linter + prettier
parent
877aa4a227
commit
582171d1f9
@ -1,78 +1,75 @@
|
||||
import express, { Request, Response } from 'express'
|
||||
import { Order, OrderProduct, OrderStore } from '../models/order'
|
||||
import { verifyAuthToken } from './utils'
|
||||
import express, { Request, Response } from "express";
|
||||
import { Order, OrderProduct, OrderStore } from "../models/order";
|
||||
import { verifyAuthToken } from "./utils";
|
||||
|
||||
const orderRoutes = (app: express.Application) => {
|
||||
app.get('/orders', index)
|
||||
app.get('/orders/:id', read)
|
||||
app.post('/orders', verifyAuthToken, create)
|
||||
app.post('/orders/:id/products', verifyAuthToken, addProduct)
|
||||
app.delete('/orders/:id/products', verifyAuthToken, deleteProduct)
|
||||
}
|
||||
app.get("/orders", index);
|
||||
app.get("/orders/:id", read);
|
||||
app.post("/orders", verifyAuthToken, create);
|
||||
app.post("/orders/:id/products", verifyAuthToken, addProduct);
|
||||
app.delete("/orders/:id/products", verifyAuthToken, deleteProduct);
|
||||
};
|
||||
|
||||
const store = new OrderStore()
|
||||
const store = new OrderStore();
|
||||
|
||||
const index = async (req: Request, res: Response) => {
|
||||
try {
|
||||
const orders = await store.index()
|
||||
res.json(orders)
|
||||
} catch (err) {
|
||||
res.status(400)
|
||||
res.json(err)
|
||||
}
|
||||
}
|
||||
try {
|
||||
const orders = await store.index();
|
||||
res.json(orders);
|
||||
} catch (err) {
|
||||
res.status(400);
|
||||
res.json(err);
|
||||
}
|
||||
};
|
||||
|
||||
const read = async (req: Request, res: Response) => {
|
||||
try {
|
||||
const order = await store.read(parseInt(req.params.id))
|
||||
res.json(order)
|
||||
} catch (err) {
|
||||
res.status(400)
|
||||
res.json(err)
|
||||
}
|
||||
|
||||
}
|
||||
try {
|
||||
const order = await store.read(parseInt(req.params.id));
|
||||
res.json(order);
|
||||
} catch (err) {
|
||||
res.status(400);
|
||||
res.json(err);
|
||||
}
|
||||
};
|
||||
|
||||
const create = async (req: Request, res: Response) => {
|
||||
try {
|
||||
const orderInfo: Order = {
|
||||
status: req.body.status,
|
||||
user_id: parseInt(req.body.user_id)
|
||||
}
|
||||
try {
|
||||
const orderInfo: Order = {
|
||||
status: req.body.status,
|
||||
user_id: parseInt(req.body.user_id),
|
||||
};
|
||||
|
||||
|
||||
const newOrder = await store.create(orderInfo)
|
||||
res.json(newOrder)
|
||||
} catch (err) {
|
||||
res.status(400)
|
||||
res.json(err)
|
||||
}
|
||||
}
|
||||
const newOrder = await store.create(orderInfo);
|
||||
res.json(newOrder);
|
||||
} catch (err) {
|
||||
res.status(400);
|
||||
res.json(err);
|
||||
}
|
||||
};
|
||||
|
||||
const addProduct = async (req: Request, res: Response) => {
|
||||
try {
|
||||
const orderProductInfo: OrderProduct = {
|
||||
order_id: parseInt(req.params.id),
|
||||
quantity: parseInt(req.body.quantity),
|
||||
product_id: parseInt(req.body.product_id)
|
||||
}
|
||||
const addedProduct = await store.addProduct(orderProductInfo)
|
||||
res.json(addedProduct)
|
||||
} catch (err) {
|
||||
res.status(400)
|
||||
res.json(err)
|
||||
}
|
||||
}
|
||||
try {
|
||||
const orderProductInfo: OrderProduct = {
|
||||
order_id: parseInt(req.params.id),
|
||||
quantity: parseInt(req.body.quantity),
|
||||
product_id: parseInt(req.body.product_id),
|
||||
};
|
||||
const addedProduct = await store.addProduct(orderProductInfo);
|
||||
res.json(addedProduct);
|
||||
} catch (err) {
|
||||
res.status(400);
|
||||
res.json(err);
|
||||
}
|
||||
};
|
||||
|
||||
const deleteProduct = async (req: Request, res: Response) => {
|
||||
try {
|
||||
const deletedProduct = await store.deleteProduct(parseInt(req.params.id))
|
||||
res.json(deletedProduct)
|
||||
} catch (err) {
|
||||
res.status(400)
|
||||
res.json(err)
|
||||
}
|
||||
}
|
||||
try {
|
||||
const deletedProduct = await store.deleteProduct(parseInt(req.params.id));
|
||||
res.json(deletedProduct);
|
||||
} catch (err) {
|
||||
res.status(400);
|
||||
res.json(err);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
export default orderRoutes
|
||||
export default orderRoutes;
|
||||
|
@ -1,80 +1,74 @@
|
||||
import express, { Request, Response } from 'express'
|
||||
import { Product, ProductStore } from '../models/product'
|
||||
import { verifyAuthToken } from './utils'
|
||||
import express, { Request, Response } from "express";
|
||||
import { Product, ProductStore } from "../models/product";
|
||||
import { verifyAuthToken } from "./utils";
|
||||
|
||||
const productRoutes = (app: express.Application) => {
|
||||
app.get('/products', index)
|
||||
app.get('/products/:id', read)
|
||||
app.post('/products', verifyAuthToken, create)
|
||||
app.put('/products/:id', verifyAuthToken, update)
|
||||
app.delete('/products/:id', verifyAuthToken, destroy)
|
||||
}
|
||||
app.get("/products", index);
|
||||
app.get("/products/:id", read);
|
||||
app.post("/products", verifyAuthToken, create);
|
||||
app.put("/products/:id", verifyAuthToken, update);
|
||||
app.delete("/products/:id", verifyAuthToken, destroy);
|
||||
};
|
||||
|
||||
const store = new ProductStore()
|
||||
const store = new ProductStore();
|
||||
|
||||
const index = async (req: Request, res: Response) => {
|
||||
try {
|
||||
const products = await store.index()
|
||||
res.json(products)
|
||||
} catch (err) {
|
||||
res.status(400)
|
||||
res.json(err)
|
||||
}
|
||||
|
||||
}
|
||||
try {
|
||||
const products = await store.index();
|
||||
res.json(products);
|
||||
} catch (err) {
|
||||
res.status(400);
|
||||
res.json(err);
|
||||
}
|
||||
};
|
||||
|
||||
const read = async (req: Request, res: Response) => {
|
||||
try {
|
||||
const product = await store.read(parseInt(req.params.id))
|
||||
res.json(product)
|
||||
} catch (err) {
|
||||
res.status(400)
|
||||
res.json(err)
|
||||
}
|
||||
|
||||
}
|
||||
try {
|
||||
const product = await store.read(parseInt(req.params.id));
|
||||
res.json(product);
|
||||
} catch (err) {
|
||||
res.status(400);
|
||||
res.json(err);
|
||||
}
|
||||
};
|
||||
|
||||
const create = async (req: Request, res: Response) => {
|
||||
|
||||
try {
|
||||
const productInfo: Product = {
|
||||
name: req.body.name,
|
||||
price: req.body.price,
|
||||
}
|
||||
const newProduct = await store.create(productInfo)
|
||||
res.json(newProduct)
|
||||
} catch (err) {
|
||||
res.status(400)
|
||||
res.json(err)
|
||||
}
|
||||
|
||||
}
|
||||
try {
|
||||
const productInfo: Product = {
|
||||
name: req.body.name,
|
||||
price: req.body.price,
|
||||
};
|
||||
const newProduct = await store.create(productInfo);
|
||||
res.json(newProduct);
|
||||
} catch (err) {
|
||||
res.status(400);
|
||||
res.json(err);
|
||||
}
|
||||
};
|
||||
|
||||
const update = async (req: Request, res: Response) => {
|
||||
try {
|
||||
const productInfo: Product = {
|
||||
id: parseInt(req.params.id),
|
||||
name: req.body.name,
|
||||
price: req.body.price,
|
||||
}
|
||||
const updatedProduct = await store.update(productInfo)
|
||||
res.json(updatedProduct)
|
||||
} catch (err) {
|
||||
res.status(400)
|
||||
res.json(err)
|
||||
}
|
||||
}
|
||||
try {
|
||||
const productInfo: Product = {
|
||||
id: parseInt(req.params.id),
|
||||
name: req.body.name,
|
||||
price: req.body.price,
|
||||
};
|
||||
const updatedProduct = await store.update(productInfo);
|
||||
res.json(updatedProduct);
|
||||
} catch (err) {
|
||||
res.status(400);
|
||||
res.json(err);
|
||||
}
|
||||
};
|
||||
|
||||
const destroy = async (req: Request, res: Response) => {
|
||||
try {
|
||||
const deleted = await store.delete(parseInt(req.params.id))
|
||||
res.json(deleted)
|
||||
} catch (err) {
|
||||
res.status(400)
|
||||
res.json(err)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
try {
|
||||
const deleted = await store.delete(parseInt(req.params.id));
|
||||
res.json(deleted);
|
||||
} catch (err) {
|
||||
res.status(400);
|
||||
res.json(err);
|
||||
}
|
||||
};
|
||||
|
||||
export default productRoutes
|
||||
export default productRoutes;
|
||||
|
@ -1,113 +1,108 @@
|
||||
import express, { Request, Response } from 'express'
|
||||
import { User, UserStore } from '../models/user'
|
||||
import { verifyAuthToken, verifyUserToken} from './utils'
|
||||
|
||||
import express, { Request, Response } from "express";
|
||||
import { User, UserStore } from "../models/user";
|
||||
import { verifyAuthToken, verifyUserToken } from "./utils";
|
||||
|
||||
const userRoutes = (app: express.Application) => {
|
||||
app.get('/users', verifyAuthToken, index)
|
||||
app.get('/users/:id', verifyAuthToken, read)
|
||||
app.post('/users', create)
|
||||
app.put('/users/:id', verifyAuthToken, update)
|
||||
app.delete('/users/:id', verifyAuthToken, destroy)
|
||||
app.post("/users/auth", authenticate)
|
||||
}
|
||||
|
||||
const store = new UserStore()
|
||||
app.get("/users", verifyAuthToken, index);
|
||||
app.get("/users/:id", verifyAuthToken, read);
|
||||
app.post("/users", create);
|
||||
app.put("/users/:id", verifyAuthToken, update);
|
||||
app.delete("/users/:id", verifyAuthToken, destroy);
|
||||
app.post("/users/auth", authenticate);
|
||||
};
|
||||
|
||||
const store = new UserStore();
|
||||
|
||||
const index = async (req: Request, res: Response) => {
|
||||
try {
|
||||
const users = await store.index()
|
||||
res.json(users);
|
||||
} catch (err) {
|
||||
res.status(400)
|
||||
res.json(err)
|
||||
}
|
||||
}
|
||||
try {
|
||||
const users = await store.index();
|
||||
res.json(users);
|
||||
} catch (err) {
|
||||
res.status(400);
|
||||
res.json(err);
|
||||
}
|
||||
};
|
||||
|
||||
const read = async (req: Request, res: Response) => {
|
||||
try {
|
||||
const user = await store.read(parseInt(req.params.id))
|
||||
res.json(user)
|
||||
} catch (err) {
|
||||
res.status(400)
|
||||
res.json(err)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
const create = async (req: Request, res: Response) => {
|
||||
|
||||
const userInfo: User = {
|
||||
firstname: req.body.firstname,
|
||||
lastname: req.body.lastname,
|
||||
username: req.body.username,
|
||||
password: req.body.password
|
||||
}
|
||||
|
||||
try {
|
||||
const newUser = await store.create(userInfo)
|
||||
res.json(verifyUserToken(newUser))
|
||||
} catch(err) {
|
||||
res.status(400)
|
||||
res.json(err)
|
||||
}
|
||||
}
|
||||
try {
|
||||
const user = await store.read(parseInt(req.params.id));
|
||||
res.json(user);
|
||||
} catch (err) {
|
||||
res.status(400);
|
||||
res.json(err);
|
||||
}
|
||||
};
|
||||
|
||||
const create = async (req: Request, res: Response) => {
|
||||
const userInfo: User = {
|
||||
firstname: req.body.firstname,
|
||||
lastname: req.body.lastname,
|
||||
username: req.body.username,
|
||||
password: req.body.password,
|
||||
};
|
||||
|
||||
try {
|
||||
const newUser = await store.create(userInfo);
|
||||
res.json(verifyUserToken(newUser));
|
||||
} catch (err) {
|
||||
res.status(400);
|
||||
res.json(err);
|
||||
}
|
||||
};
|
||||
|
||||
const update = async (req: Request, res: Response) => {
|
||||
try {
|
||||
const userInfo: User = {
|
||||
id: parseInt(req.params.id),
|
||||
firstname: req.body.firstname,
|
||||
lastname: req.body.lastname,
|
||||
username: req.body.username,
|
||||
password: req.body.password
|
||||
}
|
||||
const updatedUser = await store.update(userInfo)
|
||||
res.json(updatedUser)
|
||||
} catch (err) {
|
||||
res.status(400)
|
||||
res.json(err)
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
const userInfo: User = {
|
||||
id: parseInt(req.params.id),
|
||||
firstname: req.body.firstname,
|
||||
lastname: req.body.lastname,
|
||||
username: req.body.username,
|
||||
password: req.body.password,
|
||||
};
|
||||
const updatedUser = await store.update(userInfo);
|
||||
res.json(updatedUser);
|
||||
} catch (err) {
|
||||
res.status(400);
|
||||
res.json(err);
|
||||
}
|
||||
};
|
||||
|
||||
const destroy = async (req: Request, res: Response) => {
|
||||
try {
|
||||
const deleted = await store.delete(parseInt(req.params.id))
|
||||
res.json(deleted)
|
||||
} catch (err) {
|
||||
res.status(400)
|
||||
res.json(err)
|
||||
}
|
||||
}
|
||||
try {
|
||||
const deleted = await store.delete(parseInt(req.params.id));
|
||||
res.json(deleted);
|
||||
} catch (err) {
|
||||
res.status(400);
|
||||
res.json(err);
|
||||
}
|
||||
};
|
||||
|
||||
const authenticate = async (req: Request, res: Response) => {
|
||||
try {
|
||||
const userInfo: User = {
|
||||
username: req.body.username,
|
||||
password: req.body.password
|
||||
}
|
||||
|
||||
if (userInfo.username === undefined || userInfo.password === undefined) {
|
||||
res.status(400)
|
||||
res.send("Missing credentials username or password")
|
||||
|
||||
}
|
||||
|
||||
const authUser: User | null = await store.authenticate(userInfo.username, userInfo.password)
|
||||
try {
|
||||
const userInfo: User = {
|
||||
username: req.body.username,
|
||||
password: req.body.password,
|
||||
};
|
||||
|
||||
if (authUser === null) {
|
||||
res.status(401)
|
||||
res.send("Password is incorrect")
|
||||
}
|
||||
res.json(verifyUserToken(authUser))
|
||||
} catch(err) {
|
||||
res.status(401)
|
||||
res.json(err)
|
||||
if (userInfo.username === undefined || userInfo.password === undefined) {
|
||||
res.status(400);
|
||||
res.send("Missing credentials username or password");
|
||||
}
|
||||
}
|
||||
|
||||
const authUser: User | null = await store.authenticate(
|
||||
userInfo.username,
|
||||
userInfo.password
|
||||
);
|
||||
|
||||
export default userRoutes
|
||||
if (authUser === null) {
|
||||
res.status(401);
|
||||
res.send("Password is incorrect");
|
||||
}
|
||||
res.json(verifyUserToken(authUser));
|
||||
} catch (err) {
|
||||
res.status(401);
|
||||
res.json(err);
|
||||
}
|
||||
};
|
||||
|
||||
export default userRoutes;
|
||||
|
@ -1,27 +1,31 @@
|
||||
import jwt, { Secret } from "jsonwebtoken"
|
||||
import { User } from "../models/user"
|
||||
import { NextFunction, Request, Response } from "express"
|
||||
import jwt, { Secret } from "jsonwebtoken";
|
||||
import { User } from "../models/user";
|
||||
import { NextFunction, Request, Response } from "express";
|
||||
|
||||
const SECRET = process.env.TOKEN_SECRET as Secret
|
||||
const SECRET = process.env.TOKEN_SECRET as Secret;
|
||||
|
||||
export const verifyAuthToken = (req: Request, res: Response, next: NextFunction) => {
|
||||
if (!req.headers.authorization) {
|
||||
res.status(401)
|
||||
res.json("Missing authorization header")
|
||||
export const verifyAuthToken = (
|
||||
req: Request,
|
||||
res: Response,
|
||||
next: NextFunction
|
||||
) => {
|
||||
if (!req.headers.authorization) {
|
||||
res.status(401);
|
||||
res.json("Missing authorization header");
|
||||
|
||||
return false
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
const token = req.headers.authorization.split(' ')[1]
|
||||
jwt.verify(token, SECRET)
|
||||
next()
|
||||
} catch (err) {
|
||||
res.status(401)
|
||||
res.json("Access denied, invalid token")
|
||||
}
|
||||
}
|
||||
try {
|
||||
const token = req.headers.authorization.split(" ")[1];
|
||||
jwt.verify(token, SECRET);
|
||||
next();
|
||||
} catch (err) {
|
||||
res.status(401);
|
||||
res.json("Access denied, invalid token");
|
||||
}
|
||||
};
|
||||
|
||||
export const verifyUserToken = (user: User | null) => {
|
||||
return jwt.sign({ user }, SECRET)
|
||||
}
|
||||
return jwt.sign({ user }, SECRET);
|
||||
};
|
||||
|
@ -1,135 +1,129 @@
|
||||
import client from '../database'
|
||||
import client from "../database";
|
||||
|
||||
export type Order = {
|
||||
id?: number
|
||||
status: string
|
||||
user_id: number
|
||||
}
|
||||
id?: number;
|
||||
status: string;
|
||||
user_id: number;
|
||||
};
|
||||
|
||||
export type OrderProduct = {
|
||||
id?: number
|
||||
quantity: number
|
||||
order_id: number
|
||||
product_id: number
|
||||
}
|
||||
|
||||
id?: number;
|
||||
quantity: number;
|
||||
order_id: number;
|
||||
product_id: number;
|
||||
};
|
||||
|
||||
export class OrderStore {
|
||||
async index(): Promise<Order[]> {
|
||||
try {
|
||||
|
||||
const conn = await client.connect()
|
||||
const sql = 'SELECT * FROM orders'
|
||||
async index(): Promise<Order[]> {
|
||||
try {
|
||||
const conn = await client.connect();
|
||||
const sql = "SELECT * FROM orders";
|
||||
|
||||
const result = await conn.query(sql)
|
||||
const orders = result.rows
|
||||
|
||||
conn.release()
|
||||
const result = await conn.query(sql);
|
||||
const orders = result.rows;
|
||||
|
||||
return orders
|
||||
conn.release();
|
||||
|
||||
} catch (err) {
|
||||
throw new Error(`Cannot get any order ${err}`)
|
||||
}
|
||||
return orders;
|
||||
} catch (err) {
|
||||
throw new Error(`Cannot get any order ${err}`);
|
||||
}
|
||||
}
|
||||
|
||||
async read(user_id: number): Promise<Order> {
|
||||
try {
|
||||
async read(user_id: number): Promise<Order> {
|
||||
try {
|
||||
const conn = await client.connect();
|
||||
const sql = "SELECT * FROM orders WHERE user_id=($1)";
|
||||
|
||||
const conn = await client.connect()
|
||||
const sql = 'SELECT * FROM orders WHERE user_id=($1)'
|
||||
const result = await conn.query(sql, [user_id]);
|
||||
const order = result.rows[0];
|
||||
|
||||
const result = await conn.query(sql, [user_id])
|
||||
const order = result.rows[0]
|
||||
|
||||
conn.release()
|
||||
conn.release();
|
||||
|
||||
return order
|
||||
|
||||
} catch (err) {
|
||||
throw new Error(`Could not find order ${user_id}. Error: ${err}`)
|
||||
}
|
||||
return order;
|
||||
} catch (err) {
|
||||
throw new Error(`Could not find order ${user_id}. Error: ${err}`);
|
||||
}
|
||||
}
|
||||
|
||||
async create(o: Order): Promise<Order> {
|
||||
try {
|
||||
|
||||
const conn = await client.connect()
|
||||
const sql = 'INSERT INTO orders (status, user_id) VALUES ($1, $2) RETURNING *'
|
||||
async create(o: Order): Promise<Order> {
|
||||
try {
|
||||
const conn = await client.connect();
|
||||
const sql =
|
||||
"INSERT INTO orders (status, user_id) VALUES ($1, $2) RETURNING *";
|
||||
|
||||
const result = await conn.query(sql, [o.status, o.user_id])
|
||||
const order = result.rows[0]
|
||||
const result = await conn.query(sql, [o.status, o.user_id]);
|
||||
const order = result.rows[0];
|
||||
|
||||
conn.release()
|
||||
conn.release();
|
||||
|
||||
return order
|
||||
return order;
|
||||
} catch (err) {
|
||||
throw new Error(`Could not add a new order ${o.user_id}. Error: ${err}`);
|
||||
}
|
||||
}
|
||||
|
||||
async addProduct(o: OrderProduct): Promise<OrderProduct> {
|
||||
try {
|
||||
const ordersql = "SELECT * FROM orders WHERE id=($1)";
|
||||
const conn = await client.connect();
|
||||
const result = await conn.query(ordersql, [o.order_id]);
|
||||
const order = result.rows[0];
|
||||
|
||||
if (order.status !== "active") {
|
||||
throw new Error(
|
||||
`Could not add product ${o.product_id} to order ${o.order_id} because order status is ${order.status}`
|
||||
);
|
||||
}
|
||||
|
||||
conn.release();
|
||||
} catch (err) {
|
||||
throw new Error(`${err}`);
|
||||
}
|
||||
|
||||
} catch (err) {
|
||||
throw new Error(`Could not add a new order ${o.user_id}. Error: ${err}`)
|
||||
}
|
||||
try {
|
||||
const sql =
|
||||
"INSERT INTO order_products (quantity, order_id, product_id) VALUES ($1, $2, $3) RETURNING *";
|
||||
const conn = await client.connect();
|
||||
const result = await conn.query(sql, [
|
||||
o.quantity,
|
||||
o.order_id,
|
||||
o.product_id,
|
||||
]);
|
||||
const order = result.rows[0];
|
||||
|
||||
conn.release();
|
||||
|
||||
return order;
|
||||
} catch (err) {
|
||||
throw new Error(
|
||||
`Could not add product ${o.product_id} to order ${o.order_id}: Error: ${err}`
|
||||
);
|
||||
}
|
||||
|
||||
async addProduct(o: OrderProduct): Promise<OrderProduct> {
|
||||
try {
|
||||
|
||||
const ordersql = 'SELECT * FROM orders WHERE id=($1)'
|
||||
const conn = await client.connect()
|
||||
const result = await conn.query(ordersql, [o.order_id])
|
||||
const order = result.rows[0]
|
||||
|
||||
if(order.status !== "active") {
|
||||
throw new Error(`Could not add product ${o.product_id} to order ${o.order_id} because order status is ${order.status}`)
|
||||
}
|
||||
|
||||
conn.release()
|
||||
} catch (err) {
|
||||
throw new Error(`${err}`)
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
const sql = 'INSERT INTO order_products (quantity, order_id, product_id) VALUES ($1, $2, $3) RETURNING *'
|
||||
const conn = await client.connect()
|
||||
const result = await conn.query(sql, [o.quantity, o.order_id, o.product_id])
|
||||
const order = result.rows[0]
|
||||
|
||||
conn.release()
|
||||
|
||||
return order
|
||||
} catch (err) {
|
||||
throw new Error(`Could not add product ${o.product_id} to order ${o.order_id}: Error: ${err}`)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
async deleteProduct(id: number): Promise<Order> {
|
||||
try {
|
||||
const sql = "DELETE FROM order_products WHERE order_id=($1)";
|
||||
const conn = await client.connect();
|
||||
const result = await conn.query(sql, [id]);
|
||||
|
||||
conn.release();
|
||||
} catch (err) {
|
||||
throw new Error(`Could not delete order ${id}: Error: ${err}`);
|
||||
}
|
||||
|
||||
async deleteProduct(id: number): Promise<Order> {
|
||||
try {
|
||||
|
||||
const sql = 'DELETE FROM order_products WHERE order_id=($1)'
|
||||
const conn = await client.connect()
|
||||
const result = await conn.query(sql, [id])
|
||||
|
||||
conn.release()
|
||||
|
||||
|
||||
} catch (err) {
|
||||
throw new Error(`Could not delete order ${id}: Error: ${err}`)
|
||||
}
|
||||
|
||||
|
||||
try {
|
||||
|
||||
const ordersql = 'DELETE FROM orders WHERE id=($1)'
|
||||
const conn = await client.connect()
|
||||
const ordersResult = await conn.query(ordersql, [id])
|
||||
const order = ordersResult.rows[0]
|
||||
|
||||
conn.release()
|
||||
|
||||
return order
|
||||
|
||||
} catch (err) {
|
||||
throw new Error(`${err}`)
|
||||
}
|
||||
try {
|
||||
const ordersql = "DELETE FROM orders WHERE id=($1)";
|
||||
const conn = await client.connect();
|
||||
const ordersResult = await conn.query(ordersql, [id]);
|
||||
const order = ordersResult.rows[0];
|
||||
|
||||
conn.release();
|
||||
|
||||
return order;
|
||||
} catch (err) {
|
||||
throw new Error(`${err}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,101 +1,91 @@
|
||||
import client from '../database';
|
||||
import client from "../database";
|
||||
|
||||
export type Product = {
|
||||
id?: number;
|
||||
name: string;
|
||||
price: number;
|
||||
}
|
||||
id?: number;
|
||||
name: string;
|
||||
price: number;
|
||||
};
|
||||
|
||||
export class ProductStore {
|
||||
async index(): Promise<Product[]> {
|
||||
try {
|
||||
|
||||
const conn = await client.connect()
|
||||
const sql = 'SELECT * FROM products'
|
||||
|
||||
const result = await conn.query(sql)
|
||||
const products = result.rows
|
||||
async index(): Promise<Product[]> {
|
||||
try {
|
||||
const conn = await client.connect();
|
||||
const sql = "SELECT * FROM products";
|
||||
|
||||
conn.release()
|
||||
const result = await conn.query(sql);
|
||||
const products = result.rows;
|
||||
|
||||
return products
|
||||
conn.release();
|
||||
|
||||
} catch (err) {
|
||||
throw new Error(`Cannot get any products ${err}`)
|
||||
}
|
||||
return products;
|
||||
} catch (err) {
|
||||
throw new Error(`Cannot get any products ${err}`);
|
||||
}
|
||||
}
|
||||
|
||||
async read(id: number): Promise<Product> {
|
||||
try {
|
||||
async read(id: number): Promise<Product> {
|
||||
try {
|
||||
const conn = await client.connect();
|
||||
const sql = "SELECT * FROM products WHERE id=($1)";
|
||||
|
||||
const conn = await client.connect()
|
||||
const sql = 'SELECT * FROM products WHERE id=($1)'
|
||||
|
||||
const result = await conn.query(sql, [id])
|
||||
const product = result.rows[0]
|
||||
const result = await conn.query(sql, [id]);
|
||||
const product = result.rows[0];
|
||||
|
||||
conn.release()
|
||||
|
||||
return product
|
||||
|
||||
} catch (err) {
|
||||
throw new Error(`Could not find product ${id}. Error: ${err}`)
|
||||
}
|
||||
conn.release();
|
||||
|
||||
return product;
|
||||
} catch (err) {
|
||||
throw new Error(`Could not find product ${id}. Error: ${err}`);
|
||||
}
|
||||
|
||||
async create(p: Product): Promise<Product> {
|
||||
try {
|
||||
|
||||
const conn = await client.connect()
|
||||
const sql = 'INSERT INTO products (name, price) VALUES ($1, $2) RETURNING *'
|
||||
}
|
||||
|
||||
const result = await conn.query(sql, [p.name, p.price])
|
||||
const product = result.rows[0]
|
||||
async create(p: Product): Promise<Product> {
|
||||
try {
|
||||
const conn = await client.connect();
|
||||
const sql =
|
||||
"INSERT INTO products (name, price) VALUES ($1, $2) RETURNING *";
|
||||
|
||||
conn.release()
|
||||
const result = await conn.query(sql, [p.name, p.price]);
|
||||
const product = result.rows[0];
|
||||
|
||||
return product
|
||||
|
||||
} catch (err) {
|
||||
throw new Error(`Could not add a new product ${p.name}. Error: ${err}`)
|
||||
}
|
||||
conn.release();
|
||||
|
||||
return product;
|
||||
} catch (err) {
|
||||
throw new Error(`Could not add a new product ${p.name}. Error: ${err}`);
|
||||
}
|
||||
}
|
||||
|
||||
async update(p: Product): Promise<Product> {
|
||||
try {
|
||||
|
||||
const conn = await client.connect();
|
||||
const sql = 'UPDATE products SET name=$1, price=$2 WHERE id=$3 RETURNING *'
|
||||
|
||||
const result = await conn.query(sql, [p.name, p.price, p.id])
|
||||
const product = result.rows[0]
|
||||
async update(p: Product): Promise<Product> {
|
||||
try {
|
||||
const conn = await client.connect();
|
||||
const sql =
|
||||
"UPDATE products SET name=$1, price=$2 WHERE id=$3 RETURNING *";
|
||||
|
||||
conn.release()
|
||||
const result = await conn.query(sql, [p.name, p.price, p.id]);
|
||||
const product = result.rows[0];
|
||||
|
||||
return product
|
||||
conn.release();
|
||||
|
||||
} catch (err) {
|
||||
throw new Error(`Could not update product ${p.id}. Error: ${err}`)
|
||||
}
|
||||
return product;
|
||||
} catch (err) {
|
||||
throw new Error(`Could not update product ${p.id}. Error: ${err}`);
|
||||
}
|
||||
}
|
||||
|
||||
async delete(id: number): Promise<Product> {
|
||||
try {
|
||||
|
||||
const conn = await client.connect()
|
||||
const sql = 'DELETE FROM products WHERE id=($1)'
|
||||
|
||||
const result = await conn.query(sql, [id])
|
||||
const product = result.rows[0]
|
||||
async delete(id: number): Promise<Product> {
|
||||
try {
|
||||
const conn = await client.connect();
|
||||
const sql = "DELETE FROM products WHERE id=($1)";
|
||||
|
||||
conn.release()
|
||||
const result = await conn.query(sql, [id]);
|
||||
const product = result.rows[0];
|
||||
|
||||
return product
|
||||
conn.release();
|
||||
|
||||
} catch (err) {
|
||||
throw new Error(`Could not delete product ${id}. Error: ${err}`)
|
||||
}
|
||||
return product;
|
||||
} catch (err) {
|
||||
throw new Error(`Could not delete product ${id}. Error: ${err}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,29 +1,27 @@
|
||||
import express, { Request, Response } from 'express'
|
||||
import bodyParser from 'body-parser'
|
||||
import express, { Request, Response } from "express";
|
||||
import bodyParser from "body-parser";
|
||||
|
||||
import productRoutes from './handlers/products'
|
||||
import userRoutes from './handlers/users'
|
||||
import orderRoutes from './handlers/orders'
|
||||
import productRoutes from "./handlers/products";
|
||||
import userRoutes from "./handlers/users";
|
||||
import orderRoutes from "./handlers/orders";
|
||||
|
||||
const app: express.Application = express()
|
||||
const address: string = "0.0.0.0:3000"
|
||||
const app: express.Application = express();
|
||||
const address: string = "0.0.0.0:3000";
|
||||
const port = 3000;
|
||||
|
||||
app.use(bodyParser.json())
|
||||
app.use(bodyParser.json());
|
||||
|
||||
app.get('/', function (req: Request, res: Response) {
|
||||
res.send('Main API')
|
||||
})
|
||||
app.get("/", function (req: Request, res: Response) {
|
||||
res.send("Main API");
|
||||
});
|
||||
|
||||
productRoutes(app)
|
||||
userRoutes(app)
|
||||
orderRoutes(app)
|
||||
productRoutes(app);
|
||||
userRoutes(app);
|
||||
orderRoutes(app);
|
||||
|
||||
// Start express server
|
||||
app.listen(port, function () {
|
||||
console.log(`starting app on: ${address}`)
|
||||
})
|
||||
|
||||
|
||||
console.log(`starting app on: ${address}`);
|
||||
});
|
||||
|
||||
export default app;
|
||||
|
@ -1,89 +1,85 @@
|
||||
import supertest from "supertest"
|
||||
import app from "../../server"
|
||||
import { Product } from '../../models/product'
|
||||
import { User } from '../../models/user'
|
||||
import { Order, OrderProduct } from '../../models/order'
|
||||
import supertest from "supertest";
|
||||
import app from "../../server";
|
||||
import { Product } from "../../models/product";
|
||||
import { User } from "../../models/user";
|
||||
import { Order, OrderProduct } from "../../models/order";
|
||||
|
||||
const token = process.env.TOKEN_SECRET_TEST as string
|
||||
const token = process.env.TOKEN_SECRET_TEST as string;
|
||||
const request = supertest(app);
|
||||
|
||||
const testProduct: Product = {
|
||||
id: 3,
|
||||
name: "metro",
|
||||
price: 10
|
||||
}
|
||||
id: 3,
|
||||
name: "metro",
|
||||
price: 10,
|
||||
};
|
||||
|
||||
const testUser: User = {
|
||||
id: 3,
|
||||
firstname: 'John',
|
||||
lastname: 'Doe',
|
||||
username: 'Jd',
|
||||
password: 'password'
|
||||
}
|
||||
id: 3,
|
||||
firstname: "John",
|
||||
lastname: "Doe",
|
||||
username: "Jd",
|
||||
password: "password",
|
||||
};
|
||||
|
||||
const testOrder: Order = {
|
||||
status: "active",
|
||||
user_id: 3
|
||||
}
|
||||
status: "active",
|
||||
user_id: 3,
|
||||
};
|
||||
|
||||
const testOrderProduct: OrderProduct = {
|
||||
id: 2,
|
||||
quantity: 5,
|
||||
order_id: 2,
|
||||
product_id: 3
|
||||
}
|
||||
id: 2,
|
||||
quantity: 5,
|
||||
order_id: 2,
|
||||
product_id: 3,
|
||||
};
|
||||
|
||||
describe("Order handler", () => {
|
||||
|
||||
beforeAll( async () => {
|
||||
beforeAll(async () => {
|
||||
const product = await request
|
||||
.post('/products')
|
||||
.auth(token, {type: "bearer"})
|
||||
.send(testProduct)
|
||||
.post("/products")
|
||||
.auth(token, { type: "bearer" })
|
||||
.send(testProduct);
|
||||
|
||||
const user = await request
|
||||
.post('/users')
|
||||
.auth(token, {type: "bearer"})
|
||||
.send(testUser)
|
||||
})
|
||||
.post("/users")
|
||||
.auth(token, { type: "bearer" })
|
||||
.send(testUser);
|
||||
});
|
||||
|
||||
it('Should create a new order', async () => {
|
||||
it("Should create a new order", async () => {
|
||||
const response = await request
|
||||
.post("/orders")
|
||||
.auth(token, {type: "bearer"})
|
||||
.send(testOrder)
|
||||
.post("/orders")
|
||||
.auth(token, { type: "bearer" })
|
||||
.send(testOrder);
|
||||
|
||||
expect(response.status).toBe(200)
|
||||
})
|
||||
expect(response.status).toBe(200);
|
||||
});
|
||||
|
||||
it('Should index orders', async () => {
|
||||
const response = await request
|
||||
.get("/orders")
|
||||
it("Should index orders", async () => {
|
||||
const response = await request.get("/orders");
|
||||
|
||||
expect(response.status).toBe(200)
|
||||
})
|
||||
expect(response.status).toBe(200);
|
||||
});
|
||||
|
||||
it('Should get order by id', async () => {
|
||||
const response = await request
|
||||
.get("/orders/2")
|
||||
it("Should get order by id", async () => {
|
||||
const response = await request.get("/orders/2");
|
||||
|
||||
expect(response.status).toBe(200)
|
||||
})
|
||||
it('Should add a new product to order', async () => {
|
||||
const response = await request
|
||||
.post('/orders/2/products')
|
||||
.auth(token, {type: 'bearer'})
|
||||
.send(testOrderProduct)
|
||||
expect(response.status).toBe(200);
|
||||
});
|
||||
it("Should add a new product to order", async () => {
|
||||
const response = await request
|
||||
.post("/orders/2/products")
|
||||
.auth(token, { type: "bearer" })
|
||||
.send(testOrderProduct);
|
||||
|
||||
expect(response.status).toBe(200)
|
||||
})
|
||||
expect(response.status).toBe(200);
|
||||
});
|
||||
|
||||
it('Should delete order', async () => {
|
||||
it("Should delete order", async () => {
|
||||
const response = await request
|
||||
.delete('/orders/2/products')
|
||||
.auth(token, {type: 'bearer'})
|
||||
|
||||
expect(response.status).toBe(200)
|
||||
})
|
||||
.delete("/orders/2/products")
|
||||
.auth(token, { type: "bearer" });
|
||||
|
||||
})
|
||||
expect(response.status).toBe(200);
|
||||
});
|
||||
});
|
||||
|
@ -1,64 +1,57 @@
|
||||
import supertest from "supertest"
|
||||
import app from "../../server"
|
||||
import { Product } from '../../models/product'
|
||||
import supertest from "supertest";
|
||||
import app from "../../server";
|
||||
import { Product } from "../../models/product";
|
||||
|
||||
|
||||
|
||||
const token = process.env.TOKEN_SECRET_TEST as string
|
||||
const token = process.env.TOKEN_SECRET_TEST as string;
|
||||
const request = supertest(app);
|
||||
|
||||
const testProduct: Product = {
|
||||
name: "metro",
|
||||
price: 10
|
||||
}
|
||||
name: "metro",
|
||||
price: 10,
|
||||
};
|
||||
|
||||
const updatedProduct: Product = {
|
||||
name: "1984",
|
||||
price: 5
|
||||
}
|
||||
|
||||
|
||||
name: "1984",
|
||||
price: 5,
|
||||
};
|
||||
|
||||
describe("Product handler", () => {
|
||||
|
||||
console.log("PRODUCT")
|
||||
it('Should create a new product', async () => {
|
||||
const response = await request
|
||||
console.log("PRODUCT");
|
||||
it("Should create a new product", async () => {
|
||||
const response = await request
|
||||
.post("/products")
|
||||
.auth(token, { type: "bearer" })
|
||||
.send(testProduct);
|
||||
|
||||
expect(response.status).toBe(200);
|
||||
})
|
||||
expect(response.status).toBe(200);
|
||||
});
|
||||
|
||||
it('Should index products', async () => {
|
||||
const response = await request
|
||||
.get("/products")
|
||||
|
||||
expect(response.status).toBe(200);
|
||||
})
|
||||
it("Should index products", async () => {
|
||||
const response = await request.get("/products");
|
||||
|
||||
expect(response.status).toBe(200);
|
||||
});
|
||||
|
||||
it("Should get product by id", async () => {
|
||||
const response = await request.get("/products/1");
|
||||
|
||||
expect(response.status).toBe(200);
|
||||
});
|
||||
|
||||
it("Should update product with id", async () => {
|
||||
const response = await request
|
||||
.put("/products/1")
|
||||
.auth(token, { type: "bearer" })
|
||||
.send(updatedProduct);
|
||||
|
||||
it('Should get product by id', async () => {
|
||||
const response = await request
|
||||
.get("/products/1")
|
||||
|
||||
expect(response.status).toBe(200);
|
||||
})
|
||||
expect(response.status).toBe(200);
|
||||
});
|
||||
|
||||
it('Should update product with id', async () => {
|
||||
const response = await request
|
||||
.put("/products/1")
|
||||
.auth(token, { type: 'bearer'})
|
||||
.send(updatedProduct)
|
||||
|
||||
expect(response.status).toBe(200);
|
||||
})
|
||||
it("Should delete product with id", async () => {
|
||||
const response = await request
|
||||
.delete("/products/1")
|
||||
.auth(token, { type: "bearer" });
|
||||
|
||||
it('Should delete product with id', async () => {
|
||||
const response = await request
|
||||
.delete("/products/1")
|
||||
.auth(token, { type: 'bearer'})
|
||||
|
||||
expect(response.status).toBe(200);
|
||||
})
|
||||
})
|
||||
expect(response.status).toBe(200);
|
||||
});
|
||||
});
|
||||
|
@ -1,75 +1,74 @@
|
||||
import supertest from "supertest"
|
||||
import app from "../../server"
|
||||
import { User } from '../../models/user'
|
||||
import supertest from "supertest";
|
||||
import app from "../../server";
|
||||
import { User } from "../../models/user";
|
||||
|
||||
const token = process.env.TOKEN_SECRET_TEST as string
|
||||
const token = process.env.TOKEN_SECRET_TEST as string;
|
||||
const request = supertest(app);
|
||||
|
||||
const testUser: User = {
|
||||
id: 1,
|
||||
firstname: 'John',
|
||||
lastname: 'Doe',
|
||||
username: 'Jd',
|
||||
password: 'password'
|
||||
}
|
||||
id: 1,
|
||||
firstname: "John",
|
||||
lastname: "Doe",
|
||||
username: "Jd",
|
||||
password: "password",
|
||||
};
|
||||
|
||||
describe("Users handler", () => {
|
||||
it('Should create a new user', async () => {
|
||||
const response = await request
|
||||
.post("/users")
|
||||
.auth(token, {type: "bearer"})
|
||||
.send(testUser);
|
||||
it("Should create a new user", async () => {
|
||||
const response = await request
|
||||
.post("/users")
|
||||
.auth(token, { type: "bearer" })
|
||||
.send(testUser);
|
||||
|
||||
expect(response.status).toBe(200)
|
||||
})
|
||||
expect(response.status).toBe(200);
|
||||
});
|
||||
|
||||
it('Should authenticate a user', async () => {
|
||||
const response = await request
|
||||
.post("/users/auth")
|
||||
.auth(token, {type: "bearer"})
|
||||
.send(testUser);
|
||||
it("Should authenticate a user", async () => {
|
||||
const response = await request
|
||||
.post("/users/auth")
|
||||
.auth(token, { type: "bearer" })
|
||||
.send(testUser);
|
||||
|
||||
expect(response.status).toBe(200)
|
||||
})
|
||||
expect(response.status).toBe(200);
|
||||
});
|
||||
|
||||
it('Should index users', async () => {
|
||||
const response = await request
|
||||
.get("/users")
|
||||
.auth(token, {type: "bearer"})
|
||||
|
||||
expect(response.status).toBe(200)
|
||||
})
|
||||
it("Should index users", async () => {
|
||||
const response = await request
|
||||
.get("/users")
|
||||
.auth(token, { type: "bearer" });
|
||||
|
||||
it('Should get user by id', async () => {
|
||||
const response = await request
|
||||
.get("/users/1")
|
||||
.auth(token, {type: "bearer"})
|
||||
expect(response.status).toBe(200);
|
||||
});
|
||||
|
||||
expect(response.status).toBe(200)
|
||||
})
|
||||
it("Should get user by id", async () => {
|
||||
const response = await request
|
||||
.get("/users/1")
|
||||
.auth(token, { type: "bearer" });
|
||||
|
||||
it('Should update a user', async () => {
|
||||
const updatedUser = {
|
||||
id: 1,
|
||||
firstname: 'Sara',
|
||||
lastname: 'Doe',
|
||||
username: 'Sd',
|
||||
password: 'password123'
|
||||
}
|
||||
const response = await request
|
||||
.put("/users/1")
|
||||
.auth(token, {type: 'bearer'})
|
||||
.send(updatedUser)
|
||||
expect(response.status).toBe(200);
|
||||
});
|
||||
|
||||
expect(response.status).toBe(200)
|
||||
})
|
||||
it("Should update a user", async () => {
|
||||
const updatedUser = {
|
||||
id: 1,
|
||||
firstname: "Sara",
|
||||
lastname: "Doe",
|
||||
username: "Sd",
|
||||
password: "password123",
|
||||
};
|
||||
const response = await request
|
||||
.put("/users/1")
|
||||
.auth(token, { type: "bearer" })
|
||||
.send(updatedUser);
|
||||
|
||||
it('Should delete a user by id', async () => {
|
||||
expect(response.status).toBe(200);
|
||||
});
|
||||
|
||||
const response = await request
|
||||
.delete("/users/1")
|
||||
.auth(token, {type: 'bearer'})
|
||||
it("Should delete a user by id", async () => {
|
||||
const response = await request
|
||||
.delete("/users/1")
|
||||
.auth(token, { type: "bearer" });
|
||||
|
||||
expect(response.status).toBe(200)
|
||||
})
|
||||
})
|
||||
expect(response.status).toBe(200);
|
||||
});
|
||||
});
|
||||
|
@ -1,98 +1,90 @@
|
||||
import { User, UserStore } from '../../models/user'
|
||||
import { Product, ProductStore } from '../../models/product';
|
||||
import { Order, OrderProduct, OrderStore } from '../../models/order'
|
||||
import { User, UserStore } from "../../models/user";
|
||||
import { Product, ProductStore } from "../../models/product";
|
||||
import { Order, OrderProduct, OrderStore } from "../../models/order";
|
||||
|
||||
const orderStore = new OrderStore()
|
||||
const userStore = new UserStore()
|
||||
const productStore = new ProductStore()
|
||||
const orderStore = new OrderStore();
|
||||
const userStore = new UserStore();
|
||||
const productStore = new ProductStore();
|
||||
|
||||
const testProduct: Product = {
|
||||
id: 2,
|
||||
name: '1984',
|
||||
price: 5
|
||||
}
|
||||
id: 2,
|
||||
name: "1984",
|
||||
price: 5,
|
||||
};
|
||||
|
||||
const testUser: User = {
|
||||
id: 2,
|
||||
firstname: 'John',
|
||||
lastname: 'Doe',
|
||||
username: 'Jd',
|
||||
password: 'password'
|
||||
}
|
||||
id: 2,
|
||||
firstname: "John",
|
||||
lastname: "Doe",
|
||||
username: "Jd",
|
||||
password: "password",
|
||||
};
|
||||
|
||||
const testOrder: Order = {
|
||||
id: 1,
|
||||
status: "active",
|
||||
user_id: 2
|
||||
}
|
||||
id: 1,
|
||||
status: "active",
|
||||
user_id: 2,
|
||||
};
|
||||
|
||||
const testOrderProduct: OrderProduct = {
|
||||
id: 1,
|
||||
quantity: 5,
|
||||
order_id: 1,
|
||||
product_id: 2
|
||||
}
|
||||
id: 1,
|
||||
quantity: 5,
|
||||
order_id: 1,
|
||||
product_id: 2,
|
||||
};
|
||||
|
||||
describe("Order model", () => {
|
||||
|
||||
beforeAll(async () => {
|
||||
await productStore.create(testProduct)
|
||||
await userStore.create(testUser)
|
||||
})
|
||||
|
||||
console.log('ORDER')
|
||||
it('Should have an index method', () => {
|
||||
expect(orderStore.index).toBeDefined();
|
||||
});
|
||||
|
||||
it('Should have a read method', () => {
|
||||
expect(orderStore.read).toBeDefined;
|
||||
});
|
||||
|
||||
it('Should have a create method', () => {
|
||||
expect(orderStore.create).toBeDefined;
|
||||
});
|
||||
|
||||
it('Should have a update method', () => {
|
||||
expect(orderStore.addProduct).toBeDefined;
|
||||
});
|
||||
|
||||
it('Create method should add a new order', async () => {
|
||||
const result = await orderStore.create(testOrder)
|
||||
expect(result).toEqual(testOrder)
|
||||
});
|
||||
|
||||
it('Index method should return a list of orders', async () => {
|
||||
const result = await orderStore.index();
|
||||
expect(result[0]).toEqual(testOrder)
|
||||
})
|
||||
|
||||
|
||||
it('Read method should return a order', async () => {
|
||||
const result = await orderStore.read(2);
|
||||
expect(result).toEqual(testOrder)
|
||||
})
|
||||
|
||||
|
||||
it('addProduct should add a new product to order', async () => {
|
||||
const result = await orderStore.addProduct(testOrderProduct)
|
||||
expect(result).toEqual(testOrderProduct)
|
||||
})
|
||||
|
||||
it('deleteProduct should delete product from order', async () => {
|
||||
const result = await orderStore.deleteProduct(1)
|
||||
|
||||
const checkorder = await orderStore.index()
|
||||
expect(checkorder).toEqual([])
|
||||
|
||||
})
|
||||
|
||||
|
||||
|
||||
afterAll(async () => {
|
||||
await productStore.delete(1)
|
||||
await userStore.delete(1)
|
||||
})
|
||||
|
||||
|
||||
});
|
||||
beforeAll(async () => {
|
||||
await productStore.create(testProduct);
|
||||
await userStore.create(testUser);
|
||||
});
|
||||
|
||||
console.log("ORDER");
|
||||
it("Should have an index method", () => {
|
||||
expect(orderStore.index).toBeDefined();
|
||||
});
|
||||
|
||||
it("Should have a read method", () => {
|
||||
expect(orderStore.read).toBeDefined;
|
||||
});
|
||||
|
||||
it("Should have a create method", () => {
|
||||
expect(orderStore.create).toBeDefined;
|
||||
});
|
||||
|
||||
it("Should have a update method", () => {
|
||||
expect(orderStore.addProduct).toBeDefined;
|
||||
});
|
||||
|
||||
it("Create method should add a new order", async () => {
|
||||
const result = await orderStore.create(testOrder);
|
||||
expect(result).toEqual(testOrder);
|
||||
});
|
||||
|
||||
it("Index method should return a list of orders", async () => {
|
||||
const result = await orderStore.index();
|
||||
expect(result[0]).toEqual(testOrder);
|
||||
});
|
||||
|
||||
it("Read method should return a order", async () => {
|
||||
const result = await orderStore.read(2);
|
||||
expect(result).toEqual(testOrder);
|
||||
});
|
||||
|
||||
it("addProduct should add a new product to order", async () => {
|
||||
const result = await orderStore.addProduct(testOrderProduct);
|
||||
expect(result).toEqual(testOrderProduct);
|
||||
});
|
||||
|
||||
it("deleteProduct should delete product from order", async () => {
|
||||
const result = await orderStore.deleteProduct(1);
|
||||
|
||||
const checkorder = await orderStore.index();
|
||||
expect(checkorder).toEqual([]);
|
||||
});
|
||||
|
||||
afterAll(async () => {
|
||||
await productStore.delete(1);
|
||||
await userStore.delete(1);
|
||||
});
|
||||
});
|
||||
|
@ -1,110 +1,111 @@
|
||||
import { User, UserStore } from '../../models/user'
|
||||
import bcrypt from 'bcrypt'
|
||||
import { User, UserStore } from "../../models/user";
|
||||
import bcrypt from "bcrypt";
|
||||
|
||||
const { BCRYPT_PASSWORD } = process.env;
|
||||
const pepper = BCRYPT_PASSWORD;
|
||||
|
||||
const { BCRYPT_PASSWORD } = process.env
|
||||
const pepper = BCRYPT_PASSWORD
|
||||
|
||||
|
||||
const store = new UserStore()
|
||||
const store = new UserStore();
|
||||
|
||||
const testUser: User = {
|
||||
id: 1,
|
||||
firstname: 'John',
|
||||
lastname: 'Doe',
|
||||
username: 'Jd',
|
||||
password: 'password'
|
||||
}
|
||||
id: 1,
|
||||
firstname: "John",
|
||||
lastname: "Doe",
|
||||
username: "Jd",
|
||||
password: "password",
|
||||
};
|
||||
|
||||
const updatedUser: User = {
|
||||
id: 1,
|
||||
firstname: 'Sara',
|
||||
lastname: 'Doe',
|
||||
username: 'Sd',
|
||||
password: 'password123'
|
||||
}
|
||||
id: 1,
|
||||
firstname: "Sara",
|
||||
lastname: "Doe",
|
||||
username: "Sd",
|
||||
password: "password123",
|
||||
};
|
||||
|
||||
describe("User model", () => {
|
||||
console.log("USER")
|
||||
it('Should have an index method', () => {
|
||||
expect(store.index).toBeDefined();
|
||||
});
|
||||
|
||||
it('Should have a read method', () => {
|
||||
expect(store.read).toBeDefined;
|
||||
});
|
||||
|
||||
it('Should have a create method', () => {
|
||||
expect(store.create).toBeDefined;
|
||||
});
|
||||
|
||||
it('Should have a update method', () => {
|
||||
expect(store.update).toBeDefined;
|
||||
});
|
||||
|
||||
it('Should have a delete method', () => {
|
||||
expect(store.delete).toBeDefined;
|
||||
});
|
||||
|
||||
it('Create method should create a new user', async () => {
|
||||
const result = await store.create(testUser);
|
||||
|
||||
expect(result.firstname).toEqual(testUser.firstname)
|
||||
expect(result.lastname).toEqual(testUser.lastname)
|
||||
expect(result.username).toEqual(testUser.username)
|
||||
expect(bcrypt.compareSync(testUser.password + pepper, result.password)).toBeTrue
|
||||
})
|
||||
|
||||
|
||||
|
||||
it('Index method should should return a list of users', async () => {
|
||||
|
||||
|
||||
const result = await store.index();
|
||||
expect(result[0].firstname).toEqual(testUser.firstname)
|
||||
expect(result[0].lastname).toEqual(testUser.lastname)
|
||||
expect(result[0].username).toEqual(testUser.username)
|
||||
expect(bcrypt.compareSync(testUser.password + pepper, result[0].password)).toBeTrue
|
||||
})
|
||||
|
||||
it('Read method should return user', async () => {
|
||||
const result = await store.read(1);
|
||||
|
||||
expect(result.firstname).toEqual(testUser.firstname)
|
||||
expect(result.lastname).toEqual(testUser.lastname)
|
||||
expect(result.username).toEqual(testUser.username)
|
||||
expect(bcrypt.compareSync(testUser.password + pepper, result.password)).toBeTrue
|
||||
})
|
||||
|
||||
it('Authenticate method', async () => {
|
||||
const authUser = {
|
||||
username: 'Jd',
|
||||
password: 'password'
|
||||
}
|
||||
const result = await store.authenticate(authUser.username, authUser.password);
|
||||
|
||||
if (result) {
|
||||
expect(result.firstname).toEqual(testUser.firstname)
|
||||
expect(result.lastname).toEqual(testUser.lastname)
|
||||
expect(result.username).toEqual(testUser.username)
|
||||
expect(bcrypt.compareSync(testUser.password + pepper, result.password)).toBeTrue
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
it('Update method should create a new user', async () => {
|
||||
const result = await store.update(updatedUser);
|
||||
|
||||
expect(result.firstname).toEqual(updatedUser.firstname)
|
||||
expect(result.lastname).toEqual(updatedUser.lastname)
|
||||
expect(result.username).toEqual(updatedUser.username)
|
||||
expect(bcrypt.compareSync(updatedUser.password + pepper, result.password)).toBeTrue
|
||||
})
|
||||
|
||||
it('Delete method should delete a user by Id', async () => {
|
||||
const result = await store.delete(1);
|
||||
const checkUsers = await store.index()
|
||||
|
||||
expect(checkUsers).toEqual([])
|
||||
})
|
||||
})
|
||||
console.log("USER");
|
||||
it("Should have an index method", () => {
|
||||
expect(store.index).toBeDefined();
|
||||
});
|
||||
|
||||
it("Should have a read method", () => {
|
||||
expect(store.read).toBeDefined;
|
||||
});
|
||||
|
||||
it("Should have a create method", () => {
|
||||
expect(store.create).toBeDefined;
|
||||
});
|
||||
|
||||
it("Should have a update method", () => {
|
||||
expect(store.update).toBeDefined;
|
||||
});
|
||||
|
||||
it("Should have a delete method", () => {
|
||||
expect(store.delete).toBeDefined;
|
||||
});
|
||||
|
||||
it("Create method should create a new user", async () => {
|
||||
const result = await store.create(testUser);
|
||||
|
||||
expect(result.firstname).toEqual(testUser.firstname);
|
||||
expect(result.lastname).toEqual(testUser.lastname);
|
||||
expect(result.username).toEqual(testUser.username);
|
||||
expect(bcrypt.compareSync(testUser.password + pepper, result.password))
|
||||
.toBeTrue;
|
||||
});
|
||||
|
||||
it("Index method should should return a list of users", async () => {
|
||||
const result = await store.index();
|
||||
expect(result[0].firstname).toEqual(testUser.firstname);
|
||||
expect(result[0].lastname).toEqual(testUser.lastname);
|
||||
expect(result[0].username).toEqual(testUser.username);
|
||||
expect(bcrypt.compareSync(testUser.password + pepper, result[0].password))
|
||||
.toBeTrue;
|
||||
});
|
||||
|
||||
it("Read method should return user", async () => {
|
||||
const result = await store.read(1);
|
||||
|
||||
expect(result.firstname).toEqual(testUser.firstname);
|
||||
expect(result.lastname).toEqual(testUser.lastname);
|
||||
expect(result.username).toEqual(testUser.username);
|
||||
expect(bcrypt.compareSync(testUser.password + pepper, result.password))
|
||||
.toBeTrue;
|
||||
});
|
||||
|
||||
it("Authenticate method", async () => {
|
||||
const authUser = {
|
||||
username: "Jd",
|
||||
password: "password",
|
||||
};
|
||||
const result = await store.authenticate(
|
||||
authUser.username,
|
||||
authUser.password
|
||||
);
|
||||
|
||||
if (result) {
|
||||
expect(result.firstname).toEqual(testUser.firstname);
|
||||
expect(result.lastname).toEqual(testUser.lastname);
|
||||
expect(result.username).toEqual(testUser.username);
|
||||
expect(bcrypt.compareSync(testUser.password + pepper, result.password))
|
||||
.toBeTrue;
|
||||
}
|
||||
});
|
||||
|
||||
it("Update method should create a new user", async () => {
|
||||
const result = await store.update(updatedUser);
|
||||
|
||||
expect(result.firstname).toEqual(updatedUser.firstname);
|
||||
expect(result.lastname).toEqual(updatedUser.lastname);
|
||||
expect(result.username).toEqual(updatedUser.username);
|
||||
expect(bcrypt.compareSync(updatedUser.password + pepper, result.password))
|
||||
.toBeTrue;
|
||||
});
|
||||
|
||||
it("Delete method should delete a user by Id", async () => {
|
||||
const result = await store.delete(1);
|
||||
const checkUsers = await store.index();
|
||||
|
||||
expect(checkUsers).toEqual([]);
|
||||
});
|
||||
});
|
||||
|
Loading…
Reference in New Issue