const express = require('express'); const sqlite3 = require('sqlite3').verbose(); const bodyParser = require('body-parser'); const cors = require('cors'); const path = require('path'); const app = express(); const PORT = process.env.PORT || 3000; // Middlewares app.use(cors()); app.use(bodyParser.json()); app.use(express.static(path.join(__dirname, 'public'))); // Banco de Dados SQLite const db = new sqlite3.Database('./rota_vilasp.db', (err) => { if (err) console.error('Erro ao conectar ao banco de dados', err.message); else console.log('📦 Banco de dados SQLite conectado com sucesso.'); }); // Inicialização das Tabelas e Inserção dos Links do Discord db.serialize(() => { db.run(`CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, email TEXT UNIQUE NOT NULL, password TEXT NOT NULL, role TEXT DEFAULT 'CANDIDATO', status TEXT DEFAULT 'EM_ANDAMENTO', patente TEXT DEFAULT 'Recruta', ingress_date DATETIME DEFAULT CURRENT_TIMESTAMP )`); db.run(`CREATE TABLE IF NOT EXISTS posts ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER, content TEXT, category TEXT, media_url TEXT, likes INTEGER DEFAULT 0, status TEXT DEFAULT 'APROVADO', created_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY(user_id) REFERENCES users(id) )`); db.run(`CREATE TABLE IF NOT EXISTS discord_links ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, url TEXT )`); db.get(`SELECT COUNT(*) as count FROM discord_links`, (err, row) => { if (row && row.count === 0) { db.run(`INSERT INTO discord_links (name, url) VALUES ('Vila SP', 'https://discord.gg/ggMvJmygm')`); db.run(`INSERT INTO discord_links (name, url) VALUES ('ROTA', 'https://discord.gg/ZAZZVUyZv')`); } }); }); // Rotas da API app.post('/api/register', (req, res) => { const { name, email, password } = req.body; db.run(`INSERT INTO users (name, email, password, status, role) VALUES (?, ?, ?, 'EM_ANDAMENTO', 'CANDIDATO')`, [name, email, password], function(err) { if (err) return res.status(400).json({ error: 'E-mail já cadastrado no sistema.' }); res.json({ success: true, userId: this.lastID, status: 'EM_ANDAMENTO' }); }); }); app.post('/api/login', (req, res) => { const { email, password } = req.body; db.get(`SELECT * FROM users WHERE email = ? AND password = ?`, [email, password], (err, user) => { if (err || !user) return res.status(401).json({ error: 'Credenciais inválidas.' }); res.json({ success: true, user }); }); }); app.get('/api/discord', (req, res) => { db.all(`SELECT * FROM discord_links`, (err, rows) => { if (err) return res.status(500).json({ error: 'Erro ao buscar links do Discord.' }); res.json(rows); }); }); app.get('/api/posts', (req, res) => { db.all(`SELECT posts.*, users.name as author_name, users.patente FROM posts JOIN users ON posts.user_id = users.id WHERE posts.status = 'APROVADO' ORDER BY posts.id DESC`, (err, rows) => { if (err) return res.status(500).json({ error: 'Erro ao carregar o feed.' }); res.json(rows); }); }); app.post('/api/posts', (req, res) => { const { user_id, content, category, media_url } = req.body; db.run(`INSERT INTO posts (user_id, content, category, media_url) VALUES (?, ?, ?, ?)`, [user_id, content, category, media_url], function(err) { if (err) return res.status(500).json({ error: 'Erro ao registrar publicação.' }); res.json({ success: true, postId: this.lastID }); }); }); app.post('/api/admin/status', (req, res) => { const { user_id, new_status } = req.body; let new_role = 'CANDIDATO'; if (new_status === 'APROVADO') new_role = 'ALUNO'; db.run(`UPDATE users SET status = ?, role = ? WHERE id = ?`, [new_status, new_role, user_id], function(err) { if (err) return res.status(500).json({ error: 'Erro ao atualizar status do usuário.' }); res.json({ success: true, message: `Status alterado para ${new_status} com sucesso.` }); }); }); app.listen(PORT, () => { console.log(`🛡️ Servidor ROTA Vila SP rodando na porta ${PORT}`); }); ROTA VILA SP — Plataforma Definitiva
🛡️ ROTA VILA SP
Discord Vila SP Discord ROTA

CENTRAL DE OPERAÇÕES ROTA VILA SP

Plataforma definitiva de recrutamento, controle de status, treinamentos internos e comunidade restrita para membros aprovados.

Status do Sistema

Conectado aos servidores oficiais e banco de dados relacional.