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

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;