From 5cf38a910f2fc9b5d4ae6dbb606702441d805281 Mon Sep 17 00:00:00 2001 From: Vsux Date: Wed, 11 May 2022 19:32:23 -0200 Subject: [PATCH 1/2] testes backend --- modulo5/testes-backend/.gitignore | 6 ++ modulo5/testes-backend/jest.config.js | 8 ++ modulo5/testes-backend/package.json | 36 +++++++++ .../src/business/UserBusiness.ts | 35 +++++++++ .../src/controller/UserController.ts | 22 ++++++ .../testes-backend/src/data/BaseDatabase.ts | 23 ++++++ .../testes-backend/src/data/UserDatabase.ts | 74 +++++++++++++++++++ .../testes-backend/src/errors/CustomErrors.ts | 8 ++ modulo5/testes-backend/src/index.ts | 18 +++++ modulo5/testes-backend/src/model/User.ts | 47 ++++++++++++ .../testes-backend/src/router/UserRouter.ts | 6 ++ .../src/services/hashGenerator.ts | 16 ++++ .../src/services/idGenerator.ts | 9 +++ .../src/services/tokenGenerator.ts | 35 +++++++++ .../src/test/mocks/hashGeneratorMock.ts | 14 ++++ .../src/test/mocks/idGeneratorMock.ts | 5 ++ .../src/test/mocks/tokenGenerator.ts | 21 ++++++ .../src/test/mocks/userDatabaseMock.ts | 6 ++ modulo5/testes-backend/src/test/user.test.ts | 47 ++++++++++++ modulo5/testes-backend/src/tsconfig.json | 19 +++++ 20 files changed, 455 insertions(+) create mode 100644 modulo5/testes-backend/.gitignore create mode 100644 modulo5/testes-backend/jest.config.js create mode 100644 modulo5/testes-backend/package.json create mode 100644 modulo5/testes-backend/src/business/UserBusiness.ts create mode 100644 modulo5/testes-backend/src/controller/UserController.ts create mode 100644 modulo5/testes-backend/src/data/BaseDatabase.ts create mode 100644 modulo5/testes-backend/src/data/UserDatabase.ts create mode 100644 modulo5/testes-backend/src/errors/CustomErrors.ts create mode 100644 modulo5/testes-backend/src/index.ts create mode 100644 modulo5/testes-backend/src/model/User.ts create mode 100644 modulo5/testes-backend/src/router/UserRouter.ts create mode 100644 modulo5/testes-backend/src/services/hashGenerator.ts create mode 100644 modulo5/testes-backend/src/services/idGenerator.ts create mode 100644 modulo5/testes-backend/src/services/tokenGenerator.ts create mode 100644 modulo5/testes-backend/src/test/mocks/hashGeneratorMock.ts create mode 100644 modulo5/testes-backend/src/test/mocks/idGeneratorMock.ts create mode 100644 modulo5/testes-backend/src/test/mocks/tokenGenerator.ts create mode 100644 modulo5/testes-backend/src/test/mocks/userDatabaseMock.ts create mode 100644 modulo5/testes-backend/src/test/user.test.ts create mode 100644 modulo5/testes-backend/src/tsconfig.json diff --git a/modulo5/testes-backend/.gitignore b/modulo5/testes-backend/.gitignore new file mode 100644 index 0000000..de8f926 --- /dev/null +++ b/modulo5/testes-backend/.gitignore @@ -0,0 +1,6 @@ +node_modules/ +build/ +.vscode/ +package-lock.json +.env +.rest \ No newline at end of file diff --git a/modulo5/testes-backend/jest.config.js b/modulo5/testes-backend/jest.config.js new file mode 100644 index 0000000..4c4051b --- /dev/null +++ b/modulo5/testes-backend/jest.config.js @@ -0,0 +1,8 @@ +module.exports = { + roots: ["/tests"], + transform: { + "^.+\\.tsx?$": "ts-jest", + }, + testRegex: "(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$", + moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"], + }; \ No newline at end of file diff --git a/modulo5/testes-backend/package.json b/modulo5/testes-backend/package.json new file mode 100644 index 0000000..6fa500a --- /dev/null +++ b/modulo5/testes-backend/package.json @@ -0,0 +1,36 @@ +{ + "name": "labook", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "start": "tsc && node --inspect ./build/index.js", + "dev": "ts-node-dev ./src/index.ts", + "test": "node ./node_modules/jest/bin/jest.js" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@types/cors": "^2.8.12", + "@types/jsonwebtoken": "^8.5.8", + "bcryptjs": "^2.4.3", + "cors": "^2.8.5", + "dotenv": "^16.0.0", + "jest": "^28.1.0", + "jsonwebtoken": "^8.5.1", + "knex": "^2.0.0", + "mysql": "^2.18.1", + "ts-jest": "^28.0.2", + "uuid": "^8.3.2" + }, + "devDependencies": { + "@types/bcryptjs": "^2.4.2", + "@types/express": "^4.17.13", + "@types/jest": "^27.5.0", + "@types/uuid": "^8.3.4", + "express": "^4.18.1", + "ts-node-dev": "^1.1.8", + "typescript": "^4.6.4" + } + } \ No newline at end of file diff --git a/modulo5/testes-backend/src/business/UserBusiness.ts b/modulo5/testes-backend/src/business/UserBusiness.ts new file mode 100644 index 0000000..c236843 --- /dev/null +++ b/modulo5/testes-backend/src/business/UserBusiness.ts @@ -0,0 +1,35 @@ +import { CustomError } from "../errors/CustomError"; +import { User, stringToUserRole } from "../model/User"; +import userDatabase, { UserDatabase } from "../data/UserDatabase"; +import hashGenerator, { HashGenerator } from "../services/hashGenerator"; +import idGenerator, { IdGenerator } from "../services/idGenerator"; +import tokenGenerator, { TokenGenerator } from "../services/tokenGenerator"; + +export class UserBusiness { + constructor( + private userDatabase: UserDatabase, + private idGenerator:IdGenerator, + private tokenGenerator: TokenGenerator, + private hashGenerator: HashGenerator + + ){} + + public async getIDBusiness(id: string) { + + try { + + const getuser = await userDatabase.getUserById(id); + + if (!getuser) { + throw new CustomError(401, "Usuário inválido"); + } + + + return { getuser}; + } catch (error: any) { + throw new CustomError(error.statusCode, error.message) + } + } +} + +export default UserBusiness; \ No newline at end of file diff --git a/modulo5/testes-backend/src/controller/UserController.ts b/modulo5/testes-backend/src/controller/UserController.ts new file mode 100644 index 0000000..487f6e9 --- /dev/null +++ b/modulo5/testes-backend/src/controller/UserController.ts @@ -0,0 +1,22 @@ + +import { Request, Response } from "express"; +import UserBusiness from "../business/UserBusiness"; + +export class UserController { + + + public async getID(req: Request, res: Response) { + try { + const id = req.params.id + + const result = await UserBusiness.getIDBusiness(id); + + res.status(200).send(result); + } catch (error: any) { + res.status(400).send({ error: error.message }); + } + } + +} + +export default new UserController() \ No newline at end of file diff --git a/modulo5/testes-backend/src/data/BaseDatabase.ts b/modulo5/testes-backend/src/data/BaseDatabase.ts new file mode 100644 index 0000000..a1d4162 --- /dev/null +++ b/modulo5/testes-backend/src/data/BaseDatabase.ts @@ -0,0 +1,23 @@ +import dotenv from "dotenv"; +import knex from "knex"; + +dotenv.config(); + +export default class BaseDataBase { + + protected static connection = knex({ + client: "mysql", + connection: { + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_SCHEMA, + port: 3306, + multipleStatements: true + }, + }); + + public static async destroyConnection(): Promise { + await BaseDataBase.connection.destroy(); + } +} \ No newline at end of file diff --git a/modulo5/testes-backend/src/data/UserDatabase.ts b/modulo5/testes-backend/src/data/UserDatabase.ts new file mode 100644 index 0000000..81ee13e --- /dev/null +++ b/modulo5/testes-backend/src/data/UserDatabase.ts @@ -0,0 +1,74 @@ +import BaseDataBase from "./BaseDatabase"; +import { User } from "../model/User"; + +export class UserDatabase extends BaseDataBase { + + protected tableName: string = "User_Arqu"; + + private toModel(dbModel?: any): User | undefined { + return ( + dbModel && + new User( + dbModel.id, + dbModel.name, + dbModel.email, + dbModel.password, + dbModel.role + ) + ); + } + + public async createUser(user: User): Promise { + try { + await BaseDataBase.connection.raw(` + INSERT INTO ${this.tableName} (id, name, email, password, role) + VALUES ( + '${user.getId()}', + '${user.getName()}', + '${user.getEmail()}', + '${user.getPassword()}', + '${user.getRole()}' + )` + ); + } catch (error: any) { + throw new Error(error.sqlMessage || error.message) + } + } + + public async getUserByEmail(email: string): Promise { + try { + const result = await BaseDataBase.connection.raw(` + SELECT * from ${this.tableName} WHERE email = '${email}' + `); + return this.toModel(result[0][0]); + } catch (error: any) { + throw new Error(error.sqlMessage || error.message) + } + } + + public async getUserById(id: string): Promise { + try { + const result = await BaseDataBase.connection.raw(` + SELECT * from ${this.tableName} WHERE id = '${id}' + `); + return this.toModel(result[0][0]); + } catch (error: any) { + throw new Error(error.sqlMessage || error.message) + } + } + + public async getAllUsers(): Promise { + try { + const result = await BaseDataBase.connection.raw(` + SELECT * from ${this.tableName} + `); + return result[0].map((res: any) => { + return this.toModel(res); + }); + } catch (error: any) { + throw new Error(error.sqlMessage || error.message) + } + } +} + +export default new UserDatabase() \ No newline at end of file diff --git a/modulo5/testes-backend/src/errors/CustomErrors.ts b/modulo5/testes-backend/src/errors/CustomErrors.ts new file mode 100644 index 0000000..0997eb7 --- /dev/null +++ b/modulo5/testes-backend/src/errors/CustomErrors.ts @@ -0,0 +1,8 @@ +export class CustomError extends Error { + constructor( + public statusCode: number, + message: string + ) { + super(message); + } + } \ No newline at end of file diff --git a/modulo5/testes-backend/src/index.ts b/modulo5/testes-backend/src/index.ts new file mode 100644 index 0000000..4599d47 --- /dev/null +++ b/modulo5/testes-backend/src/index.ts @@ -0,0 +1,18 @@ +import express from "express"; +import {AddressInfo} from "net"; +import { userRouter } from "./router/UserRouter"; + +const app = express(); + +app.use(express.json()); + +app.use("/users", userRouter); + +const server = app.listen(3003, () => { + if (server) { + const address = server.address() as AddressInfo; + console.log(`Servidor rodando em http://localhost:${address.port}`); + } else { + console.error(`Falha ao rodar o servidor.`); + } +}); \ No newline at end of file diff --git a/modulo5/testes-backend/src/model/User.ts b/modulo5/testes-backend/src/model/User.ts new file mode 100644 index 0000000..16d1165 --- /dev/null +++ b/modulo5/testes-backend/src/model/User.ts @@ -0,0 +1,47 @@ +import { CustomError } from "../errors/CustomError"; + +export class User { + constructor( + private id: string, + private name: string, + private email: string, + private password: string, + private role: USER_ROLES + ) { } + + public getId(): string { + return this.id; + } + + public getName(): string { + return this.name; + } + + public getEmail(): string { + return this.email; + } + + public getPassword(): string { + return this.password; + } + + public getRole(): USER_ROLES { + return this.role; + } +} + +export const stringToUserRole = (input: string): USER_ROLES => { + switch (input) { + case "NORMAL": + return USER_ROLES.NORMAL; + case "ADMIN": + return USER_ROLES.ADMIN; + default: + throw new CustomError(422, "Invalid user role"); + } +}; + +export enum USER_ROLES { + NORMAL = "NORMAL", + ADMIN = "ADMIN", +} \ No newline at end of file diff --git a/modulo5/testes-backend/src/router/UserRouter.ts b/modulo5/testes-backend/src/router/UserRouter.ts new file mode 100644 index 0000000..bfb4b24 --- /dev/null +++ b/modulo5/testes-backend/src/router/UserRouter.ts @@ -0,0 +1,6 @@ +import express from "express"; +import userController from "../controller/UserController"; + +export const userRouter = express.Router(); + +userRouter.get("/profile/:id", userController.getID); \ No newline at end of file diff --git a/modulo5/testes-backend/src/services/hashGenerator.ts b/modulo5/testes-backend/src/services/hashGenerator.ts new file mode 100644 index 0000000..cf55f30 --- /dev/null +++ b/modulo5/testes-backend/src/services/hashGenerator.ts @@ -0,0 +1,16 @@ +import bcrypt from "bcryptjs"; + +export class HashGenerator { + public hash = async (s: string): Promise => { + const rounds: number = Number(process.env.BCRYPT_COST) + const salt = await bcrypt.genSalt(rounds) + const result = await bcrypt.hash(s, salt) + return result + } + + public compareHash = async (s: string, hash: string): Promise => { + return bcrypt.compare(s, hash) + } +} + +export default new HashGenerator() \ No newline at end of file diff --git a/modulo5/testes-backend/src/services/idGenerator.ts b/modulo5/testes-backend/src/services/idGenerator.ts new file mode 100644 index 0000000..a117c92 --- /dev/null +++ b/modulo5/testes-backend/src/services/idGenerator.ts @@ -0,0 +1,9 @@ +import { v4 } from "uuid"; + +export class IdGenerator { + public generate(): string { + return v4(); + } +} + +export default new IdGenerator() \ No newline at end of file diff --git a/modulo5/testes-backend/src/services/tokenGenerator.ts b/modulo5/testes-backend/src/services/tokenGenerator.ts new file mode 100644 index 0000000..7d13b41 --- /dev/null +++ b/modulo5/testes-backend/src/services/tokenGenerator.ts @@ -0,0 +1,35 @@ +import * as jwt from "jsonwebtoken"; +import dotenv from "dotenv"; + +dotenv.config(); + +export class TokenGenerator { + private static expiresIn: number = 1200; + + public generate = (input: AuthenticationData): string => { + const newToken = jwt.sign( + { + id: input.id, + role: input.role, + }, + process.env.JWT_KEY as string, + { + expiresIn: TokenGenerator.expiresIn, + } + ); + return newToken; + }; + + public verify(token: string) { + const payload = jwt.verify(token, process.env.JWT_KEY as string) as any; + const result = { id: payload.id, role: payload.role }; + return result; + } +} + +export interface AuthenticationData { + id: string; + role: string; +} + +export default new TokenGenerator() \ No newline at end of file diff --git a/modulo5/testes-backend/src/test/mocks/hashGeneratorMock.ts b/modulo5/testes-backend/src/test/mocks/hashGeneratorMock.ts new file mode 100644 index 0000000..fce34fe --- /dev/null +++ b/modulo5/testes-backend/src/test/mocks/hashGeneratorMock.ts @@ -0,0 +1,14 @@ +import bcrypt from "bcryptjs"; + +export class HashGeneratorMock { + public hash = async (s: string): Promise => { + + return "hash" + } + + public compareHash = async (s: string, hash: string): Promise => { + return s === hash + } +} + +export default new HashGeneratorMock() \ No newline at end of file diff --git a/modulo5/testes-backend/src/test/mocks/idGeneratorMock.ts b/modulo5/testes-backend/src/test/mocks/idGeneratorMock.ts new file mode 100644 index 0000000..a18cbb9 --- /dev/null +++ b/modulo5/testes-backend/src/test/mocks/idGeneratorMock.ts @@ -0,0 +1,5 @@ +export class IdGeneratorMock { + public generate(): string { + return "id_mockado" + } +} \ No newline at end of file diff --git a/modulo5/testes-backend/src/test/mocks/tokenGenerator.ts b/modulo5/testes-backend/src/test/mocks/tokenGenerator.ts new file mode 100644 index 0000000..ff4f3f4 --- /dev/null +++ b/modulo5/testes-backend/src/test/mocks/tokenGenerator.ts @@ -0,0 +1,21 @@ +import * as jwt from "jsonwebtoken"; +import { USER_ROLES } from "../../model/User"; +import { AuthenticationData } from "../../services/tokenGenerator"; + +export class TokenGeneratorMock { + private static expiresIn: number = 1200; + + public generate = (input: AuthenticationData): string => { + + return "token_mockado"; + }; + + public verify(token: string) { + return { + id: "id_mockado", + role: USER_ROLES.NORMAL + } + } + } + + export default new TokenGeneratorMock() \ No newline at end of file diff --git a/modulo5/testes-backend/src/test/mocks/userDatabaseMock.ts b/modulo5/testes-backend/src/test/mocks/userDatabaseMock.ts new file mode 100644 index 0000000..a7c3027 --- /dev/null +++ b/modulo5/testes-backend/src/test/mocks/userDatabaseMock.ts @@ -0,0 +1,6 @@ +import BaseDataBase from "../../data/BaseDatabase"; +import { User } from "../../model/User"; + +export class UserDatabaseMock{ + public async getUserById(id: string): Promise {} +} \ No newline at end of file diff --git a/modulo5/testes-backend/src/test/user.test.ts b/modulo5/testes-backend/src/test/user.test.ts new file mode 100644 index 0000000..b475679 --- /dev/null +++ b/modulo5/testes-backend/src/test/user.test.ts @@ -0,0 +1,47 @@ +import UserBusiness from "../src/business/UserBusiness" +import { HashGeneratorMock } from "./mocks/hashGeneratorMock" +import { IdGeneratorMock } from "./mocks/idGeneratorMock" +import { TokenGeneratorMock } from "./mocks/tokenGeneratorMock" +import { UserDatabaseMock } from "./mocks/userDatabaseMock" + +const userBusinessMock = new UserBusiness( + new UserDatabaseMock() as any, + new IdGeneratorMock(), + new TokenGeneratorMock(), + new HashGeneratorMock() +) + +describe("Testando usuário não existente", () => { + + test("usuário não existente", async () => { + expect.assertions(2) + + try { + await userBusinessMock.getIDBusiness("654") + } catch (error: any) { + expect(error.statusCode).toBe(401) + expect(error.message).toBe("Usuário inválido") + } + }) + test("usuário existente", async () => { + expect.assertions + + try { + const getUserById = jest.fn( + (id: string) => userBusinessMock.getIDBusiness(id) + ) + + const result = await getUserById("id_mockado") + + expect(getUserById).toHaveBeenCalledWith("id_mockado") + expect(result).toEqual({ + id: "id_mockado", + name: "astrodev", + email: "astrodev@gmail.com", + role: "ADMIN", + }) + } catch (error: any) { + console.log(error.message) + } + }) +}) \ No newline at end of file diff --git a/modulo5/testes-backend/src/tsconfig.json b/modulo5/testes-backend/src/tsconfig.json new file mode 100644 index 0000000..97da593 --- /dev/null +++ b/modulo5/testes-backend/src/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "es6", + "module": "commonjs", + "sourceMap": true, + "outDir": "./build", + "rootDir": "./", + "removeComments": true, + "strict": true, + "noImplicitAny": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true + + // "typeRoots": [ + // "./custom_typings", + // "./node_modules/@types" + // ] + } + } \ No newline at end of file From bbbe40859ea726e42e4f07a925b2737c552030bd Mon Sep 17 00:00:00 2001 From: Vsux Date: Tue, 17 May 2022 10:50:20 -0200 Subject: [PATCH 2/2] . --- .../projeto-whatslab/src/EntradaTexto.js | 10 ++ .../IWFSToDoList/IWFSToDoList/src/app.js | 20 +++ .../IWFSToDoList/src/connection.js | 20 +++ .../IWFSToDoList/IWFSToDoList/src/index.js | 130 ++++++++++++++++++ modulo4/LabECommerce/src/data/connection.js | 20 +++ .../src/endpoints/Purchases/purchases.js | 32 +++++ .../src/endpoints/User/createUser.js | 35 +++++ .../src/endpoints/User/searchUser.js | 28 ++++ .../src/endpoints/products/siginProducts.js | 42 ++++++ modulo4/LabECommerce/src/index.js | 26 ++++ modulo4/ListaTypescript/index.js | 1 - modulo4/ListaTypescript/src/index.js | 54 ++++++++ modulo4/apis-rest/src/data.js | 47 +++++++ modulo4/apis-rest/src/index.js | 51 +++++++ modulo4/aprofundamento-express/src/index.js | 75 ++++++++++ modulo4/aprofundamento-sql/connection.js | 10 ++ .../src/exercicio-4.js | 16 +++ .../aprofundamento-typescript/src/index.js | 54 ++++++++ modulo4/async-await-promises/src/app.js | 20 +++ .../async-await-promises/src/connection.js | 20 +++ .../src/constants/baseURL.js | 4 + .../src/constants/types.js | 2 + modulo4/async-await-promises/src/index.js | 71 ++++++++++ .../src/data/connection.js | 20 +++ modulo4/classes-encapsulamento/src/index.js | 68 +++++++++ .../src/app.js | 20 +++ .../src/data/connection.js | 20 +++ .../src/data/migrations.js | 44 ++++++ .../src/endpoints/getAllRecipes.js | 111 +++++++++++++++ .../src/index.js | 7 + .../src/types.js | 2 + modulo4/fluxo-de-dados-backend/src/data.js | 25 ++++ modulo4/fluxo-de-dados-backend/src/index.js | 110 +++++++++++++++ modulo4/intro-express/src/index.js | 83 +++++++++++ modulo4/knex-js/src/connection.js | 21 +++ modulo4/knex-js/src/index.js | 98 +++++++++++++ .../src/endpoints/createUser.js | 31 +++++ modulo4/servicos-backend/src/index.js | 23 ++++ .../src/services/getAdressInfo.js | 35 +++++ modulo4/servicos-backend/src/types/Addres.js | 2 + modulo4/sistema-bancario/src/data.js | 19 +++ modulo4/sistema-bancario/src/index.js | 127 +++++++++++++++++ .../src/business/UserBusiness.ts | 3 + 43 files changed, 1656 insertions(+), 1 deletion(-) create mode 100644 modulo2/projeto-whatslab/projeto-whatslab/src/EntradaTexto.js create mode 100644 modulo4/IWFSToDoList/IWFSToDoList/IWFSToDoList/src/app.js create mode 100644 modulo4/IWFSToDoList/IWFSToDoList/IWFSToDoList/src/connection.js create mode 100644 modulo4/IWFSToDoList/IWFSToDoList/IWFSToDoList/src/index.js create mode 100644 modulo4/LabECommerce/src/data/connection.js create mode 100644 modulo4/LabECommerce/src/endpoints/Purchases/purchases.js create mode 100644 modulo4/LabECommerce/src/endpoints/User/createUser.js create mode 100644 modulo4/LabECommerce/src/endpoints/User/searchUser.js create mode 100644 modulo4/LabECommerce/src/endpoints/products/siginProducts.js create mode 100644 modulo4/LabECommerce/src/index.js create mode 100644 modulo4/ListaTypescript/src/index.js create mode 100644 modulo4/apis-rest/src/data.js create mode 100644 modulo4/apis-rest/src/index.js create mode 100644 modulo4/aprofundamento-express/src/index.js create mode 100644 modulo4/aprofundamento-sql/connection.js create mode 100644 modulo4/aprofundamento-typescript/src/exercicio-4.js create mode 100644 modulo4/aprofundamento-typescript/src/index.js create mode 100644 modulo4/async-await-promises/src/app.js create mode 100644 modulo4/async-await-promises/src/connection.js create mode 100644 modulo4/async-await-promises/src/constants/baseURL.js create mode 100644 modulo4/async-await-promises/src/constants/types.js create mode 100644 modulo4/async-await-promises/src/index.js create mode 100644 modulo4/classes-encapsulamento/src/data/connection.js create mode 100644 modulo4/classes-encapsulamento/src/index.js create mode 100644 modulo4/filtros-ordenacao-paginacao/template-filtros-ordenacao-paginacao/src/app.js create mode 100644 modulo4/filtros-ordenacao-paginacao/template-filtros-ordenacao-paginacao/src/data/connection.js create mode 100644 modulo4/filtros-ordenacao-paginacao/template-filtros-ordenacao-paginacao/src/data/migrations.js create mode 100644 modulo4/filtros-ordenacao-paginacao/template-filtros-ordenacao-paginacao/src/endpoints/getAllRecipes.js create mode 100644 modulo4/filtros-ordenacao-paginacao/template-filtros-ordenacao-paginacao/src/index.js create mode 100644 modulo4/filtros-ordenacao-paginacao/template-filtros-ordenacao-paginacao/src/types.js create mode 100644 modulo4/fluxo-de-dados-backend/src/data.js create mode 100644 modulo4/fluxo-de-dados-backend/src/index.js create mode 100644 modulo4/intro-express/src/index.js create mode 100644 modulo4/knex-js/src/connection.js create mode 100644 modulo4/knex-js/src/index.js create mode 100644 modulo4/servicos-backend/src/endpoints/createUser.js create mode 100644 modulo4/servicos-backend/src/index.js create mode 100644 modulo4/servicos-backend/src/services/getAdressInfo.js create mode 100644 modulo4/servicos-backend/src/types/Addres.js create mode 100644 modulo4/sistema-bancario/src/data.js create mode 100644 modulo4/sistema-bancario/src/index.js diff --git a/modulo2/projeto-whatslab/projeto-whatslab/src/EntradaTexto.js b/modulo2/projeto-whatslab/projeto-whatslab/src/EntradaTexto.js new file mode 100644 index 0000000..721781d --- /dev/null +++ b/modulo2/projeto-whatslab/projeto-whatslab/src/EntradaTexto.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.EntradaTexto = void 0; +const react_1 = require("react"); +class EntradaTexto extends react_1.Component { + render() { + return (); + } +} +exports.EntradaTexto = EntradaTexto; diff --git a/modulo4/IWFSToDoList/IWFSToDoList/IWFSToDoList/src/app.js b/modulo4/IWFSToDoList/IWFSToDoList/IWFSToDoList/src/app.js new file mode 100644 index 0000000..b41b99b --- /dev/null +++ b/modulo4/IWFSToDoList/IWFSToDoList/IWFSToDoList/src/app.js @@ -0,0 +1,20 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const express_1 = __importDefault(require("express")); +const cors_1 = __importDefault(require("cors")); +const app = (0, express_1.default)(); +app.use(express_1.default.json()); +app.use((0, cors_1.default)()); +const server = app.listen(process.env.PORT || 3003, () => { + if (server) { + const address = server.address(); + console.log(`Server is running in http://localhost:${address.port}`); + } + else { + console.error(`Failure upon starting server.`); + } +}); +exports.default = app; diff --git a/modulo4/IWFSToDoList/IWFSToDoList/IWFSToDoList/src/connection.js b/modulo4/IWFSToDoList/IWFSToDoList/IWFSToDoList/src/connection.js new file mode 100644 index 0000000..08b23d5 --- /dev/null +++ b/modulo4/IWFSToDoList/IWFSToDoList/IWFSToDoList/src/connection.js @@ -0,0 +1,20 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const knex_1 = __importDefault(require("knex")); +const dotenv_1 = __importDefault(require("dotenv")); +dotenv_1.default.config(); +const connection = (0, knex_1.default)({ + client: "mysql", + connection: { + host: process.env.DB_HOST, + port: 3306, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_SCHEMA, + multipleStatements: true + }, +}); +exports.default = connection; diff --git a/modulo4/IWFSToDoList/IWFSToDoList/IWFSToDoList/src/index.js b/modulo4/IWFSToDoList/IWFSToDoList/IWFSToDoList/src/index.js new file mode 100644 index 0000000..bac9144 --- /dev/null +++ b/modulo4/IWFSToDoList/IWFSToDoList/IWFSToDoList/src/index.js @@ -0,0 +1,130 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const express_1 = __importDefault(require("express")); +const cors_1 = __importDefault(require("cors")); +const dotenv_1 = __importDefault(require("dotenv")); +const connection_1 = __importDefault(require("./connection")); +dotenv_1.default.config(); +const app = (0, express_1.default)(); +app.use(express_1.default.json()); +app.use((0, cors_1.default)()); +const server = app.listen(process.env.PORT || 3003, () => { + if (server) { + const address = server.address(); + console.log(`Server is running in http://localhost: ${address.port}`); + } + else { + console.error(`Failure upon starting server.`); + } +}); +const createUser = (name, nickname, email) => __awaiter(void 0, void 0, void 0, function* () { + yield connection_1.default.insert({ + id: Date.now().toString(), + name: name, + nickname: nickname, + email: email + }) + .into("User"); +}); +app.post("/user", (req, res) => __awaiter(void 0, void 0, void 0, function* () { + let errorCode = 400; + try { + const create = yield createUser(req.body.name, req.body.nickname, req.body.email); + res.status(200).send({ message: "criado com sucesso", create }); + } + catch (error) { + res.status(500).send(error.sqlMessage || error.message); + } +})); +const getUserById = (id) => __awaiter(void 0, void 0, void 0, function* () { + const result = yield connection_1.default.raw(` + SELECT id, nickname FROM User WHERE id = '${id}' + `); + return result[0][0]; +}); +app.get("/user/:id", (req, res) => __awaiter(void 0, void 0, void 0, function* () { + const id = req.params.id; + let errorCode = 400; + try { + const result = yield getUserById(id); + if (!result) { + errorCode = 422; + throw new Error("Id não encontrado"); + } + res.send({ result: result }); + } + catch (err) { + res.status(500).send({ message: err.message }); + } +})); +app.put("/user/edit/:id", (req, res) => __awaiter(void 0, void 0, void 0, function* () { + const id = req.params.id; + const { name, nickname } = req.body; + let errorCode = 400; + try { + yield (0, connection_1.default)("User") + .update({ + name, + nickname + }) + .where("id", id); + if (!name || !nickname) { + errorCode = 422; + throw new Error("Preencha todos os campos"); + } + res.send({ message: "Usuário editado com sucesso" }); + } + catch (err) { + res.status(500).send({ message: err.message }); + } +})); +const createTask = (title, description, limit_date, creator_user_id) => __awaiter(void 0, void 0, void 0, function* () { + yield (0, connection_1.default)("TodoListTask") + .insert({ + id: Date.now().toString(), + title: title, + description: description, + limit_date: limit_date, + creator_user_id: creator_user_id + }); +}); +app.post("/task", (req, res) => __awaiter(void 0, void 0, void 0, function* () { + let errorCode = 422; + try { + if (!req.body.title || !req.body.description || !req.body.limit_date || !req.body.creator_user_id) { + errorCode = 422; + throw new Error("Campo vazio ou inválido!"); + } + const createT = yield createTask(req.body.title, req.body.description, req.body.limit_date, req.body.creator_user_id); + res.status(200).send({ + message: "Criado com sucesso!", createT + }); + } + catch (err) { + res.status(400).send({ + message: err.message, + }); + } +})); +app.get("/users", (req, res) => __awaiter(void 0, void 0, void 0, function* () { + try { + const resultado = yield (0, connection_1.default)("User") + .select("id", "nickname"); + res.status(200).send({ users: resultado }); + } + catch (error) { + res.status(500).send(error.sqlMessage || error.message); + } +})); diff --git a/modulo4/LabECommerce/src/data/connection.js b/modulo4/LabECommerce/src/data/connection.js new file mode 100644 index 0000000..63c0fb9 --- /dev/null +++ b/modulo4/LabECommerce/src/data/connection.js @@ -0,0 +1,20 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.connection = void 0; +const knex_1 = __importDefault(require("knex")); +const dotenv_1 = __importDefault(require("dotenv")); +dotenv_1.default.config(); +exports.connection = (0, knex_1.default)({ + client: "mysql", + connection: { + host: process.env.DB_HOST, + port: 3303, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + multipleStatements: true + } +}); diff --git a/modulo4/LabECommerce/src/endpoints/Purchases/purchases.js b/modulo4/LabECommerce/src/endpoints/Purchases/purchases.js new file mode 100644 index 0000000..045f4b4 --- /dev/null +++ b/modulo4/LabECommerce/src/endpoints/Purchases/purchases.js @@ -0,0 +1,32 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getPurchases = void 0; +const connection_1 = require("../../../src/data/connection"); +function getPurchases(req, res) { + return __awaiter(this, void 0, void 0, function* () { + let errorCode = 422; + try { + const id = req.params; + if (!id) { + throw new Error(`Não foi possivel achar o is '${id}'`); + } + const listProducts = yield (0, connection_1.connection)("labecommerce_purchases") + .select("*") + .where("labecommerce_purchases.id", `${id}`); + res.status(200).send({ Compras: listProducts }); + } + catch (error) { + res.status(500).send("Internal server error"); + } + }); +} +exports.getPurchases = getPurchases; diff --git a/modulo4/LabECommerce/src/endpoints/User/createUser.js b/modulo4/LabECommerce/src/endpoints/User/createUser.js new file mode 100644 index 0000000..09940b3 --- /dev/null +++ b/modulo4/LabECommerce/src/endpoints/User/createUser.js @@ -0,0 +1,35 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createUser = void 0; +const connection_1 = require("../../data/connection"); +const create = (name, email, password) => __awaiter(void 0, void 0, void 0, function* () { + yield connection_1.connection + .insert({ + id: Date.now().toString(), + name: name, + email: email, + password: password + }) + .into("labecommerce_users"); +}); +const createUser = (req, res) => __awaiter(void 0, void 0, void 0, function* () { + let errorCode = 400; + try { + const { name, email, password } = req.body; + const user = yield create(name, email, password); + res.status(201).send(`Usuario ${user} cadastrado com sucesso.`); + } + catch (error) { + res.status(500).send("erro interno do servidor"); + } +}); +exports.createUser = createUser; diff --git a/modulo4/LabECommerce/src/endpoints/User/searchUser.js b/modulo4/LabECommerce/src/endpoints/User/searchUser.js new file mode 100644 index 0000000..3f403ec --- /dev/null +++ b/modulo4/LabECommerce/src/endpoints/User/searchUser.js @@ -0,0 +1,28 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.searchUser = void 0; +const connection_1 = require("../../data/connection"); +function searchUser(req, res) { + return __awaiter(this, void 0, void 0, function* () { + let errorCode = 422; + try { + const listUser = yield (0, connection_1.connection)("labecommerce_users") + .select("*") + .from("labecommerce_users"); + res.status(200).send({ users: listUser }); + } + catch (error) { + res.status(500).send("Internal server error"); + } + }); +} +exports.searchUser = searchUser; diff --git a/modulo4/LabECommerce/src/endpoints/products/siginProducts.js b/modulo4/LabECommerce/src/endpoints/products/siginProducts.js new file mode 100644 index 0000000..9f74ff2 --- /dev/null +++ b/modulo4/LabECommerce/src/endpoints/products/siginProducts.js @@ -0,0 +1,42 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.siginProducts = void 0; +const connection_1 = require("../../data/connection"); +const create = (name, price, image_url) => __awaiter(void 0, void 0, void 0, function* () { + yield (0, connection_1.connection)("labecommerce_products") + .insert({ + id: Date.now().toString(), + name: name, + price: price, + image_url: image_url + }); +}); +function siginProducts(req, res) { + return __awaiter(this, void 0, void 0, function* () { + let errorCode = 422; + const { name, price, image_url } = req.body; + try { + if (!name || !price || !image_url) { + errorCode = 422; + throw new Error("Um dos seguintes campos estávazio ou inválido: name, price, image_url"); + } + const sigin = yield create(name, price, image_url); + res.status(200).send({ + message: `Produto criado com sucesso ${sigin} ` + }); + } + catch (error) { + res.status(500).send("Internal server error"); + } + }); +} +exports.siginProducts = siginProducts; diff --git a/modulo4/LabECommerce/src/index.js b/modulo4/LabECommerce/src/index.js new file mode 100644 index 0000000..0b70980 --- /dev/null +++ b/modulo4/LabECommerce/src/index.js @@ -0,0 +1,26 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const dotenv_1 = __importDefault(require("dotenv")); +const express_1 = __importDefault(require("express")); +const cors_1 = __importDefault(require("cors")); +const createUser_1 = require("./endpoints/User/createUser"); +const searchUser_1 = require("./endpoints/User/searchUser"); +dotenv_1.default.config(); +const app = (0, express_1.default)(); +app.use(express_1.default.json()); +app.use((0, cors_1.default)()); +const server = app.listen(process.env.PORT || 3003, () => { + if (server) { + const address = server.address(); + console.log(`Server is running in http://localhost:3003`); + } + else { + console.error(`Failure upon starting server.`); + } +}); +app.post("/users", createUser_1.createUser); +app.get("/users", searchUser_1.searchUser); +app.post("/products", createUser_1.createUser); diff --git a/modulo4/ListaTypescript/index.js b/modulo4/ListaTypescript/index.js index 34df6e9..eb6954c 100644 --- a/modulo4/ListaTypescript/index.js +++ b/modulo4/ListaTypescript/index.js @@ -1,3 +1,2 @@ "use strict"; document.write("Hoje é " + now.getDay() + ", " + now.getDate() + " de " + now.getMonth() + " de " + now.getFullYear()); -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/modulo4/ListaTypescript/src/index.js b/modulo4/ListaTypescript/src/index.js new file mode 100644 index 0000000..b044d0c --- /dev/null +++ b/modulo4/ListaTypescript/src/index.js @@ -0,0 +1,54 @@ +"use strict"; +function frase(nome, nascimento) { + const resultado = nascimento.split("/", 3); + return `Olá me chamo ${nome}, nasci no dia ${resultado[0]} do mês de ${resultado[1]} do ano de ${resultado[2]}`; +} +console.log(frase("Victor", "16/08/1994")); +function variaveis(tiposVariaveis) { + if (typeof tiposVariaveis === "string") { + return "Tipo String!"; + } + else if (typeof tiposVariaveis === "number") { + return "Tipo Number!"; + } + else if (typeof tiposVariaveis === "boolean") { + return " Tipo Boolean!"; + } +} +console.log(variaveis(true)); +var GENERO; +(function (GENERO) { + GENERO["TERROR"] = "Terror"; + GENERO["ACAO"] = "A\u00E7\u00E3o"; + GENERO["DRAMA"] = "Drama"; + GENERO["COMEDIA"] = "Com\u00E9dia"; + GENERO["ROMANCE"] = "Romance"; +})(GENERO || (GENERO = {})); +const filme1 = { + nome: "O Exorcista", + ano: 1973, + genero: GENERO.TERROR, + pontuacao: 9.5 +}; +function filme() { + return filme1; +} +console.log(filme()); +const usuarios = [ + { name: "Rogério", email: "roger@email.com", role: "user" }, + { name: "Ademir", email: "ademir@email.com", role: "admin" }, + { name: "Aline", email: "aline@email.com", role: "user" }, + { name: "Jéssica", email: "jessica@email.com", role: "user" }, + { name: "Adilson", email: "adilson@email.com", role: "user" }, + { name: "Carina", email: "carina@email.com", role: "admin" } +]; +function usuarioAdmin(admin) { + const adminFilter = admin.filter((admin) => { + return admin.role === "admin"; + }); + const adminMap = adminFilter.map((admin) => { + return admin.email; + }); + return adminMap; +} +console.log(usuarioAdmin(usuarios)); diff --git a/modulo4/apis-rest/src/data.js b/modulo4/apis-rest/src/data.js new file mode 100644 index 0000000..3d5d06c --- /dev/null +++ b/modulo4/apis-rest/src/data.js @@ -0,0 +1,47 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.users = void 0; +exports.users = [ + { + id: 1, + name: "Alice", + email: "alice@email.com", + type: "ADMIN", + age: 12 + }, + { + id: 2, + name: "Bob", + email: "bob@email.com", + type: "NORMAL", + age: 36 + }, + { + id: 3, + name: "Coragem", + email: "coragem@email.com", + type: "NORMAL", + age: 21 + }, + { + id: 4, + name: "Dory", + email: "dory@email.com", + type: "NORMAL", + age: 17 + }, + { + id: 5, + name: "Elsa", + email: "elsa@email.com", + type: "ADMIN", + age: 17 + }, + { + id: 6, + name: "Fred", + email: "fred@email.com", + type: "ADMIN", + age: 60 + } +]; diff --git a/modulo4/apis-rest/src/index.js b/modulo4/apis-rest/src/index.js new file mode 100644 index 0000000..c6800fb --- /dev/null +++ b/modulo4/apis-rest/src/index.js @@ -0,0 +1,51 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const express_1 = __importDefault(require("express")); +const data_1 = require("./data"); +const app = (0, express_1.default)(); +app.use(express_1.default.json()); +const server = app.listen(process.env.PORT || 3003, () => { + if (server) { + const address = server.address(); + console.log(`Server is running in http://localhost:${address.port}`); + } + else { + console.error(`Failure upon starting server.`); + } +}); +; +app.get("/users", (req, res) => { + try { + res.status(200).send({ users: data_1.users }); + } + catch (error) { + res.status(500).send(error.message); + } +}); +app.get("/users/type", (req, res) => { + try { + const { type } = req.body; + if (type !== type.toLowerCase() && !type) { + throw new Error("Informe um 'type' válido"); + } + else { + const user = data_1.users.filter((user) => { + return user.type.toLowerCase() === type.toLowerCase(); + }); + res.status(200).send(user); + } + } + catch (error) { + switch (error.message) { + case "Por gentileza, informar um type válido": + res.status(401); + break; + default: + res.status(500); + } + res.send(error.message); + } +}); diff --git a/modulo4/aprofundamento-express/src/index.js b/modulo4/aprofundamento-express/src/index.js new file mode 100644 index 0000000..5e86b41 --- /dev/null +++ b/modulo4/aprofundamento-express/src/index.js @@ -0,0 +1,75 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const express_1 = __importDefault(require("express")); +const app = (0, express_1.default)(); +app.use(express_1.default.json()); +const server = app.listen(process.env.PORT || 3003, () => { + if (server) { + const address = server.address(); + console.log(`Server is running in http://localhost:${address.port}`); + } + else { + console.error(`Failure upon starting server.`); + } +}); +; +app.get("/ping", (req, res) => { + res.send("Pong! 🏓"); +}); +const listaDeAfazeres = [ + { + "userId": 1, + "id": 1, + "title": "estudar", + "completed": true + }, + { + "userId": 2, + "id": 2, + "title": "caminhar", + "completed": true + }, + { + "userId": 3, + "id": 3, + "title": "sofrer", + "completed": true + }, + { + "userId": 4, + "id": 4, + "title": "limpar a casa", + "completed": false + }, +]; +app.get("/afazeres/:completed", (req, res) => { + if (req.params.completed === "true" || req.params.completed === "false") { + let completo; + if (req.params.completed === "true") { + completo = true; + } + else if (req.params.completed === "false") { + completo = false; + } + const afazeresCompletos = listaDeAfazeres; + const afazeresLista = afazeresCompletos.filter((a) => { + return a.completed === completo; + }); + res.status(200).send(afazeresLista); + } +}); +app.post("/criar-tarefa/:idUsuario", (req, res) => { + const nomeDaTarefa = req.body.title; + const completo = req.body.completed; + const idUsuario = Number(req.headers.authorization); + listaDeAfazeres.push({ + userId: idUsuario, + id: Number(Date.now()), + title: nomeDaTarefa, + completed: completo, + }); + res.status(200).send({ listaDeAfazeres }); +}); diff --git a/modulo4/aprofundamento-sql/connection.js b/modulo4/aprofundamento-sql/connection.js new file mode 100644 index 0000000..67b6c27 --- /dev/null +++ b/modulo4/aprofundamento-sql/connection.js @@ -0,0 +1,10 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const knex_1 = __importDefault(require("knex")); +const connection = (0, knex_1.default)({ + client: "mysql", + connection: {} +}); diff --git a/modulo4/aprofundamento-typescript/src/exercicio-4.js b/modulo4/aprofundamento-typescript/src/exercicio-4.js new file mode 100644 index 0000000..3d13e9d --- /dev/null +++ b/modulo4/aprofundamento-typescript/src/exercicio-4.js @@ -0,0 +1,16 @@ +"use strict"; +const pokemon1 = { + name: "Charmander", + types: "Fire", + healthPoints: 28 +}; +const pokemon2 = { + name: "Bulbasaur", + types: "Grass/Poison", + healthPoints: 31 +}; +const pokemon3 = { + name: "Squirtle", + types: "Water", + healthPoints: 35 +}; diff --git a/modulo4/aprofundamento-typescript/src/index.js b/modulo4/aprofundamento-typescript/src/index.js new file mode 100644 index 0000000..1cdccb4 --- /dev/null +++ b/modulo4/aprofundamento-typescript/src/index.js @@ -0,0 +1,54 @@ +"use strict"; +let minhaString; +let meuNumero; +var CorFavorita; +(function (CorFavorita) { + CorFavorita["VERMELHO"] = "Vermelho"; + CorFavorita["LARANJA"] = "Laranja"; + CorFavorita["AMARELO"] = "Amarelo"; + CorFavorita["VERDE"] = "Verde"; + CorFavorita["AZUL"] = "Azul"; + CorFavorita["ANIL"] = "Anil"; + CorFavorita["VIOLETA"] = "Violeta"; +})(CorFavorita || (CorFavorita = {})); +function obterEstatisticas(numeros) { + const numerosOrdenados = numeros.sort((a, b) => a - b); + let soma = 0; + for (let num of numeros) { + soma += num; + } + const valores = { + maior: numerosOrdenados[numeros.length - 1], + menor: numerosOrdenados[0], + media: soma / numeros.length + }; + return valores; +} +const posts = [ + { + autor: "Alvo Dumbledore", + texto: "Não vale a pena viver sonhando e se esquecer de viver" + }, + { + autor: "Severo Snape", + texto: "Menos 10 pontos para Grifinória!" + }, + { + autor: "Hermione Granger", + texto: "É levi-ô-sa, não levio-sá!" + }, + { + autor: "Dobby", + texto: "Dobby é um elfo livre!" + }, + { + autor: "Lord Voldemort", + texto: "Avada Kedavra!" + } +]; +function buscarPostsPorAutor(posts, autorInformado) { + return posts.filter((post) => { + return post.autor === autorInformado; + }); +} +console.log(buscarPostsPorAutor(posts, "Dobby")); diff --git a/modulo4/async-await-promises/src/app.js b/modulo4/async-await-promises/src/app.js new file mode 100644 index 0000000..b41b99b --- /dev/null +++ b/modulo4/async-await-promises/src/app.js @@ -0,0 +1,20 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const express_1 = __importDefault(require("express")); +const cors_1 = __importDefault(require("cors")); +const app = (0, express_1.default)(); +app.use(express_1.default.json()); +app.use((0, cors_1.default)()); +const server = app.listen(process.env.PORT || 3003, () => { + if (server) { + const address = server.address(); + console.log(`Server is running in http://localhost:${address.port}`); + } + else { + console.error(`Failure upon starting server.`); + } +}); +exports.default = app; diff --git a/modulo4/async-await-promises/src/connection.js b/modulo4/async-await-promises/src/connection.js new file mode 100644 index 0000000..08b23d5 --- /dev/null +++ b/modulo4/async-await-promises/src/connection.js @@ -0,0 +1,20 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const knex_1 = __importDefault(require("knex")); +const dotenv_1 = __importDefault(require("dotenv")); +dotenv_1.default.config(); +const connection = (0, knex_1.default)({ + client: "mysql", + connection: { + host: process.env.DB_HOST, + port: 3306, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_SCHEMA, + multipleStatements: true + }, +}); +exports.default = connection; diff --git a/modulo4/async-await-promises/src/constants/baseURL.js b/modulo4/async-await-promises/src/constants/baseURL.js new file mode 100644 index 0000000..307d7f1 --- /dev/null +++ b/modulo4/async-await-promises/src/constants/baseURL.js @@ -0,0 +1,4 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.baseURL = void 0; +exports.baseURL = "https://labenews.herokuapp.com/"; diff --git a/modulo4/async-await-promises/src/constants/types.js b/modulo4/async-await-promises/src/constants/types.js new file mode 100644 index 0000000..c8ad2e5 --- /dev/null +++ b/modulo4/async-await-promises/src/constants/types.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/modulo4/async-await-promises/src/index.js b/modulo4/async-await-promises/src/index.js new file mode 100644 index 0000000..d89463a --- /dev/null +++ b/modulo4/async-await-promises/src/index.js @@ -0,0 +1,71 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const baseURL_1 = require("./constants/baseURL"); +const axios_1 = __importDefault(require("axios")); +function getAllSubscribers() { + return __awaiter(this, void 0, void 0, function* () { + const response = yield axios_1.default.get(`${baseURL_1.baseURL}/subscribers`); + return response.data; + }); +} +; +const getAllSubscribers1 = () => __awaiter(void 0, void 0, void 0, function* () { + const response = yield axios_1.default.get(`${baseURL_1.baseURL}/subscribers`); + return response.data; +}); +getAllSubscribers1() + .then(console.log); +const getAllSubscribers2 = () => __awaiter(void 0, void 0, void 0, function* () { + const response = yield axios_1.default.get(`${baseURL_1.baseURL}/subscribers`); + return response.data.map((res) => { + return { + id: res.id, + name: res.name, + email: res.email, + }; + }); +}); +getAllSubscribers2(); +const createNews = (news) => { + return axios_1.default.put(`${baseURL_1.baseURL}/news`, news); +}; +const sendNotifications1 = (users, message) => __awaiter(void 0, void 0, void 0, function* () { + try { + for (const user of users) { + yield axios_1.default.post(`${baseURL_1.baseURL}/notifications`, { + subscriberId: user.id, + message + }); + } + console.log("All notifications sent"); + } + catch (_a) { + console.log("Error"); + } +}); +const sendNotifications2 = (users, message) => __awaiter(void 0, void 0, void 0, function* () { + try { + const promises = users.map(user => { + return axios_1.default.post(`${baseURL_1.baseURL}/notifications`, { + subscriberId: user.id, + message: message, + }); + }); + yield Promise.all(promises); + } + catch (_b) { + console.log("Error"); + } +}); diff --git a/modulo4/classes-encapsulamento/src/data/connection.js b/modulo4/classes-encapsulamento/src/data/connection.js new file mode 100644 index 0000000..63c0fb9 --- /dev/null +++ b/modulo4/classes-encapsulamento/src/data/connection.js @@ -0,0 +1,20 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.connection = void 0; +const knex_1 = __importDefault(require("knex")); +const dotenv_1 = __importDefault(require("dotenv")); +dotenv_1.default.config(); +exports.connection = (0, knex_1.default)({ + client: "mysql", + connection: { + host: process.env.DB_HOST, + port: 3303, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + multipleStatements: true + } +}); diff --git a/modulo4/classes-encapsulamento/src/index.js b/modulo4/classes-encapsulamento/src/index.js new file mode 100644 index 0000000..41363cf --- /dev/null +++ b/modulo4/classes-encapsulamento/src/index.js @@ -0,0 +1,68 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const dotenv_1 = __importDefault(require("dotenv")); +const express_1 = __importDefault(require("express")); +const cors_1 = __importDefault(require("cors")); +dotenv_1.default.config(); +const app = (0, express_1.default)(); +app.use(express_1.default.json()); +app.use((0, cors_1.default)()); +const server = app.listen(process.env.PORT || 3003, () => { + if (server) { + const address = server.address(); + console.log(`Server is running in http://localhost:3003`); + } + else { + console.error(`Failure upon starting server.`); + } +}); +class UserAccount { + constructor(cpf, name, age) { + this.balance = 0; + this.transactions = []; + console.log("Chamando o construtor da classe UserAccount"); + this.cpf = cpf; + this.name = name; + this.age = age; + } + getUser() { + return [this.age, this.cpf, this.name, this.transactions]; + } + getName() { + return this.name; + } + addTransaction(transaction) { + this.transactions.push(transaction); + } + setAge(newAge) { + return this.age = newAge; + } +} +let usuario = new UserAccount("111", "User1", 27); +usuario.setAge(28); +class Transaction { + constructor(description, value, date) { + this.description = description; + this.value = value; + this.date = date; + } + getTransaction() { + return this.description, this.value, this.date; + } +} +let add = new Transaction("pagamento", 227, "10/04/2022"); +usuario.addTransaction(add); +class Bank { + constructor(accounts) { + this.accounts = accounts; + } + getNames() { + return this.accounts.map((user) => { + return user.getName(); + }); + } +} +console.log(usuario.getUser()); diff --git a/modulo4/filtros-ordenacao-paginacao/template-filtros-ordenacao-paginacao/src/app.js b/modulo4/filtros-ordenacao-paginacao/template-filtros-ordenacao-paginacao/src/app.js new file mode 100644 index 0000000..fe3507c --- /dev/null +++ b/modulo4/filtros-ordenacao-paginacao/template-filtros-ordenacao-paginacao/src/app.js @@ -0,0 +1,20 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.app = void 0; +const express_1 = __importDefault(require("express")); +const cors_1 = __importDefault(require("cors")); +exports.app = (0, express_1.default)(); +exports.app.use(express_1.default.json()); +exports.app.use((0, cors_1.default)()); +const server = exports.app.listen(process.env.PORT || 3003, () => { + if (server) { + const address = server.address(); + console.log(`Server is running in http://localhost:${address.port}`); + } + else { + console.error(`Failure upon starting server.`); + } +}); diff --git a/modulo4/filtros-ordenacao-paginacao/template-filtros-ordenacao-paginacao/src/data/connection.js b/modulo4/filtros-ordenacao-paginacao/template-filtros-ordenacao-paginacao/src/data/connection.js new file mode 100644 index 0000000..0519f12 --- /dev/null +++ b/modulo4/filtros-ordenacao-paginacao/template-filtros-ordenacao-paginacao/src/data/connection.js @@ -0,0 +1,20 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.connection = void 0; +const knex_1 = __importDefault(require("knex")); +const dotenv_1 = __importDefault(require("dotenv")); +dotenv_1.default.config(); +exports.connection = (0, knex_1.default)({ + client: "mysql", + connection: { + host: process.env.DB_HOST, + port: 3306, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_SCHEMA, + multipleStatements: true + } +}); diff --git a/modulo4/filtros-ordenacao-paginacao/template-filtros-ordenacao-paginacao/src/data/migrations.js b/modulo4/filtros-ordenacao-paginacao/template-filtros-ordenacao-paginacao/src/data/migrations.js new file mode 100644 index 0000000..a915c2e --- /dev/null +++ b/modulo4/filtros-ordenacao-paginacao/template-filtros-ordenacao-paginacao/src/data/migrations.js @@ -0,0 +1,44 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const connection_1 = require("./connection"); +const users_json_1 = __importDefault(require("./users.json")); +const recipes_json_1 = __importDefault(require("./recipes.json")); +const printError = (error) => { console.log(error.sqlMessage || error.message); }; +const createTables = () => connection_1.connection + .raw(` + + CREATE TABLE IF NOT EXISTS aula49_users ( + id VARCHAR(255) PRIMARY KEY, + name VARCHAR(255) UNIQUE NOT NULL, + email VARCHAR(255) UNIQUE NOT NULL, + password VARCHAR(255) NOT NULL + ); + + CREATE TABLE IF NOT EXISTS aula49_recipes ( + id VARCHAR(255) PRIMARY KEY, + title VARCHAR(255) NOT NULL, + description TEXT(1023), + user_id VARCHAR(255), + created_at BIGINT, + FOREIGN KEY(user_id) REFERENCES aula49_users(id) + ); + +`) + .then(() => { console.log("Tabelas criadas"); }) + .catch(printError); +const insertUsers = () => (0, connection_1.connection)("aula49_users") + .insert(users_json_1.default) + .then(() => { console.log("Usuários criados"); }) + .catch(printError); +const insertRecipes = () => (0, connection_1.connection)("aula49_recipes") + .insert(recipes_json_1.default) + .then(() => { console.log("Receitas criadas"); }) + .catch(printError); +const closeConnection = () => { connection_1.connection.destroy(); }; +createTables() + .then(insertUsers) + .then(insertRecipes) + .finally(closeConnection); diff --git a/modulo4/filtros-ordenacao-paginacao/template-filtros-ordenacao-paginacao/src/endpoints/getAllRecipes.js b/modulo4/filtros-ordenacao-paginacao/template-filtros-ordenacao-paginacao/src/endpoints/getAllRecipes.js new file mode 100644 index 0000000..e99c339 --- /dev/null +++ b/modulo4/filtros-ordenacao-paginacao/template-filtros-ordenacao-paginacao/src/endpoints/getAllRecipes.js @@ -0,0 +1,111 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.allEndpoints = exports.listUsers = exports.ordenacaoUsers = exports.getTypeUsers = exports.getAllUsers = void 0; +const connection_1 = require("../data/connection"); +const getAllUsers = (req, res) => __awaiter(void 0, void 0, void 0, function* () { + try { + const { name } = req.query; + if (!name) { + throw new Error(`Não foi possivel achar o titulo '${name}'`); + } + const filtraNome = yield (0, connection_1.connection)("aula48_exercicio") + .select("*") + .where("name", "like", `%${name}%`); + res.status(200).send(filtraNome); + } + catch (error) { + res.send(error.message || error.sqlMessage); + } +}); +exports.getAllUsers = getAllUsers; +const getTypeUsers = (req, res) => __awaiter(void 0, void 0, void 0, function* () { + try { + const { type } = req.params; + if (!type) { + throw new Error(`Não foi possivel achar o tipo '${type}'`); + } + const filtraType = yield (0, connection_1.connection)("aula48_exercicio") + .select("*") + .where("type", "like", `%${type}%`); + res.status(200).send(filtraType); + } + catch (error) { + res.send(error.message || error.sqlMessage); + } +}); +exports.getTypeUsers = getTypeUsers; +const ordenacaoUsers = (req, res) => __awaiter(void 0, void 0, void 0, function* () { + try { + const { name } = req.query; + let ordernar = req.query.ordenacao; + if (ordernar.toUpperCase() !== 'ASC' && ordernar.toUpperCase() !== 'DESC') { + ordernar = 'ASC'; + } + if (!ordernar) { + const result = yield (0, connection_1.connection)("aula48_exercicio") + .select("*") + .orderBy('email', `${ordernar}`); + } + const result = yield (0, connection_1.connection)("aula48_exercicio") + .select("*") + .orderBy('name', `${ordernar}`) + .orderBy('type', `${ordernar}`); + res.status(200).send(result); + } + catch (error) { + res.send(error.message || error.sqlMessage); + } +}); +exports.ordenacaoUsers = ordenacaoUsers; +const listUsers = (req, res) => __awaiter(void 0, void 0, void 0, function* () { + try { + let quantidadeExibida = 5; + let pagina = Number(req.query.pagina); + let offset = quantidadeExibida * (pagina - 1); + const result = yield (0, connection_1.connection)("aula48_exercicio") + .select("*") + .limit(quantidadeExibida) + .offset(offset); + res.status(200).send(result); + } + catch (error) { + res.send(error.message || error.sqlMessage); + } +}); +exports.listUsers = listUsers; +const allEndpoints = (req, res) => __awaiter(void 0, void 0, void 0, function* () { + try { + const { name, type } = req.query; + let ordernar = req.query.ordenacao; + let pagina = Number(req.query.pagina); + if (!pagina) { + pagina = 1; + } + let quantidadeExibida = 5; + let offset = quantidadeExibida * (pagina - 1); + if (ordernar.toUpperCase() !== 'ASC' && ordernar.toUpperCase() !== 'DESC') { + ordernar = 'DESC'; + } + const result = yield (0, connection_1.connection)("aula48_exercicio") + .select("*") + .where("name", "like", `%${name}%`) + .where("type", "like", `%${type}%`) + .orderBy('name', `${ordernar}`) + .limit(quantidadeExibida) + .offset(offset); + res.status(200).send(result); + } + catch (error) { + res.send(error.message || error.sqlMessage); + } +}); +exports.allEndpoints = allEndpoints; diff --git a/modulo4/filtros-ordenacao-paginacao/template-filtros-ordenacao-paginacao/src/index.js b/modulo4/filtros-ordenacao-paginacao/template-filtros-ordenacao-paginacao/src/index.js new file mode 100644 index 0000000..4cea9f7 --- /dev/null +++ b/modulo4/filtros-ordenacao-paginacao/template-filtros-ordenacao-paginacao/src/index.js @@ -0,0 +1,7 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const app_1 = require("./app"); +const getAllUsers_1 = require("./endpoints/getAllUsers"); +app_1.app.get("/users", getAllUsers_1.getAllUsers); +app_1.app.get("/users/order", getAllUsers_1.ordenacaoUsers); +app_1.app.get("/users/:type", getAllUsers_1.getTypeUsers); diff --git a/modulo4/filtros-ordenacao-paginacao/template-filtros-ordenacao-paginacao/src/types.js b/modulo4/filtros-ordenacao-paginacao/template-filtros-ordenacao-paginacao/src/types.js new file mode 100644 index 0000000..c8ad2e5 --- /dev/null +++ b/modulo4/filtros-ordenacao-paginacao/template-filtros-ordenacao-paginacao/src/types.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/modulo4/fluxo-de-dados-backend/src/data.js b/modulo4/fluxo-de-dados-backend/src/data.js new file mode 100644 index 0000000..ac1b447 --- /dev/null +++ b/modulo4/fluxo-de-dados-backend/src/data.js @@ -0,0 +1,25 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.produtosArray = void 0; +exports.produtosArray = [ + { + id: "1", + name: "bolo", + price: 10 + }, + { + id: "2", + name: "guarana", + price: 7 + }, + { + id: "3", + name: "suco de caju", + price: 17 + }, + { + id: "4", + name: "goiabada", + price: 5 + } +]; diff --git a/modulo4/fluxo-de-dados-backend/src/index.js b/modulo4/fluxo-de-dados-backend/src/index.js new file mode 100644 index 0000000..de2c98a --- /dev/null +++ b/modulo4/fluxo-de-dados-backend/src/index.js @@ -0,0 +1,110 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const express_1 = __importDefault(require("express")); +const data_1 = require("./data"); +const app = (0, express_1.default)(); +app.use(express_1.default.json()); +const server = app.listen(process.env.PORT || 3003, () => { + if (server) { + const address = server.address(); + console.log(`Server is running in http://localhost:${address.port}`); + } + else { + console.error(`Failure upon starting server.`); + } +}); +; +app.get("/test", (req, res) => { + res.status(200).send("funcionando"); +}); +app.post("/novo-produto", (req, res) => { + const { name, price } = req.body; + try { + if (!name || !price) { + throw new Error("Campos de nome ou preço faltando"); + } + if (name !== String) { + throw new Error("O nome do produto não é uma string"); + } + if (price !== Number) { + throw new Error("O preço do produto não é um Number"); + } + if (price < 0) { + throw new Error("O preço do produto não pode ser menor que ZERO"); + } + data_1.produtosArray.push({ + id: Date.now().toString(), + name: req.body.name, + price: req.body.price + }); + res.status(200).send(data_1.produtosArray); + } + catch (error) { + switch (error.message) { + case "Campos de nome ou preço faltando": + return res.status(400).send(error.message); + case "O nome do produto não é uma string": + return res.status(401).send(error.message); + case "O preço do produto não é um number": + return res.status(400).send(error.message); + case "O preço do produto não pode ser menor que ZERO": + return res.status(400).send(error.message); + default: + res.status(500); + break; + } + } +}); +app.get("/lista-de-produtos", (req, res) => { + res.status(200).send(data_1.produtosArray); +}); +app.put("/edit-price/:id", (req, res) => { + const id = req.params.id; + const { price } = req.body; + try { + if (!price) { + throw new Error("Preço não informado"); + } + if (price !== Number) { + throw new Error("Preço não é um Number"); + } + if (price <= 0) { + throw new Error("Preço não pode ser menor ou igual a ZERO"); + } + if (!id) { + throw new Error("Produto não encontrado"); + } + const editarPreco = data_1.produtosArray.filter((p) => { + return p.id === id; + })[0]; + editarPreco.price = req.body.price; + res.status(200).send(editarPreco); + } + catch (error) { + switch (error.message) { + case "Preço não informado": + res.status(400).send(error.message); + break; + case "Preço não é um Number": + res.status(400).send(error.message); + break; + case "Preço não pode ser menor ou igual a ZERO": + res.status(400).send(error.message); + break; + default: + break; + } + } +}); +app.delete("/delete-produto/:id", (req, res) => { + const id = req.params.id; + for (let i = 0; i < data_1.produtosArray.length; i++) { + if (data_1.produtosArray[i].id === id) { + data_1.produtosArray.splice(i, 1); + } + } + res.status(200).send(data_1.produtosArray); +}); diff --git a/modulo4/intro-express/src/index.js b/modulo4/intro-express/src/index.js new file mode 100644 index 0000000..62c0905 --- /dev/null +++ b/modulo4/intro-express/src/index.js @@ -0,0 +1,83 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const express_1 = __importDefault(require("express")); +const app = (0, express_1.default)(); +app.use(express_1.default.json()); +const server = app.listen(process.env.PORT || 3003, () => { + if (server) { + const address = server.address(); + console.log(`Server is running in http://localhost:${address.port}`); + } + else { + console.error(`Failure upon starting server.`); + } +}); +; +app.get("/", (req, res) => { + res.send("Hello from Express"); +}); +const usuario1 = { + id: 1, + name: "victor", + phone: "83 99999-9999 ", + email: "victor@gmail.com", + website: "victor.com.br" +}; +const usuario2 = { + id: 1, + name: "Leleco", + phone: "83 88888-8888 ", + email: "leleco@gmail.com", + website: "leleco.com.br" +}; +const usuario3 = { + id: 1, + name: "Sara", + phone: "83 77777-777 ", + email: "sara@gmail.com", + website: "saraondeequevoceseesconde.com.br" +}; +const arrayDeUsuarios = [ + usuario1, usuario3, usuario2 +]; +app.get("/users", (req, res) => { + const user = arrayDeUsuarios; + res.status(200).send(user); +}); +const postPoema1 = { + id: 1, + title: "Albert Einstein", + body: "Pode ser que um dia não mais existamos.Mas, se ainda sobrar amizade,nasceremos de novo um para o outro.", + userId: "AlbertEinstein" +}; +const postPoema2 = { + id: 2, + title: "Chico Buarque", + body: "Hoje na solidão ainda custoA entender como o amor foi tão injustoPra quem só lhe foi dedicação", + userId: "ChicoBuarque" +}; +const postPoema3 = { + id: 3, + title: "Charles Chaplin", + body: "Não preciso me drogar para ser um gênio;Não preciso ser um gênio para ser humano;Mas preciso do seu sorriso para ser feliz.", + userId: "CharlesChaplin" +}; +const arrayPostPoema = [ + postPoema1, postPoema2, postPoema3 +]; +app.get("/posts", (req, res) => { + const postAtual = arrayPostPoema; + res.status(200).send(postAtual); +}); +app.get("/posts/:id", (req, res) => { + const idUsuario = Number(req.params.id); + const postUsuario = arrayPostPoema.filter(post => { + if (post.id === idUsuario) { + return post; + } + }); + res.status(200).send(postUsuario); +}); diff --git a/modulo4/knex-js/src/connection.js b/modulo4/knex-js/src/connection.js new file mode 100644 index 0000000..3cece59 --- /dev/null +++ b/modulo4/knex-js/src/connection.js @@ -0,0 +1,21 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.connection = void 0; +const knex_1 = __importDefault(require("knex")); +const dotenv_1 = __importDefault(require("dotenv")); +dotenv_1.default.config(); +exports.connection = (0, knex_1.default)({ + client: "mysql", + connection: { + host: process.env.DB_HOST, + port: 3306, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_SCHEMA, + multiStatements: true + } +}); +exports.default = exports.connection; diff --git a/modulo4/knex-js/src/index.js b/modulo4/knex-js/src/index.js new file mode 100644 index 0000000..f55a207 --- /dev/null +++ b/modulo4/knex-js/src/index.js @@ -0,0 +1,98 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const connection_1 = __importDefault(require("./connection")); +const express_1 = __importDefault(require("express")); +const cors_1 = __importDefault(require("cors")); +const app = (0, express_1.default)(); +app.use(express_1.default.json()); +app.use((0, cors_1.default)()); +app.use(express_1.default.json()); +const server = app.listen(process.env.PORT || 3003, () => { + if (server) { + const address = server.address(); + console.log(`Server ta on, pai http://localhost:${address.port}`); + } + else { + console.error(`Failure upon starting server.`); + } +}); +; +const searchActor = (name) => __awaiter(void 0, void 0, void 0, function* () { + const resultado = yield connection_1.default + .raw(` + SELECT * FROM Actor WHERE name = "${name}" + `); + return resultado[0]; +}); +const countActors = (gender) => __awaiter(void 0, void 0, void 0, function* () { + const result = yield connection_1.default + .raw(` + SELECT COUNT(*) as count FROM Actor WHERE gender = "${gender}" + `); + const count = result[0][0].count; + return count; +}); +const attSalaryActor = (id, salary) => __awaiter(void 0, void 0, void 0, function* () { + yield (0, connection_1.default)("Actor") + .update({ + salary: salary, + }) + .where("id", id); +}); +const deleteActor = (id) => __awaiter(void 0, void 0, void 0, function* () { + yield (0, connection_1.default)("Actor") + .delete() + .where("id", id); +}); +const averageSalary = (gender) => __awaiter(void 0, void 0, void 0, function* () { + const result = yield (0, connection_1.default)("Actor") + .avg("salary as average") + .where({ gender }); + return result[0][0].average; +}); +app.get("/actor", (req, res) => __awaiter(void 0, void 0, void 0, function* () { + try { + const count = yield countActors(req.query.gender); + res.status(200).send({ + gender: count, + }); + } + catch (err) { + res.status(400).send({ + message: err.message + }); + } +})); +app.put("/actor", (req, res) => __awaiter(void 0, void 0, void 0, function* () { + try { + yield attSalaryActor(req.body.salary, req.body.id); + res.status(200).send({ message: "Alterado com sucesso" }); + } + catch (error) { + res.status(400).send({ + message: error.message, + }); + } +})); +app.delete("/actor/:id", (req, res) => __awaiter(void 0, void 0, void 0, function* () { + try { + yield deleteActor(req.params.id); + } + catch (error) { + res.status(400).send({ + message: error.message, + }); + } +})); diff --git a/modulo4/servicos-backend/src/endpoints/createUser.js b/modulo4/servicos-backend/src/endpoints/createUser.js new file mode 100644 index 0000000..5629431 --- /dev/null +++ b/modulo4/servicos-backend/src/endpoints/createUser.js @@ -0,0 +1,31 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createUser = void 0; +const getAdressInfo_1 = require("./../services/getAdressInfo"); +const createUser = (req, res) => __awaiter(void 0, void 0, void 0, function* () { + try { + const { zipcode, number, complement } = req.body; + const address = yield (0, getAdressInfo_1.getAdressInfo)(zipcode); + if (!address) { + throw new Error("erro no get addres"); + } + res.send({ + Estado: address.state, + Bairro: address.district, Cidade: address.city, Logradouro: address.street, + zipcode, number, complement + }); + } + catch (error) { + res.send({ message: "CEP inesistente" }); + } +}); +exports.createUser = createUser; diff --git a/modulo4/servicos-backend/src/index.js b/modulo4/servicos-backend/src/index.js new file mode 100644 index 0000000..19d75ed --- /dev/null +++ b/modulo4/servicos-backend/src/index.js @@ -0,0 +1,23 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const createUser_1 = require("./endpoints/createUser"); +const dotenv_1 = __importDefault(require("dotenv")); +const express_1 = __importDefault(require("express")); +const cors_1 = __importDefault(require("cors")); +dotenv_1.default.config(); +const app = (0, express_1.default)(); +app.use(express_1.default.json()); +app.use((0, cors_1.default)()); +const server = app.listen(process.env.PORT || 3003, () => { + if (server) { + const address = server.address(); + console.log(`Server is running in http://localhost:3003`); + } + else { + console.error(`Failure upon starting server.`); + } +}); +app.post("/users", createUser_1.createUser); diff --git a/modulo4/servicos-backend/src/services/getAdressInfo.js b/modulo4/servicos-backend/src/services/getAdressInfo.js new file mode 100644 index 0000000..e1404f0 --- /dev/null +++ b/modulo4/servicos-backend/src/services/getAdressInfo.js @@ -0,0 +1,35 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getAdressInfo = void 0; +const axios_1 = __importDefault(require("axios")); +const baseURL = "https://viacep.com.br/ws"; +const getAdressInfo = (zipcode) => __awaiter(void 0, void 0, void 0, function* () { + try { + const response = yield axios_1.default.get(`${baseURL}/${zipcode}/json/`); + console.log(response); + const address = { + state: response.data.uf, + city: response.data.localidade, + district: response.data.bairro, + street: response.data.logradouro, + }; + return address; + } + catch (error) { + console.error("erro no getAddressInfo", error); + return null; + } +}); +exports.getAdressInfo = getAdressInfo; diff --git a/modulo4/servicos-backend/src/types/Addres.js b/modulo4/servicos-backend/src/types/Addres.js new file mode 100644 index 0000000..c8ad2e5 --- /dev/null +++ b/modulo4/servicos-backend/src/types/Addres.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/modulo4/sistema-bancario/src/data.js b/modulo4/sistema-bancario/src/data.js new file mode 100644 index 0000000..358d291 --- /dev/null +++ b/modulo4/sistema-bancario/src/data.js @@ -0,0 +1,19 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.users = void 0; +exports.users = [ + { + name: "João", + cpf: "111.111.111-11", + date: new Date(15 / 4 / 2004), + saldo: 0, + gastos: [{}], + }, + { + name: "Poliana", + cpf: "222.222.222-22", + date: new Date(30 / 8 / 2005), + saldo: 0, + gastos: [{}], + } +]; diff --git a/modulo4/sistema-bancario/src/index.js b/modulo4/sistema-bancario/src/index.js new file mode 100644 index 0000000..1643814 --- /dev/null +++ b/modulo4/sistema-bancario/src/index.js @@ -0,0 +1,127 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const express_1 = __importDefault(require("express")); +const data_1 = require("./data"); +const app = (0, express_1.default)(); +app.use(express_1.default.json()); +const server = app.listen(process.env.PORT || 3003, () => { + if (server) { + const address = server.address(); + console.log(`Server is running in http://localhost:${address.port}`); + } + else { + console.error(`Failure upon starting server.`); + } +}); +; +app.post("/users/create-account", (req, res) => { + let errorCode = 400; + const token = req.headers.authorization; + try { + const { name, cpf, date, saldo } = req.body; + if (!token) { + errorCode = 401; + throw new Error("Necessário token de autorização"); + } + if (!name && !cpf && !date) { + errorCode = 404; + throw new Error("Alguns dos seguintes campos em branco: Name,CPF ou Date(data de nascimento)"); + } + const formatoCPF = /\d{3}\.\d{3}\.\d{3}\-\d{2}/; + if (!formatoCPF.test(cpf)) { + errorCode = 401; + throw new Error("erro no formato do cpf"); + } + const now = new Date(); + const idade = date - now.getFullYear(); + if (idade < 18) { + errorCode = 404; + throw new Error("Idade abaixo dos 18 anos"); + } + const consultaCPF = data_1.users.find((userCPF) => { + return userCPF.cpf === cpf; + }); + if (consultaCPF) { + errorCode = 404; + throw new Error("CPF ja cadastrado"); + } + data_1.users.push(name, cpf, date, saldo); + res.status(200).send(data_1.users); + } + catch (error) { + res.status(errorCode).send({ message: error.message }); + } +}); +app.get("/user/balance", (req, res) => { + let errorCode = 422; + try { + const usuarioName = req.query.name; + const usuarioCPF = req.query.cpf; + const filtro = data_1.users.filter((user) => { + return user.name === usuarioName; + }); + const serachname = data_1.users.find((name) => { + return name.name === usuarioName; + }); + const serchcpf = data_1.users.find((cpf) => { + return cpf.cpf === usuarioCPF; + }); + if (!serachname || !serchcpf) { + errorCode = 422; + throw new Error("Name ou CPF inválido!"); + } + res.status(200).send({ saldo: filtro[0].saldo }); + } + catch (error) { + res.status(errorCode).send({ message: error.message }); + } +}); +app.get("/users", (req, res) => { + let errorCode = 400; + try { + const usuarioName = req.query.name; + const usuarioCPF = req.query.cpf; + const findAccount = data_1.users.filter((user) => user.name === usuarioName && user.cpf === usuarioCPF); + const findName = data_1.users.find((name) => { + return name.name.toLowerCase() === usuarioName.toLowerCase(); + }); + const findCPF = data_1.users.find((cpf) => { + return cpf.cpf.toLowerCase() === usuarioCPF.toLowerCase(); + }); + if (!findName) { + errorCode = 422; + throw new Error("Name não cadastrados"); + } + if (!findCPF) { + errorCode = 422; + throw new Error("CPF não cadastrados"); + } + res.status(200).send(findAccount); + } + catch (error) { + res.status(errorCode).send(error.message); + } +}); +app.get("/user/cpf", (req, res) => { + let errorCode = 422; + try { + const usuarioCPF = req.query.cpf; + const filtro = data_1.users.filter((user) => { + return user.cpf === usuarioCPF; + }); + const serchcpf = data_1.users.find((cpf) => { + return cpf.cpf === usuarioCPF; + }); + if (!serchcpf) { + errorCode = 422; + throw new Error("CPF inválido!"); + } + res.status(200).send({ saldo: filtro[0].saldo }); + } + catch (error) { + res.status(errorCode).send({ message: error.message }); + } +}); diff --git a/modulo5/testes-backend/src/business/UserBusiness.ts b/modulo5/testes-backend/src/business/UserBusiness.ts index c236843..6e34a34 100644 --- a/modulo5/testes-backend/src/business/UserBusiness.ts +++ b/modulo5/testes-backend/src/business/UserBusiness.ts @@ -6,6 +6,9 @@ import idGenerator, { IdGenerator } from "../services/idGenerator"; import tokenGenerator, { TokenGenerator } from "../services/tokenGenerator"; export class UserBusiness { + static getIDBusiness(id: string) { + throw new Error("Method not implemented."); + } constructor( private userDatabase: UserDatabase, private idGenerator:IdGenerator,