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>> { const client = new_client(); const res = await client.query(`SELECT * FROM necessiter WHERE id_modele = $1;`, [ id_model ]); const arr: Array> = new Array(); for (let i = 0; i < res.rows.length; ++i) { const piece: Either = 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> => { 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("Does not exist."); } const model = await db2Model(res.rows[0]); return eitherLeft(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> => { const gettingModel = await getModel(name); if (!gettingModel.hasRight) { return eitherRight("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("Something went wrong"); } const model: Model = await db2Model(res.rows[0]); return eitherLeft(model); } const modelService = { getModel, getAllModels, createModel, getAllModelsFromFans, getAllModelsByNote, getAllBuildableModels, }; export default modelService;