lego/back-end/src/services/model.service.ts
Alessandre Laguierce 9748de5355 fix: remove log
2024-12-03 11:54:12 +01:00

126 lines
3.7 KiB
TypeScript

import { new_client } from '../db/db_client';
import { Model } from '../types/model';
import { Either, eitherLeft, eitherRight, Pair, createPair } from '../utils/utils';
import { Piece } from '../types/piece';
import { getPiece } from './pieces.service';
type DBModel = {
id_modele: number;
nom_modele: string;
url_notice_modele: string;
id_membre: number;
id_modele_2: number;
};
async function getPiecesFromModel(id_model: number): Promise<Array<Pair<Piece, number>>> {
const client = new_client();
const res = await client.query(`SELECT * FROM necessiter WHERE id_modele = $1;`, [ id_model ]);
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_necessiter'] as number));
}
return arr;
}
async function db2Model(data: DBModel) {
const model: Model = {
id: data.id_modele,
name: data.nom_modele,
url: data.url_notice_modele,
creator: data.id_membre,
inheritFrom: data.id_modele_2,
pieces: await getPiecesFromModel(data.id_modele)
};
return model;
}
const getModel = async (idOrName: number | string): Promise<Either<Model, string>> => {
const client = new_client();
let res;
if (typeof idOrName !== 'number') {
res = await client.query("SELECT * FROM modeles WHERE nom_modele=$1;", [`${idOrName}`]);
} else {
res = await client.query("SELECT * FROM modeles WHERE id_modele=$1;", [idOrName]);
}
if (res.rows.length === 0) {
return eitherRight<Model, string>("Does not exist.");
}
const model = await db2Model(res.rows[0]);
return eitherLeft<Model, string>(model);
}
const getAllModels = async () => {
const client = new_client();
const res = await client.query("SELECT * FROM modeles");
return Promise.all(res.rows.map(async (el) => { return await db2Model(el) }));
}
const getAllModelsFromFans = async () => {
const client = new_client();
const res = await client.query(
"SELECT * FROM modeles WHERE id_membre IS NOT NULL"
);
return Promise.all(res.rows.map(async (el) => { return await db2Model(el) }));
}
const getAllBuildableModels = async (id_member: number) => {
const client = new_client();
const res = await client.query(
"SELECT modeles_faisables_membre($1)",
[id_member]
);
return Promise.all(res.rows.map(async (el) => { return await db2Model(el) }));
}
const getAllModelsByNote = async () => {
const client = new_client();
const res = await client.query(
"SELECT modeles.*, AVG(note_noter) as note_moyenne FROM noter JOIN modeles on noter.id_modele = modeles.id_modele GROUP BY modeles.id_modele ORDER BY note_moyenne DESC;"
);
return Promise.all(res.rows.map(async (el) => { return await db2Model(el) }));
}
const createModel = async (name: string, url: string, creator: number, inheritFrom: number): Promise<Either<Model, string>> => {
const gettingModel = await getModel(name);
if (!gettingModel.hasRight) {
return eitherRight<Model, string>("Already in database.");
}
const client = new_client();
const res = await client.query(
"INSERT INTO modeles \
(nom_modele, url_notice_modele, id_membre, id_modele_2) \
VALUES ($1, $2, $3, $4) \
RETURNING *;",
[`${name}`, `${url}`, `${creator}`, `${inheritFrom}`]);
if (res.rows.length === 0) {
return eitherRight<Model, string>("Something went wrong");
}
const model: Model = await db2Model(res.rows[0]);
return eitherLeft<Model, string>(model);
}
const modelService = {
getModel,
getAllModels,
createModel,
getAllModelsFromFans,
getAllModelsByNote,
getAllBuildableModels,
};
export default modelService;