diff --git a/back-end/src/controllers/piece.controller.ts b/back-end/src/controllers/piece.controller.ts new file mode 100644 index 0000000..65294c6 --- /dev/null +++ b/back-end/src/controllers/piece.controller.ts @@ -0,0 +1,154 @@ +import { Request, Response } from 'express'; +import { new_client } from '../db/db_client'; +import { Colour, Pattern, Shape, Piece, ComplexPiece } from '../types/piece'; +import { Either, eitherLeft, eitherRight } from '../utils/utils'; + +const getDefaultColour = () => ({ id_colour: -1, name: 'unknown' }); +const getDefaultPattern = () => ({ id_pattern: -1, name: 'unknown' }); +const getDefaultShape = () => ({ id_shape: -1, name: 'unknown' }); +const getDefaultPiece = () => ({ id_piece: -1, colour: getDefaultColour(), pattern: getDefaultPattern(), shape: getDefaultShape() }); + +async function getEntity(table: string, column: string, value: string | number, f: (o: Object) => T): Promise> { + const client = new_client(); + await client.connect(); + const res = await client.query(`SELECT * FROM ${client.escapeIdentifier(table)} WHERE $1=$2;`, [column, value]); + if (res.rows.length === 0) { + await client.end(); + return eitherRight('Not found in database.'); + } + const entity: T = f(res.rows[0]); + await client.end(); + return eitherLeft(entity); +} + +async function getEntities(table: string, f: (o: Object) => T): Promise> { + const client = new_client(); + await client.connect(); + const res = await client.query(`SELECT * FROM ${client.escapeIdentifier(table)};`); + const arr: Array = new Array(); + for (let i = 0; i < res.rows.length; ++i) { + arr.push(f(res.rows[i])); + } + await client.end(); + return arr; +} + +const toColour: (o: Object) => Colour = o => { + return { id_colour: o['id_couleur'], name: o['nom_couleur'] }; +}; + +async function getColour(idOrName: number | string): Promise> { + return await getEntity('couleurs', typeof idOrName !== 'number' ? 'nom_couleur' : 'id_couleur', idOrName, toColour); +} + +async function getColours(): Promise> { + return await getEntities('couleurs', toColour); +} + +async function createColour(name: string): Promise { + return getDefaultColour(); +} + +const toPattern: (o: Object) => Pattern = o => { + return { id_pattern: o['id_motif'], name: o['nom_motif'] }; +}; + +async function getPattern(idOrName: number | string): Promise> { + return await getEntity('motifs', typeof idOrName !== 'number' ? 'nom_motif' : 'id_motif', idOrName, toPattern); +} + +async function getPatterns(): Promise> { + return await getEntities('motifs', toPattern); +} + +async function createPattern(name: string): Promise { + return getDefaultPattern(); +} + +const toShape: (o: Object) => Shape = o => { + return { id_shape: o['id_forme'], name: o['nom_forme'] }; +}; + +async function getShape(idOrName: number | string): Promise> { + return await getEntity('formes', typeof idOrName !== 'number' ? 'nom_forme' : 'id_forme', idOrName, toShape); +} + +async function getShapes(): Promise> { + return await getEntities('formes', toShape); +} + +async function createShape(name: string): Promise { + return getDefaultShape(); +} + +async function getPiece(id: number): Promise { + return getDefaultPiece(); +} + +async function getPieces(): Promise> { + return new Array(getDefaultPiece()); +} + +async function createPiece(colour: number, pattern: number, shape: number): Promise { + return getDefaultPiece(); +} + +async function retrieveEntity(f: (id: number) => Promise>, req: Request, res: Response) { + const entity: Either = await f(parseInt(req.params.id)); + if (entity.hasRight) { + res.status(500).send(entity.right); + return; + } + res.send(entity.left); +} + +const retrieveColour = async (req: Request, res: Response) => { + retrieveEntity(getColour, req, res); +}; + +const retrieveColours = async (req: Request, res: Response) => { + const colours: Array = await getColours(); + res.send(colours); +}; + +const registerColour = (req: Request, res: Response) => { + +}; + +const retrievePattern = (req: Request, res: Response) => { + retrieveEntity(getPattern, req, res); +}; + +const retrievePatterns = (req: Request, res: Response) => { + res.send(getPatterns()); +}; + +const registerPattern = (req: Request, res: Response) => { + +}; + +const retrieveShape = (req: Request, res: Response) => { + retrieveEntity(getShape, req, res); +}; + +const retrieveShapes = (req: Request, res: Response) => { + res.send(getShapes()); +}; + +const registerShape = (req: Request, res: Response) => { + +}; + +const retrievePiece = (req: Request, res: Response) => { + retrieveEntity(getPiece, req, res); +}; + +const retrievePieces = (req: Request, res: Response) => { + res.send(getPieces()); +}; + +const registerPiece = (req: Request, res: Response) => { + +}; + +export { retrieveColour, retrieveColours, registerColour, retrievePattern, retrievePatterns, registerPattern, retrieveShape, retrieveShapes, registerShape, retrievePieces, registerPiece }; diff --git a/back-end/src/routes/index.ts b/back-end/src/routes/index.ts index 3183206..8f50368 100644 --- a/back-end/src/routes/index.ts +++ b/back-end/src/routes/index.ts @@ -3,6 +3,7 @@ import db from '../db'; import { getUsername, verifyAuthentication } from '../middlewares/auth.middleware' import authRoute from './auth.route' import marquesRoute from './marque.route' +import piecesRoute from './piece.route' const routes = express.Router(); @@ -18,5 +19,6 @@ routes.get("/message", async (_req, res) => { routes.use("/auth", authRoute); routes.use("/marques", getUsername, verifyAuthentication, marquesRoute); +routes.use("/pieces", getUsername, verifyAuthentication, piecesRoute); export default routes; diff --git a/back-end/src/routes/piece.route.ts b/back-end/src/routes/piece.route.ts new file mode 100644 index 0000000..1cd550f --- /dev/null +++ b/back-end/src/routes/piece.route.ts @@ -0,0 +1,19 @@ +import express from 'express'; +import { retrieveColour, retrieveColours, registerColour, retrievePatterns, registerPattern, retrieveShapes, registerShape, retrievePieces, registerPiece } from '../controllers/piece.controller'; + +const router = express.Router(); + +router.get("/colour", retrieveColours); +router.get("/colour/:id", retrieveColour); +router.post("/colour/register", registerColour); +router.get("/pattern", retrievePatterns); +router.get("/colour/:id", retrievePattern); +router.post("/pattern/register", registerPattern); +router.get("/shape", retrieveShapes); +router.get("/shape/:id", retrieveShape); +router.post("/shape/register", registerShape); +router.get("/", retrievePieces); +router.get("/:id", retrievePiece); +router.post("/register", registerPiece); + +export default router; diff --git a/back-end/src/types/piece.ts b/back-end/src/types/piece.ts new file mode 100644 index 0000000..dc79ad5 --- /dev/null +++ b/back-end/src/types/piece.ts @@ -0,0 +1,28 @@ +type Colour = { + id_colour: number, + name: string +}; + +type Pattern = { + id_pattern: number, + name: string +}; + +type Shape = { + id_shape: number, + name: string +}; + +type Piece = { + id_piece: number, + colour: Colour, + pattern: Pattern, + shape: Shape +}; + +type ComplexPiece = { + id_complex: number, + subpieces: Array +}; + +export { Colour, Pattern, Shape, Piece, ComplexPiece };