From 5ee6376fa2bc6e2d7fc92b60af94ade07c9324b7 Mon Sep 17 00:00:00 2001 From: Izad0ra Date: Tue, 28 Apr 2026 00:32:02 +0000 Subject: [PATCH] Enviar arquivos para "/" --- db.js | 24 ++++++++ libraryController.js | 127 +++++++++++++++++++++++++++++++++++++++++++ libraryModel.js | 33 +++++++++++ mime | 16 ++++++ mime.cmd | 17 ++++++ 5 files changed, 217 insertions(+) create mode 100644 db.js create mode 100644 libraryController.js create mode 100644 libraryModel.js create mode 100644 mime create mode 100644 mime.cmd diff --git a/db.js b/db.js new file mode 100644 index 0000000..6190161 --- /dev/null +++ b/db.js @@ -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; diff --git a/libraryController.js b/libraryController.js new file mode 100644 index 0000000..76e0ca5 --- /dev/null +++ b/libraryController.js @@ -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.' + }); + }); + }); +}; diff --git a/libraryModel.js b/libraryModel.js new file mode 100644 index 0000000..2a909b1 --- /dev/null +++ b/libraryModel.js @@ -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); +}; diff --git a/mime b/mime new file mode 100644 index 0000000..7751de3 --- /dev/null +++ b/mime @@ -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 diff --git a/mime.cmd b/mime.cmd new file mode 100644 index 0000000..a9e48f1 --- /dev/null +++ b/mime.cmd @@ -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" %*