Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions modulo6/rodada-cases-semana4/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
node_modules
package-lock.json
build
.env
8 changes: 8 additions & 0 deletions modulo6/rodada-cases-semana4/jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
module.exports = {
roots: ["<rootDir>/tests"],
transform: {
"^.+\\.tsx?$": "ts-jest",
},
testRegex: "(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$",
moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"],
}
31 changes: 31 additions & 0 deletions modulo6/rodada-cases-semana4/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{
"name": "rodada-cases-semana4",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"dev": "ts-node-dev ./src/index.ts",
"start": "tsc && node ./build/index.js",
"test": "jest"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"@types/cors": "^2.8.12",
"@types/express": "^4.17.13",
"@types/knex": "^0.16.1",
"@types/jest": "^28.1.6",
"ts-node-dev": "^2.0.0",
"typescript": "^4.7.4"
},
"dependencies": {
"cors": "^2.8.5",
"dotenv": "^16.0.1",
"express": "^4.18.1",
"jest": "^28.1.3",
"knex": "^2.2.0",
"mysql": "^2.18.1",
"ts-jest": "^28.0.7"
}
}
17 changes: 17 additions & 0 deletions modulo6/rodada-cases-semana4/requests.rest
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
### PEGAR TODOS OS POKEMON
GET http://localhost:3003/pokemon

### PEGAR POKEMON POR NOME
GET http://localhost:3003/pokemon/name/:name

### PEGAR POKEMON POR GERAÇÃO
GET http://localhost:3003/pokemon/generation/0

### PEGAR POKEMON PELO NÚMERO DA POKEDEX
GET http://localhost:3003/pokemon/pokedex/0

### PEGAR POKEMON PELO PRIMEIRO TIPO
GET http://localhost:3003/pokemon/type1/:type1

### PEGAR POKEMON PELO SEGUNDO TIPO
GET http://localhost:3003/pokemon/type2/:type2
21 changes: 21 additions & 0 deletions modulo6/rodada-cases-semana4/src/app.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import express, { Express } from 'express'
import cors from 'cors'
import { AddressInfo } from "net"
import dotenv from 'dotenv'
dotenv.config()

const app: Express = express()

app.use(express.json())
app.use(cors())

const server = app.listen(process.env.PORT || 3003, () => {
if (server) {
const address = server.address() as AddressInfo;
console.log(`Server is running in http://localhost: ${address.port}`)
} else {
console.error(`Failure upon starting server.`)
}
})

export default app
85 changes: 85 additions & 0 deletions modulo6/rodada-cases-semana4/src/business/PokemonBusiness.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
import { PokemonDatabase } from "../data/PokemonDatabase";
import { Pokemon } from "../model/Pokemon";

export class PokemonBusiness {
constructor(
private pokemonDatabase: PokemonDatabase
) { }
getAllPokemon = async (page: number): Promise<Pokemon[] | undefined> => {
try {
const size = 10
let offset = (page - 1) * size
if (page < 1 || page > 83) {
throw new Error("Insira um valor válido de 1 a 83")
} else if (page) {
const result = await this.pokemonDatabase.getAllPokemon(size, offset)
return result
} else if (!page) {
const result = await this.pokemonDatabase.getAllPokemon()
return result
}

} catch (error: any) {
throw new Error(error.sqlMessage || error.message)
}
}
getPokemonByName = async (name: string): Promise<Pokemon | undefined> => {
try {
if (!name || name === ":name") {
throw new Error("Insira um nome de pokemon")
}
const pokemonDb = await this.pokemonDatabase.getPokemonByName(name)
return pokemonDb
} catch (error: any) {
throw new Error(error.sqlMessage || error.message)
}
}
getPokemonByGeneration = async (generation: number): Promise<Pokemon[] | undefined> => {
try {
if (!generation || generation === 0) {
throw new Error("Insira uma geração")
}
if (generation > 7) {
throw new Error("Insira um número de 1 a 7")
}
const pokemonDb = await this.pokemonDatabase.getPokemonByGeneration(generation)
return pokemonDb
} catch (error: any) {
throw new Error(error.sqlMessage || error.message)
}

}
getPokemonByPokedexNumber = async (pokedex_number: number): Promise<Pokemon[]> => {
try {
if (!pokedex_number || pokedex_number === 0) {
throw new Error("Insira um número de pokedex para buscar o pokemon referente")
}
const pokemonDb = await this.pokemonDatabase.getPokemonByPokedexNumber(pokedex_number)
return pokemonDb
} catch (error: any) {
throw new Error(error.sqlMessage || error.message)
}
}
getPokemonByType1 = async (type1: string): Promise<Pokemon[]> => {
try {
if (!type1 || type1 === ":type1") {
throw new Error("Insira o primeiro tipo do pokemon que deseja buscar")
}
const pokemonDb = await this.pokemonDatabase.getPokemonByType1(type1)
return pokemonDb
} catch (error: any) {
throw new Error(error.sqlMessage || error.message)
}
}
getPokemonByType2 = async (type2: string): Promise<Pokemon[]> => {
try {
if (!type2 || type2 === ":type2") {
throw new Error("Insira o segundo tipo do pokemon que deseja buscar")
}
const pokemonDb = await this.pokemonDatabase.getPokemonByType2(type2)
return pokemonDb
} catch (error: any) {
throw new Error(error.sqlMessage || error.message)
}
}
}
63 changes: 63 additions & 0 deletions modulo6/rodada-cases-semana4/src/controller/PokemonController.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import { Request, Response } from "express"
import { PokemonBusiness } from "../business/PokemonBusiness"

export class PokemonController {
constructor(
private pokemonBusiness: PokemonBusiness
) { }
getAllPokemon = async (req: Request, res: Response) => {
try {
let page = Number(req.query.page)
const result = await this.pokemonBusiness.getAllPokemon(page)
res.status(200).send(result)
} catch (error: any) {
res.status(500).send({ message: error.message })
}
}
getPokemonByName = async (req: Request, res: Response) => {
try {
const { name } = req.params
const pokemon = await this.pokemonBusiness.getPokemonByName(name)
res.status(200).send(pokemon)
} catch (error: any) {
res.status(500).send({ message: error.message })
}
}
getPokemonByGeneration = async (req: Request, res: Response) => {
try {
const generation = Number(req.params.generation)
const pokemon = await this.pokemonBusiness.getPokemonByGeneration(generation)
res.status(200).send(pokemon)
} catch (error: any) {
res.status(500).send({ message: error.message })
}
}
getPokemonByPokedexNumber = async (req: Request, res: Response) => {
try {
const pokedex_number = Number(req.params.pokedex_number)
const pokemon = await this.pokemonBusiness.getPokemonByPokedexNumber(pokedex_number)
res.status(200).send(pokemon)
} catch (error: any) {
res.status(500).send({ message: error.message })
}
}
getPokemonByType1 = async (req: Request, res: Response) => {
try {
const { type1 } = req.params

const pokemon = await this.pokemonBusiness.getPokemonByType1(type1)
res.status(200).send(pokemon)
} catch (error: any) {
res.status(500).send({ message: error.message })
}
}
getPokemonByType2 = async (req: Request, res: Response) => {
try {
const { type2 } = req.params
const pokemon = await this.pokemonBusiness.getPokemonByType2(type2)
res.status(200).send(pokemon)
} catch (error: any) {
res.status(500).send({ message: error.message })
}
}
}
16 changes: 16 additions & 0 deletions modulo6/rodada-cases-semana4/src/data/BaseDatabase.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import knex, {Knex} from "knex"
import dotenv from "dotenv"
dotenv.config()

export class BaseDatabase {
protected static connection: Knex = knex({
client: "mysql",
connection: {
host: process.env.DB_HOST,
port: 3306,
user: process.env.DB_USER,
password: process.env.DB_PASS,
database: process.env.DB_NAME
}
})
}
68 changes: 68 additions & 0 deletions modulo6/rodada-cases-semana4/src/data/PokemonDatabase.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import { Pokemon } from "../model/Pokemon"
import { BaseDatabase } from "./BaseDatabase"

export class PokemonDatabase extends BaseDatabase {
protected TABLE_NAME = 'mytable'

getAllPokemon = async (size?: any, offset?: any): Promise<Pokemon[]> => {
try {
const result = await BaseDatabase.connection(this.TABLE_NAME)
.select("*")
.limit(size)
.offset(offset)
return result
} catch (error: any) {
throw new Error(error.sqlMessage || error.message)
}
}
getPokemonByName = async (name: string): Promise<Pokemon> => {
try {
const [result] = await BaseDatabase.connection(this.TABLE_NAME)
.select("*")
.where({ name })
return result
} catch (error: any) {
throw new Error(error.sqlMessage || error.message)
}
}
getPokemonByGeneration = async (generation: number) => {
try {
const result: Pokemon[] = await BaseDatabase.connection(this.TABLE_NAME)
.select("*")
.where({ generation })
return result
} catch (error: any) {
throw new Error(error.sqlMessage || error.message)
}
}
getPokemonByPokedexNumber = async (pokedex_number: number) => {
try {
const result: Pokemon[] = await BaseDatabase.connection(this.TABLE_NAME)
.select("*")
.where({ pokedex_number })
return result
} catch (error: any) {
throw new Error(error.sqlMessage || error.message)
}
}
getPokemonByType1 = async (type1: string) => {
try {
const result: Pokemon[] = await BaseDatabase.connection(this.TABLE_NAME)
.select("*")
.where({ type1 })
return result
} catch (error: any) {
throw new Error(error.sqlMessage || error.message)
}
}
getPokemonByType2 = async (type2: string) => {
try {
const result: Pokemon[] = await BaseDatabase.connection(this.TABLE_NAME)
.select("*")
.where({ type2 })
return result
} catch (error: any) {
throw new Error(error.sqlMessage || error.message)
}
}
}
5 changes: 5 additions & 0 deletions modulo6/rodada-cases-semana4/src/error/CustomError.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export class CustomError extends Error {
constructor(public code: number, public message: string) {
super(message)
}
}
17 changes: 17 additions & 0 deletions modulo6/rodada-cases-semana4/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import app from "./app"
import { PokemonBusiness } from "./business/PokemonBusiness"
import { PokemonController } from "./controller/PokemonController"
import { PokemonDatabase } from "./data/PokemonDatabase"

const pokemonController = new PokemonController(
new PokemonBusiness(
new PokemonDatabase
)
)

app.get("/pokemon", pokemonController.getAllPokemon)
app.get("/pokemon/name/:name", pokemonController.getPokemonByName)
app.get("/pokemon/generation/:generation", pokemonController.getPokemonByGeneration)
app.get("/pokemon/pokedex/:pokedex_number", pokemonController.getPokemonByPokedexNumber)
app.get("/pokemon/type1/:type1", pokemonController.getPokemonByType1)
app.get("/pokemon/type2/:type2", pokemonController.getPokemonByType2)
32 changes: 32 additions & 0 deletions modulo6/rodada-cases-semana4/src/model/Pokemon.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
export interface Pokemon {
id: number,
name: string,
pokedex_number: number,
img_name: string,
generation: number,
evolution_stage: string | null,
evolved: number,
family_id: number | null,
cross_gen: number,
type1: string,
type2: string | null,
weather1: string,
weather2: string | null,
stat_total: number,
atk: number,
def: number,
sta: number,
legendary: number,
aquireable: number,
spawns: number,
regional: number,
raidable: number,
hatchable: number,
shiny: number,
nest: number,
new: number,
not_gettable: number,
future_evolve: number,
full_cp_at_forty: number,
full_cp_at_thirty_nine: number
}
Loading