diff --git a/Md03_Dev_Back_end/Bloco25/25.3/express-typescript/dist/index.js b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript/dist/index.js new file mode 100644 index 00000000..7705aab1 --- /dev/null +++ b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript/dist/index.js @@ -0,0 +1,39 @@ +"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")); +require("express-async-errors"); +const books_routes_1 = __importDefault(require("./routes/books.routes")); +const statusCodes_1 = __importDefault(require("./statusCodes")); +const app = (0, express_1.default)(); +app.use(express_1.default.json()); +const PORT = 8000; +app.get('/', (_req, res) => { + res.status(statusCodes_1.default.OK).send('Express + TypeScript'); +}); +app.use(books_routes_1.default); +app.use((err, _req, res, next) => { + const { name, message, details } = err; + console.log(`name: ${name}`); + switch (name) { + case 'BadRequestError': + res.status(400).json({ message }); + break; + case 'ValidationError': + res.status(400).json({ message: details[0].message }); + break; + case 'NotFoundError': + res.status(404).json({ message }); + break; + case 'ConflictError': + res.status(409).json({ message }); + break; + default: + console.error(err); + res.sendStatus(500); + } + next(); +}); +app.listen(PORT, () => console.log(`Server is running at http://localhost:${PORT}`)); diff --git a/Md03_Dev_Back_end/Bloco25/25.3/express-typescript/dist/interfaces/book.interface.js b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript/dist/interfaces/book.interface.js new file mode 100644 index 00000000..c8ad2e54 --- /dev/null +++ b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript/dist/interfaces/book.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/Md03_Dev_Back_end/Bloco25/25.3/express-typescript/dist/routes/books.routes.js b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript/dist/routes/books.routes.js new file mode 100644 index 00000000..3749ae5b --- /dev/null +++ b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript/dist/routes/books.routes.js @@ -0,0 +1,5 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const express_1 = require("express"); +const bookRouter = (0, express_1.Router)(); +exports.default = bookRouter; diff --git a/Md03_Dev_Back_end/Bloco25/25.3/express-typescript/dist/statusCodes.js b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript/dist/statusCodes.js new file mode 100644 index 00000000..dda1ba18 --- /dev/null +++ b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript/dist/statusCodes.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +// ./statusCodes.ts +const statusCodes = { + OK: 200, + NOT_FOUND: 404, + CREATED: 201, + BAD_REQUEST: 400, + UNAUTHORIZED: 401, + NO_CONTENT: 204, +}; +exports.default = statusCodes; diff --git a/Md03_Dev_Back_end/Bloco25/25.3/express-typescript/index.ts b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript/index.ts new file mode 100644 index 00000000..c6d388b9 --- /dev/null +++ b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript/index.ts @@ -0,0 +1,42 @@ +import express, { Request, Response, NextFunction } from "express"; +import 'express-async-errors'; +import bookRouter from "./routes/books.routes"; +import statusCodes from "./statusCodes"; + +const app = express(); + +app.use(express.json()); +const PORT = 8000; + +app.get('/', (_req: Request, res: Response) => { + res.status(statusCodes.OK).send('Express + TypeScript'); +}); +app.use(bookRouter); +app.use( + (err: Error, _req: Request, res: Response, next: NextFunction) => { + const { name, message, details } = err as any; + console.log(`name: ${name}`); + + switch(name) { + case 'BadRequestError': + res.status(400).json({ message }); + break; + case 'ValidationError': + res.status(400).json({ message: details[0].message }); + break; + case 'NotFoundError': + res.status(404).json({ message }); + break; + case 'ConflictError': + res.status(409).json({ message }); + break; + default: + console.error(err); + res.sendStatus(500); + } + + next(); + } +); + +app.listen(PORT,() => console.log(`Server is running at http://localhost:${PORT}`)); \ No newline at end of file diff --git a/Md03_Dev_Back_end/Bloco25/25.3/express-typescript/interfaces/book.interface.ts b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript/interfaces/book.interface.ts new file mode 100644 index 00000000..a6d8cff8 --- /dev/null +++ b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript/interfaces/book.interface.ts @@ -0,0 +1,9 @@ +interface Book { + id?: number; + title: string; + price: number; + author: string; + isbn: string; +} + +export default Book; \ No newline at end of file diff --git a/Md03_Dev_Back_end/Bloco25/25.3/express-typescript/package.json b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript/package.json new file mode 100644 index 00000000..a1ce84bf --- /dev/null +++ b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript/package.json @@ -0,0 +1,27 @@ +{ + "name": "express-typescript", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "start": "npm run build && node ./dist/index.js", + "dev": "tsnd index.ts", + "build": "tsc", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@types/express": "4.17", + "@types/node": "16.11", + "ts-node-dev": "1.1", + "typescript": "4.4" + }, + "dependencies": { + "@types/restify-errors": "4.3", + "express": "4.17", + "express-async-errors": "3.1", + "restify-errors": "8.0" + } +} diff --git a/Md03_Dev_Back_end/Bloco25/25.3/express-typescript/routes/books.routes.ts b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript/routes/books.routes.ts new file mode 100644 index 00000000..876c0220 --- /dev/null +++ b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript/routes/books.routes.ts @@ -0,0 +1,5 @@ +import { Router } from 'express'; + +const bookRouter = Router(); + +export default bookRouter; \ No newline at end of file diff --git a/Md03_Dev_Back_end/Bloco25/25.3/express-typescript/statusCodes.ts b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript/statusCodes.ts new file mode 100644 index 00000000..ffe41821 --- /dev/null +++ b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript/statusCodes.ts @@ -0,0 +1,11 @@ +// ./statusCodes.ts +const statusCodes = { + OK: 200, + NOT_FOUND: 404, + CREATED: 201, + BAD_REQUEST: 400, + UNAUTHORIZED: 401, + NO_CONTENT: 204, +}; + +export default statusCodes; \ No newline at end of file diff --git a/Md03_Dev_Back_end/Bloco25/25.3/express-typescript/tsconfig.json b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript/tsconfig.json new file mode 100644 index 00000000..eeb24e61 --- /dev/null +++ b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es6", + "rootDir": "./", + "outDir": "./dist", + "esModuleInterop": true, + "strict": true + } +} \ No newline at end of file diff --git a/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/.env b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/.env new file mode 100644 index 00000000..dcb5bdff --- /dev/null +++ b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/.env @@ -0,0 +1,4 @@ +DB_HOSTNAME = localhost +DB_USER = root +DB_PASSWORD = N@p0lea0 +DB_DATABASE = books_api \ No newline at end of file diff --git a/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/controllers/books.controller.ts b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/controllers/books.controller.ts new file mode 100644 index 00000000..f399e1c3 --- /dev/null +++ b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/controllers/books.controller.ts @@ -0,0 +1,15 @@ +import { Request, Response } from 'express'; +import statusCode from '../statusCodes'; +import BookService from '../services/books.service'; + +export default class BookController { + constructor(private bookservice = new BookService()) {}; + + public getAll = async(_req: Request, res: Response) => { + const { type, message } = await this.bookservice.getAll(); + + if(type) return res.status(statusCode[type]).json(message); + + return res.status(statusCode.OK).json(message); + } +} \ No newline at end of file diff --git a/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/index.ts b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/index.ts new file mode 100644 index 00000000..5e06ddbc --- /dev/null +++ b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/index.ts @@ -0,0 +1,44 @@ +import express, { Request, Response, NextFunction } from "express"; +import statusCode from "./statusCodes"; +import 'express-async-errors'; +import bookRouter from "./routes/books.routes"; + +const app = express(); + +app.use(express.json()); +const PORT = 8000; + +app.get('/', (_req: Request,res: Response) => { + res.status(statusCode.OK).send('Express + TypeScript'); +}); + +app.use(bookRouter); + +app.use((err: Error, _req: Request, res: Response, next: NextFunction) => { + const { name, message, details } = err as any; + console.log(`name: ${name}`); + + switch (name) { + case 'BadRequestError': + res.status(400).json({ message }); + break; + case 'ValidationError': + res.status(400).json({ message: details[0].message }); + break; + case 'NotFoundError': + res.status(404).json({ message }); + break; + case 'ConflictError': + res.status(409).json({ message }); + break; + default: + console.error(err); + res.sendStatus(500); + } + + next(); +}); + +app.listen(PORT, () => { + console.log(`Server is running at http://localhost:${PORT}`); +}); diff --git a/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/interfaces/book.interface.ts b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/interfaces/book.interface.ts new file mode 100644 index 00000000..cbcc004e --- /dev/null +++ b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/interfaces/book.interface.ts @@ -0,0 +1,10 @@ +// ./interfaces/book.interface.ts +interface IBook { + id?: number; + title: string; + price: number; + author: string; + isbn: string; +} + +export default IBook; \ No newline at end of file diff --git a/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/interfaces/services.interface.ts b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/interfaces/services.interface.ts new file mode 100644 index 00000000..2bf6e429 --- /dev/null +++ b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/interfaces/services.interface.ts @@ -0,0 +1,8 @@ +import IBook from "./book.interface"; + +interface IServices { + message: IBook[]; + type: null | 'NOT_FOUND'; +} + +export default IServices; \ No newline at end of file diff --git a/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/models/book.model.ts b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/models/book.model.ts new file mode 100644 index 00000000..87c2394e --- /dev/null +++ b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/models/book.model.ts @@ -0,0 +1,26 @@ +import { Pool, ResultSetHeader } from 'mysql2/promise'; +import IBook from '../interfaces/book.interface'; + +export default class BookModel { + public connection: Pool; + + constructor(connection: Pool) { + this.connection = connection; + } + + public async getAll(): Promise { + const [rows] = await this.connection.execute('SELECT * FROM books'); + + return rows as IBook[]; + } + + public async create(book: IBook): Promise { + const { title, price, author, isbn } = book; + const [{ insertId }] = await this.connection.execute( + 'INSERT INTO books (title, price, author, isbn) VALUES (?,?,?,?)', + [title, price, author, isbn] + ); + + return { id: insertId, ...book }; + } +} \ No newline at end of file diff --git a/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/models/connection.ts b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/models/connection.ts new file mode 100644 index 00000000..bac9841b --- /dev/null +++ b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/models/connection.ts @@ -0,0 +1,12 @@ +// ./models/connection.ts +import mysql from 'mysql2/promise'; // instalar mysql2 e dotenv +import dotenv from 'dotenv'; + +dotenv.config(); + +export default mysql.createPool({ + host: process.env.DB_HOSTNAME, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_DATABASE, +}); diff --git a/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/routes/books.routes.ts b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/routes/books.routes.ts new file mode 100644 index 00000000..79a4a583 --- /dev/null +++ b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/routes/books.routes.ts @@ -0,0 +1,11 @@ +// ./routes/books.routes.ts + +import { Router } from 'express'; +import BooksController from '../controllers/books.controller'; + +const router = Router(); +const booksController = new BooksController(); + +router.get('/books', booksController.getAll); + +export default router; \ No newline at end of file diff --git a/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/services/books.service.ts b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/services/books.service.ts new file mode 100644 index 00000000..91fcb4a8 --- /dev/null +++ b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/services/books.service.ts @@ -0,0 +1,20 @@ +// ./services/books.service.ts +import connection from "../models/connection"; +import BookModel from "../models/book.model"; +import IServices from "../interfaces/services.interface"; + +export default class BookService { + public model: BookModel; + + constructor() { + this.model = new BookModel(connection); + } + + public async getAll(): Promise { + const message = await this.model.getAll(); + + if(message) return { type: null, message }; + + return { type: 'NOT_FOUND', message }; + } +} \ No newline at end of file diff --git a/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/statusCodes.ts b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/statusCodes.ts new file mode 100644 index 00000000..7dd4c008 --- /dev/null +++ b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/statusCodes.ts @@ -0,0 +1,10 @@ +const statusCode = { + OK: 200, + NOT_FOUND: 404, + CREATED: 201, + BAD_REQUEST: 400, + UNAUTHORIZED: 401, + NO_CONTENT: 204, +} + +export default statusCode; \ No newline at end of file diff --git a/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/tsconfig.json b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/tsconfig.json new file mode 100644 index 00000000..eeb24e61 --- /dev/null +++ b/Md03_Dev_Back_end/Bloco25/25.3/express-typescript2/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es6", + "rootDir": "./", + "outDir": "./dist", + "esModuleInterop": true, + "strict": true + } +} \ No newline at end of file