You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
2.6 KiB
TypeScript
109 lines
2.6 KiB
TypeScript
import express, { Request, Response } from "express";
|
|
import { User, UserStore } from "../models/user";
|
|
import { verifyAuthToken, verifyUserToken } from "./utils";
|
|
|
|
const userRoutes = (app: express.Application) => {
|
|
app.get("/users", verifyAuthToken, index);
|
|
app.get("/users/:id", verifyAuthToken, read);
|
|
app.post("/users", create);
|
|
app.put("/users/:id", verifyAuthToken, update);
|
|
app.delete("/users/:id", verifyAuthToken, destroy);
|
|
app.post("/users/auth", authenticate);
|
|
};
|
|
|
|
const store = new UserStore();
|
|
|
|
const index = async (req: Request, res: Response) => {
|
|
try {
|
|
const users = await store.index();
|
|
res.json(users);
|
|
} catch (err) {
|
|
res.status(400);
|
|
res.json(err);
|
|
}
|
|
};
|
|
|
|
const read = async (req: Request, res: Response) => {
|
|
try {
|
|
const user = await store.read(parseInt(req.params.id));
|
|
res.json(user);
|
|
} catch (err) {
|
|
res.status(400);
|
|
res.json(err);
|
|
}
|
|
};
|
|
|
|
const create = async (req: Request, res: Response) => {
|
|
const userInfo: User = {
|
|
firstname: req.body.firstname,
|
|
lastname: req.body.lastname,
|
|
username: req.body.username,
|
|
password: req.body.password,
|
|
};
|
|
|
|
try {
|
|
const newUser = await store.create(userInfo);
|
|
res.json(verifyUserToken(newUser));
|
|
} catch (err) {
|
|
res.status(400);
|
|
res.json(err);
|
|
}
|
|
};
|
|
|
|
const update = async (req: Request, res: Response) => {
|
|
try {
|
|
const userInfo: User = {
|
|
id: parseInt(req.params.id),
|
|
firstname: req.body.firstname,
|
|
lastname: req.body.lastname,
|
|
username: req.body.username,
|
|
password: req.body.password,
|
|
};
|
|
const updatedUser = await store.update(userInfo);
|
|
res.json(updatedUser);
|
|
} catch (err) {
|
|
res.status(400);
|
|
res.json(err);
|
|
}
|
|
};
|
|
|
|
const destroy = async (req: Request, res: Response) => {
|
|
try {
|
|
const deleted = await store.delete(parseInt(req.params.id));
|
|
res.json(deleted);
|
|
} catch (err) {
|
|
res.status(400);
|
|
res.json(err);
|
|
}
|
|
};
|
|
|
|
const authenticate = async (req: Request, res: Response) => {
|
|
try {
|
|
const userInfo: User = {
|
|
username: req.body.username,
|
|
password: req.body.password,
|
|
};
|
|
|
|
if (userInfo.username === undefined || userInfo.password === undefined) {
|
|
res.status(400);
|
|
res.send("Missing credentials username or password");
|
|
}
|
|
|
|
const authUser: User | null = await store.authenticate(
|
|
userInfo.username,
|
|
userInfo.password
|
|
);
|
|
|
|
if (authUser === null) {
|
|
res.status(401);
|
|
res.send("Password is incorrect");
|
|
}
|
|
res.json(verifyUserToken(authUser));
|
|
} catch (err) {
|
|
res.status(401);
|
|
res.json(err);
|
|
}
|
|
};
|
|
|
|
export default userRoutes;
|