diff --git a/src/database.ts b/src/database.ts index 3aa61be..7aa6704 100644 --- a/src/database.ts +++ b/src/database.ts @@ -98,6 +98,7 @@ export function createTables(db: sqlite3.Database) { // CREATE TABLE registered_user ( // id_user SERIAL PRIMARY KEY, // login VARCHAR(64) NOT NULL, +// email VARCHAR(64) NOT NULL, // password VARCHAR(72) NOT NULL, // permissions INT NOT NULL, // UNIQUE (login) @@ -105,8 +106,13 @@ export function createTables(db: sqlite3.Database) { /* Créer la table registered_user dans la base de données */ export function createRegisteredUserTable(db: sqlite3.Database): Promise { - const tableRegisteredUser = - `CREATE TABLE IF NOT EXISTS registered_user (id_user INTEGER PRIMARY KEY AUTOINCREMENT, login TEXT NOT NULL, password TEXT NOT NULL, permissions INTEGER NOT NULL, UNIQUE (login))`; + const tableRegisteredUser = `CREATE TABLE IF NOT EXISTS registered_user ( + id_user INTEGER PRIMARY KEY AUTOINCREMENT, + login TEXT NOT NULL, + email TEXT NOT NULL, + password TEXT NOT NULL, + permissions INTEGER NOT NULL, + UNIQUE (login))`; return runDB(db, tableRegisteredUser, []); } @@ -115,12 +121,13 @@ export function createRegisteredUserTable(db: sqlite3.Database): Promise { export function insertUser( db: sqlite3.Database, login: string, + email: string, password: string, permissions: number, ) { - const insertUserQuery = `INSERT INTO registered_user (login, password, permissions) VALUES (?, ?, ?)`; + const insertUserQuery = `INSERT INTO registered_user (login, email, password, permissions) VALUES (?, ?, ?, ?)`; - return runDB(db, insertUserQuery, [login, password, permissions]); + return runDB(db, insertUserQuery, [login, email, password, permissions]); } /* Modifier le login d'un utilisateur dans la table registered_user */ @@ -156,6 +163,15 @@ export function updateUserPermissions( return runDB(db, updateUserPermissionsQuery, [newPermissions, id]); } +export function updateUserEmail( + db: sqlite3.Database, + id: number, + newEmail: string +) { + const updateUserEmailQuery = `UPDATE registered_user SET email = ? WHERE id_user = ?`; + return runDB(db, updateUserEmailQuery, [newEmail, id]); +} + /* Supprimer un utilisateur de la table registered_user par son ID */ export function deleteUserById(db: sqlite3.Database, id: number) { const deleteUserQuery = `DELETE FROM registered_user WHERE id_user = ?`; @@ -279,13 +295,20 @@ export function selectLanguageById(db: sqlite3.Database, id: number) { // link CHAR(36) NOT NULL, // user_id INT REFERENCES registered_user(id_user), // language_id INT NOT NULL REFERENCES language(id_language) +// title VARCHAR(30) NOT NULL, // content TEXT NOT NULL, +// date TIMESTAMP DEFAULT CURRENT_TIMESTAMP // ); /* Créer la table work dans la base de données */ export function createWorkTable(db: sqlite3.Database): Promise { - const tableWork = - `CREATE TABLE IF NOT EXISTS work (id_work INTEGER PRIMARY KEY AUTOINCREMENT, link CHAR(36) NOT NULL, user_id INTEGER REFERENCES registered_user(id_user), language_id INTEGER NOT NULL REFERENCES language(id_language), content TEXT NOT NULL)`; + const tableWork = `CREATE TABLE IF NOT EXISTS work ( + id_work INTEGER PRIMARY KEY AUTOINCREMENT, + link CHAR(36) NOT NULL, user_id INTEGER REFERENCES registered_user(id_user), + language_id INTEGER NOT NULL REFERENCES language(id_language), + title TEXT NOT NULL, + content TEXT NOT NULL, + date TIMESTAMP DEFAULT CURRENT_TIMESTAMP)`; return runDB(db, tableWork, []); } @@ -295,11 +318,12 @@ export function insertWork( link: string, user_id: number, language_id: number, + title: string, content: string, ) { - const insertWorkQuery = `INSERT INTO work (link, user_id, language_id, content) VALUES (?, ?, ?, ?)`; + const insertWorkQuery = `INSERT INTO work (link, user_id, language_id, title, content, date) VALUES (?, ?, ?, ?, ?, ?)`; - return runDB(db, insertWorkQuery, [link, user_id, language_id, content]); + return runDB(db, insertWorkQuery, [link, user_id, language_id, title, content, new Date().toISOString()]); } /* Sélectionner tous les works de la table work */ @@ -329,3 +353,27 @@ export function selectWorkById(db: sqlite3.Database, id: number) { return getDB(db, selectWorkByIdQuery, [id]); } + +/* Update the work title by its ID */ +export function updateWorkTitle( + db: sqlite3.Database, + id: number, + newTitle: string +) { + const updateWorkTitleQuery = `UPDATE work SET title = ? WHERE id_work = ?`; + + return runDB(db, updateWorkTitleQuery, [newTitle, id]); +} + +/* Update the work content by its ID */ +export function updateWorkContent( + db: sqlite3.Database, + id: number, + newContent: string +) { + const updateWorkContentQuery = `UPDATE work SET content = ? WHERE id_work = ?`; + + return runDB(db, updateWorkContentQuery, [newContent, id]); +} + + diff --git a/src/server.ts b/src/server.ts index 51d8de6..eb92b16 100644 --- a/src/server.ts +++ b/src/server.ts @@ -161,14 +161,15 @@ fastify.post( schema: { body: Type.Object({ login: Type.String(), + email: Type.String(), password: Type.String(), permissions: Type.Number(), }), }, }, async (request, reply) => { - const { login, password, permissions } = request.body; - db.insertUser(database, login, password, permissions); + const { login, email, password, permissions } = request.body; + db.insertUser(database, login, email, password, permissions); reply.send({ success: true }); }, ); @@ -242,6 +243,36 @@ fastify.put( }, ); +/* Route pour mettre à jour l'email d'un utilisateur */ +fastify.put( + "/users/:id/email", + { + schema: { + params: Type.Object({ + id: Type.Number({ + minimum: 0, + }), + }), + body: Type.Object({ + newEmail: Type.String(), + }), + }, + }, + async (request, reply) => { + const { id } = request.params; + const { newEmail } = request.body; + + // Check if the ID relates to an existing ID. + const user = await db.selectUserById(database, id); + if (!user) { + reply.status(404).send({ error: "User not found" }); + return; + } + await db.updateUserEmail(database, id, newEmail); + reply.send({ success: true }); + } +); + /* Route pour supprimer un utilisateur par son ID */ fastify.delete( "/users/:id", @@ -449,13 +480,14 @@ fastify.post( id_user: Type.Number(), link: Type.String(), id_language: Type.Number(), + title: Type.String(), code: Type.String(), }), }, }, async (request, reply) => { - const { id_user, link, id_language, code } = request.body; - db.insertWork(database, link, id_user, id_language, code); + const { id_user, link, id_language, title, code } = request.body; + await db.insertWork(database, link, id_user, id_language, title, code); reply.send({ success: true }); }, ); @@ -510,6 +542,54 @@ fastify.get( }, ); +/* Update the work title by its ID */ +fastify.put( + "/works/:id/title", + { + schema: { + params: Type.Object({ + id: Type.Number({ + minimum: 0, + }), + }), + body: Type.Object({ + newTitle: Type.String(), + }), + }, + }, + async (request, reply) => { + const { id } = request.params; + const { newTitle } = request.body; + await db.updateWorkTitle(database, id, newTitle); + reply.send({ success: true }); + } +); + +/* Update the work content by its ID */ +fastify.put( + "/works/:id/content", + { + schema: { + params: Type.Object({ + id: Type.Number({ + minimum: 0, + }), + }), + body: Type.Object({ + newContent: Type.String(), + }), + }, + }, + async (request, reply) => { + const { id } = request.params; + const { newContent } = request.body; + await db.updateWorkContent(database, id, newContent); + reply.send({ success: true }); + } +); + + + /* Forward output est une fonction asynchrone qui permet de récupérer les messages envoyés par le container et de les renvoyer au client */ async function forwardOutput() { for await (const [buff] of receiver) {