From 642e84910bb7635c210c3bb9278813107295a2ed Mon Sep 17 00:00:00 2001 From: tycrek Date: Mon, 26 Dec 2022 11:49:48 -0700 Subject: [PATCH] feat: added setting username via API --- src/auth.ts | 27 +++++++++++++++++++++++++++ src/routers/api.ts | 16 +++++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/auth.ts b/src/auth.ts index 45dfea3..d92e56d 100644 --- a/src/auth.ts +++ b/src/auth.ts @@ -239,6 +239,33 @@ export const deleteUserMeta = (unid: string, key: string): Promise => new .catch(reject); }); +/** + * Sets the username for a user + * @since v0.14.1 + */ +export const setUsername = (unid: string, username: 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')); + + // Check if the username is already taken + if (users.find((user) => user.username === username)) return reject(new Error('Username already taken')); + + // Set the username + user.username = username; + + // 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[userIndex] = user; + fs.writeJson(authPath, authData, { spaces: '\t' }) + .then(() => log.info('Set username for', user.unid, username)) + .then(() => resolve(user)) + .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 8fa1715..1eace94 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, deleteUser, setUserMeta, deleteUserMeta, verifyCliKey } from '../auth'; +import { findFromToken, setUserPassword, users, createNewUser, deleteUser, setUserMeta, deleteUserMeta, setUsername, verifyCliKey } from '../auth'; import { log } from '../utils'; import { data } from '../data'; import { User } from '../types/auth'; @@ -124,6 +124,20 @@ function buildUserRouter() { .catch((err) => errorHandler(res, err)); }); + // Sets a username + // Admin only + userRouter.put('/username/:id', adminAuthMiddleware, (req: Request, res: Response) => { + const id = req.params.id; + const username: string | undefined = req.body.username; + + if (username == null || username.length === 0) + return res.sendStatus(400); + + setUsername(id, username) + .then(() => res.sendStatus(200)) + .catch((err) => errorHandler(res, err)); + }); + // Delete a user meta key // Admin only userRouter.delete('/meta/:id', adminAuthMiddleware, (req: Request, res: Response) => {