Enviar arquivos para "/"
This commit is contained in:
24
db.js
Normal file
24
db.js
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
const mysql = require('mysql2');
|
||||||
|
|
||||||
|
// Aqui está a configuração da nossa conexão com o banco de dados!
|
||||||
|
// Cada microsserviço tem seu próprio banco, lembra? Isso garante independência.
|
||||||
|
// Estou usando MySQL porque é confiável e funciona bem com Node.js.
|
||||||
|
const connection = mysql.createConnection({
|
||||||
|
host: 'localhost', // O banco roda na mesma máquina
|
||||||
|
user: 'root', // Usuário padrão do MySQL
|
||||||
|
password: '', // Sem senha para desenvolvimento local
|
||||||
|
database: 'gameverse_library' // Nosso banco exclusivo da biblioteca
|
||||||
|
});
|
||||||
|
|
||||||
|
// Esta função tenta conectar ao banco quando o serviço inicia.
|
||||||
|
// Se der erro, a gente sabe que tem problema na configuração do MySQL.
|
||||||
|
connection.connect((err) => {
|
||||||
|
if (err) {
|
||||||
|
console.error('Erro ao conectar:', err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
console.log('Banco conectado!');
|
||||||
|
});
|
||||||
|
|
||||||
|
// Exportamos a conexão para usar em outros arquivos, principalmente no model.
|
||||||
|
module.exports = connection;
|
||||||
127
libraryController.js
Normal file
127
libraryController.js
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
const model = require('../models/libraryModel');
|
||||||
|
|
||||||
|
// Este é o "cérebro" do nosso microsserviço!
|
||||||
|
// O controller recebe as requisições HTTP, valida os dados,
|
||||||
|
// chama as funções do model e retorna respostas apropriadas.
|
||||||
|
// É como o gerente que coordena tudo.
|
||||||
|
|
||||||
|
// Função para adicionar um item manualmente à biblioteca.
|
||||||
|
// Pode ser usado para correções ou imports especiais.
|
||||||
|
exports.addItem = (req, res) => {
|
||||||
|
// Validação básica dos dados obrigatórios
|
||||||
|
const { user_id, type, item_id, title } = req.body;
|
||||||
|
|
||||||
|
if (!user_id || !type || !item_id || !title) {
|
||||||
|
return res.json({
|
||||||
|
success: false,
|
||||||
|
message: 'Dados obrigatórios faltando: user_id, type, item_id, title'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Só aceitamos tipos válidos para manter consistência
|
||||||
|
if (!['game', 'gift_card'].includes(type)) {
|
||||||
|
return res.json({
|
||||||
|
success: false,
|
||||||
|
message: 'Tipo inválido. Use "game" ou "gift_card"'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Chama o model para adicionar o item
|
||||||
|
model.addItem(req.body, (err) => {
|
||||||
|
if (err) {
|
||||||
|
return res.json({
|
||||||
|
success: false,
|
||||||
|
error: err,
|
||||||
|
message: 'Erro ao adicionar item à biblioteca'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
res.json({
|
||||||
|
success: true,
|
||||||
|
message: 'Item adicionado à biblioteca com sucesso!'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// Função que retorna toda a biblioteca de um usuário.
|
||||||
|
// É chamada quando o usuário abre sua página de biblioteca.
|
||||||
|
exports.getLibrary = (req, res) => {
|
||||||
|
const user_id = req.params.user_id;
|
||||||
|
|
||||||
|
// Validação do ID do usuário
|
||||||
|
if (!user_id || isNaN(user_id)) {
|
||||||
|
return res.json({
|
||||||
|
success: false,
|
||||||
|
message: 'ID do usuário inválido'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Busca todos os itens do usuário
|
||||||
|
model.getUserLibrary(user_id, (err, results) => {
|
||||||
|
if (err) {
|
||||||
|
return res.json({
|
||||||
|
success: false,
|
||||||
|
error: err,
|
||||||
|
message: 'Erro ao buscar biblioteca'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
res.json({
|
||||||
|
success: true,
|
||||||
|
data: results,
|
||||||
|
message: `Encontrados ${results.length} itens na biblioteca`
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// Esta é a função mais importante para integração!
|
||||||
|
// É chamada AUTOMATICAMENTE pelo serviço de pagamentos quando uma compra é aprovada.
|
||||||
|
// Garante que o usuário receba seu jogo/gift card na biblioteca.
|
||||||
|
exports.paymentApproved = (req, res) => {
|
||||||
|
const data = req.body;
|
||||||
|
|
||||||
|
// Validações rigorosas pois isso vem de outro serviço
|
||||||
|
const { user_id, type, item_id, title } = data;
|
||||||
|
|
||||||
|
if (!user_id || !type || !item_id || !title) {
|
||||||
|
return res.json({
|
||||||
|
success: false,
|
||||||
|
message: 'Dados de pagamento incompletos'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Primeiro verifica se o usuário já tem esse item (evita duplicatas)
|
||||||
|
model.checkItem(user_id, item_id, (err, results) => {
|
||||||
|
if (err) {
|
||||||
|
return res.json({
|
||||||
|
success: false,
|
||||||
|
error: err,
|
||||||
|
message: 'Erro ao verificar item existente'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Se já tem, informa que não precisa adicionar novamente
|
||||||
|
if (results.length > 0) {
|
||||||
|
return res.json({
|
||||||
|
success: false,
|
||||||
|
message: 'Usuário já possui este item em sua biblioteca'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Se não tem, adiciona o item
|
||||||
|
model.addItem(data, (err) => {
|
||||||
|
if (err) {
|
||||||
|
return res.json({
|
||||||
|
success: false,
|
||||||
|
error: err,
|
||||||
|
message: 'Erro ao adicionar item após pagamento'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
res.json({
|
||||||
|
success: true,
|
||||||
|
message: 'Pagamento aprovado! Item adicionado à biblioteca.'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
33
libraryModel.js
Normal file
33
libraryModel.js
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
const db = require('../config/db');
|
||||||
|
|
||||||
|
// Este arquivo é o nosso "guarda-roupa" - aqui guardamos todas as funções
|
||||||
|
// que interagem diretamente com o banco de dados da biblioteca.
|
||||||
|
// Seguimos o padrão MVC: Model lida com dados, Controller com lógica, View com apresentação.
|
||||||
|
|
||||||
|
// Função para adicionar um item (jogo ou gift card) à biblioteca do usuário.
|
||||||
|
// É chamada quando um pagamento é aprovado ou quando queremos adicionar manualmente.
|
||||||
|
exports.addItem = (data, callback) => {
|
||||||
|
// SQL preparado para evitar injeção de código malicioso
|
||||||
|
// Campos: user_id (quem comprou), type (jogo ou gift card), item_id (ID do item),
|
||||||
|
// title (nome do jogo/gift), platform (onde roda ou vale)
|
||||||
|
const sql = `INSERT INTO users_library (user_id, type, item_id, title, platform)
|
||||||
|
VALUES (?, ?, ?, ?, ?)`;
|
||||||
|
|
||||||
|
// Executa a query com os dados sanitizados
|
||||||
|
db.query(sql, [data.user_id, data.type, data.item_id, data.title, data.platform], callback);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Função que busca TODOS os itens da biblioteca de um usuário específico.
|
||||||
|
// É usada quando o usuário quer ver sua coleção completa.
|
||||||
|
exports.getUserLibrary = (user_id, callback) => {
|
||||||
|
// Query simples mas eficiente - busca tudo do usuário
|
||||||
|
db.query('SELECT * FROM users_library WHERE user_id = ?', [user_id], callback);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Função importante para evitar duplicatas!
|
||||||
|
// Antes de adicionar um item, verificamos se o usuário já não o tem.
|
||||||
|
// Isso evita que alguém compre o mesmo jogo duas vezes por acidente.
|
||||||
|
exports.checkItem = (user_id, item_id, callback) => {
|
||||||
|
// Busca se existe algum registro com esse usuário e item
|
||||||
|
db.query('SELECT * FROM users_library WHERE user_id = ? AND item_id = ?', [user_id, item_id], callback);
|
||||||
|
};
|
||||||
16
mime
Normal file
16
mime
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
||||||
|
|
||||||
|
case `uname` in
|
||||||
|
*CYGWIN*|*MINGW*|*MSYS*)
|
||||||
|
if command -v cygpath > /dev/null 2>&1; then
|
||||||
|
basedir=`cygpath -w "$basedir"`
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [ -x "$basedir/node" ]; then
|
||||||
|
exec "$basedir/node" "$basedir/../mime/cli.js" "$@"
|
||||||
|
else
|
||||||
|
exec node "$basedir/../mime/cli.js" "$@"
|
||||||
|
fi
|
||||||
17
mime.cmd
Normal file
17
mime.cmd
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
@ECHO off
|
||||||
|
GOTO start
|
||||||
|
:find_dp0
|
||||||
|
SET dp0=%~dp0
|
||||||
|
EXIT /b
|
||||||
|
:start
|
||||||
|
SETLOCAL
|
||||||
|
CALL :find_dp0
|
||||||
|
|
||||||
|
IF EXIST "%dp0%\node.exe" (
|
||||||
|
SET "_prog=%dp0%\node.exe"
|
||||||
|
) ELSE (
|
||||||
|
SET "_prog=node"
|
||||||
|
SET PATHEXT=%PATHEXT:;.JS;=;%
|
||||||
|
)
|
||||||
|
|
||||||
|
endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\mime\cli.js" %*
|
||||||
Reference in New Issue
Block a user