From 2b87e044e16da45d0ebfb8f06e5b778bb65abd55 Mon Sep 17 00:00:00 2001 From: tycrek Date: Sun, 25 Dec 2022 22:23:29 -0700 Subject: [PATCH] feat: added deleting users via the API --- src/auth.ts | 23 +++++++++++++++++++++++ src/routers/api.ts | 34 +++++++++++++++++++++++++++++++--- 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/auth.ts b/src/auth.ts index 8b1b392..611cd3c 100644 --- a/src/auth.ts +++ b/src/auth.ts @@ -164,6 +164,29 @@ export const setUserPassword = (unid: string, password: string): Promise = .catch(reject); }); +/** + * Deletes a user account + * @since v0.14.1 + */ +export const deleteUser = (unid: string): Promise => new Promise((resolve, reject) => { + + // Find the user + const user = users.find((user) => user.unid === unid); + if (!user) return reject(new Error('User not found')); + + // Remove the user from the users map + users.splice(users.indexOf(user), 1); + + // Save the new user to auth.json + const authPath = path('auth.json'); + const authData = fs.readJsonSync(authPath) as Users; + const userIndex = authData.users.findIndex((user) => user.unid === unid); + authData.users.splice(userIndex, 1); + fs.writeJson(authPath, authData, { spaces: '\t' }) + .then(() => resolve()) + .catch(reject); +}); + /** * Called by ass.ts on startup * @since v0.14.0 diff --git a/src/routers/api.ts b/src/routers/api.ts index fb45e92..dd26867 100644 --- a/src/routers/api.ts +++ b/src/routers/api.ts @@ -5,7 +5,7 @@ */ import { Router, Request, Response, NextFunction } from 'express'; -import { findFromToken, setUserPassword, users, createNewUser, verifyCliKey } from '../auth'; +import { findFromToken, setUserPassword, users, createNewUser, deleteUser, verifyCliKey } from '../auth'; import { log } from '../utils'; import { data } from '../data'; import { User } from '../types/auth'; @@ -15,6 +15,17 @@ import { User } from '../types/auth'; */ const RouterApi = Router(); +/** + * Logs an error and sends a 500 (404 if 'User not found' error) + * @since v0.14.1 + */ +const errorHandler = (res: Response, err: Error | any) => { + log.error(err); + if (err.message === 'User not found') + return res.sendStatus(404); + res.sendStatus(500); +}; + /** * Token authentication middleware for Admins * @since v0.14.0 @@ -56,7 +67,7 @@ function buildUserRouter() { setUserPassword(id, newPassword) .then(() => res.sendStatus(200)) - .catch((err) => (log.error(err), res.sendStatus(500))); + .catch((err) => errorHandler(res, err)); }); // Create a new user @@ -73,7 +84,7 @@ function buildUserRouter() { createNewUser(username, password, admin, meta) .then((user) => res.send(user)) - .catch((err) => (log.error(err), res.sendStatus(500))); + .catch((err) => errorHandler(res, err)); }); // Get a user (must be last as it's a catch-all) @@ -81,6 +92,23 @@ function buildUserRouter() { userRouter.get('/:id', adminAuthMiddleware, (req: Request, res: Response) => userFinder(res, users.find(user => user.unid === req.params.id || user.username === req.params.id))); + // Delete a user + // Admin only + userRouter.delete('/:id', adminAuthMiddleware, (req: Request, res: Response) => { + const id = req.params.id; + + deleteUser(id) + .then(() => res.sendStatus(200)) + .catch((err) => errorHandler(res, err)); + }); + + // Update a user + // Admin only + userRouter.put('/:id', adminAuthMiddleware, (req: Request, res: Response) => { + const id = req.params.id; + //WIP + }); + return userRouter; }