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

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions modulo5/criptografia-e-user-roles/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{
"name": "to-do-list",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"start": "tsc && node --inspect ./build/index.js",
"dev": "ts-node-dev --transpile-only --ignore-watch node_modules ./src/index.ts",
"test": "ts-node-dev ./src/services/authenticator.ts"
},
"author": "Labenu",
"license": "ISC",
"dependencies": {
"bcryptjs": "^2.4.3",
"cors": "^2.8.5",
"dotenv": "^8.2.0",
"express": "^4.17.1",
"jsonwebtoken": "^8.5.1",
"knex": "^0.21.5",
"mysql": "^2.18.1",
"ts-node-dev": "^2.0.0",
"uuid": "^9.0.0"
},
"devDependencies": {
"@types/bcryptjs": "^2.4.2",
"@types/cors": "^2.8.8",
"@types/express": "^4.17.8",
"@types/jsonwebtoken": "^8.5.9",
"@types/knex": "^0.16.1",
"@types/node": "^14.11.2",
"@types/uuid": "^8.3.4",
"typescript": "^4.0.3"
}
}
37 changes: 37 additions & 0 deletions modulo5/criptografia-e-user-roles/requests.rest
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# @name signup

POST http://localhost:3003/user/signup
Content-Type: application/json

{
"name": "Norman Osbourne",
"nickname": "Green Goblin",
"email": "osbourne6@oscorp.com" ,
"password": "ihatepeter",
"role": "ADMIN"
}

###

@id = {{signup.response.body.newUser.id}}

PUT http://localhost:3003/user/edit/{{id}}
Content-Type: application/json

{
"name": "Harry Osbourne"
}

### Login
POST http://localhost:3003/user/login
Content-Type: application/json

{
"email": "osbourne6@oscorp.com",
"password": "ihatepeter"
}

### Get Users
GET http://localhost:3003/user/all
Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6Ijk3Y2IyZDY5LWRhMDctNGU5Ni1hOWI0LWNhNjFkNTk1ODVmOSIsInJvbGUiOiJBRE1JTiIsImlhdCI6MTY2MzA4MDE3NSwiZXhwIjoxNjYzMDgzNzc1fQ._bpg5NuS0qWYovoRdurkLSyAgGzFRfauEVVZjb6RKAo

Binary file not shown.
13 changes: 13 additions & 0 deletions modulo5/criptografia-e-user-roles/src/app.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import express from 'express'
import cors from 'cors'

const app = express()

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

app.listen(3003, ()=>{
console.log('Servidor rodando na porta 3003')
})

export default app
20 changes: 20 additions & 0 deletions modulo5/criptografia-e-user-roles/src/data/BaseDatabase.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import Knex from "knex"
import dotenv from "dotenv"
dotenv.config()

export class BaseDatabase {
private 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
}
})
protected getConnection() {
return BaseDatabase.connection
}
}
61 changes: 61 additions & 0 deletions modulo5/criptografia-e-user-roles/src/data/UserDatabase.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import User from "../model/User";
import { IUserDB } from "../types";
import { BaseDatabase } from "./BaseDatabase";

// Utiliza sempre que precisar salvar, editar, deletar ou consultar recursos

export class UserDatabase extends BaseDatabase {

public async createUser(user: User) {

const userDB: IUserDB = {
id: user.getId(),
name: user.getName(),
nickname: user.getNickName(),
email: user.getEmail(),
password: user.getPassword(),
role: user.getRole()
}

await this.getConnection().insert(userDB).into("to_do_list_users")
}

public async edit(id: string, nickname: string) {
await this.getConnection().update({ nickname }).into("to_do_list_users").where({ id })
}

public async getUserByEmail(email: string): Promise<IUserDB | undefined> {
const result: IUserDB[] = await this.getConnection()
.select("*")
.from("to_do_list_users")
.where({ email })

return result[0]
}

public async getUserByPassword(senha: string) {
const result: IUserDB[] = await this.getConnection()
.select("*")
.from("to_do_list_users")
.where({ password: senha })

return result
}

public async getUserById(id: string) {
const result: IUserDB[] = await this.getConnection()
.select("*")
.from("to_do_list_users")
.where({ id })

return result[0]
}

public async getUsers() {
const result: IUserDB[] = await this.getConnection()
.select("*")
.from("to_do_list_users")

return result
}
}
145 changes: 145 additions & 0 deletions modulo5/criptografia-e-user-roles/src/endpoints/User.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
import { Request, Response } from "express";
import { UserDatabase } from "../data/UserDatabase";
import { EmailExist } from "../error/EmailExist";
import { InvalidCredencial } from "../error/IncorrectPassword";
import { MissingFields } from "../error/MissingFields";
import User from "../model/User";
import Authenticator, { ITokenPayload } from "../services/Authenticator";
import GenerateId from "../services/GenerateId";
import { HashManager } from "../services/HashManager";
import { USER_ROLES } from "../types";

class UserEndpoint {

public async createUser(req: Request, res: Response) {
try {
const { name, nickname, email, password, role } = req.body

if (!name || !nickname || !email || !password) {
throw new MissingFields()
}

const userDataBase = new UserDatabase()

const userDB = await userDataBase.getUserByEmail(email)

if (userDB) {
throw new EmailExist()
}

const id = new GenerateId().createId();

// const user = new User(id, name, nickname, email, password)

const hashManager = new HashManager()
const hash = await hashManager.hash(password)

const user = new User(id, name, nickname, email, hash, role)

await userDataBase.createUser(user)

const payload: ITokenPayload = {
id,
role
}

const token = new Authenticator().generateToken(payload)

res.status(201).send({ message: "Usuario cadastrado com sucesso", token })

} catch (error: any) {
res.status(error.statusCode || 500).send({ message: error.message })
}
}

async login(req: Request, res: Response) {
try {

const { email, password } = req.body

if (!email || !password) {
throw new MissingFields()
}

const userData = new UserDatabase()

const userDB = await userData.getUserByEmail(email)

if (!userDB) {
throw new InvalidCredencial();
}

// if (userDB.password !== password) {
// throw new InvalidCredencial();
// }

const hashManager = new HashManager()
const isPasswordCorrect = await hashManager.compare(password, userDB.password)

if (!isPasswordCorrect) {
throw new InvalidCredencial();
}

const payload: ITokenPayload = {
id: userDB.id,
role: userDB.role
}

const token = new Authenticator().generateToken(payload)

res.status(200).send({ token })

} catch (error: any) {
res.status(error.statusCode || 500).send({ message: error.message })
}
}

async editUser(req: Request, res: Response) {
try {
// const token = req.headers.authorization as string
const token = req.headers.authorization!
const { nickname } = req.body

const payload = new Authenticator().verifyToken(token)

const userData = new UserDatabase()

await userData.edit(payload.id,nickname)

res.status(200).send("Atualizado com sucesso!")

} catch (error: any) {
res.status(error.statusCode || 500).send({ message: error.message })
}
}

async getUsers(req: Request, res: Response) {
try {
const token = req.headers.authorization

if (!token) {
throw new InvalidCredencial();
}

const authenticator = new Authenticator()
const payload = authenticator.verifyToken(token)

if (payload.role !== USER_ROLES.ADMIN) {
throw new Error("Autorização insuficiente")
}

const userData = new UserDatabase()
const usersDB = await userData.getUsers()

res.status(200).send({ users: usersDB })

} catch (error: any) {
res.status(error.statusCode || 500).send({ message: error.message })
}
}
}

export default UserEndpoint



41 changes: 41 additions & 0 deletions modulo5/criptografia-e-user-roles/src/endpoints/createUser.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { Request, Response } from "express";
import { UserDatabase } from "../data/UserDatabase";
import { user } from "../types";

export default async function createUser(
req: Request,
res: Response
): Promise<void> {
try {

const { name, nickname, email, password } = req.body
const userDB = new UserDatabase()

if (!name || !nickname || !email || !password) {
res.statusCode = 422
throw new Error("Preencha os campos 'name','nickname', 'password' e 'email'")
}

const user = await userDB.getByEmail(email)
console.log(user)
if (user) {
res.statusCode = 409
throw new Error('Email já cadastrado')
}

const id: string = Date.now().toString()

const newUser: user = { id, name, nickname, email, password }

await userDB.create(newUser)

res.status(201).send({ newUser })

} catch (error: any) {
if (res.statusCode === 200) {
res.status(500).send({ message: "Internal server error" })
} else {
res.send({ message: error.message })
}
}
}
30 changes: 30 additions & 0 deletions modulo5/criptografia-e-user-roles/src/endpoints/editUser.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { Request, Response } from "express";
import { UserDatabase } from "../data/UserDatabase";

export default async function createUser(
req: Request,
res: Response
): Promise<void> {
try {

const { name, nickname } = req.body

if (!name && !nickname) {
res.statusCode = 422
res.statusMessage = "Informe o(s) novo(s) 'name' ou 'nickname'"
throw new Error()
}

new UserDatabase().edit(req.params.id, {name, nickname})

res.end()

} catch (error) {

if (res.statusCode === 200) {
res.status(500).end()
}

res.end()
}
}
Loading