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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 347 by rakin, Mon Jul 29 17:29:33 2024 UTC revision 348 by rakin, Mon Jul 29 17:29:43 2024 UTC
# Line 1  Line 1 
1  import { Request } from "express";  import { Request } from "express";
2    import User from "../../models/User";
3  import Controller from "../Controller";  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 {  export default class UserController extends Controller {
12      public async index(request: Request) {      middleware(): KeyValuePair<Function[]> {
13          return { message: "Server is up." };          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  }  }

Legend:
Removed from v.347  
changed lines
  Added in v.348

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26