diff --git a/Back-end/modulo2/MODULO3/testes-backend/.DS_Store b/Back-end/modulo2/MODULO3/testes-backend/.DS_Store new file mode 100644 index 0000000..659a5f3 Binary files /dev/null and b/Back-end/modulo2/MODULO3/testes-backend/.DS_Store differ diff --git a/Back-end/modulo2/MODULO3/testes-backend/.gitignore b/Back-end/modulo2/MODULO3/testes-backend/.gitignore new file mode 100644 index 0000000..1b96213 --- /dev/null +++ b/Back-end/modulo2/MODULO3/testes-backend/.gitignore @@ -0,0 +1,6 @@ +node_modules/ +build/ +.vscode/ + +.env +.rest \ No newline at end of file diff --git a/Back-end/modulo2/MODULO3/testes-backend/jest.config.js b/Back-end/modulo2/MODULO3/testes-backend/jest.config.js new file mode 100644 index 0000000..f4ffb84 --- /dev/null +++ b/Back-end/modulo2/MODULO3/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/Back-end/modulo2/MODULO3/testes-backend/package.json b/Back-end/modulo2/MODULO3/testes-backend/package.json new file mode 100644 index 0000000..5d2c450 --- /dev/null +++ b/Back-end/modulo2/MODULO3/testes-backend/package.json @@ -0,0 +1,34 @@ +{ + "name": "testes-no-backend", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "jest --watchAll", + "start": "tsc && node --inspect ./build/src/index.js", + "dev": " ts-node-dev ./src/index.ts" + }, + "author": "Labenu", + "license": "ISC", + "dependencies": { + "@types/knex": "^0.16.1", + "bcryptjs": "^2.4.3", + "dotenv": "^8.2.0", + "express": "^4.17.1", + "jsonwebtoken": "^8.5.1", + "knex": "^2.3.0", + "mysql": "^2.18.1", + "uuid": "^8.3.2" + }, + "devDependencies": { + "@types/bcryptjs": "^2.4.2", + "@types/express": "^4.17.13", + "@types/jest": "^28.1.4", + "@types/jsonwebtoken": "^8.5.9", + "@types/uuid": "^7.0.3", + "jest": "^28.1.2", + "ts-jest": "^28.0.5", + "ts-node-dev": "^2.0.0", + "typescript": "^4.7.1" + } +} diff --git a/Back-end/modulo2/MODULO3/testes-backend/src/.DS_Store b/Back-end/modulo2/MODULO3/testes-backend/src/.DS_Store new file mode 100644 index 0000000..b69b7dd Binary files /dev/null and b/Back-end/modulo2/MODULO3/testes-backend/src/.DS_Store differ diff --git a/Back-end/modulo2/MODULO3/testes-backend/src/business/Ports.ts b/Back-end/modulo2/MODULO3/testes-backend/src/business/Ports.ts new file mode 100644 index 0000000..9930609 --- /dev/null +++ b/Back-end/modulo2/MODULO3/testes-backend/src/business/Ports.ts @@ -0,0 +1,18 @@ +import { AuthenticationData } from "../services/tokenGenerator"; + +export interface IHashGenerator { + hash(s: string): Promise + compareHash(s: string, hash: string): Promise +} + +export interface IIDGenerator { + generate(): string +} + +export interface ITokenGenerator { + generate(input: AuthenticationData): string + verify(token: string): AuthenticationData +} + + + diff --git a/Back-end/modulo2/MODULO3/testes-backend/src/business/UserBusiness.ts b/Back-end/modulo2/MODULO3/testes-backend/src/business/UserBusiness.ts new file mode 100644 index 0000000..170296e --- /dev/null +++ b/Back-end/modulo2/MODULO3/testes-backend/src/business/UserBusiness.ts @@ -0,0 +1,90 @@ +import { CustomError } from "../errors/CustomError"; +import { User, stringToUserRole } from "../model/User"; +import { IHashGenerator, IIDGenerator, ITokenGenerator } from "./Ports"; +import { UserRepository } from "./UserRepository"; + + +export class UserBusiness { + constructor( + private userDatabase: UserRepository, + private hashGenerator: IHashGenerator, + private idGenerator: IIDGenerator, + private tokenGenerator: ITokenGenerator + ){} + + public async signup( + name: string, + email: string, + password: string, + role: string + ) { + try { + if (!name || !email || !password || !role) { + throw new CustomError(422, "Missing input"); + } + + if (email.indexOf("@") === -1) { + throw new CustomError(422, "Invalid email"); + } + + if (password.length < 6) { + throw new CustomError(422, "Invalid password"); + } + + const id = this.idGenerator.generate(); + + const cypherPassword = await this.hashGenerator.hash(password); + + await this.userDatabase.createUser( + new User(id, name, email, cypherPassword, stringToUserRole(role)) + ); + + const accessToken = this.tokenGenerator.generate({ + id, + role, + }); + return { accessToken }; + } catch (error:any) { + if (error.message.includes("key 'email'")) { + throw new CustomError(409, "Email already in use") + } + + throw new CustomError(error.statusCode, error.message) + } + + } + + public async login(email: string, password: string) { + + try { + if (!email || !password) { + throw new CustomError(422, "Missing input"); + } + + const user = await this.userDatabase.getUserByEmail(email); + + if (!user) { + throw new CustomError(401, "Invalid credentials"); + } + + const isPasswordCorrect = await this.hashGenerator.compareHash( + password, + user.getPassword() + ); + + if (!isPasswordCorrect) { + throw new CustomError(401, "Invalid credentials"); + } + + const accessToken = this.tokenGenerator.generate({ + id: user.getId(), + role: user.getRole(), + }); + + return { accessToken }; + } catch (error:any) { + throw new CustomError(error.statusCode, error.message) + } + } +} + diff --git a/Back-end/modulo2/MODULO3/testes-backend/src/business/UserRepository.ts b/Back-end/modulo2/MODULO3/testes-backend/src/business/UserRepository.ts new file mode 100644 index 0000000..051b5a3 --- /dev/null +++ b/Back-end/modulo2/MODULO3/testes-backend/src/business/UserRepository.ts @@ -0,0 +1,8 @@ +import { User } from "../model/User"; + +export interface UserRepository { + createUser(user: User): Promise; + getUserByEmail(email: string): Promise; + getUserById(id: string): Promise; + getAllUsers(): Promise; +} diff --git a/Back-end/modulo2/MODULO3/testes-backend/src/controller/UserController.ts b/Back-end/modulo2/MODULO3/testes-backend/src/controller/UserController.ts new file mode 100644 index 0000000..85cfdf3 --- /dev/null +++ b/Back-end/modulo2/MODULO3/testes-backend/src/controller/UserController.ts @@ -0,0 +1,37 @@ +import { Request, Response } from "express"; +import { UserBusiness } from "../business/UserBusiness"; + + +export class UserController { + constructor( + private userBusiness: UserBusiness + ){} + + public async signup(req: Request, res: Response) { + try { + const { name, role, email, password } = req.body + const result = await this.userBusiness.signup( + name, + email, + password, + role + ); + res.status(200).send(result); + } catch (error:any) { + const { statusCode, message } = error + res.status(statusCode || 400).send({ message }); + } + } + + public async login(req: Request, res: Response) { + try { + const { email, password } = req.body + const result = await this.userBusiness.login(email, password); + res.status(200).send(result); + } catch (error:any) { + const { statusCode, message } = error + res.status(statusCode || 400).send({ message }); + } + } +} + diff --git a/Back-end/modulo2/MODULO3/testes-backend/src/data/BaseDatabase.ts b/Back-end/modulo2/MODULO3/testes-backend/src/data/BaseDatabase.ts new file mode 100644 index 0000000..beac7fa --- /dev/null +++ b/Back-end/modulo2/MODULO3/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(); + } +} diff --git a/Back-end/modulo2/MODULO3/testes-backend/src/data/UserDatabase.ts b/Back-end/modulo2/MODULO3/testes-backend/src/data/UserDatabase.ts new file mode 100644 index 0000000..6f64be1 --- /dev/null +++ b/Back-end/modulo2/MODULO3/testes-backend/src/data/UserDatabase.ts @@ -0,0 +1,75 @@ +import BaseDataBase from "./BaseDatabase"; +import { User } from "../model/User"; +import { UserRepository } from "../business/UserRepository"; + +export class UserDatabase extends BaseDataBase implements UserRepository { + + protected tableName: string = "INSIRA AQUI O NOME DA SUA TABELA DE USUÁRIOS"; + + 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/Back-end/modulo2/MODULO3/testes-backend/src/errors/CustomError.ts b/Back-end/modulo2/MODULO3/testes-backend/src/errors/CustomError.ts new file mode 100644 index 0000000..72f2bd3 --- /dev/null +++ b/Back-end/modulo2/MODULO3/testes-backend/src/errors/CustomError.ts @@ -0,0 +1,8 @@ +export class CustomError extends Error { + constructor( + public statusCode: number, + message: string + ) { + super(message); + } +} diff --git a/Back-end/modulo2/MODULO3/testes-backend/src/index.ts b/Back-end/modulo2/MODULO3/testes-backend/src/index.ts new file mode 100644 index 0000000..6d1e61c --- /dev/null +++ b/Back-end/modulo2/MODULO3/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/Back-end/modulo2/MODULO3/testes-backend/src/model/User.ts b/Back-end/modulo2/MODULO3/testes-backend/src/model/User.ts new file mode 100644 index 0000000..8bacd8f --- /dev/null +++ b/Back-end/modulo2/MODULO3/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", +} diff --git a/Back-end/modulo2/MODULO3/testes-backend/src/router/UserRouter.ts b/Back-end/modulo2/MODULO3/testes-backend/src/router/UserRouter.ts new file mode 100644 index 0000000..5a5768c --- /dev/null +++ b/Back-end/modulo2/MODULO3/testes-backend/src/router/UserRouter.ts @@ -0,0 +1,21 @@ +import express from "express"; +import { UserBusiness } from "../business/UserBusiness"; +import { UserController } from "../controller/UserController"; +import {UserDatabase} from "../data/UserDatabase"; +import { HashGenerator } from "../services/hashGenerator"; +import { IdGenerator } from "../services/idGenerator"; +import { TokenGenerator } from "../services/tokenGenerator"; + + +const hashGenerator = new HashGenerator() +const idGenerator = new IdGenerator() +const tokenGenerator = new TokenGenerator() + +const userDatabase = new UserDatabase() +const userBusiness = new UserBusiness(userDatabase, hashGenerator, idGenerator, tokenGenerator) +const userController = new UserController(userBusiness) + +export const userRouter = express.Router(); + +userRouter.post("/signup", (req, res) => userController.signup(req, res)); +userRouter.post("/login", (req, res) => userController.login(req, res)); diff --git a/Back-end/modulo2/MODULO3/testes-backend/src/services/hashGenerator.ts b/Back-end/modulo2/MODULO3/testes-backend/src/services/hashGenerator.ts new file mode 100644 index 0000000..d142564 --- /dev/null +++ b/Back-end/modulo2/MODULO3/testes-backend/src/services/hashGenerator.ts @@ -0,0 +1,17 @@ +import bcrypt from "bcryptjs"; +import { IHashGenerator } from "../business/Ports"; + +export class HashGenerator implements IHashGenerator { + 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/Back-end/modulo2/MODULO3/testes-backend/src/services/idGenerator.ts b/Back-end/modulo2/MODULO3/testes-backend/src/services/idGenerator.ts new file mode 100644 index 0000000..7583564 --- /dev/null +++ b/Back-end/modulo2/MODULO3/testes-backend/src/services/idGenerator.ts @@ -0,0 +1,10 @@ +import { v4 } from "uuid"; +import { IIDGenerator } from "../business/Ports"; + +export class IdGenerator implements IIDGenerator { + public generate(): string { + return v4(); + } +} + +export default new IdGenerator() \ No newline at end of file diff --git a/Back-end/modulo2/MODULO3/testes-backend/src/services/tokenGenerator.ts b/Back-end/modulo2/MODULO3/testes-backend/src/services/tokenGenerator.ts new file mode 100644 index 0000000..c7aafde --- /dev/null +++ b/Back-end/modulo2/MODULO3/testes-backend/src/services/tokenGenerator.ts @@ -0,0 +1,36 @@ +import * as jwt from "jsonwebtoken"; +import dotenv from "dotenv"; +import { ITokenGenerator } from "../business/Ports"; + +dotenv.config(); + +export class TokenGenerator implements ITokenGenerator { + 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/Back-end/modulo2/MODULO3/testes-backend/tests/.DS_Store b/Back-end/modulo2/MODULO3/testes-backend/tests/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Back-end/modulo2/MODULO3/testes-backend/tests/.DS_Store differ diff --git a/Back-end/modulo2/MODULO3/testes-backend/tests/business/UserBusiness.test.ts b/Back-end/modulo2/MODULO3/testes-backend/tests/business/UserBusiness.test.ts new file mode 100644 index 0000000..60c6278 --- /dev/null +++ b/Back-end/modulo2/MODULO3/testes-backend/tests/business/UserBusiness.test.ts @@ -0,0 +1,141 @@ +import { UserBusiness } from "../../src/business/UserBusiness"; +import { USER_ROLES } from "../../src/model/User"; +import { HashManagerMock } from "./mocks/HashManagerMock"; +import { IdGeneratorMock } from "./mocks/IdGeneratorMock"; +import { TokenGeneratorMock } from "./mocks/TokenGeneratorMock"; +import { UserDatabaseMock } from "./mocks/UserDatabaseMock"; + +const userDatabaseMock = new UserDatabaseMock(); +const idGeneratorMock = new IdGeneratorMock(); +const tokenGeneratorMock = new TokenGeneratorMock(); +const hashGeneratorMock = new HashManagerMock(); + +const userBusinessTest = new UserBusiness( + userDatabaseMock, + hashGeneratorMock, + idGeneratorMock, + tokenGeneratorMock +); + +describe.skip("Testando o signup do userBusiness", () => { + test("1. Caso de erro: nome inválido", async () => { + expect.assertions(3); + try { + const name = ""; + const email = "email@email"; + const password = "password"; + const role = USER_ROLES.NORMAL; + + await userBusinessTest.signup(name, email, password, role); + } catch (error: any) { + expect(error).toBeDefined(); + expect(error.statusCode).toBe(422); + expect(error.message).toBe("Missing input"); + } + }); + + test("2. Caso de erro: email inválido", async () => { + expect.assertions(3); + try { + const name = "name"; + const email = "email"; + const password = "password"; + const role = USER_ROLES.NORMAL; + + await userBusinessTest.signup(name, email, password, role); + } catch (error: any) { + expect(error).toBeDefined(); + expect(error.statusCode).toBe(422); + expect(error.message).toBe("Invalid email"); + } + }); + + test("3. Caso de erro: email inválido", async () => { + expect.assertions(3); + try { + const name = "name"; + const email = "email@email"; + const password = "pass"; + const role = USER_ROLES.NORMAL; + + await userBusinessTest.signup(name, email, password, role); + } catch (error: any) { + expect(error).toBeDefined(); + expect(error.statusCode).toBe(422); + expect(error.message).toBe("Invalid password"); + } + }); + + test("4. Caso de erro: role inválido", async () => { + expect.assertions(3); + try { + const name = "name"; + const email = "email@email"; + const password = "password"; + const role = ""; + + await userBusinessTest.signup(name, email, password, role); + } catch (error: any) { + expect(error).toBeDefined(); + expect(error.statusCode).toBe(422); + expect(error.message).toBe("Missing input"); + } + }); + + test("5. Caso de sucesso: token gerado", async () => { + expect.assertions(2); + try { + const name = "name"; + const email = "email@email"; + const password = "password"; + const role = USER_ROLES.NORMAL; + + const result = await userBusinessTest.signup(name, email, password, role); + expect(result).toBeDefined(); + expect(result).toEqual({ accessToken: "token" }); + } catch (error: any) {} + }); +}); + + +describe("Testando o login do userBusiness", () => { + + test("1. Caso de erro: email não encontrado", async () => { + expect.assertions(2); + try { + const email = "email@email.com"; + const password = "password"; + + await userBusinessTest.login( email, password); + + } catch (error: any) { + expect(error.statusCode).toBe(401) + expect(error.message).toEqual("Invalid credentials"); + } + }); + + test("2. Caso de erro: senha incorreta", async () => { + expect.assertions(2); + try { + const email = "email@email"; + const password = "123456"; + + const result = await userBusinessTest.login( email, password); + } catch (error: any) { + expect(error.statusCode).toBe(401) + expect(error.message).toEqual("Invalid credentials"); + } + }); + + test("3. Caso de sucesso: token gerado", async () => { + expect.assertions(2); + try { + const email = "email@email"; + const password = "password"; + + const result = await userBusinessTest.login( email, password); + expect(result).toBeDefined(); + expect(result).toEqual({ accessToken: "token" }); + } catch (error: any) {} + }); + }); \ No newline at end of file diff --git a/Back-end/modulo2/MODULO3/testes-backend/tests/business/mocks/HashManagerMock.ts b/Back-end/modulo2/MODULO3/testes-backend/tests/business/mocks/HashManagerMock.ts new file mode 100644 index 0000000..c82e3e8 --- /dev/null +++ b/Back-end/modulo2/MODULO3/testes-backend/tests/business/mocks/HashManagerMock.ts @@ -0,0 +1,12 @@ +import { IHashGenerator } from "../../../src/business/Ports"; + + +export class HashManagerMock implements IHashGenerator { + async hash(s: string): Promise { + return "hashPassword" + } + async compareHash(s: string, hash: string): Promise { + return s === hash + } + +} \ No newline at end of file diff --git a/Back-end/modulo2/MODULO3/testes-backend/tests/business/mocks/IdGeneratorMock.ts b/Back-end/modulo2/MODULO3/testes-backend/tests/business/mocks/IdGeneratorMock.ts new file mode 100644 index 0000000..8f2770c --- /dev/null +++ b/Back-end/modulo2/MODULO3/testes-backend/tests/business/mocks/IdGeneratorMock.ts @@ -0,0 +1,6 @@ +import { IIDGenerator } from "../../../src/business/Ports"; + + +export class IdGeneratorMock implements IIDGenerator { + generate = jest.fn(()=> "id") +} \ No newline at end of file diff --git a/Back-end/modulo2/MODULO3/testes-backend/tests/business/mocks/TokenGeneratorMock.ts b/Back-end/modulo2/MODULO3/testes-backend/tests/business/mocks/TokenGeneratorMock.ts new file mode 100644 index 0000000..a8698df --- /dev/null +++ b/Back-end/modulo2/MODULO3/testes-backend/tests/business/mocks/TokenGeneratorMock.ts @@ -0,0 +1,14 @@ +import { ITokenGenerator } from "../../../src/business/Ports"; +import { USER_ROLES } from "../../../src/model/User"; +import { AuthenticationData } from "../../../src/services/tokenGenerator"; + + +export class TokenGeneratorMock implements ITokenGenerator { + generate(input: AuthenticationData): string { + return "token" + } + verify(token: string): AuthenticationData { + return {id: "id", role: USER_ROLES.ADMIN} + } + +} \ No newline at end of file diff --git a/Back-end/modulo2/MODULO3/testes-backend/tests/business/mocks/UserDatabaseMock.ts b/Back-end/modulo2/MODULO3/testes-backend/tests/business/mocks/UserDatabaseMock.ts new file mode 100644 index 0000000..c1c7de4 --- /dev/null +++ b/Back-end/modulo2/MODULO3/testes-backend/tests/business/mocks/UserDatabaseMock.ts @@ -0,0 +1,24 @@ +import { UserRepository } from "../../../src/business/UserRepository"; +import { User, USER_ROLES } from "../../../src/model/User"; + + +export class UserDatabaseMock implements UserRepository{ + async createUser(user: User): Promise { + console.log("Usuário criado") + } + async getUserByEmail(email: string): Promise { + + if(email === "email@email" ){ + return new User("id", "name", "email@email", "password", USER_ROLES.NORMAL) + } else { + return undefined + } + } + async getUserById(id: string): Promise { + throw new Error("Method not implemented."); + } + async getAllUsers(): Promise { + throw new Error("Method not implemented."); + } + +} \ No newline at end of file diff --git a/Back-end/modulo2/MODULO3/testes-backend/tsconfig.json b/Back-end/modulo2/MODULO3/testes-backend/tsconfig.json new file mode 100644 index 0000000..e6e86ee --- /dev/null +++ b/Back-end/modulo2/MODULO3/testes-backend/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "es6", + "module": "commonjs", + "sourceMap": true, + "outDir": "./build", + "rootDir": "./", + "removeComments": true, + "strict": true, + "noImplicitAny": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true + } +} \ No newline at end of file