diff --git a/PostgreSQL/src/functions.sql b/PostgreSQL/src/functions.sql index 2cc0c19..48d67f0 100644 --- a/PostgreSQL/src/functions.sql +++ b/PostgreSQL/src/functions.sql @@ -18,7 +18,7 @@ LANGUAGE SQL; -- Liste des modèles faisables à partir d'un membre CREATE OR REPLACE FUNCTION modeles_faisables_membre(int) RETURNS TABLE(id_modele int) AS $$ -SELECT id_modele +SELECT * FROM modeles WHERE id_modele not IN ( diff --git a/back-end/src/controllers/member.controller.ts b/back-end/src/controllers/member.controller.ts index bf2f25f..9482f1e 100644 --- a/back-end/src/controllers/member.controller.ts +++ b/back-end/src/controllers/member.controller.ts @@ -1,5 +1,6 @@ import { RequestHandler } from "express"; import memberService from "../services/member.service"; +import modelService from "../services/model.service"; const memberByName: RequestHandler<{ name: string; }> = async (req, res) => { const memberEither = await memberService.getMember(req.params.name); @@ -10,8 +11,9 @@ const memberByName: RequestHandler<{ name: string; }> = async (req, res) => { } const member = memberEither.left; + const models = await modelService.getAllBuildableModels(member.id_member); - res.render('member.ejs', { member }); + res.render('member.ejs', { member, models }); }; const allMembers: RequestHandler = async (_req, res) => { @@ -34,8 +36,9 @@ const memberById: RequestHandler<{ id: string; }> = async (req, res) => { } const member = memberEither.left; + const models = modelService.getAllBuildableModels(member.id_member); - res.render('member.ejs', { member }); + res.render('member.ejs', { member, models }); }; const memberController = { diff --git a/back-end/src/controllers/model.controller.ts b/back-end/src/controllers/model.controller.ts index 38e1d4e..c4ecc47 100644 --- a/back-end/src/controllers/model.controller.ts +++ b/back-end/src/controllers/model.controller.ts @@ -33,7 +33,6 @@ const modelById: RequestHandler<{ id: string; }> = async (req, res) => { res.render('model.ejs', { model }); }; - const allModelsFromFans: RequestHandler = async (_req, res) => { const models = await modelService.getAllModelsFromFans(); res.render('models.ejs', { models }); diff --git a/back-end/src/db/db_client.ts b/back-end/src/db/db_client.ts index 116d6f1..e734a8c 100644 --- a/back-end/src/db/db_client.ts +++ b/back-end/src/db/db_client.ts @@ -14,12 +14,16 @@ console.log(`DB_HOST:\t${db_host}`); console.log(`DB_PORT:\t${db_port}`); console.log("=== END DB CONFIG ==="); -export function new_client() { - return new pg.Client({ +// doc: https://node-postgres.com/apis/pool +const pool_config: pg.PoolConfig = { user: db_user, password: db_password, database: db_name, host: db_host, port: db_port, - }); +} +const pool = new pg.Pool(pool_config); + +export function new_client() { + return pool } diff --git a/back-end/src/db/index.ts b/back-end/src/db/index.ts index 934d4dd..f821837 100644 --- a/back-end/src/db/index.ts +++ b/back-end/src/db/index.ts @@ -2,11 +2,9 @@ import { new_client } from './db_client'; async function example_request() { const client = new_client(); - await client.connect(); const res = await client.query('SELECT $1::text as message', ['Hello world!']); const message = res.rows[0].message; // Hello world! - await client.end(); return message; } diff --git a/back-end/src/services/box.service.ts b/back-end/src/services/box.service.ts index caab528..8803ee6 100644 --- a/back-end/src/services/box.service.ts +++ b/back-end/src/services/box.service.ts @@ -12,7 +12,6 @@ type DBBox = { async function getPiecesFromBox(id_box: number): Promise>> { const client = new_client(); - await client.connect(); const res = await client.query(`SELECT * FROM contenir WHERE id_boite = $1;`, [ id_box ]); const arr: Array> = new Array(); for (let i = 0; i < res.rows.length; ++i) { @@ -21,22 +20,17 @@ async function getPiecesFromBox(id_box: number): Promise { @@ -52,7 +46,6 @@ async function db2box(data: DBBox): Promise { const getBox = async (idOrTitle: number | string): Promise> => { const client = new_client(); - await client.connect(); let res; if (typeof idOrTitle !== 'number') { res = await client.query("SELECT * FROM boites WHERE titre_boite=$1;", [`${idOrTitle}`]); @@ -60,28 +53,23 @@ const getBox = async (idOrTitle: number | string): Promise> res = await client.query("SELECT * FROM boites WHERE id_boite=$1;", [idOrTitle]); } if (res.rows.length === 0) { - await client.end(); return eitherRight("Does not exist."); } const box = await db2box(res.rows[0]); - await client.end(); return eitherLeft(box); } const getAllBoxes = async () => { const client = new_client(); - await client.connect(); const res = await client.query("SELECT * FROM boites"); - await client.end(); return await Promise.all(res.rows.map(async (el) => { return await db2box(el) })); } const getAllBoxesFromDate = async (date: Date) => { const client = new_client(); - await client.connect(); const YYYY = date.getFullYear(); const MM = date.getMonth() + 1; @@ -90,7 +78,6 @@ const getAllBoxesFromDate = async (date: Date) => { const res = await client.query("SELECT * FROM boites WHERE date_boite > $1", [dateString]); - await client.end(); return await Promise.all(res.rows.map(async (el) => { return await db2box(el) })); } diff --git a/back-end/src/services/marque.service.ts b/back-end/src/services/marque.service.ts index 9381364..de9c4f0 100644 --- a/back-end/src/services/marque.service.ts +++ b/back-end/src/services/marque.service.ts @@ -5,7 +5,6 @@ import { Either, eitherLeft, eitherRight } from '../utils/utils'; const getMarque = async (idOrName: number | string): Promise> => { const client = new_client(); - await client.connect(); let res; if (typeof idOrName !== 'number') { res = await client.query("SELECT * FROM marques WHERE nom_marque=$1;", [`${idOrName}`]); @@ -13,11 +12,9 @@ const getMarque = async (idOrName: number | string): Promise("Does not exist."); } const marque: Marque = { id_marque: res.rows[0].id_marque, name: res.rows[0].nom_marque }; - await client.end(); return eitherLeft(marque); } @@ -28,14 +25,11 @@ const createMarque = async (name: string): Promise> => { return eitherRight("Already in database."); } const client = new_client(); - await client.connect(); const res = await client.query("INSERT INTO marques (nom_membre) VALUES ($1) RETURNING *;", [`${name}`]); if (res.rows.length === 0) { - await client.end(); return eitherRight("Something went wrong"); } const marque: Marque = { id_marque: res.rows[0].id_marque, name: res.rows[0].nom_marque }; - await client.end(); return eitherLeft(marque); }; diff --git a/back-end/src/services/member.service.ts b/back-end/src/services/member.service.ts index 8d718cf..d0f0bac 100644 --- a/back-end/src/services/member.service.ts +++ b/back-end/src/services/member.service.ts @@ -1,5 +1,6 @@ import { new_client } from '../db/db_client'; import { Member, MemberAndNbModels, User } from '../types/member'; +import { Model } from '../types/model'; import { Either, eitherLeft, eitherRight } from '../utils/utils'; type DBMembre = { @@ -37,7 +38,6 @@ function db2memberAndNbModels(data: DBMembreAndNbModels): MemberAndNbModels { const getMember = async (idOrName: number | string): Promise> => { const client = new_client(); - await client.connect(); let res; if (typeof idOrName !== 'number') { res = await client.query("SELECT * FROM membres WHERE nom_membre=$1;", [`${idOrName}`]); @@ -45,28 +45,22 @@ const getMember = async (idOrName: number | string): Promise("Does not exist."); } const member = db2member(res.rows[0]); - await client.end(); return eitherLeft(member); } const getAllMembers = async () => { const client = new_client(); - await client.connect(); const res = await client.query("SELECT * FROM membres"); - await client.end(); return res.rows.map(db2member); } const getAllMembersByNbModels = async () => { const client = new_client(); - await client.connect(); const res = await client.query("SELECT * FROM nb_modele_par_membre ORDER BY nb_modele DESC LIMIT 5;"); - await client.end(); return res.rows.map(db2memberAndNbModels); } @@ -76,14 +70,11 @@ const createMember = async (name: string, passwd: string): Promise("Already in database."); } const client = new_client(); - await client.connect(); const res = await client.query("INSERT INTO membres (nom_membre, mdp_membre) VALUES ($1, $2) RETURNING *;", [`${name}`, `${passwd}`]); if (res.rows.length === 0) { - await client.end(); return eitherRight("Something went wrong"); } const member: Member = { id_member: res.rows[0].id_membre, name: res.rows[0].nom_membre, password: res.rows[0].mdp_membre }; - await client.end(); return eitherLeft(member); } diff --git a/back-end/src/services/model.service.ts b/back-end/src/services/model.service.ts index 055235c..11ebda1 100644 --- a/back-end/src/services/model.service.ts +++ b/back-end/src/services/model.service.ts @@ -24,7 +24,6 @@ function db2Model(data: DBModel) { const getModel = async (idOrName: number | string): Promise> => { const client = new_client(); - await client.connect(); let res; if (typeof idOrName !== 'number') { res = await client.query("SELECT * FROM modeles WHERE nom_modele=$1;", [`${idOrName}`]); @@ -32,47 +31,49 @@ const getModel = async (idOrName: number | string): Promise("Does not exist."); } const model = db2Model(res.rows[0]); - await client.end(); return eitherLeft(model); } const getAllModels = async () => { const client = new_client(); - await client.connect(); const res = await client.query("SELECT * FROM modeles"); - await client.end(); return res.rows.map(db2Model); } const getAllModelsFromFans = async () => { const client = new_client(); - await client.connect(); const res = await client.query( "SELECT * FROM modeles WHERE id_membre IS NOT NULL" ); - await client.end(); + return res.rows.map(db2Model); +} + +const getAllBuildableModels = async (id_member: number) => { + const client = new_client(); + + const res = await client.query( + "SELECT modeles_faisables_membre($1)", + [id_member] + ); + return res.rows.map(db2Model); } const getAllModelsByNote = async () => { const client = new_client(); - await client.connect(); 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;" ); - await client.end(); - console.log(res); return res.rows.map(db2Model); } @@ -82,7 +83,6 @@ const createModel = async (name: string, url: string, creator: number, inheritFr return eitherRight("Already in database."); } const client = new_client(); - await client.connect(); const res = await client.query( "INSERT INTO modeles \ (nom_modele, url_notice_modele, id_membre, id_modele_2) \ @@ -91,11 +91,9 @@ const createModel = async (name: string, url: string, creator: number, inheritFr [`${name}`, `${url}`, `${creator}`, `${inheritFrom}`]); if (res.rows.length === 0) { - await client.end(); return eitherRight("Something went wrong"); } const model: Model = db2Model(res.rows[0]); - await client.end(); return eitherLeft(model); } @@ -105,6 +103,7 @@ const modelService = { createModel, getAllModelsFromFans, getAllModelsByNote, + getAllBuildableModels, }; export default modelService; diff --git a/back-end/src/services/pieces.service.ts b/back-end/src/services/pieces.service.ts index 1a338be..0707571 100644 --- a/back-end/src/services/pieces.service.ts +++ b/back-end/src/services/pieces.service.ts @@ -4,35 +4,28 @@ import { Either, eitherLeft, eitherRight, eitherFormatError } from '../utils/uti 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]); + const res = await client.query(`SELECT * FROM $1 WHERE $2=$3;`, [table, 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 res = await client.query(`SELECT * FROM $1;`, [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; } async function registerEntity(table: string, colName: string, name: string, f: (o: Object) => T): Promise { const client = new_client(); - await client.connect(); - const res = await client.query(`INSERT INTO ${client.escapeIdentifier(table)} (${client.escapeIdentifier(colName)}) VALUES ($1) RETURNING *;`, [name]); + const res = await client.query(`INSERT INTO $1 ($2) VALUES ($3) RETURNING *;`, [table, colName, name]); const entity: T = f(res.rows[0]); - await client.end(); return entity; } @@ -86,7 +79,6 @@ async function createShape(name: string): Promise { async function getPiece(id: number): Promise> { const client = new_client(); - await client.connect(); const res = await client.query(`SELECT * FROM pieces NATURAL JOIN colorer NATURAL JOIN couleurs NATURAL JOIN etre_forme NATURAL JOIN formes NATURAL JOIN avoir_motif NATURAL JOIN motifs WHERE id_piece = $1`, [id]); if (!res.rows[0]) { return eitherRight("Nothing found"); @@ -97,7 +89,6 @@ async function getPiece(id: number): Promise> { async function getPieces(): Promise> { const client = new_client(); - await client.connect(); const res = await client.query(`SELECT * FROM pieces NATURAL JOIN colorer NATURAL JOIN couleurs NATURAL JOIN etre_forme NATURAL JOIN formes NATURAL JOIN avoir_motif NATURAL JOIN motifs;`); const arr: Array = new Array(); for (let i = 0; i < res.rows.length; ++i) { @@ -108,13 +99,11 @@ async function getPieces(): Promise> { async function createPiece(colour: Colour, pattern: Pattern, shape: Shape): Promise { const client = new_client(); - await client.connect(); const res = await client.query(`INSERT INTO pieces () VALUES () RETURNING *;`); const result: Piece = { id_piece: res.rows[0]['id_piece'], colour: colour, pattern: pattern, shape: shape }; await client.query("INSERT INTO colorer (id_piece, id_couleur) VALUES ($1, $2);", [result.id_piece, colour.id_colour]); await client.query("INSERT INTO etre_forme (id_forme, id_piece) VALUES ($1, $2);", [shape.id_shape, result.id_piece]); await client.query("INSERT INTO avoir_motif (id_piece, id_motif) VALUES ($1, $2);", [result.id_piece, pattern.id_pattern]) - await client.end(); return result; } diff --git a/back-end/src/templates/member.ejs b/back-end/src/templates/member.ejs index a5a8ad0..8de3501 100644 --- a/back-end/src/templates/member.ejs +++ b/back-end/src/templates/member.ejs @@ -16,8 +16,28 @@

<%= member.name %>

-

id: <%= member.id_member%> -

+ +
+ +

Caractéristiques

+ +
+		id:   <%= member.id_member%>
+		name: <%= member.name%>
+	
+ +

Liste des modèles faisable

+ + +