147 lines
4.9 KiB
TypeScript
147 lines
4.9 KiB
TypeScript
import { new_client } from '../db/db_client';
|
|
import { Box } from '../types/box';
|
|
import { Model } from '../types/model';
|
|
import { Piece } from '../types/piece';
|
|
import { getPiece } from './pieces.service';
|
|
import { Either, eitherLeft, eitherRight, Pair, createPair } from '../utils/utils';
|
|
import modelService from './model.service';
|
|
import { config } from 'dotenv';
|
|
|
|
type DBBox = {
|
|
id_boite: number;
|
|
titre_boite: string;
|
|
date_boite: string;
|
|
};
|
|
|
|
async function getPiecesFromBox(id_box: number): Promise<Array<Pair<Piece, number>>> {
|
|
const client = new_client();
|
|
const res = await client.query(`SELECT * FROM contenir WHERE id_boite = $1;`, [id_box]);
|
|
const arr: Array<Pair<Piece, number>> = new Array();
|
|
for (let i = 0; i < res.rows.length; ++i) {
|
|
const piece: Either<Piece, string> = await getPiece(res.rows[i]['id_piece']);
|
|
if (piece.hasRight)
|
|
continue;
|
|
arr.push(createPair(piece.left, res.rows[i]['quantite_contenir'] as number));
|
|
}
|
|
return arr;
|
|
}
|
|
|
|
async function addPiecesToBox(id_box: number, id_piece: number, qty: number) {
|
|
const client = new_client();
|
|
const res = await client.query(`INSERT INTO contenir (id_boite, id_piece, quantite_contenir) VALUES ($1, $2, $3);`, [id_box, id_piece, qty]);
|
|
}
|
|
|
|
async function removePieceFromBox(id_box: number, id_piece: number) {
|
|
const client = new_client();
|
|
const res = await client.query(`DELETE FROM contenir WHERE id_boite = $1 AND id_piece = $2;`, [id_box, id_piece]);
|
|
}
|
|
|
|
async function getModelsFromBox(id_box: number): Promise<Array<Model>> {
|
|
const client = new_client();
|
|
const res = await client.query(`SELECT * FROM modeles_faisables_boite($1);`, [id_box]);
|
|
const arr: Array<Model> = new Array();
|
|
for (let i = 0; i < res.rows.length; ++i) {
|
|
const model: Either<Model, string> = await modelService.getModel(res.rows[i]['id_modele']);
|
|
if (model.hasRight)
|
|
continue;
|
|
arr.push(model.left);
|
|
}
|
|
return arr;
|
|
}
|
|
|
|
async function getBoxesFromMember(id_member: number): Promise<Array<Pair<Box, number>>> {
|
|
const client = new_client()
|
|
const res = await client.query(`SELECT id_boite, quantite_enregistrer FROM enregistrer WHERE id_membre = $1;`, [id_member])
|
|
const arr: Array<Pair<Box, number>> = new Array();
|
|
|
|
for (let index = 0; index < res.rows.length; index++) {
|
|
const box: Either<Box, string> = await getBox(res.rows[index]['id_boite']);
|
|
if (box.hasRight)
|
|
continue;
|
|
arr.push(createPair(box.left, res.rows[index]['quantite_enregistrer']));
|
|
}
|
|
|
|
return arr;
|
|
}
|
|
|
|
async function db2box(data: DBBox): Promise<Box> {
|
|
const box: Box = {
|
|
id: data.id_boite,
|
|
title: data.titre_boite,
|
|
date: new Date(data.date_boite),
|
|
models: await getModelsFromBox(data.id_boite),
|
|
pieces: await getPiecesFromBox(data.id_boite)
|
|
};
|
|
|
|
return box;
|
|
}
|
|
|
|
const getBox = async (idOrTitle: number | string): Promise<Either<Box, string>> => {
|
|
const client = new_client();
|
|
let res;
|
|
if (typeof idOrTitle !== 'number') {
|
|
res = await client.query("SELECT * FROM boites WHERE titre_boite=$1;", [`${idOrTitle}`]);
|
|
} else {
|
|
res = await client.query("SELECT * FROM boites WHERE id_boite=$1;", [idOrTitle]);
|
|
}
|
|
if (res.rows.length === 0) {
|
|
return eitherRight<Box, string>("Does not exist.");
|
|
}
|
|
const box = await db2box(res.rows[0]);
|
|
|
|
return eitherLeft<Box, string>(box);
|
|
}
|
|
|
|
const getAllBoxes = async () => {
|
|
const client = new_client();
|
|
|
|
const res = await client.query("SELECT * FROM boites");
|
|
|
|
return await Promise.all(res.rows.map(async (el) => { return await db2box(el) }));
|
|
}
|
|
|
|
const getAllBoxesFromDate = async (date: Date) => {
|
|
const client = new_client();
|
|
|
|
const YYYY = date.getFullYear();
|
|
const MM = date.getMonth() + 1;
|
|
const DD = date.getDate();
|
|
const dateString = `${YYYY}-${MM}-${DD}`;
|
|
|
|
const res = await client.query("SELECT * FROM boites WHERE date_boite > $1", [dateString]);
|
|
|
|
return await Promise.all(res.rows.map(async (el) => { return await db2box(el) }));
|
|
}
|
|
|
|
const registerBox = async (id_box: number, id_member: number, quantity: number) => {
|
|
const client = new_client();
|
|
|
|
const boxes = await boxService.getBoxesFromMember(id_member);
|
|
|
|
if (boxes.map(el => el.first).find(el => el.id == id_box)) {
|
|
const qty = await client.query("SELECT quantite_enregistrer FROM enregistrer WHERE id_boite=$1 AND id_membre=$2;", [id_box, id_member]);
|
|
await client.query("UPDATE enregistrer SET quantite_enregistrer=$3 WHERE id_boite=$1 AND id_membre=$2;", [id_box, id_member, qty.rows[0].quantite_enregistrer + quantity]);
|
|
}
|
|
else
|
|
await client.query("INSERT INTO enregistrer VALUES($1, $2, $3);", [id_box, id_member, quantity]);
|
|
}
|
|
|
|
const removeBoxFromMember = async (id_box: number, id_member: number) => {
|
|
const client = new_client();
|
|
|
|
await client.query("DELETE FROM enregistrer WHERE id_boite=$1 AND id_membre=$2;", [id_box, id_member]);
|
|
}
|
|
|
|
const boxService = {
|
|
addPiecesToBox,
|
|
getBox,
|
|
getAllBoxes,
|
|
getAllBoxesFromDate,
|
|
removePieceFromBox,
|
|
registerBox,
|
|
getBoxesFromMember,
|
|
removeBoxFromMember,
|
|
};
|
|
|
|
export default boxService;
|