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.

129 lines
3.1 KiB
TypeScript

import express, { Request, Response, NextFunction } from 'express'
import { User, UserStore } from '../models/user'
import jwt, {Secret} from 'jsonwebtoken'
const SECRET = process.env.TOKEN_SECRET as Secret
const userRoutes = (app: express.Application) => {
app.get('/users', index)
app.get('/users/:id', read)
app.post('/users/create', verifyAuthToken, create)
app.put('/users/:id', verifyAuthToken, update)
app.delete('/users/:id', verifyAuthToken, destroy)
app.post("/users/auth", authenticate)
}
const store = new UserStore()
const verifyAuthToken = (req: Request, res: Response, next: NextFunction) => {
if (!req.headers.authorization) {
res.status(401)
res.json("Access denied, invalid token")
return false
}
try {
//const authorizationHeader = req.headers.authorization
const token = req.headers.authorization.split(" ")[1]
const decoded = jwt.verify(token, SECRET)
next()
} catch (err) {
res.status(401)
res.json("Access denied, invalid token")
}
}
let verifyUserToken = (user: User | null) => {
return jwt.sign({ user }, SECRET)
}
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.fristName,
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 user = await store.update(req.body)
res.json({
firstName: req.body.fristName,
lastName: req.body.lastName,
username: req.body.username,
password: req.body.password
})
} catch (err) {
res.status(400)
res.json(err)
}
}
const destroy = async (req: Request, res: Response) => {
try {
const deleted = await store.delete(req.body.id)
res.json(deleted)
} catch (err) {
res.status(400)
res.json(err)
}
}
const authenticate = async (req: Request, res: Response) => {
const userInfo: User = {
username: req.body.username,
password: req.body.password
}
if (userInfo.username === undefined || userInfo.password === undefined) {
res.status(400)
}
try {
const auth: User | null = await store.authenticate(userInfo.username, userInfo.password)
res.json(verifyUserToken(auth))
} catch(err) {
res.status(401)
res.json(err)
}
}
export default userRoutes