diff --git a/back-end/src/controllers/members.controller.ts b/back-end/src/controllers/members.controller.ts index 0c1f0d0..8280aa6 100644 --- a/back-end/src/controllers/members.controller.ts +++ b/back-end/src/controllers/members.controller.ts @@ -1,15 +1,46 @@ import { Request, Response, Router } from 'express'; import bcrypt from 'bcrypt'; import { Member, User } from '../types/member'; +import { new_client } from '../db/db_client'; +import { Either, eitherLeft, eitherRight } from '../utils/utils'; -const defaultMember = { id_member: -1, name: "unknown" }; +const defaultUser = { id_member: -1, name: "unknown" }; +const defaultMember = { id_member: -1, name: "unknown", password: "none" }; -function getMember(idOrName: number | string): Member { - return defaultMember; +async function getMember(idOrName: number | string): Promise> { + const client = new_client(); + await client.connect(); + + const res = await client.query("SELECT * FROM membres WHERE 'id_membre'='$1' OR 'nom_membre'='$2';", [`${idOrName}`, `${idOrName}`]); + if (res.rows.length === 0) { + await client.end(); + return eitherRight("Does not exist."); + } + const member: Member = { id_member: res.rows[0].id_member, name: res.rows[0].nom_membre, password: res.rows[0].mdp_membre }; + await client.end(); + + return eitherLeft(member); } -function createMember(name: string, passwd: string): Member { - return defaultMember; +async function createMember(name: string, passwd: string): Promise> { + const gettingMember = await getMember(name); + if (!gettingMember.hasError) { + return eitherRight("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_member, name: res.rows[0].nom_membre, password: res.rows[0].mdp_membre }; + await client.end(); + return eitherLeft(member); +} + +function userAdapter(member: Member): User { + return { id_member: member.id_member, name: member.name }; } const register = (req: Request, res: Response) => { @@ -21,16 +52,20 @@ const register = (req: Request, res: Response) => { const name: string = req.body.name; bcrypt.genSalt(10, (err, salt) => { if (err) { - // Handle error + res.status(500); return; } - bcrypt.hash(req.body.password, salt, (err, hash) => { + bcrypt.hash(req.body.password, salt, async (err, hash) => { if (err) { - // Handle error + res.status(500); return; } - res.send(createMember(name, hash)); + const member: Either = await createMember(name, hash); + if (member.hasError) + res.send(member.error); + else + res.send(userAdapter(member.value)); }); }); } diff --git a/back-end/src/types/member.ts b/back-end/src/types/member.ts index b01b0f5..92b2319 100644 --- a/back-end/src/types/member.ts +++ b/back-end/src/types/member.ts @@ -1,8 +1,8 @@ -type Member = { +type User = { id_member: number, name: string } -type User = Member | { password: string }; +type Member = User & { password: string }; export { Member, User }; diff --git a/back-end/src/utils/utils.ts b/back-end/src/utils/utils.ts new file mode 100644 index 0000000..9a75651 --- /dev/null +++ b/back-end/src/utils/utils.ts @@ -0,0 +1,15 @@ +type Either = { + hasError: boolean, + value: T, + error: U +}; + +function eitherLeft(val: T): Either { + return { hasError: false, value: val, error: undefined }; +} + +function eitherRight(error: U): Either { + return { hasError: true, value: undefined, error: error }; +} + +export { Either, eitherLeft, eitherRight };