mirror of
https://github.com/Mueller-Patrick/Betterzon.git
synced 2024-11-22 14:23:57 +00:00
BETTERZON-38: Added all currently required models with required service classes and routers
This commit is contained in:
parent
3de28d8835
commit
0f2e2be246
|
@ -2,13 +2,17 @@
|
||||||
* Required External Modules
|
* Required External Modules
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import * as dotenv from "dotenv";
|
import * as dotenv from 'dotenv';
|
||||||
import express from "express";
|
import express from 'express';
|
||||||
import cors from "cors";
|
import cors from 'cors';
|
||||||
import helmet from "helmet";
|
import helmet from 'helmet';
|
||||||
import { productsRouter } from "./products/products.router";
|
import {productsRouter} from './models/products/products.router';
|
||||||
import { errorHandler } from "./middleware/error.middleware";
|
import {categoriesRouter} from './models/categories/categories.router';
|
||||||
import {notFoundHandler} from "./middleware/notFound.middleware";
|
import {manufacturersRouter} from './models/manufacturers/manufacturers.router';
|
||||||
|
import {pricesRouter} from './models/prices/prices.router';
|
||||||
|
import {vendorsRouter} from './models/vendors/vendors.router';
|
||||||
|
import {errorHandler} from './middleware/error.middleware';
|
||||||
|
import {notFoundHandler} from './middleware/notFound.middleware';
|
||||||
|
|
||||||
dotenv.config();
|
dotenv.config();
|
||||||
|
|
||||||
|
@ -33,7 +37,11 @@ const app = express();
|
||||||
app.use(helmet());
|
app.use(helmet());
|
||||||
app.use(cors());
|
app.use(cors());
|
||||||
app.use(express.json());
|
app.use(express.json());
|
||||||
app.use("/products", productsRouter);
|
app.use('/products', productsRouter);
|
||||||
|
app.use('/categories', categoriesRouter);
|
||||||
|
app.use('/manufacturers', manufacturersRouter);
|
||||||
|
app.use('/prices', pricesRouter);
|
||||||
|
app.use('/vendors', vendorsRouter);
|
||||||
|
|
||||||
app.use(errorHandler);
|
app.use(errorHandler);
|
||||||
app.use(notFoundHandler);
|
app.use(notFoundHandler);
|
||||||
|
|
5
Backend/src/models/categories/categories.interface.ts
Normal file
5
Backend/src/models/categories/categories.interface.ts
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
import {Category} from './category.interface';
|
||||||
|
|
||||||
|
export interface Categories {
|
||||||
|
[key: number]: Category;
|
||||||
|
}
|
112
Backend/src/models/categories/categories.router.ts
Normal file
112
Backend/src/models/categories/categories.router.ts
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
/**
|
||||||
|
* Required External Modules and Interfaces
|
||||||
|
*/
|
||||||
|
|
||||||
|
import express, {Request, Response} from 'express';
|
||||||
|
import * as CategoryService from './categories.service';
|
||||||
|
import {Category} from './category.interface';
|
||||||
|
import {Categories} from './categories.interface';
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Router Definition
|
||||||
|
*/
|
||||||
|
|
||||||
|
export const categoriesRouter = express.Router();
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Controller Definitions
|
||||||
|
*/
|
||||||
|
|
||||||
|
// GET items/
|
||||||
|
|
||||||
|
categoriesRouter.get('/', async (req: Request, res: Response) => {
|
||||||
|
try {
|
||||||
|
const categories: Categories = await CategoryService.findAll();
|
||||||
|
|
||||||
|
res.status(200).send(categories);
|
||||||
|
} catch (e) {
|
||||||
|
res.status(404).send(e.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// GET items/:id
|
||||||
|
|
||||||
|
categoriesRouter.get('/:id', async (req: Request, res: Response) => {
|
||||||
|
const id: number = parseInt(req.params.id, 10);
|
||||||
|
|
||||||
|
if (!id) {
|
||||||
|
res.status(400).send('Missing parameters.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const category: Category = await CategoryService.find(id);
|
||||||
|
|
||||||
|
res.status(200).send(category);
|
||||||
|
} catch (e) {
|
||||||
|
res.status(404).send(e.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// GET items/:name
|
||||||
|
|
||||||
|
categoriesRouter.get('/search/:term', async (req: Request, res: Response) => {
|
||||||
|
const term: string = req.params.term;
|
||||||
|
|
||||||
|
if (!term) {
|
||||||
|
res.status(400).send('Missing parameters.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const categories: Categories = await CategoryService.findBySearchTerm(term);
|
||||||
|
|
||||||
|
res.status(200).send(categories);
|
||||||
|
} catch (e) {
|
||||||
|
res.status(404).send(e.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// POST items/
|
||||||
|
|
||||||
|
// categoriesRouter.post('/', async (req: Request, res: Response) => {
|
||||||
|
// try {
|
||||||
|
// const category: Category = req.body.category;
|
||||||
|
//
|
||||||
|
// await CategoryService.create(category);
|
||||||
|
//
|
||||||
|
// res.sendStatus(201);
|
||||||
|
// } catch (e) {
|
||||||
|
// res.status(404).send(e.message);
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
//
|
||||||
|
// // PUT items/
|
||||||
|
//
|
||||||
|
// categoriesRouter.put('/', async (req: Request, res: Response) => {
|
||||||
|
// try {
|
||||||
|
// const category: Category = req.body.category;
|
||||||
|
//
|
||||||
|
// await CategoryService.update(category);
|
||||||
|
//
|
||||||
|
// res.sendStatus(200);
|
||||||
|
// } catch (e) {
|
||||||
|
// res.status(500).send(e.message);
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
//
|
||||||
|
// // DELETE items/:id
|
||||||
|
//
|
||||||
|
// categoriesRouter.delete('/:id', async (req: Request, res: Response) => {
|
||||||
|
// try {
|
||||||
|
// const id: number = parseInt(req.params.id, 10);
|
||||||
|
// await CategoryService.remove(id);
|
||||||
|
//
|
||||||
|
// res.sendStatus(200);
|
||||||
|
// } catch (e) {
|
||||||
|
// res.status(500).send(e.message);
|
||||||
|
// }
|
||||||
|
// });
|
135
Backend/src/models/categories/categories.service.ts
Normal file
135
Backend/src/models/categories/categories.service.ts
Normal file
|
@ -0,0 +1,135 @@
|
||||||
|
import * as dotenv from 'dotenv';
|
||||||
|
|
||||||
|
dotenv.config();
|
||||||
|
|
||||||
|
const mariadb = require('mariadb');
|
||||||
|
const pool = mariadb.createPool({
|
||||||
|
host: process.env.DB_HOST,
|
||||||
|
user: process.env.DB_USER,
|
||||||
|
password: process.env.DB_PASSWORD,
|
||||||
|
database: process.env.DB_DATABASE,
|
||||||
|
connectionLimit: 5
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data Model Interfaces
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {Category} from './category.interface';
|
||||||
|
import {Categories} from './categories.interface';
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Service Methods
|
||||||
|
*/
|
||||||
|
|
||||||
|
export const findAll = async (): Promise<Categories> => {
|
||||||
|
let conn;
|
||||||
|
let categRows = [];
|
||||||
|
try {
|
||||||
|
conn = await pool.getConnection();
|
||||||
|
const rows = await conn.query('SELECT category_id, name FROM categories');
|
||||||
|
for (let row in rows) {
|
||||||
|
if (row !== 'meta') {
|
||||||
|
let categ: Category = {
|
||||||
|
category_id: 0,
|
||||||
|
name: ''
|
||||||
|
};
|
||||||
|
const sqlCateg = rows[row];
|
||||||
|
|
||||||
|
categ.category_id = sqlCateg.category_id;
|
||||||
|
categ.name = sqlCateg.name;
|
||||||
|
categRows.push(categ);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
throw err;
|
||||||
|
} finally {
|
||||||
|
if (conn) {
|
||||||
|
conn.end();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return categRows;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const find = async (id: number): Promise<Category> => {
|
||||||
|
let conn;
|
||||||
|
let categ: any;
|
||||||
|
try {
|
||||||
|
conn = await pool.getConnection();
|
||||||
|
const rows = await conn.query('SELECT category_id, name FROM categories WHERE category_id = ?', id);
|
||||||
|
for (let row in rows) {
|
||||||
|
if (row !== 'meta') {
|
||||||
|
categ = rows[row];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
throw err;
|
||||||
|
} finally {
|
||||||
|
if (conn) {
|
||||||
|
conn.end();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return categ;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const findBySearchTerm = async (term: string): Promise<Categories> => {
|
||||||
|
let conn;
|
||||||
|
let categRows = [];
|
||||||
|
try {
|
||||||
|
conn = await pool.getConnection();
|
||||||
|
term = '%' + term + '%';
|
||||||
|
const rows = await conn.query('SELECT category_id, name FROM categories WHERE name LIKE ?', term);
|
||||||
|
for (let row in rows) {
|
||||||
|
if (row !== 'meta') {
|
||||||
|
categRows.push(rows[row]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
throw err;
|
||||||
|
} finally {
|
||||||
|
if (conn) {
|
||||||
|
conn.end();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return categRows;
|
||||||
|
};
|
||||||
|
|
||||||
|
// export const create = async (newItem: Product): Promise<void> => {
|
||||||
|
// let conn;
|
||||||
|
// try {
|
||||||
|
// conn = await pool.getConnection();
|
||||||
|
// await conn.query("");
|
||||||
|
//
|
||||||
|
// } catch (err) {
|
||||||
|
// throw err;
|
||||||
|
// } finally {
|
||||||
|
// if (conn) conn.end();
|
||||||
|
// }
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// export const update = async (updatedItem: Product): Promise<void> => {
|
||||||
|
// if (models.products[updatedItem.product_id]) {
|
||||||
|
// models.products[updatedItem.product_id] = updatedItem;
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// throw new Error("No record found to update");
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// export const remove = async (id: number): Promise<void> => {
|
||||||
|
// const record: Product = models.products[id];
|
||||||
|
//
|
||||||
|
// if (record) {
|
||||||
|
// delete models.products[id];
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// throw new Error("No record found to delete");
|
||||||
|
// };
|
4
Backend/src/models/categories/category.interface.ts
Normal file
4
Backend/src/models/categories/category.interface.ts
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
export interface Category {
|
||||||
|
category_id: number;
|
||||||
|
name: string;
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
export interface Manufacturer {
|
||||||
|
manufacturer_id: number;
|
||||||
|
name: string;
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
import {Manufacturer} from './manufacturer.interface';
|
||||||
|
|
||||||
|
export interface Manufacturers {
|
||||||
|
[key: number]: Manufacturer;
|
||||||
|
}
|
112
Backend/src/models/manufacturers/manufacturers.router.ts
Normal file
112
Backend/src/models/manufacturers/manufacturers.router.ts
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
/**
|
||||||
|
* Required External Modules and Interfaces
|
||||||
|
*/
|
||||||
|
|
||||||
|
import express, {Request, Response} from 'express';
|
||||||
|
import * as ManufacturerService from './manufacturers.service';
|
||||||
|
import {Manufacturer} from './manufacturer.interface';
|
||||||
|
import {Manufacturers} from './manufacturers.interface';
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Router Definition
|
||||||
|
*/
|
||||||
|
|
||||||
|
export const manufacturersRouter = express.Router();
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Controller Definitions
|
||||||
|
*/
|
||||||
|
|
||||||
|
// GET items/
|
||||||
|
|
||||||
|
manufacturersRouter.get('/', async (req: Request, res: Response) => {
|
||||||
|
try {
|
||||||
|
const manufacturers: Manufacturers = await ManufacturerService.findAll();
|
||||||
|
|
||||||
|
res.status(200).send(manufacturers);
|
||||||
|
} catch (e) {
|
||||||
|
res.status(404).send(e.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// GET items/:id
|
||||||
|
|
||||||
|
manufacturersRouter.get('/:id', async (req: Request, res: Response) => {
|
||||||
|
const id: number = parseInt(req.params.id, 10);
|
||||||
|
|
||||||
|
if (!id) {
|
||||||
|
res.status(400).send('Missing parameters.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const manufacturer: Manufacturer = await ManufacturerService.find(id);
|
||||||
|
|
||||||
|
res.status(200).send(manufacturer);
|
||||||
|
} catch (e) {
|
||||||
|
res.status(404).send(e.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// GET items/:name
|
||||||
|
|
||||||
|
manufacturersRouter.get('/search/:term', async (req: Request, res: Response) => {
|
||||||
|
const term: string = req.params.term;
|
||||||
|
|
||||||
|
if (!term) {
|
||||||
|
res.status(400).send('Missing parameters.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const manufacturer: Manufacturers = await ManufacturerService.findBySearchTerm(term);
|
||||||
|
|
||||||
|
res.status(200).send(manufacturer);
|
||||||
|
} catch (e) {
|
||||||
|
res.status(404).send(e.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// POST items/
|
||||||
|
|
||||||
|
// manufacturersRouter.post('/', async (req: Request, res: Response) => {
|
||||||
|
// try {
|
||||||
|
// const category: Category = req.body.category;
|
||||||
|
//
|
||||||
|
// await CategoryService.create(category);
|
||||||
|
//
|
||||||
|
// res.sendStatus(201);
|
||||||
|
// } catch (e) {
|
||||||
|
// res.status(404).send(e.message);
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
//
|
||||||
|
// // PUT items/
|
||||||
|
//
|
||||||
|
// manufacturersRouter.put('/', async (req: Request, res: Response) => {
|
||||||
|
// try {
|
||||||
|
// const category: Category = req.body.category;
|
||||||
|
//
|
||||||
|
// await CategoryService.update(category);
|
||||||
|
//
|
||||||
|
// res.sendStatus(200);
|
||||||
|
// } catch (e) {
|
||||||
|
// res.status(500).send(e.message);
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
//
|
||||||
|
// // DELETE items/:id
|
||||||
|
//
|
||||||
|
// manufacturersRouter.delete('/:id', async (req: Request, res: Response) => {
|
||||||
|
// try {
|
||||||
|
// const id: number = parseInt(req.params.id, 10);
|
||||||
|
// await CategoryService.remove(id);
|
||||||
|
//
|
||||||
|
// res.sendStatus(200);
|
||||||
|
// } catch (e) {
|
||||||
|
// res.status(500).send(e.message);
|
||||||
|
// }
|
||||||
|
// });
|
135
Backend/src/models/manufacturers/manufacturers.service.ts
Normal file
135
Backend/src/models/manufacturers/manufacturers.service.ts
Normal file
|
@ -0,0 +1,135 @@
|
||||||
|
import * as dotenv from 'dotenv';
|
||||||
|
|
||||||
|
dotenv.config();
|
||||||
|
|
||||||
|
const mariadb = require('mariadb');
|
||||||
|
const pool = mariadb.createPool({
|
||||||
|
host: process.env.DB_HOST,
|
||||||
|
user: process.env.DB_USER,
|
||||||
|
password: process.env.DB_PASSWORD,
|
||||||
|
database: process.env.DB_DATABASE,
|
||||||
|
connectionLimit: 5
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data Model Interfaces
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {Manufacturer} from './manufacturer.interface';
|
||||||
|
import {Manufacturers} from './manufacturers.interface';
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Service Methods
|
||||||
|
*/
|
||||||
|
|
||||||
|
export const findAll = async (): Promise<Manufacturers> => {
|
||||||
|
let conn;
|
||||||
|
let manRows = [];
|
||||||
|
try {
|
||||||
|
conn = await pool.getConnection();
|
||||||
|
const rows = await conn.query('SELECT manufacturer_id, name FROM manufacturers');
|
||||||
|
for (let row in rows) {
|
||||||
|
if (row !== 'meta') {
|
||||||
|
let man: Manufacturer = {
|
||||||
|
manufacturer_id: 0,
|
||||||
|
name: ''
|
||||||
|
};
|
||||||
|
const sqlMan = rows[row];
|
||||||
|
|
||||||
|
man.manufacturer_id = sqlMan.manufacturer_id;
|
||||||
|
man.name = sqlMan.name;
|
||||||
|
manRows.push(man);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
throw err;
|
||||||
|
} finally {
|
||||||
|
if (conn) {
|
||||||
|
conn.end();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return manRows;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const find = async (id: number): Promise<Manufacturer> => {
|
||||||
|
let conn;
|
||||||
|
let man: any;
|
||||||
|
try {
|
||||||
|
conn = await pool.getConnection();
|
||||||
|
const rows = await conn.query('SELECT manufacturer_id, name FROM manufacturers WHERE manufacturer_id = ?', id);
|
||||||
|
for (let row in rows) {
|
||||||
|
if (row !== 'meta') {
|
||||||
|
man = rows[row];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
throw err;
|
||||||
|
} finally {
|
||||||
|
if (conn) {
|
||||||
|
conn.end();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return man;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const findBySearchTerm = async (term: string): Promise<Manufacturers> => {
|
||||||
|
let conn;
|
||||||
|
let manRows = [];
|
||||||
|
try {
|
||||||
|
conn = await pool.getConnection();
|
||||||
|
term = '%' + term + '%';
|
||||||
|
const rows = await conn.query('SELECT manufacturer_id, name FROM manufacturers WHERE name LIKE ?', term);
|
||||||
|
for (let row in rows) {
|
||||||
|
if (row !== 'meta') {
|
||||||
|
manRows.push(rows[row]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
throw err;
|
||||||
|
} finally {
|
||||||
|
if (conn) {
|
||||||
|
conn.end();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return manRows;
|
||||||
|
};
|
||||||
|
|
||||||
|
// export const create = async (newItem: Product): Promise<void> => {
|
||||||
|
// let conn;
|
||||||
|
// try {
|
||||||
|
// conn = await pool.getConnection();
|
||||||
|
// await conn.query("");
|
||||||
|
//
|
||||||
|
// } catch (err) {
|
||||||
|
// throw err;
|
||||||
|
// } finally {
|
||||||
|
// if (conn) conn.end();
|
||||||
|
// }
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// export const update = async (updatedItem: Product): Promise<void> => {
|
||||||
|
// if (models.products[updatedItem.product_id]) {
|
||||||
|
// models.products[updatedItem.product_id] = updatedItem;
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// throw new Error("No record found to update");
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// export const remove = async (id: number): Promise<void> => {
|
||||||
|
// const record: Product = models.products[id];
|
||||||
|
//
|
||||||
|
// if (record) {
|
||||||
|
// delete models.products[id];
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// throw new Error("No record found to delete");
|
||||||
|
// };
|
7
Backend/src/models/prices/price.interface.ts
Normal file
7
Backend/src/models/prices/price.interface.ts
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
export interface Price {
|
||||||
|
price_id: number;
|
||||||
|
product_id: number;
|
||||||
|
vendor_id: number;
|
||||||
|
price_in_cents: number;
|
||||||
|
timestamp: Date;
|
||||||
|
}
|
5
Backend/src/models/prices/prices.interface.ts
Normal file
5
Backend/src/models/prices/prices.interface.ts
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
import {Price} from './price.interface';
|
||||||
|
|
||||||
|
export interface Prices {
|
||||||
|
[key: number]: Price;
|
||||||
|
}
|
112
Backend/src/models/prices/prices.router.ts
Normal file
112
Backend/src/models/prices/prices.router.ts
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
/**
|
||||||
|
* Required External Modules and Interfaces
|
||||||
|
*/
|
||||||
|
|
||||||
|
import express, {Request, Response} from 'express';
|
||||||
|
import * as PriceService from './prices.service';
|
||||||
|
import {Price} from './price.interface';
|
||||||
|
import {Prices} from './prices.interface';
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Router Definition
|
||||||
|
*/
|
||||||
|
|
||||||
|
export const pricesRouter = express.Router();
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Controller Definitions
|
||||||
|
*/
|
||||||
|
|
||||||
|
// GET items/
|
||||||
|
|
||||||
|
pricesRouter.get('/', async (req: Request, res: Response) => {
|
||||||
|
try {
|
||||||
|
const prices: Prices = await PriceService.findAll();
|
||||||
|
|
||||||
|
res.status(200).send(prices);
|
||||||
|
} catch (e) {
|
||||||
|
res.status(404).send(e.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// GET items/:id
|
||||||
|
|
||||||
|
pricesRouter.get('/:id', async (req: Request, res: Response) => {
|
||||||
|
const id: number = parseInt(req.params.id, 10);
|
||||||
|
|
||||||
|
if (!id) {
|
||||||
|
res.status(400).send('Missing parameters.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const price: Price = await PriceService.find(id);
|
||||||
|
|
||||||
|
res.status(200).send(price);
|
||||||
|
} catch (e) {
|
||||||
|
res.status(404).send(e.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// GET items/:name
|
||||||
|
|
||||||
|
pricesRouter.get('/products/:id', async (req: Request, res: Response) => {
|
||||||
|
const id: number = parseInt(req.params.id, 10);
|
||||||
|
|
||||||
|
if (!id) {
|
||||||
|
res.status(400).send('Missing parameters.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const prices: Prices = await PriceService.findByProduct(id);
|
||||||
|
|
||||||
|
res.status(200).send(prices);
|
||||||
|
} catch (e) {
|
||||||
|
res.status(404).send(e.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// POST items/
|
||||||
|
|
||||||
|
// pricesRouter.post('/', async (req: Request, res: Response) => {
|
||||||
|
// try {
|
||||||
|
// const category: Category = req.body.category;
|
||||||
|
//
|
||||||
|
// await CategoryService.create(category);
|
||||||
|
//
|
||||||
|
// res.sendStatus(201);
|
||||||
|
// } catch (e) {
|
||||||
|
// res.status(404).send(e.message);
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
//
|
||||||
|
// // PUT items/
|
||||||
|
//
|
||||||
|
// pricesRouter.put('/', async (req: Request, res: Response) => {
|
||||||
|
// try {
|
||||||
|
// const category: Category = req.body.category;
|
||||||
|
//
|
||||||
|
// await CategoryService.update(category);
|
||||||
|
//
|
||||||
|
// res.sendStatus(200);
|
||||||
|
// } catch (e) {
|
||||||
|
// res.status(500).send(e.message);
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
//
|
||||||
|
// // DELETE items/:id
|
||||||
|
//
|
||||||
|
// pricesRouter.delete('/:id', async (req: Request, res: Response) => {
|
||||||
|
// try {
|
||||||
|
// const id: number = parseInt(req.params.id, 10);
|
||||||
|
// await CategoryService.remove(id);
|
||||||
|
//
|
||||||
|
// res.sendStatus(200);
|
||||||
|
// } catch (e) {
|
||||||
|
// res.status(500).send(e.message);
|
||||||
|
// }
|
||||||
|
// });
|
140
Backend/src/models/prices/prices.service.ts
Normal file
140
Backend/src/models/prices/prices.service.ts
Normal file
|
@ -0,0 +1,140 @@
|
||||||
|
import * as dotenv from 'dotenv';
|
||||||
|
|
||||||
|
dotenv.config();
|
||||||
|
|
||||||
|
const mariadb = require('mariadb');
|
||||||
|
const pool = mariadb.createPool({
|
||||||
|
host: process.env.DB_HOST,
|
||||||
|
user: process.env.DB_USER,
|
||||||
|
password: process.env.DB_PASSWORD,
|
||||||
|
database: process.env.DB_DATABASE,
|
||||||
|
connectionLimit: 5
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data Model Interfaces
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {Price} from './price.interface';
|
||||||
|
import {Prices} from './prices.interface';
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Service Methods
|
||||||
|
*/
|
||||||
|
|
||||||
|
export const findAll = async (): Promise<Prices> => {
|
||||||
|
let conn;
|
||||||
|
let priceRows = [];
|
||||||
|
try {
|
||||||
|
conn = await pool.getConnection();
|
||||||
|
const rows = await conn.query('SELECT price_id, product_id, vendor_id, price_in_cents, timestamp FROM prices');
|
||||||
|
for (let row in rows) {
|
||||||
|
if (row !== 'meta') {
|
||||||
|
let price: Price = {
|
||||||
|
price_id: 0,
|
||||||
|
price_in_cents: 0,
|
||||||
|
product_id: 0,
|
||||||
|
timestamp: new Date(),
|
||||||
|
vendor_id: 0
|
||||||
|
};
|
||||||
|
const sqlPrice = rows[row];
|
||||||
|
|
||||||
|
price.price_id = sqlPrice.price_id;
|
||||||
|
price.product_id = sqlPrice.product_id;
|
||||||
|
price.vendor_id = sqlPrice.vendor_id;
|
||||||
|
price.price_in_cents = sqlPrice.price_in_cents;
|
||||||
|
price.timestamp = sqlPrice.timestamp;
|
||||||
|
priceRows.push(price);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
throw err;
|
||||||
|
} finally {
|
||||||
|
if (conn) {
|
||||||
|
conn.end();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return priceRows;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const find = async (id: number): Promise<Price> => {
|
||||||
|
let conn;
|
||||||
|
let price: any;
|
||||||
|
try {
|
||||||
|
conn = await pool.getConnection();
|
||||||
|
const rows = await conn.query('SELECT price_id, product_id, vendor_id, price_in_cents, timestamp FROM prices WHERE price_id = ?', id);
|
||||||
|
for (let row in rows) {
|
||||||
|
if (row !== 'meta') {
|
||||||
|
price = rows[row];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
throw err;
|
||||||
|
} finally {
|
||||||
|
if (conn) {
|
||||||
|
conn.end();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return price;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const findByProduct = async (product: number): Promise<Prices> => {
|
||||||
|
let conn;
|
||||||
|
let priceRows = [];
|
||||||
|
try {
|
||||||
|
conn = await pool.getConnection();
|
||||||
|
const rows = await conn.query('SELECT price_id, product_id, vendor_id, price_in_cents, timestamp FROM prices WHERE product_id = ?', product);
|
||||||
|
for (let row in rows) {
|
||||||
|
if (row !== 'meta') {
|
||||||
|
priceRows.push(rows[row]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
throw err;
|
||||||
|
} finally {
|
||||||
|
if (conn) {
|
||||||
|
conn.end();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return priceRows;
|
||||||
|
};
|
||||||
|
|
||||||
|
// export const create = async (newItem: Product): Promise<void> => {
|
||||||
|
// let conn;
|
||||||
|
// try {
|
||||||
|
// conn = await pool.getConnection();
|
||||||
|
// await conn.query("");
|
||||||
|
//
|
||||||
|
// } catch (err) {
|
||||||
|
// throw err;
|
||||||
|
// } finally {
|
||||||
|
// if (conn) conn.end();
|
||||||
|
// }
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// export const update = async (updatedItem: Product): Promise<void> => {
|
||||||
|
// if (models.products[updatedItem.product_id]) {
|
||||||
|
// models.products[updatedItem.product_id] = updatedItem;
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// throw new Error("No record found to update");
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// export const remove = async (id: number): Promise<void> => {
|
||||||
|
// const record: Product = models.products[id];
|
||||||
|
//
|
||||||
|
// if (record) {
|
||||||
|
// delete models.products[id];
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// throw new Error("No record found to delete");
|
||||||
|
// };
|
|
@ -1,4 +1,5 @@
|
||||||
import { Product } from "./product.interface";
|
import {Product} from './product.interface';
|
||||||
|
|
||||||
export interface Products {
|
export interface Products {
|
||||||
[key: number]: Product;
|
[key: number]: Product;
|
||||||
}
|
}
|
|
@ -36,7 +36,7 @@ productsRouter.get('/', async (req: Request, res: Response) => {
|
||||||
productsRouter.get('/:id', async (req: Request, res: Response) => {
|
productsRouter.get('/:id', async (req: Request, res: Response) => {
|
||||||
const id: number = parseInt(req.params.id, 10);
|
const id: number = parseInt(req.params.id, 10);
|
||||||
|
|
||||||
if(!id){
|
if (!id) {
|
||||||
res.status(400).send('Missing parameters.');
|
res.status(400).send('Missing parameters.');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -55,7 +55,7 @@ productsRouter.get('/:id', async (req: Request, res: Response) => {
|
||||||
productsRouter.get('/search/:term', async (req: Request, res: Response) => {
|
productsRouter.get('/search/:term', async (req: Request, res: Response) => {
|
||||||
const term: string = req.params.term;
|
const term: string = req.params.term;
|
||||||
|
|
||||||
if(!term){
|
if (!term) {
|
||||||
res.status(400).send('Missing parameters.');
|
res.status(400).send('Missing parameters.');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -72,41 +72,41 @@ productsRouter.get('/search/:term', async (req: Request, res: Response) => {
|
||||||
|
|
||||||
// POST items/
|
// POST items/
|
||||||
|
|
||||||
productsRouter.post('/', async (req: Request, res: Response) => {
|
// productsRouter.post('/', async (req: Request, res: Response) => {
|
||||||
try {
|
// try {
|
||||||
const product: Product = req.body.product;
|
// const product: Product = req.body.product;
|
||||||
|
//
|
||||||
await ProductService.create(product);
|
// await ProductService.create(product);
|
||||||
|
//
|
||||||
res.sendStatus(201);
|
// res.sendStatus(201);
|
||||||
} catch (e) {
|
// } catch (e) {
|
||||||
res.status(404).send(e.message);
|
// res.status(404).send(e.message);
|
||||||
}
|
// }
|
||||||
});
|
// });
|
||||||
|
//
|
||||||
// PUT items/
|
// // PUT items/
|
||||||
|
//
|
||||||
productsRouter.put('/', async (req: Request, res: Response) => {
|
// productsRouter.put('/', async (req: Request, res: Response) => {
|
||||||
try {
|
// try {
|
||||||
const product: Product = req.body.product;
|
// const product: Product = req.body.product;
|
||||||
|
//
|
||||||
await ProductService.update(product);
|
// await ProductService.update(product);
|
||||||
|
//
|
||||||
res.sendStatus(200);
|
// res.sendStatus(200);
|
||||||
} catch (e) {
|
// } catch (e) {
|
||||||
res.status(500).send(e.message);
|
// res.status(500).send(e.message);
|
||||||
}
|
// }
|
||||||
});
|
// });
|
||||||
|
//
|
||||||
// DELETE items/:id
|
// // DELETE items/:id
|
||||||
|
//
|
||||||
productsRouter.delete('/:id', async (req: Request, res: Response) => {
|
// productsRouter.delete('/:id', async (req: Request, res: Response) => {
|
||||||
try {
|
// try {
|
||||||
const id: number = parseInt(req.params.id, 10);
|
// const id: number = parseInt(req.params.id, 10);
|
||||||
await ProductService.remove(id);
|
// await ProductService.remove(id);
|
||||||
|
//
|
||||||
res.sendStatus(200);
|
// res.sendStatus(200);
|
||||||
} catch (e) {
|
// } catch (e) {
|
||||||
res.status(500).send(e.message);
|
// res.status(500).send(e.message);
|
||||||
}
|
// }
|
||||||
});
|
// });
|
147
Backend/src/models/products/products.service.ts
Normal file
147
Backend/src/models/products/products.service.ts
Normal file
|
@ -0,0 +1,147 @@
|
||||||
|
import * as dotenv from 'dotenv';
|
||||||
|
|
||||||
|
dotenv.config();
|
||||||
|
|
||||||
|
const mariadb = require('mariadb');
|
||||||
|
const pool = mariadb.createPool({
|
||||||
|
host: process.env.DB_HOST,
|
||||||
|
user: process.env.DB_USER,
|
||||||
|
password: process.env.DB_PASSWORD,
|
||||||
|
database: process.env.DB_DATABASE,
|
||||||
|
connectionLimit: 5
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data Model Interfaces
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {Product} from './product.interface';
|
||||||
|
import {Products} from './products.interface';
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Service Methods
|
||||||
|
*/
|
||||||
|
|
||||||
|
export const findAll = async (): Promise<Products> => {
|
||||||
|
let conn;
|
||||||
|
let prodRows = [];
|
||||||
|
try {
|
||||||
|
conn = await pool.getConnection();
|
||||||
|
const rows = await conn.query('SELECT product_id, name, asin FROM products');
|
||||||
|
for (let row in rows) {
|
||||||
|
if (row !== 'meta') {
|
||||||
|
let prod: Product = {
|
||||||
|
asin: '',
|
||||||
|
category_id: 0,
|
||||||
|
date_added: new Date(),
|
||||||
|
image_guid: '',
|
||||||
|
is_active: false,
|
||||||
|
last_modified: new Date(),
|
||||||
|
long_description: '',
|
||||||
|
manufacturer_id: 0,
|
||||||
|
name: '',
|
||||||
|
product_id: 0,
|
||||||
|
selling_rank: '',
|
||||||
|
short_description: ''
|
||||||
|
};
|
||||||
|
const sqlProd = rows[row];
|
||||||
|
|
||||||
|
prod.product_id = sqlProd.product_id;
|
||||||
|
prod.name = sqlProd.name;
|
||||||
|
prod.asin = sqlProd.asin;
|
||||||
|
prodRows.push(prod);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
throw err;
|
||||||
|
} finally {
|
||||||
|
if (conn) {
|
||||||
|
conn.end();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return prodRows;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const find = async (id: number): Promise<Product> => {
|
||||||
|
let conn;
|
||||||
|
let prod: any;
|
||||||
|
try {
|
||||||
|
conn = await pool.getConnection();
|
||||||
|
const rows = await conn.query('SELECT product_id, name FROM products WHERE product_id = ?', id);
|
||||||
|
for (let row in rows) {
|
||||||
|
if (row !== 'meta') {
|
||||||
|
prod = rows[row];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
throw err;
|
||||||
|
} finally {
|
||||||
|
if (conn) {
|
||||||
|
conn.end();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return prod;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const findBySearchTerm = async (term: string): Promise<Products> => {
|
||||||
|
let conn;
|
||||||
|
let prodRows = [];
|
||||||
|
try {
|
||||||
|
conn = await pool.getConnection();
|
||||||
|
term = '%' + term + '%';
|
||||||
|
const rows = await conn.query('SELECT product_id, name FROM products WHERE name LIKE ?', term);
|
||||||
|
for (let row in rows) {
|
||||||
|
if (row !== 'meta') {
|
||||||
|
prodRows.push(rows[row]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
console.log(err);
|
||||||
|
throw err;
|
||||||
|
} finally {
|
||||||
|
if (conn) {
|
||||||
|
conn.end();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return prodRows;
|
||||||
|
};
|
||||||
|
|
||||||
|
// export const create = async (newItem: Product): Promise<void> => {
|
||||||
|
// let conn;
|
||||||
|
// try {
|
||||||
|
// conn = await pool.getConnection();
|
||||||
|
// await conn.query("");
|
||||||
|
//
|
||||||
|
// } catch (err) {
|
||||||
|
// throw err;
|
||||||
|
// } finally {
|
||||||
|
// if (conn) conn.end();
|
||||||
|
// }
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// export const update = async (updatedItem: Product): Promise<void> => {
|
||||||
|
// if (models.products[updatedItem.product_id]) {
|
||||||
|
// models.products[updatedItem.product_id] = updatedItem;
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// throw new Error("No record found to update");
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// export const remove = async (id: number): Promise<void> => {
|
||||||
|
// const record: Product = models.products[id];
|
||||||
|
//
|
||||||
|
// if (record) {
|
||||||
|
// delete models.products[id];
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// throw new Error("No record found to delete");
|
||||||
|
// };
|
10
Backend/src/models/vendors/vendor.interface.ts
vendored
Normal file
10
Backend/src/models/vendors/vendor.interface.ts
vendored
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
export interface Vendor {
|
||||||
|
vendor_id: number;
|
||||||
|
name: string;
|
||||||
|
streetname: string;
|
||||||
|
zip_code: string;
|
||||||
|
city: string;
|
||||||
|
country_code: string;
|
||||||
|
phone: string;
|
||||||
|
website: string;
|
||||||
|
}
|
5
Backend/src/models/vendors/vendors.interface.ts
vendored
Normal file
5
Backend/src/models/vendors/vendors.interface.ts
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
import {Vendor} from './vendor.interface';
|
||||||
|
|
||||||
|
export interface Vendors {
|
||||||
|
[key: number]: Vendor;
|
||||||
|
}
|
112
Backend/src/models/vendors/vendors.router.ts
vendored
Normal file
112
Backend/src/models/vendors/vendors.router.ts
vendored
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
/**
|
||||||
|
* Required External Modules and Interfaces
|
||||||
|
*/
|
||||||
|
|
||||||
|
import express, {Request, Response} from 'express';
|
||||||
|
import * as VendorService from './vendors.service';
|
||||||
|
import {Vendor} from './vendor.interface';
|
||||||
|
import {Vendors} from './vendors.interface';
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Router Definition
|
||||||
|
*/
|
||||||
|
|
||||||
|
export const vendorsRouter = express.Router();
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Controller Definitions
|
||||||
|
*/
|
||||||
|
|
||||||
|
// GET items/
|
||||||
|
|
||||||
|
vendorsRouter.get('/', async (req: Request, res: Response) => {
|
||||||
|
try {
|
||||||
|
const vendors: Vendors = await VendorService.findAll();
|
||||||
|
|
||||||
|
res.status(200).send(vendors);
|
||||||
|
} catch (e) {
|
||||||
|
res.status(404).send(e.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// GET items/:id
|
||||||
|
|
||||||
|
vendorsRouter.get('/:id', async (req: Request, res: Response) => {
|
||||||
|
const id: number = parseInt(req.params.id, 10);
|
||||||
|
|
||||||
|
if (!id) {
|
||||||
|
res.status(400).send('Missing parameters.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const vendor: Vendor = await VendorService.find(id);
|
||||||
|
|
||||||
|
res.status(200).send(vendor);
|
||||||
|
} catch (e) {
|
||||||
|
res.status(404).send(e.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// GET items/:name
|
||||||
|
|
||||||
|
vendorsRouter.get('/search/:term', async (req: Request, res: Response) => {
|
||||||
|
const term: string = req.params.term;
|
||||||
|
|
||||||
|
if (!term) {
|
||||||
|
res.status(400).send('Missing parameters.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const vendors: Vendors = await VendorService.findBySearchTerm(term);
|
||||||
|
|
||||||
|
res.status(200).send(vendors);
|
||||||
|
} catch (e) {
|
||||||
|
res.status(404).send(e.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// POST items/
|
||||||
|
|
||||||
|
// vendorsRouter.post('/', async (req: Request, res: Response) => {
|
||||||
|
// try {
|
||||||
|
// const category: Category = req.body.category;
|
||||||
|
//
|
||||||
|
// await CategoryService.create(category);
|
||||||
|
//
|
||||||
|
// res.sendStatus(201);
|
||||||
|
// } catch (e) {
|
||||||
|
// res.status(404).send(e.message);
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
//
|
||||||
|
// // PUT items/
|
||||||
|
//
|
||||||
|
// vendorsRouter.put('/', async (req: Request, res: Response) => {
|
||||||
|
// try {
|
||||||
|
// const category: Category = req.body.category;
|
||||||
|
//
|
||||||
|
// await CategoryService.update(category);
|
||||||
|
//
|
||||||
|
// res.sendStatus(200);
|
||||||
|
// } catch (e) {
|
||||||
|
// res.status(500).send(e.message);
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
//
|
||||||
|
// // DELETE items/:id
|
||||||
|
//
|
||||||
|
// vendorsRouter.delete('/:id', async (req: Request, res: Response) => {
|
||||||
|
// try {
|
||||||
|
// const id: number = parseInt(req.params.id, 10);
|
||||||
|
// await CategoryService.remove(id);
|
||||||
|
//
|
||||||
|
// res.sendStatus(200);
|
||||||
|
// } catch (e) {
|
||||||
|
// res.status(500).send(e.message);
|
||||||
|
// }
|
||||||
|
// });
|
147
Backend/src/models/vendors/vendors.service.ts
vendored
Normal file
147
Backend/src/models/vendors/vendors.service.ts
vendored
Normal file
|
@ -0,0 +1,147 @@
|
||||||
|
import * as dotenv from 'dotenv';
|
||||||
|
|
||||||
|
dotenv.config();
|
||||||
|
|
||||||
|
const mariadb = require('mariadb');
|
||||||
|
const pool = mariadb.createPool({
|
||||||
|
host: process.env.DB_HOST,
|
||||||
|
user: process.env.DB_USER,
|
||||||
|
password: process.env.DB_PASSWORD,
|
||||||
|
database: process.env.DB_DATABASE,
|
||||||
|
connectionLimit: 5
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data Model Interfaces
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {Vendor} from './vendor.interface';
|
||||||
|
import {Vendors} from './vendors.interface';
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Service Methods
|
||||||
|
*/
|
||||||
|
|
||||||
|
export const findAll = async (): Promise<Vendors> => {
|
||||||
|
let conn;
|
||||||
|
let vendorRows = [];
|
||||||
|
try {
|
||||||
|
conn = await pool.getConnection();
|
||||||
|
const rows = await conn.query('SELECT vendor_id, name, streetname, zip_code, city, country_code, phone, website FROM vendors');
|
||||||
|
for (let row in rows) {
|
||||||
|
if (row !== 'meta') {
|
||||||
|
let vendor: Vendor = {
|
||||||
|
city: '',
|
||||||
|
country_code: '',
|
||||||
|
name: '',
|
||||||
|
phone: '',
|
||||||
|
streetname: '',
|
||||||
|
vendor_id: 0,
|
||||||
|
website: '',
|
||||||
|
zip_code: ''
|
||||||
|
};
|
||||||
|
const sqlVendor = rows[row];
|
||||||
|
|
||||||
|
vendor.vendor_id = sqlVendor.vendor_id;
|
||||||
|
vendor.name = sqlVendor.name;
|
||||||
|
vendor.streetname = sqlVendor.streetname;
|
||||||
|
vendor.zip_code = sqlVendor.zip_code;
|
||||||
|
vendor.city = sqlVendor.city;
|
||||||
|
vendor.country_code = sqlVendor.country_code;
|
||||||
|
vendor.phone = sqlVendor.phone;
|
||||||
|
vendor.website = sqlVendor.website;
|
||||||
|
vendorRows.push(vendor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
throw err;
|
||||||
|
} finally {
|
||||||
|
if (conn) {
|
||||||
|
conn.end();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return vendorRows;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const find = async (id: number): Promise<Vendor> => {
|
||||||
|
let conn;
|
||||||
|
let vendor: any;
|
||||||
|
try {
|
||||||
|
conn = await pool.getConnection();
|
||||||
|
const rows = await conn.query('SELECT vendor_id, name, streetname, zip_code, city, country_code, phone, website FROM vendors WHERE vendor_id = ?', id);
|
||||||
|
for (let row in rows) {
|
||||||
|
if (row !== 'meta') {
|
||||||
|
vendor = rows[row];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
throw err;
|
||||||
|
} finally {
|
||||||
|
if (conn) {
|
||||||
|
conn.end();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return vendor;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const findBySearchTerm = async (term: string): Promise<Vendors> => {
|
||||||
|
let conn;
|
||||||
|
let vendorRows = [];
|
||||||
|
try {
|
||||||
|
conn = await pool.getConnection();
|
||||||
|
term = '%' + term + '%';
|
||||||
|
const rows = await conn.query('SELECT vendor_id, name, streetname, zip_code, city, country_code, phone, website FROM vendors WHERE name LIKE ?', term);
|
||||||
|
for (let row in rows) {
|
||||||
|
if (row !== 'meta') {
|
||||||
|
vendorRows.push(rows[row]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
throw err;
|
||||||
|
} finally {
|
||||||
|
if (conn) {
|
||||||
|
conn.end();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return vendorRows;
|
||||||
|
};
|
||||||
|
|
||||||
|
// export const create = async (newItem: Product): Promise<void> => {
|
||||||
|
// let conn;
|
||||||
|
// try {
|
||||||
|
// conn = await pool.getConnection();
|
||||||
|
// await conn.query("");
|
||||||
|
//
|
||||||
|
// } catch (err) {
|
||||||
|
// throw err;
|
||||||
|
// } finally {
|
||||||
|
// if (conn) conn.end();
|
||||||
|
// }
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// export const update = async (updatedItem: Product): Promise<void> => {
|
||||||
|
// if (models.products[updatedItem.product_id]) {
|
||||||
|
// models.products[updatedItem.product_id] = updatedItem;
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// throw new Error("No record found to update");
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// export const remove = async (id: number): Promise<void> => {
|
||||||
|
// const record: Product = models.products[id];
|
||||||
|
//
|
||||||
|
// if (record) {
|
||||||
|
// delete models.products[id];
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// throw new Error("No record found to delete");
|
||||||
|
// };
|
|
@ -1,172 +0,0 @@
|
||||||
import * as dotenv from 'dotenv';
|
|
||||||
dotenv.config();
|
|
||||||
|
|
||||||
const mariadb = require('mariadb');
|
|
||||||
const pool = mariadb.createPool({
|
|
||||||
host: process.env.DB_HOST,
|
|
||||||
user: process.env.DB_USER,
|
|
||||||
password: process.env.DB_PASSWORD,
|
|
||||||
database: process.env.DB_DATABASE,
|
|
||||||
connectionLimit: 5
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Data Model Interfaces
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { Product } from "./product.interface";
|
|
||||||
import { Products } from "./products.interface";
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* In-Memory Store
|
|
||||||
*/
|
|
||||||
|
|
||||||
const products: Products = {
|
|
||||||
1: {
|
|
||||||
product_id: 1,
|
|
||||||
asin: "",
|
|
||||||
is_active: true,
|
|
||||||
name: "Burger",
|
|
||||||
short_description: "",
|
|
||||||
long_description: "",
|
|
||||||
image_guid: "",
|
|
||||||
date_added: new Date(),
|
|
||||||
last_modified: new Date(),
|
|
||||||
manufacturer_id: 1,
|
|
||||||
selling_rank: "",
|
|
||||||
category_id: 1
|
|
||||||
},
|
|
||||||
2: {
|
|
||||||
product_id: 2,
|
|
||||||
asin: "",
|
|
||||||
is_active: true,
|
|
||||||
name: "Pizza",
|
|
||||||
short_description: "",
|
|
||||||
long_description: "",
|
|
||||||
image_guid: "",
|
|
||||||
date_added: new Date(),
|
|
||||||
last_modified: new Date(),
|
|
||||||
manufacturer_id: 2,
|
|
||||||
selling_rank: "",
|
|
||||||
category_id: 1
|
|
||||||
},
|
|
||||||
3: {
|
|
||||||
product_id: 3,
|
|
||||||
asin: "",
|
|
||||||
is_active: true,
|
|
||||||
name: "Tea",
|
|
||||||
short_description: "",
|
|
||||||
long_description: "",
|
|
||||||
image_guid: "",
|
|
||||||
date_added: new Date(),
|
|
||||||
last_modified: new Date(),
|
|
||||||
manufacturer_id: 3,
|
|
||||||
selling_rank: "",
|
|
||||||
category_id: 2
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Service Methods
|
|
||||||
*/
|
|
||||||
|
|
||||||
export const findAll = async (): Promise<Products> => {
|
|
||||||
let conn;
|
|
||||||
let prodRows = [];
|
|
||||||
try {
|
|
||||||
conn = await pool.getConnection();
|
|
||||||
const rows = await conn.query("SELECT product_id, name FROM products");
|
|
||||||
for(let row in rows){
|
|
||||||
if(row !== 'meta'){
|
|
||||||
prodRows.push(rows[row]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (err) {
|
|
||||||
throw err;
|
|
||||||
} finally {
|
|
||||||
if (conn) conn.end();
|
|
||||||
}
|
|
||||||
|
|
||||||
return prodRows;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const find = async (id: number): Promise<Product> => {
|
|
||||||
let conn;
|
|
||||||
let prod: any;
|
|
||||||
try {
|
|
||||||
conn = await pool.getConnection();
|
|
||||||
const rows = await conn.query("SELECT product_id, name FROM products WHERE product_id = ?", id);
|
|
||||||
for(let row in rows){
|
|
||||||
if(row !== 'meta'){
|
|
||||||
prod = rows[row];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (err) {
|
|
||||||
throw err;
|
|
||||||
} finally {
|
|
||||||
if (conn) conn.end();
|
|
||||||
}
|
|
||||||
|
|
||||||
return prod;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const findBySearchTerm = async (term: string): Promise<Products> => {
|
|
||||||
let conn;
|
|
||||||
let prodRows = [];
|
|
||||||
try {
|
|
||||||
conn = await pool.getConnection();
|
|
||||||
term = '%' + term + '%';
|
|
||||||
const rows = await conn.query("SELECT product_id, name FROM products WHERE name LIKE ?", term);
|
|
||||||
for(let row in rows){
|
|
||||||
if(row !== 'meta'){
|
|
||||||
prodRows.push(rows[row]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (err) {
|
|
||||||
console.log(err);
|
|
||||||
throw err;
|
|
||||||
} finally {
|
|
||||||
if (conn) conn.end();
|
|
||||||
}
|
|
||||||
|
|
||||||
return prodRows;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const create = async (newItem: Product): Promise<void> => {
|
|
||||||
let conn;
|
|
||||||
try {
|
|
||||||
conn = await pool.getConnection();
|
|
||||||
// TODO adjust query
|
|
||||||
await conn.query("SELECT product_id, name FROM products WHERE product_id = ?");
|
|
||||||
|
|
||||||
} catch (err) {
|
|
||||||
throw err;
|
|
||||||
} finally {
|
|
||||||
if (conn) conn.end();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const update = async (updatedItem: Product): Promise<void> => {
|
|
||||||
if (products[updatedItem.product_id]) {
|
|
||||||
products[updatedItem.product_id] = updatedItem;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Error("No record found to update");
|
|
||||||
};
|
|
||||||
|
|
||||||
export const remove = async (id: number): Promise<void> => {
|
|
||||||
const record: Product = products[id];
|
|
||||||
|
|
||||||
if (record) {
|
|
||||||
delete products[id];
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Error("No record found to delete");
|
|
||||||
};
|
|
Loading…
Reference in New Issue
Block a user