Commit b275310c authored by Rafael Dias's avatar Rafael Dias

Merge branch 'issue/18' into 'develop'

Issue #18: Documentação com typedoc

Closes #18

See merge request !18
parents 1e3f8088 888b2257
Pipeline #22297 passed with stage
in 1 minute and 19 seconds
node_modules/
.nyc_output/
coverage/
doc/code/
*.swp
*.swo
*.tmp
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -7,7 +7,7 @@
"start": "node index",
"lint": "tslint -s node_modules/tslint_stylish -t stylish src/**/*.ts",
"test": "ts-node node_modules/nyc/bin/nyc.js mocha",
"doc-code": "typedoc --mode 'file' --module 'commonjs' --target 'ES6' --ignoreCompilerErrors --exclude '**/*.spec.ts' --out 'doc/code' 'src'"
"doc": "typedoc --mode 'file' --module 'commonjs' --target 'ES6' --ignoreCompilerErrors --exclude '**/*.spec.ts' --out 'doc/code' 'src'"
},
"repository": {
"type": "git",
......@@ -38,12 +38,14 @@
"license": "ISC",
"dependencies": {
"@types/async": "^3.0.3",
"@types/chai": "^4.2.4",
"@types/express": "^4.17.1",
"@types/pg": "^7.11.2",
"async": "^3.1.0",
"body-parser": "^1.19.0",
"express": "^4.17.1",
"pg": "^7.12.1",
"raml-parser": "^0.8.18",
"ts-node": "^8.4.1",
"typescript": "^3.6.3"
},
......@@ -53,9 +55,10 @@
"chai": "^4.2.0",
"mocha": "^6.2.1",
"nyc": "^14.1.1",
"raml2html": "^7.4.0",
"supertest": "^4.0.2",
"tslint": "^5.20.0",
"typedoc": "^0.15.0",
"typedoc-plugin-markdown": "^2.2.11"
"tslint-stylish": "^2.1.0-beta",
"typedoc": "^0.15.0"
}
}
......@@ -2,12 +2,30 @@ import { Compra } from "./compra";
import { Jogador } from "./jogador";
import { Jogo } from "./jogo";
/**
* Banco de dados utilizado para armazenar os objetos
* Jogadores, Jogos e Compras.
*/
export class DBHandler {
/**
* Banco de jogadores
*/
private jogadores: Jogador[];
/**
* Banco de jogos
*/
private jogos: Jogo[];
/**
* Banco de compras
*/
private compras: Compra[];
/**
* Inicializa o banco de dados com alguns jogadores e jogos para casos de teste
*/
constructor() {
/** Populando o banco de jogadores com alguns objetos */
this.jogadores = [
/** Jogador 1 com seus atributos -> 2 jogos, um amigo e R$110 */
new Jogador(
"Player1"
, [
......@@ -19,53 +37,116 @@ export class DBHandler {
]
, 110
)
/** Jogador 2, 3 e 4 com seus atributos -> 0 jogos, 0 amigo e fundos específicos */
, new Jogador("Player2", [], [], 100)
, new Jogador("Player3", [], [], 400)
, new Jogador("Player4", [], [], 400)
];
/** Populando o banco de jogos com alguns objetos */
this.jogos = [
/** Jogos e seus atributos */
new Jogo("Overcooked", "fracasso", "fracasso", new Date("2010-01-01"), 200),
new Jogo("Tera", "FracassoXD", "FracassoXD", new Date("2010-01-01"), 0)
];
/** Não houve necessidade de popular */
this.compras = [];
}
public createplayer(player: Jogador) {
return this.jogadores.push(player);
}
public creategame(game: Jogo) {
return this.jogos.push(game);
}
public createbuy(buy: Compra) {
return this.compras.push(buy);
}
/**
* Insere jogador no banco
* @param player Jogador a ser inserido
*/
public createplayer(player: Jogador): void {
this.jogadores.push(player);
}
/**
* Insere jogo no banco
* @param game Jogo a ser inserido
*/
public creategame(game: Jogo): void {
this.jogos.push(game);
}
/**
* Insere registro de compra no banco
* @param buy Registro de compra a ser inserido
*/
public createbuy(buy: Compra): void {
this.compras.push(buy);
}
/**
* Lê um jogador do banco
* @param ID Posição do jogador no banco
* @returns Jogador da posição solicitada
*/
public readplayer(ID: number): Jogador {
return this.jogadores[ID];
}
/**
* Lê um jogo do banco
* @param ID Posição do jogo no banco
* @returns Jogo da posição solicitada
*/
public readgame(ID: number): Jogo {
return this.jogos[ID];
}
/**
* Lê um registro de compra do banco
* @param ID Posição do registro de compra no banco
* @returns Registro de compra da posição solicitada
*/
public readbuy(ID: number): Compra {
return this.compras[ID];
}
public updateplayer(ID: number, newplayer: Jogador) {
/**
* Atualiza um jogador
* @param ID Posição do jogador a ser atualizado
* @param newplayer Novo jogador a ser inserido
*/
public updateplayer(ID: number, newplayer: Jogador): void {
this.jogadores.splice(ID, 1, newplayer);
}
public updategame(ID: number, newgame: Jogo) {
/**
* Atualiza um jogo
* @param ID Posição do jogo a ser atualizado
* @param newgame Novo jogo a ser inserido
*/
public updategame(ID: number, newgame: Jogo): void {
this.jogos.splice(ID, 1, newgame);
}
public updatebuy(ID: number, newbuy: Compra) {
/**
* Atualiza um registro de compra
* @param ID Posição do registro de compra a ser atualizado
* @param newbuy Novo registro de compra a ser inserido
*/
public updatebuy(ID: number, newbuy: Compra): void {
this.compras.splice(ID, 1, newbuy);
}
public deleteplayer(ID: number) {
return this.jogadores.splice(ID, 1);
}
public deletegame(ID: number) {
return this.jogos.splice(ID, 1);
}
public deletebuy(ID: number) {
return this.compras.splice(ID, 1);
}
public list(argument: string) {
/**
* Deleta um jogador
* @param ID Posição do jogador a ser deletado
*/
public deleteplayer(ID: number): void {
this.jogadores.splice(ID, 1);
}
/**
* Deleta um jogo
* @param ID Posição do jogo a ser deletado
*/
public deletegame(ID: number): void {
this.jogos.splice(ID, 1);
}
/**
* Deleta um registro de compra
* @param ID Posição do registro de compra a ser deletado
*/
public deletebuy(ID: number): void {
this.compras.splice(ID, 1);
}
/**
* Lista jogadores, jogos, ou compras de acordo com o argumento de entrada
* @param argument Recebe uma string que pode ser **jogos**, **compras** ou **jogadores**
* @returns Vetor de nomes do argumento de entrada
*/
public list(argument: string): string[] {
const nomes: string[] = [];
if (argument === "jogos" ) {
for (let i = 0; i < this.jogos.length; ++i) {
......
/**
* Interface Opções de Compra.
*/
interface CompraOpts {
name: string;
game: string;
......@@ -8,18 +11,42 @@ interface CompraOpts {
import { Jogador } from "./jogador";
import { Jogo } from "./jogo";
/**
* Classe que contém informações sobre registros de compra e seus métodos.
*/
export class Compra {
/**
* Atributo jogador que faz a compra
*/
private buyer: Jogador;
/**
* Atributo jogo que está sendo comprado
*/
private game: Jogo;
/**
* Atributo data da compra executada
*/
private date: Date;
/**
* Atributo opcional do alvo da compra
*/
private owner: Jogador;
constructor(buyer, game, date, owner?) {
/**
* Construtor de objetos da classe Compra
* @param buyer Comprador do jogo
* @param game Jogo a ser comprado
* @param date Data da compra
* @param owner Alvo da compra
*/
constructor(buyer: Jogador, game: Jogo, date: Date, owner?: Jogador) {
this.buyer = buyer;
this.game = game;
this.date = date;
this.owner = (owner) ? owner : null;
}
/**
* Retorna as informações do registro de compra solicitado
*/
public writeinfo(): CompraOpts {
return {
name: this.buyer.getName()
......@@ -29,6 +56,9 @@ export class Compra {
, owner: (this.owner === this.buyer) ? this.buyer.getName() : this.owner.getName()
};
}
/**
* Retorna as informações do registro de compra solicitado em forma de texto
*/
public getBuy(): string{
return "O jogador " + this.buyer.getName() + " comprou o jogo " + this.game.getName() + " de preço R$ " + this.game.getPrice() + " na data " + this.date + ".";
}
......
/**
* Interface Opções de Jogador.
*/
interface JogadorOpts {
name: string;
jogos: string[];
......@@ -7,12 +10,31 @@ interface JogadorOpts {
import { Jogo } from "./jogo";
/**
* Classe que contém informações sobre o jogador e seus métodos.
*/
export class Jogador {
/** Atributo nome do jogador
*/
private name: string;
/** Atributo jogos do jogador
*/
private jogos: string[];
/** Atributo amigos do jogador
*/
private amigos: string[];
/** Atributo carteira do jogador
*/
private carteira: number;
constructor(name, jogos: Jogo[], amigos: Jogador[], carteira) {
/**
* Construtor de objetos da classe Jogador
* @param name Nome do jogador a ser criado
* @param jogos Lista de jogos do jogador a ser criado (normalmente inicializado vazio)
* @param amigos Lista de amigos do jogador a ser criado (normalmente inicializado vazio)
* @param carteira Dinheiro do jogador (normalmente inicializado vazio)
*/
constructor(name: string, jogos: Jogo[], amigos: Jogador[], carteira: number) {
this.name = name;
this.jogos = [];
for (const jogo of jogos) {
......@@ -23,8 +45,10 @@ export class Jogador {
this.amigos.push(amigo.getName());
}
this.carteira = carteira;
}
/**
* Retorna informações sobre o jogador solicitado.
*/
public writeinfo(): JogadorOpts {
return {
name: this.name
......@@ -33,9 +57,15 @@ export class Jogador {
, carteira: this.carteira
};
}
/**
* Retorna no nome do jogador solicitado.
*/
public getName(): string{
return this.name;
}
/**
* Retorna o dinheiro do jogador solicitado.
*/
public getmoney(): number {
return this.carteira;
}
......@@ -64,13 +94,20 @@ export class Jogador {
*/
return 2;
}
public buy(game: Jogo) {
/**
* Compra um jogo para o jogador com fundos da carteira
* @param game Jogo a ser comprado
*/
public buy(game: Jogo): void {
this.carteira = this.carteira - game.getPrice();
this.jogos.push(game.getName());
}
public addfriend(jogador: Jogador) {
/**
* Adiciona um amigo para o jogador
* @param jogador Jogador a ser adicionado
* @returns Verdadeiro se adicionou sem problemas; falso se o jogador já era adicionado
*/
public addfriend(jogador: Jogador): boolean {
if (this.amigos.some((value1: string) => {
return value1 === jogador.getName();
})) {
......@@ -79,8 +116,12 @@ export class Jogador {
this.amigos.push(jogador.getName());
return true;
}
public removeFriend(jogador: Jogador) {
/**
* Remove um amigo da lista de amigos de um jogador
* @param jogador Amigo a ser removido
* @returns Verdadeiro se removeu sem problemas; falso se os jogadores não eram amigos
*/
public removeFriend(jogador: Jogador): boolean {
if (!this.amigos.some((value1: string) => {
return value1 === jogador.getName();
})) {
......@@ -90,15 +131,31 @@ export class Jogador {
return true;
}
/**
* Retorna a biblioteca de jogos do jogador solicitado
*/
public library(): string[] {
return this.jogos;
}
public addcredit(amount: number): number {
return this.carteira = this.carteira + amount;
/**
* Adiciona dinheiro à carteira do jogador solicitado
* @param amount Quantidade a ser adicionada
*/
public addcredit(amount: number): void {
this.carteira = this.carteira + amount;
}
/**
* Retorna, em texto, o dinheiro do jogador
*/
public balance(): string {
return "Balanço da carteira de " + this.name + ": " + this.carteira + "R$";
}
/**
* Retorna os amigos do jogador solicitado
*/
public getAmigos(): string[]{
return this.amigos;
}
......
/**
* Interface Opções de Jogo.
*/
interface JogoOpts {
name: string;
developer: string;
......@@ -6,22 +9,48 @@ interface JogoOpts {
price: number;
// publisher?: string;
}
/**
* Classe que contém informações sobre o jogo e seus métodos.
*/
export class Jogo {
/**
* Atributo nome do jogo
*/
private name: string;
/**
* Atributo desenvolvedor do jogo
*/
private developer: string;
/**
* Atributo produtor do jogo
*/
private producer: string;
/**
* Atributo data de lançamento do jogo
*/
private release: Date;
/**
* Atributo preço do jogo
*/
private price: number;
constructor(name, developer, producer, release, price) {
/**
* Construtor de objetos da classe Jogo
* @param name Nome do jogo a ser criado
* @param developer Nome do desenvolvedor do jogo a ser criado
* @param producer Nome do produtor do jogo a ser criado
* @param release Data de lançamento do jogo a ser criado
* @param price Preço do jogo a ser criado
*/
constructor(name: string, developer: string, producer: string, release: Date, price: number) {
this.name = name;
this.developer = developer;
this.producer = producer;
this.release = release;
this.price = price;
}
/**
* Retorna as informações do jogo solicitado
*/
public writeinfo(): JogoOpts {
return {
name: this.name
......@@ -31,18 +60,33 @@ export class Jogo {
, price: this.price
};
}
/**
* Retorna o nome do jogador solicitado
*/
public getName(): string {
return this.name;
}
public getDeveloper(){
/**
* Retorna o desenvolvedor do jogo solicitado
*/
public getDeveloper(): string{
return this.developer;
}
public getProducer(){
/**
* Retorna o produtor do jogo solicitado
*/
public getProducer(): string{
return this.producer;
}
public getRelease(){
/**
* Retorna a data de lançamento do jogo solicitado
*/
public getRelease(): Date{
return this.release;
}
/**
* Retorna o preço do jogo solicitado
*/
public getPrice(): number {
return this.price;
}
......
......@@ -5,11 +5,16 @@ import { Compra } from "./compra";
import { DBHandler } from "./DBHandler";
import { Jogador } from "./jogador";
import { Jogo } from "./jogo";
/**
* Interface do banco de dados
*/
export interface Request extends express.Request {
db: DBHandler;
}
/**
* Gerenciador de dados provindos de requisições
* Essencialmente, uma variável global
*/
export type Middleware = (req: Request, res: express.Response, next: express.NextFunction) => void;
function dbhMW(): Middleware {
......@@ -99,21 +104,6 @@ app.put("/jogador/:id", (req: Request, res: express.Response) => {
res.json({msg: "O jogador foi atulaizado com sucesso."});
});
app.get("/", (req: Request, res: express.Response) => {
const jogo1: Jogo = new Jogo("Portal 2", "Valve", "Valve", new Date("2012-01-01"), 25);
const jogo2: Jogo = new Jogo("The Witcher 3", "CD Projekt RED", "CD Projekt RED", new Date("2016-01-01"), 10);
req.db.creategame(jogo1);
req.db.creategame(jogo2);
const jogador1: Jogador = new Jogador("Batman", [], [], 110);
req.db.createplayer(jogador1);
const jogador2: Jogador = new Jogador("Robin", [jogo2], [jogador1], 0);
req.db.createplayer(jogador2);
req.db.readplayer(1).addcredit(100);
res.json({Acesse: "/adicionar-amigos ou /compra"});
});
// Retorna os atributos do jogador indexado pelo /:id com o método get
app.get("/jogador/:id", (req: Request, res: express.Response) => {
const id: number = Math.abs(parseInt(req.params.id, 10));
......@@ -128,10 +118,6 @@ app.get("/jogador/:id", (req: Request, res: express.Response) => {
res.json(req.db.readplayer(id).writeinfo());
});
app.get("/perfil/Robin", (req: Request, res: express.Response) => {
res.json(req.db.readplayer(1).writeinfo());
});
app.get("/perfil/:nome", (req: Request, res: express.Response) => {
const ID: number = req.db.list("jogadores").indexOf(req.params.nome);
res.json(req.db.readplayer(ID).writeinfo());
......@@ -145,41 +131,6 @@ app.get("/jogadores", (req: Request, res: express.Response) => {
res.json(req.db.list("jogadores"));
});
/*app.get("/compras", (req: Request, res: express.Response) => {
res.json(req.db.list("compras"));
});
app.get("/comprar", (req: Request, res: express.Response) => {
if (req.db.readplayer(0).buy(req.db.readgame(0), req.db.readplayer(0)) === 0){
const compra = new Compra(req.db.readplayer(0), req.db.readgame(0), new Date("2019-01-01"), req.db.readplayer(0));
req.db.readplayer(0).newmoney(req.db.readgame(0).getPrice());
req.db.readplayer(0).addgame(req.db.readgame(0));
req.db.createbuy(compra);
res.json(req.db.readbuy(0).writeinfo() + req.db.readplayer(0).balance());
} else if (req.db.readplayer(0).buy(req.db.readgame(0), req.db.readplayer(0)) === 2) {
res.json("Saldo insuficiente. Adicione mais dinheiro a sua conta.");
} else if (req.db.readplayer(0).buy(req.db.readgame(0), req.db.readplayer(0)) === 4) {
res.json("Você já possui este jogo.");
}
});
*/
/*
app.get("/comprar/amigo", (req: Request, res: express.Response) => {
if (req.db.readplayer(0).buy(req.db.readgame(0), req.db.readplayer(1)) === 2) {
res.json("Saldo insuficiente. Adicione mais dinheiro a sua conta.");
}
if (req.db.readplayer(0).buy(req.db.readgame(0), req.db.readplayer(1)) === 1) {
const compra = new Compra(req.db.readplayer(0), req.db.readgame(0), new Date("2019-01-01"), req.db.readplayer(1));
req.db.readplayer(0).newmoney(req.db.readgame(0).getPrice());
req.db.readplayer(1).addgame(req.db.readgame(0));
req.db.createbuy(compra);
res.json(req.db.readbuy(0).writeinfo() + req.db.readplayer(0).balance());
} else if (req.db.readplayer(0).buy(req.db.readgame(0), req.db.readplayer(1)) === 3) {
res.json("O jogador " + req.db.readplayer(1).getName() + " já possui este jogo.");
}
});
*/
app.get("/jogos-em-comum", (req: Request, res: express.Response) => {
res.json(req.db.readplayer(0).library().filter((value: string) => {
return req.db.readplayer(1).library().some((value1: string) => {
......@@ -188,12 +139,6 @@ app.get("/jogos-em-comum", (req: Request, res: express.Response) => {
}));
});
app.get("/adicionar/saldo", (req: Request, res: express.Response) => {
const saldo = 200;
req.db.readplayer(0).addcredit(saldo);
res.json("O jogador " + req.db.readplayer(0).getName() + " adicionou " + saldo + "R$");
});
// Insere um jogo no bd com o método post
app.post("/jogo", (req: Request, res: express.Response) => {
if (!(req.body.nome && req.body.dev && req.body.producer && req.body.release && req.body.price)) {
......@@ -395,9 +340,5 @@ app.post("/compra/:idJogador/:idJogo", (req: Request, res: express.Response) =>
});
app.get("/teste", (req: Request, res: express.Response) => {
res.json({msg: req.db.list("compras")});
});
app.listen(3000);
console.log("Server listening on port 3000");
{
"compilerOptions": {
"pretty": true,
"target": "es6",
"module": "commonjs",
"noImplicitAny": true,
"experimentalDecorators": true,
"outDir": "dist/"
},
"exclude": [
"node_modules"
],
"compileOnSave": true,
"typeRoots": [
"node_modules/@types"
],
"types": [
"mocha",
"d3-force"
]
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment