/[sudobot]/trunk/src/api/controllers/UserController.ts
ViewVC logotype

Contents of /trunk/src/api/controllers/UserController.ts

Parent Directory Parent Directory | Revision Log Revision Log


Revision 348 - (show annotations)
Mon Jul 29 17:29:43 2024 UTC (8 months, 1 week ago) by rakin
File MIME type: application/typescript
File size: 2349 byte(s)
feat: user controller
1 import { Request } from "express";
2 import User from "../../models/User";
3 import Controller from "../Controller";
4 import { body, validationResult } from 'express-validator';
5 import bcrypt from 'bcrypt';
6 import jwt from 'jsonwebtoken';
7 import KeyValuePair from "../../types/KeyValuePair";
8 import { promise } from "zod";
9 import Response from "../Response";
10
11 export default class UserController extends Controller {
12 middleware(): KeyValuePair<Function[]> {
13 return {
14 create: [
15 body(["password"]).isLength({ min: 2 }),
16 body(["username"]).custom(async username => {
17 const user = await User.findOne({ username });
18
19 if (user) {
20 return Promise.reject("Username is already in use");
21 }
22
23 return username;
24 }),
25 body(["discord_id"]).custom(value => /\d+/g.test(value) ? value : Promise.reject("Invalid Snowflake Given"))
26 ]
27 };
28 }
29
30 public async index() {
31 return await User.find().limit(30);
32 }
33
34 public async create(request: Request) {
35 return new Response(403);
36
37 const errors = validationResult(request);
38
39 if (!errors.isEmpty()) {
40 return { errors: errors.array(), error_type: 'validation' };
41 }
42
43 const user = new User();
44
45 user.username = request.body.username;
46 user.discord_id = request.body.discord_id;
47 user.createdAt = new Date();
48
49 try {
50 await user.save();
51 }
52 catch (e) {
53 return { error: "DB validation error", error_type: 'db_validation' };
54 }
55
56 const salt = await bcrypt.genSalt();
57 user.password = await bcrypt.hash(request.body.password, salt);
58
59 const token = await jwt.sign({
60 username: user.username,
61 discord_id: user.discord_id,
62 _id: user.id
63 }, process.env.JWT_SECRET!, {
64 expiresIn: "2 days",
65 issuer: "SudoBot API",
66 });
67
68 user.token = token;
69
70 try {
71 await user.save();
72 }
73 catch (e) {
74 return { error: "Token signing error", error_type: 'token_signing' };
75 }
76
77 user.password = undefined;
78 return user;
79 }
80 }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26