-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathusers.js
125 lines (99 loc) · 3.33 KB
/
users.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
"use strict";
/** Routes for users. */
const jsonschema = require("jsonschema");
const express = require("express");
const { ensureCorrectUserOrAdmin, ensureAdmin } = require("../middleware/auth");
const { BadRequestError } = require("../expressError");
const User = require("../models/user");
const { createToken } = require("../helpers/tokens");
const userNewSchema = require("../schemas/userNew.json");
const userUpdateSchema = require("../schemas/userUpdate.json");
const router = express.Router();
/** POST / { user } => { user, token }
*
* Adds a new user. This is not the registration endpoint --- instead, this is
* only for admin users to add new users. The new user being added can be an
* admin.
*
* This returns the newly created user and an authentication token for them:
* {user: { username, firstName, lastName, email, isAdmin }, token }
*
* Authorization required: admin
**/
router.post("/", ensureAdmin, async function (req, res, next) {
const validator = jsonschema.validate(
req.body,
userNewSchema,
{ required: true },
);
if (!validator.valid) {
const errs = validator.errors.map(e => e.stack);
throw new BadRequestError(errs);
}
const user = await User.register(req.body);
const token = createToken(user);
return res.status(201).json({ user, token });
});
/** GET / => { users: [ {username, firstName, lastName, email }, ... ] }
*
* Returns list of all users.
*
* Authorization required: admin
**/
router.get("/", ensureAdmin, async function (req, res, next) {
const users = await User.findAll();
return res.json({ users });
});
/** GET /[username] => { user }
*
* Returns { username, firstName, lastName, isAdmin, jobs }
* where jobs is { id, title, companyHandle, companyName, state }
*
* Authorization required: admin or same user-as-:username
**/
router.get("/:username", ensureCorrectUserOrAdmin, async function (req, res, next) {
const user = await User.get(req.params.username);
return res.json({ user });
});
/** PATCH /[username] { user } => { user }
*
* Data can include:
* { firstName, lastName, password, email }
*
* Returns { username, firstName, lastName, email, isAdmin }
*
* Authorization required: admin or same-user-as-:username
**/
router.patch("/:username", ensureCorrectUserOrAdmin, async function (req, res, next) {
const validator = jsonschema.validate(
req.body,
userUpdateSchema,
{ required: true },
);
if (!validator.valid) {
const errs = validator.errors.map(e => e.stack);
throw new BadRequestError(errs);
}
const user = await User.update(req.params.username, req.body);
return res.json({ user });
});
/** DELETE /[username] => { deleted: username }
*
* Authorization required: admin or same-user-as-:username
**/
router.delete("/:username", ensureCorrectUserOrAdmin, async function (req, res, next) {
await User.remove(req.params.username);
return res.json({ deleted: req.params.username });
});
/** POST /[username]/jobs/[id] { state } => { application }
*
* Returns {"applied": jobId}
*
* Authorization required: admin or same-user-as-:username
* */
router.post("/:username/jobs/:id", ensureCorrectUserOrAdmin, async function (req, res, next) {
const jobId = +req.params.id;
await User.applyToJob(req.params.username, jobId);
return res.json({ applied: jobId });
});
module.exports = router;