RaspberryRocketeer/backend/api/src/userRoute.ts
2023-01-10 09:38:44 +01:00

86 lines
2.8 KiB
TypeScript

import express from "express";
import {body, param, validationResult} from 'express-validator';
import {UserScoresPgPromiseRepository} from "./repositories/pgPromise/UserScoresPgPromiseRepository.js";
import {UserPgPromiseRepository} from "./repositories/pgPromise/UserPgPromiseRepository.js";
import {UserRepository} from "./repositories/UserRepository.js";
import {UserScoresRepository} from "./repositories/UserScoresRepository.js";
import {User} from "./model/User.js";
import {USERNAME_VALIDATION_REGEX, userWithIdExists, userWithNameDoesNotExists} from "./validators.js";
export const userRoute = express.Router()
userRoute.use(express.json())
userRoute.post(
'/register',
body('name')
.isString()
.isLength({min: 3, max: 32})
.matches(USERNAME_VALIDATION_REGEX)
.custom(userWithNameDoesNotExists),
/**
* After processing the errors of express-validator, inserts the user into DB
* Returns the inserted user
* @param req
* body {
* name: string
* }
* @param res json: User
*/
async (req, res) => {
try {
//region validate parameters
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
//endregion
const username: string = req.body.name;
const userRepo: UserRepository = new UserPgPromiseRepository();
// insert & return user
const inserted: User = await userRepo.insert({name: username});
res.json(inserted);
} catch (error) {
// handle errors
console.log(error)
res.status(500).json({ errors: [{msg: "Internal server error"}]})
}
}
)
userRoute.get('/:userId/scores',
param('userId')
.isInt({min: 1})
.custom(userWithIdExists),
/**
* After processing the errors of express-validator, fetches the scores from the DB
* Returns user scores
* @param req
* params {
* userId: number
* }
* @param res json: UserScores
*/
async (req, res) => {
//region validate parameters
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
//endregion
const userId: number = req.params.userId;
try {
// get & return data
const userScoresRepo: UserScoresRepository = new UserScoresPgPromiseRepository;
const userScores = await userScoresRepo.getById(userId);
res.json(userScores);
} catch (error) {
// handle errors
console.log(error)
res.status(500).json({ errors: [{msg: "Internal server error"}]})
}
}
)