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",
"version": "0.0.1",
"version": "0.0.2",
"description": "Your go-to place for short and memorable URLs.",
"type": "commonjs",
"devDependencies": {

View File

@@ -15,5 +15,5 @@ export const AppDataSource = new DataSource({
entities: [__dirname + '/entities/*.ts'],
migrations: [__dirname + '/migrations/*.ts'],
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 { ErrorDTO } from "../schemas/miscSchema";
import * as jwt from "../tools/jwt";
import { Request, Response, NextFunction } from 'express';
import { ErrorDTO } from '../schemas/miscSchema';
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 user: jwt.JwtStatus = res.locals.user;
let error: ErrorDTO | null = null;

View File

@@ -104,9 +104,11 @@ linkRouter.get('/api/v1/link/fromWordlist', validateSchema(ls.sentenceLinkReques
* post:
* description:
* 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]
* summary: Shorten a link
* summary: "[AUTHED?] Shorten a link"
* requestBody:
* required: true
* content: