Skip to content

Commit

Permalink
Merge branch 'feat/nao-mexe'
Browse files Browse the repository at this point in the history
  • Loading branch information
zzzBECK committed Dec 10, 2023
2 parents abd528b + 945d378 commit 5d48b00
Show file tree
Hide file tree
Showing 19 changed files with 452 additions and 51 deletions.
10 changes: 9 additions & 1 deletion game/Backend/postgres/migrations/1_schema.sql
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ CREATE TABLE local (
-- Tabela de Personagens
CREATE TABLE personagem (
id_personagem SERIAL PRIMARY KEY,
idLocal INTEGER REFERENCES local(idLocal) DEFAULT 1, -- Relação com a tabela Local
idLocal INTEGER REFERENCES local(idLocal) DEFAULT 1, -- Relação com a tabela Local
nome VARCHAR(50) NOT NULL,
dinheiro INTEGER NOT NULL DEFAULT 0,
tipoP VARCHAR(25), -- Tipo de personagem
Expand Down Expand Up @@ -103,3 +103,11 @@ CREATE TABLE armadura (
);

-- Add any other necessary tables here following the same pattern.
CREATE TABLE compra (
idCompra SERIAL PRIMARY KEY,
id_personagem SERIAL REFERENCES personagem(id_personagem),
idItem SERIAL REFERENCES item(idItem),
quantidade INTEGER NOT NULL,
valorTotal INTEGER NOT NULL,
dataCompra TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
51 changes: 50 additions & 1 deletion game/Backend/postgres/migrations/2_functions.sql
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
CREATE OR REPLACE FUNCTION criar_inventario()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO inventario (id_personagem) VALUES (NEW.id_personagem);
INSERT INTO inventario (id_personagem,dinAtual) VALUES (NEW.id_personagem, 1000);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
Expand Down Expand Up @@ -73,3 +73,52 @@ CREATE TRIGGER trigger_check_exclusive_item_type
BEFORE INSERT OR UPDATE ON item
FOR EACH ROW EXECUTE FUNCTION check_exclusive_item_type();


CREATE OR REPLACE PROCEDURE comprarItem(idPersonagem INT, idItemCompra INT)
LANGUAGE plpgsql
AS $$
DECLARE
precoItem INT;
pesoItem INT;
dinheiroPersonagem INT;
pesoAtual INT;
qtdItemExistente INT;
BEGIN
-- Obtém o preço e o peso do item
SELECT valor, peso INTO precoItem, pesoItem FROM item WHERE idItem = idItemCompra;

-- Obtém o dinheiro e o peso atual do personagem
SELECT dinAtual, capAtual INTO dinheiroPersonagem, pesoAtual FROM inventario WHERE id_personagem = idPersonagem;

-- Verifica se o personagem tem dinheiro suficiente
IF dinheiroPersonagem < precoItem THEN
RAISE EXCEPTION 'Dinheiro insuficiente';
END IF;

-- Atualiza o dinheiro e o peso no inventário
UPDATE inventario SET
dinAtual = dinAtual - precoItem,
capAtual = capAtual + pesoItem
WHERE id_personagem = idPersonagem;

-- Verifica se o item já existe no inventário
SELECT quantidade INTO qtdItemExistente FROM compra WHERE id_personagem = idPersonagem AND idItem = idItemCompra;

IF qtdItemExistente IS NOT NULL THEN
-- Se o item já existe, incrementa a quantidade
UPDATE compra SET
quantidade = quantidade + 1,
valorTotal = valorTotal + precoItem
WHERE id_personagem = idPersonagem AND idItem = idItemCompra;
ELSE
-- Se o item não existe, insere um novo registro
INSERT INTO compra (id_personagem, idItem, quantidade, valorTotal)
VALUES (idPersonagem, idItemCompra, 1, precoItem);
END IF;

COMMIT;
END;
$$;



78 changes: 56 additions & 22 deletions game/Backend/postgres/migrations/3_data.sql
Original file line number Diff line number Diff line change
Expand Up @@ -12,31 +12,31 @@ VALUES
'A única igreja da cidade. Aqui os moradores dedicavam preces a All-mer, o último dos deuses antigos, também conhecido como "aquele que ascendeu".',
TRUE
),
(
'Circo',
'Um lugar que antes era usado para diversão e entretenimento, mas que atualmente tem um aspecto sinistro e abandonado.',
TRUE
),
(
'Truques e mágica Dr. Kefer',
'Um pequeno edifício de aparência desgastada.',
FALSE
),
(
'Livraria',
'A livraria comercializava todo tipo de livro dos mais variados assuntos.',
FALSE
),
(
'Floresta',
'O bosque que fica ao redor da cidade.',
FALSE
),
(
'Casa do lenhador',
'A casa do lenhador do vilarejo',
FALSE
);
-- (
-- 'Circo',
-- 'Um lugar que antes era usado para diversão e entretenimento, mas que atualmente tem um aspecto sinistro e abandonado.',
-- TRUE
-- ),
-- (
-- 'Truques e mágica Dr. Kefer',
-- 'Um pequeno edifício de aparência desgastada.',
-- FALSE
-- ),
-- (
-- 'Livraria',
-- 'A livraria comercializava todo tipo de livro dos mais variados assuntos.',
-- FALSE
-- ),
-- (
-- 'Casa do lenhador',
-- 'A casa do lenhador do vilarejo',
-- FALSE
-- );

INSERT INTO
Local (idRegiao, nomeL, imgTexto)
Expand All @@ -57,11 +57,45 @@ VALUES
'Diz-se que a Árvore da Praça tem mais de um século de idade, testemunhando eventos importantes e segredos compartilhados ao longo do tempo. Seus troncos retorcidos e casca rugosa contam histórias que são passadas de boca em boca. Com suas raízes profundamente enraizadas na cultura da cidade, esta árvore é mais do que apenas um elemento paisagístico; ela é um símbolo de conexão, sombra e continuidade na Praça Central.'
);

INSERT INTO
Local (idRegiao, nomeL, imgTexto)
VALUES
(
2,
'Entrada',
'A entrada da igreja, única na cidade, é um portal majestoso para a espiritualidade. Suas portas de madeira entalhada são adornadas com símbolos e cenas da ascensão de All-mer, o último dos deuses antigos. Acima, um arco de pedra com figuras angélicas simboliza a conexão entre os mundos terreno e espiritual. Ao lado, duas estátuas de pedra de All-mer guardam a entrada, representando sua majestosa ascensão e poder divino. O caminho florido que leva até lá evoca paz e reverência, preparando os visitantes para a comunhão espiritual no interior.'
),
(
2,
'Interior',
'O interior da igreja é um santuário de serenidade e devoção. Altas colunas de pedra se elevam para sustentar um teto abobadado, adornado com afrescos delicadamente pintados que contam as histórias de All-mer e sua ascensão divina. A luz suave penetra através dos vitrais coloridos, lançando um arco-íris de cores sobre os bancos de madeira enfileirados, convidando os fiéis a um momento de reflexão e oração.'
),
(
2,
'Altar',
'O altar, um grande mural retrata All-mer em sua forma glorificada, cercado por símbolos celestiais e terrenos. O espaço em frente ao altar, frequentemente usado para cerimônias e preces, é aberto e acolhedor, facilitando uma conexão coletiva entre os adoradores e o divino.'
);

INSERT INTO
Local (idRegiao, nomeL, imgTexto)
VALUES
(
3,
'Entrada',
'A entrada da floresta, emerge como um umbral sombrio e inquietante para um reino de mistérios e medos ancestrais. As árvores retorcidas e imponentes formam um arco quase ameaçador, com galhos entrelaçados que se assemelham a dedos esqueléticos estendendo-se para o céu encoberto. A luz do sol raramente penetra essa cortina de folhagem densa, criando um crepúsculo perpétuo que envolve o caminho com uma penumbra desconcertante.'
),
(
3,
'Interior',
'À medida que se adentra mais profundamente, a trilha se torna mais sinuosa e menos definida, levando os visitantes a um labirinto de sombras e incertezas. A floresta parece guardar segredos antigos e histórias esquecidas, onde cada sussurro do vento e movimento furtivo nas sombras pode ser o prenúncio de horrores ocultos. Neste cenário, a entrada da floresta é mais do que um simples começo de trilha; é um convite ao coração de um pesadelo natural, onde o medo e o fascínio caminham lado a lado.'
);


-- Primeiro, inserimos um personagem que será jogável
INSERT INTO
personagem (nome, idLocal, tipoP)
personagem (nome, idLocal, tipoP, dinheiro)
VALUES
('Jogador Heroico', 1, 'personagem_jogavel') RETURNING id_personagem;
('Jogador Heroico', 1, 'personagem_jogavel', 1000) RETURNING id_personagem;

-- Suponha que o ID retornado seja 1, usamos esse ID para inserir na tabela PersonagemJogavel
INSERT INTO
Expand Down
5 changes: 5 additions & 0 deletions game/Backend/src/Services/PersonagemServicesDB.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,8 @@ export const getPersonagensPorLocal = async (idLocal) => {
`;
return await getDBConnection(query);
};

export const getPersonagensById = async (id_personagem) => {
const query = `SELECT * FROM personagem WHERE id_personagem = ${id_personagem};`;
return await getDBConnection(query);
};
20 changes: 20 additions & 0 deletions game/Backend/src/Services/compraServiceDB.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import getDBConnection from "./getDBConnection.js";

export const compraItens = async (idPersonagem, idItem) => {
// const query = "'CALL comprarItem($1, $2)', [idPersonagem, idItem]";
return await getDBConnection('CALL comprarItem($1, $2)', [idPersonagem, idItem]);
};

export const ItemComprados = async () => {
// console.log('teste');
// const query = `SELECT * FROM inventario`;
// return await getDBConnection(query);
const query = `
SELECT i.nome, c.quantidade, c.valorTotal, c.dataCompra
FROM compra c
JOIN item i ON c.idItem = i.idItem
WHERE c.id_personagem = $1
ORDER BY c.dataCompra DESC;
`;
return await getDBConnection(query, [1]);
};
8 changes: 4 additions & 4 deletions game/Backend/src/Services/getDBConnection.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
import pkg from "pg";
const { Pool } = pkg;

async function getDBConnection(query, returToCaller = true) {
//Conectar Banco de Dados
async function getDBConnection(query, params = [], returnToCaller = true) {
// Conectar Banco de Dados
const connection = new Pool({
connectionString: `postgres://postgres:postgres@db:5432/sbd1_database`,
});

const client = await connection.connect();
const resp = await client.query(query);
const resp = await client.query(query, params);
client.release();
if (returToCaller) {
if (returnToCaller) {
return resp.rows;
}
}
Expand Down
29 changes: 29 additions & 0 deletions game/Backend/src/controller/CompraController.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { ItemComprados, compraItens } from "../Services/compraServiceDB.js";

class CompraController {
async ComprarItem(req, res) {
try {
// Acessando o parâmetro da rota
const { idPersonagem, idItem } = req.params;
console.log("DEU bom o params", idPersonagem, idItem);
const response = (await compraItens(idPersonagem, idItem)) ?? null;
return res.status(200).json(response);
} catch (error) {
console.error(error.message);
return res.status(500).json({ error: "Compra não efetuada" });
}
}

async ItemComprados(req, res) {
try {
// Acessando o parâmetro da rota
const response = (await ItemComprados()) ?? null;
return res.status(200).json(response);
} catch (error) {
console.error(error.message);
return res.status(500).json({ error: "Compra não efetuada" });
}
}
}

export default new CompraController();
2 changes: 2 additions & 0 deletions game/Backend/src/controller/InventarioController.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ class InventarioController {
return res.status(500).json({ error: "Internal Server Error" });
}
}


}

export default new InventarioController();
13 changes: 13 additions & 0 deletions game/Backend/src/controller/PersonagemController.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import {
getItemPersonagem,
getPersonagensPorLocal,
getPersonagensById,
} from "../Services/PersonagemServicesDB.js";
class PersonagemController {
async getItemPersonagem(req, res) {
Expand All @@ -26,6 +27,18 @@ class PersonagemController {
return res.status(500).json({ error: "Internal Server Error" });
}
}

async getPersonagensById(req, res) {
try {
// Acessando o parâmetro da rota
const { id_personagem } = req.params;
const response = (await getPersonagensById(id_personagem)) ?? null;
return res.status(200).json(response);
} catch (error) {
console.error(error.message);
return res.status(500).json({ error: "Internal Server Error" });
}
}
}

export default new PersonagemController();
1 change: 1 addition & 0 deletions game/Backend/src/controller/RegiaoController.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ class RegiaoController {
try {
// Acessando o parâmetro da rota
const { idRegiao } = req.params;
console.log("idRegiao",idRegiao);
const response = (await getLocais(idRegiao)) ?? null;
return res.status(200).json(response);
} catch (error) {
Expand Down
7 changes: 6 additions & 1 deletion game/Backend/src/routes/routes.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import InventarioController from "../controller/InventarioController.js";
import PersonagemController from "../controller/PersonagemController.js";
import RegiaoController from "../controller/RegiaoController.js";
import ItensController from "../controller/ItensController.js";
import CompraController from "../controller/CompraController.js";

const routes = new Router();

Expand All @@ -15,6 +16,7 @@ routes.get("/", (req, res) => {
// Rota Personagem
routes.get("/personagem", PersonagemController.getItemPersonagem);
routes.get("/personagem/:localId", PersonagemController.getPersonagensPorLocal);
routes.get("/personagem/only/:id_personagem", PersonagemController.getPersonagensById);

// Rota Regiao
routes.get("/regiao", RegiaoController.getRegioes);
Expand All @@ -29,7 +31,10 @@ routes.get(
);

// Rota para todos os items

routes.get("/item", ItensController.getItens);

// Rota para compra de item
routes.post("/comprarItem/:idPersonagem/:idItem", CompraController.ComprarItem)
routes.get("/comprarItem/inventario", CompraController.ItemComprados)

export default routes;
19 changes: 19 additions & 0 deletions game/FrontEnd/src/components/InimigoModal/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { Body, Footer, Header, ModalContainer } from "./styles";

// interface IInimigoModal {
// inventario: IInventario;
// inventarioItens: ItemRPG[];
// }

export default function InimigoModal() {
return (
<ModalContainer>
<Header>
<h1>Inimigo</h1>
</Header>
<Body></Body>

<Footer></Footer>
</ModalContainer>
);
}
Loading

0 comments on commit 5d48b00

Please sign in to comment.