4 Commits

Author SHA1 Message Date
9311cd3c96 chore: release v0.0.2
All checks were successful
Build and push Docker image / build (push) Successful in 2m46s
Release new version / release (push) Successful in 26s
Update changelog / changelog (push) Successful in 24s
2026-01-07 23:06:21 +01:00
89e6832e73 Merge remote-tracking branch 'origin/master' 2026-01-07 23:04:42 +01:00
109f22c231 docs: add note to link shortening endpoint swagger doc 2026-01-07 23:04:35 +01:00
355338e397 docs: add requireAdmin and docs for requireUser 2026-01-03 18:29:14 +01:00
5 changed files with 61 additions and 8 deletions

View File

@@ -1,6 +1,6 @@
{ {
"name": "kittyBE", "name": "kittyBE",
"version": "0.0.1", "version": "0.0.2",
"description": "Your go-to place for short and memorable URLs.", "description": "Your go-to place for short and memorable URLs.",
"type": "commonjs", "type": "commonjs",
"devDependencies": { "devDependencies": {

View File

@@ -15,5 +15,5 @@ export const AppDataSource = new DataSource({
entities: [__dirname + '/entities/*.ts'], entities: [__dirname + '/entities/*.ts'],
migrations: [__dirname + '/migrations/*.ts'], migrations: [__dirname + '/migrations/*.ts'],
subscribers: [], subscribers: [],
parseInt8: true parseInt8: true // https://github.com/typeorm/typeorm/issues/9341#issuecomment-1268986627
}) })

View File

@@ -0,0 +1,38 @@
import { Request, Response, NextFunction } from 'express';
import { ErrorDTO } from '../schemas/miscSchema';
import * as jwt from '../tools/jwt';
/**
* Checks if user has administrative privileges.
*
* This needs to happen AFTER ensuring this is not a guest session.
* So: use requireUser first, and after that requireAdmin to enforce
* admin privilege requirement.
*
* @param {Request} req The request
* @param {Response} res The resource
* @param {(Function|NextFunction)} next The next
* @return {any} Next function on success, unauthorized error otherwise
*/
const requireAdmin = (req: Request, res: Response, next: NextFunction) => {
const user: jwt.JwtStatus = res.locals.user;
let error: ErrorDTO | null = null;
// Check if role is set to 1 (1 = admin, 0 = standard user).
if (user.decoded?.role !== 1)
error = {
status: 'error',
error: 'Unauthorized, admin access required',
code: 'unauthorized_non_admin'
};
// It is? Send 401 unauthorized.
if (error !== null)
return res.status(401)
.send(error);
// Otherwise jump to next endpoint.
return next();
};
export default requireAdmin;

View File

@@ -1,7 +1,20 @@
import { Request, Response, NextFunction } from "express"; import { Request, Response, NextFunction } from 'express';
import { ErrorDTO } from "../schemas/miscSchema"; import { ErrorDTO } from '../schemas/miscSchema';
import * as jwt from "../tools/jwt"; import * as jwt from '../tools/jwt';
/**
* Checks if user is singed in.
* Returns 401 when user is unauthorized.
*
* To check if user is an admin, chain requireUser and requireAdmin together.
* So: use requireUser first, and after that requireAdmin to enforce
* admin privilege requirement.
*
* @param {Request} req The request
* @param {Response} res The resource
* @param {(Function|NextFunction)} next The next
* @return {any} Next function on success, unauthorized error otherwise
*/
const requireUser = (req: Request, res: Response, next: NextFunction) => { const requireUser = (req: Request, res: Response, next: NextFunction) => {
const user: jwt.JwtStatus = res.locals.user; const user: jwt.JwtStatus = res.locals.user;
let error: ErrorDTO | null = null; let error: ErrorDTO | null = null;
@@ -38,4 +51,4 @@ const requireUser = (req: Request, res: Response, next: NextFunction) => {
return next(); return next();
}; };
export default requireUser; export default requireUser;

View File

@@ -104,9 +104,11 @@ linkRouter.get('/api/v1/link/fromWordlist', validateSchema(ls.sentenceLinkReques
* post: * post:
* description: * description:
* Register a new shortened URL. <br/> * Register a new shortened URL. <br/>
* See linkSchema.ts for constraints. * See linkSchema.ts for constraints. <br/>
* <b>Note:</b> This endpoint's functionality differs depending on the user info,
* which means guests will be treated differently from authenticated users.
* tags: [Link] * tags: [Link]
* summary: Shorten a link * summary: "[AUTHED?] Shorten a link"
* requestBody: * requestBody:
* required: true * required: true
* content: * content: