Commit 888b2257 authored by Gabriel Silva Hermida's avatar Gabriel Silva Hermida Committed by Richard Fernando Heise Ferreira

Issue #18: Documentação com typedoc

Signed-off-by: Gabriel Silva Hermida's avatarGabriel_S <gash18@inf.ufpr.br>
parent 1e3f8088
Pipeline #22296 passed with stage
in 1 minute and 51 seconds
node_modules/ node_modules/
.nyc_output/ .nyc_output/
coverage/ coverage/
doc/code/
*.swp *.swp
*.swo *.swo
*.tmp *.tmp
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
"start": "node index", "start": "node index",
"lint": "tslint -s node_modules/tslint_stylish -t stylish src/**/*.ts", "lint": "tslint -s node_modules/tslint_stylish -t stylish src/**/*.ts",
"test": "ts-node node_modules/nyc/bin/nyc.js mocha", "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": { "repository": {
"type": "git", "type": "git",
...@@ -38,12 +38,14 @@ ...@@ -38,12 +38,14 @@
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@types/async": "^3.0.3", "@types/async": "^3.0.3",
"@types/chai": "^4.2.4",
"@types/express": "^4.17.1", "@types/express": "^4.17.1",
"@types/pg": "^7.11.2", "@types/pg": "^7.11.2",
"async": "^3.1.0", "async": "^3.1.0",
"body-parser": "^1.19.0", "body-parser": "^1.19.0",
"express": "^4.17.1", "express": "^4.17.1",
"pg": "^7.12.1", "pg": "^7.12.1",
"raml-parser": "^0.8.18",
"ts-node": "^8.4.1", "ts-node": "^8.4.1",
"typescript": "^3.6.3" "typescript": "^3.6.3"
}, },
...@@ -53,9 +55,10 @@ ...@@ -53,9 +55,10 @@
"chai": "^4.2.0", "chai": "^4.2.0",
"mocha": "^6.2.1", "mocha": "^6.2.1",
"nyc": "^14.1.1", "nyc": "^14.1.1",
"raml2html": "^7.4.0",
"supertest": "^4.0.2", "supertest": "^4.0.2",
"tslint": "^5.20.0", "tslint": "^5.20.0",
"typedoc": "^0.15.0", "tslint-stylish": "^2.1.0-beta",
"typedoc-plugin-markdown": "^2.2.11" "typedoc": "^0.15.0"
} }
} }
...@@ -2,12 +2,30 @@ import { Compra } from "./compra"; ...@@ -2,12 +2,30 @@ import { Compra } from "./compra";
import { Jogador } from "./jogador"; import { Jogador } from "./jogador";
import { Jogo } from "./jogo"; import { Jogo } from "./jogo";
/**
* Banco de dados utilizado para armazenar os objetos
* Jogadores, Jogos e Compras.
*/
export class DBHandler { export class DBHandler {
/**
* Banco de jogadores
*/
private jogadores: Jogador[]; private jogadores: Jogador[];
/**
* Banco de jogos
*/
private jogos: Jogo[]; private jogos: Jogo[];
/**
* Banco de compras
*/
private compras: Compra[]; private compras: Compra[];
/**
* Inicializa o banco de dados com alguns jogadores e jogos para casos de teste
*/
constructor() { constructor() {
/** Populando o banco de jogadores com alguns objetos */
this.jogadores = [ this.jogadores = [
/** Jogador 1 com seus atributos -> 2 jogos, um amigo e R$110 */
new Jogador( new Jogador(
"Player1" "Player1"
, [ , [
...@@ -19,53 +37,116 @@ export class DBHandler { ...@@ -19,53 +37,116 @@ export class DBHandler {
] ]
, 110 , 110
) )
/** Jogador 2, 3 e 4 com seus atributos -> 0 jogos, 0 amigo e fundos específicos */
, new Jogador("Player2", [], [], 100) , new Jogador("Player2", [], [], 100)
, new Jogador("Player3", [], [], 400) , new Jogador("Player3", [], [], 400)
, new Jogador("Player4", [], [], 400) , new Jogador("Player4", [], [], 400)
]; ];
/** Populando o banco de jogos com alguns objetos */
this.jogos = [ this.jogos = [
/** Jogos e seus atributos */
new Jogo("Overcooked", "fracasso", "fracasso", new Date("2010-01-01"), 200), new Jogo("Overcooked", "fracasso", "fracasso", new Date("2010-01-01"), 200),
new Jogo("Tera", "FracassoXD", "FracassoXD", new Date("2010-01-01"), 0) new Jogo("Tera", "FracassoXD", "FracassoXD", new Date("2010-01-01"), 0)
]; ];
/** Não houve necessidade de popular */
this.compras = []; this.compras = [];
} }
public createplayer(player: Jogador) { /**
return this.jogadores.push(player); * Insere jogador no banco
* @param player Jogador a ser inserido
*/
public createplayer(player: Jogador): void {
this.jogadores.push(player);
} }
public creategame(game: Jogo) { /**
return this.jogos.push(game); * Insere jogo no banco
* @param game Jogo a ser inserido
*/
public creategame(game: Jogo): void {
this.jogos.push(game);
} }
public createbuy(buy: Compra) { /**
return this.compras.push(buy); * 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 { public readplayer(ID: number): Jogador {
return this.jogadores[ID]; 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 { public readgame(ID: number): Jogo {
return this.jogos[ID]; 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 { public readbuy(ID: number): Compra {
return this.compras[ID]; 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); 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); 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); this.compras.splice(ID, 1, newbuy);
} }
public deleteplayer(ID: number) { /**
return this.jogadores.splice(ID, 1); * Deleta um jogador
* @param ID Posição do jogador a ser deletado
*/
public deleteplayer(ID: number): void {
this.jogadores.splice(ID, 1);
} }
public deletegame(ID: number) { /**
return this.jogos.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);
} }
public deletebuy(ID: number) { /**
return this.compras.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);
} }
public list(argument: string) { /**
* 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[] = []; const nomes: string[] = [];
if (argument === "jogos" ) { if (argument === "jogos" ) {
for (let i = 0; i < this.jogos.length; ++i) { for (let i = 0; i < this.jogos.length; ++i) {
......
/**
* Interface Opções de Compra.
*/
interface CompraOpts { interface CompraOpts {
name: string; name: string;
game: string; game: string;
...@@ -8,18 +11,42 @@ interface CompraOpts { ...@@ -8,18 +11,42 @@ interface CompraOpts {
import { Jogador } from "./jogador"; import { Jogador } from "./jogador";
import { Jogo } from "./jogo"; import { Jogo } from "./jogo";
/**
* Classe que contém informações sobre registros de compra e seus métodos.
*/
export class Compra { export class Compra {
/**
* Atributo jogador que faz a compra
*/
private buyer: Jogador; private buyer: Jogador;
/**
* Atributo jogo que está sendo comprado
*/
private game: Jogo; private game: Jogo;
/**
* Atributo data da compra executada
*/
private date: Date; private date: Date;
/**
* Atributo opcional do alvo da compra
*/
private owner: Jogador; 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.buyer = buyer;
this.game = game; this.game = game;
this.date = date; this.date = date;
this.owner = (owner) ? owner : null; this.owner = (owner) ? owner : null;
} }
/**
* Retorna as informações do registro de compra solicitado
*/
public writeinfo(): CompraOpts { public writeinfo(): CompraOpts {
return { return {
name: this.buyer.getName() name: this.buyer.getName()
...@@ -29,6 +56,9 @@ export class Compra { ...@@ -29,6 +56,9 @@ export class Compra {
, owner: (this.owner === this.buyer) ? this.buyer.getName() : this.owner.getName() , 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{ 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 + "."; 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 { interface JogadorOpts {
name: string; name: string;
jogos: string[]; jogos: string[];
...@@ -7,12 +10,31 @@ interface JogadorOpts { ...@@ -7,12 +10,31 @@ interface JogadorOpts {
import { Jogo } from "./jogo"; import { Jogo } from "./jogo";
/**
* Classe que contém informações sobre o jogador e seus métodos.
*/
export class Jogador { export class Jogador {
/** Atributo nome do jogador
*/
private name: string; private name: string;
/** Atributo jogos do jogador
*/
private jogos: string[]; private jogos: string[];
/** Atributo amigos do jogador
*/
private amigos: string[]; private amigos: string[];
/** Atributo carteira do jogador
*/
private carteira: number; 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.name = name;
this.jogos = []; this.jogos = [];
for (const jogo of jogos) { for (const jogo of jogos) {
...@@ -23,8 +45,10 @@ export class Jogador { ...@@ -23,8 +45,10 @@ export class Jogador {
this.amigos.push(amigo.getName()); this.amigos.push(amigo.getName());
} }
this.carteira = carteira; this.carteira = carteira;
} }
/**
* Retorna informações sobre o jogador solicitado.
*/
public writeinfo(): JogadorOpts { public writeinfo(): JogadorOpts {
return { return {
name: this.name name: this.name
...@@ -33,9 +57,15 @@ export class Jogador { ...@@ -33,9 +57,15 @@ export class Jogador {
, carteira: this.carteira , carteira: this.carteira
}; };
} }
/**
* Retorna no nome do jogador solicitado.
*/
public getName(): string{ public getName(): string{
return this.name; return this.name;
} }
/**
* Retorna o dinheiro do jogador solicitado.
*/
public getmoney(): number { public getmoney(): number {
return this.carteira; return this.carteira;
} }
...@@ -64,13 +94,20 @@ export class Jogador { ...@@ -64,13 +94,20 @@ export class Jogador {
*/ */
return 2; 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.carteira = this.carteira - game.getPrice();
this.jogos.push(game.getName()); 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) => { if (this.amigos.some((value1: string) => {
return value1 === jogador.getName(); return value1 === jogador.getName();
})) { })) {
...@@ -79,8 +116,12 @@ export class Jogador { ...@@ -79,8 +116,12 @@ export class Jogador {
this.amigos.push(jogador.getName()); this.amigos.push(jogador.getName());
return true; 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) => { if (!this.amigos.some((value1: string) => {
return value1 === jogador.getName(); return value1 === jogador.getName();
})) { })) {
...@@ -90,15 +131,31 @@ export class Jogador { ...@@ -90,15 +131,31 @@ export class Jogador {
return true; return true;
} }
/**
* Retorna a biblioteca de jogos do jogador solicitado
*/
public library(): string[] { public library(): string[] {
return this.jogos; 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 { public balance(): string {
return "Balanço da carteira de " + this.name + ": " + this.carteira + "R$"; return "Balanço da carteira de " + this.name + ": " + this.carteira + "R$";
} }
/**
* Retorna os amigos do jogador solicitado
*/
public getAmigos(): string[]{ public getAmigos(): string[]{
return this.amigos; return this.amigos;
} }
......
/**
* Interface Opções de Jogo.
*/
interface JogoOpts { interface JogoOpts {
name: string; name: string;
developer: string; developer: string;
...@@ -6,22 +9,48 @@ interface JogoOpts { ...@@ -6,22 +9,48 @@ interface JogoOpts {
price: number; price: number;
// publisher?: string; // publisher?: string;
} }
/**
* Classe que contém informações sobre o jogo e seus métodos.
*/
export class Jogo { export class Jogo {
/**
* Atributo nome do jogo
*/
private name: string; private name: string;
/**
* Atributo desenvolvedor do jogo
*/
private developer: string; private developer: string;
/**
* Atributo produtor do jogo
*/
private producer: string; private producer: string;
/**
* Atributo data de lançamento do jogo
*/
private release: Date; private release: Date;
/**
* Atributo preço do jogo
*/
private price: number; 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.name = name;
this.developer = developer; this.developer = developer;
this.producer = producer; this.producer = producer;
this.release = release; this.release = release;
this.price = price; this.price = price;
} }
/**
* Retorna as informações do jogo solicitado
*/
public writeinfo(): JogoOpts { public writeinfo(): JogoOpts {
return { return {
name: this.name name: this.name
...@@ -31,18 +60,33 @@ export class Jogo { ...@@ -31,18 +60,33 @@ export class Jogo {
, price: this.price , price: this.price
}; };
} }
/**
* Retorna o nome do jogador solicitado
*/
public getName(): string { public getName(): string {
return this.name; return this.name;
} }
public getDeveloper(){ /**
* Retorna o desenvolvedor do jogo solicitado
*/
public getDeveloper(): string{
return this.developer; return this.developer;
} }
public getProducer(){ /**
* Retorna o produtor do jogo solicitado
*/
public getProducer(): string{
return this.producer; return this.producer;
} }
public getRelease(){ /**
* Retorna a data de lançamento do jogo solicitado
*/
public getRelease(): Date{
return this.release; return this.release;
} }
/**
* Retorna o preço do jogo solicitado
*/
public getPrice(): number { public getPrice(): number {
return this.price; return this.price;
} }
......
...@@ -5,11 +5,16 @@ import { Compra } from "./compra"; ...@@ -5,11 +5,16 @@ import { Compra } from "./compra";
import { DBHandler } from "./DBHandler"; import { DBHandler } from "./DBHandler";
import { Jogador } from "./jogador"; import { Jogador } from "./jogador";
import { Jogo } from "./jogo"; import { Jogo } from "./jogo";
/**
* Interface do banco de dados
*/
export interface Request extends express.Request { export interface Request extends express.Request {
db: DBHandler; 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; export type Middleware = (req: Request, res: express.Response, next: express.NextFunction) => void;
function dbhMW(): Middleware { function dbhMW(): Middleware {
...@@ -99,21 +104,6 @@ app.put("/jogador/:id", (req: Request, res: express.Response) => { ...@@ -99,21 +104,6 @@ app.put("/jogador/:id", (req: Request, res: express.Response) => {
res.json({msg: "O jogador foi atulaizado com sucesso."}); 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 // Retorna os atributos do jogador indexado pelo /:id com o método get
app.get("/jogador/:id", (req: Request, res: express.Response) => { app.get("/jogador/:id", (req: Request, res: express.Response) => {
const id: number = Math.abs(parseInt(req.params.id, 10)); const id: number = Math.abs(parseInt(req.params.id, 10));
...@@ -128,10 +118,6 @@ app.get("/jogador/:id", (req: Request, res: express.Response) => { ...@@ -128,10 +118,6 @@ app.get("/jogador/:id", (req: Request, res: express.Response) => {
res.json(req.db.readplayer(id).writeinfo()); 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) => { app.get("/perfil/:nome", (req: Request, res: express.Response) => {
const ID: number = req.db.list("jogadores").indexOf(req.params.nome); const ID: number = req.db.list("jogadores").indexOf(req.params.nome);
res.json(req.db.readplayer(ID).writeinfo()); res.json(req.db.readplayer(ID).writeinfo());
...@@ -145,41 +131,6 @@ app.get("/jogadores", (req: Request, res: express.Response) => { ...@@ -145,41 +131,6 @@ app.get("/jogadores", (req: Request, res: express.Response) => {
res.json(req.db.list("jogadores")); 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());