126 lines
3.7 KiB
TypeScript
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;
|