express-typeorm-rest-boilerplate
Version:
Boilerplate code to get started with building RESTful API Services
144 lines (136 loc) • 4.21 kB
text/typescript
import { Router } from 'express';
import { Container } from 'typedi';
import { celebrate, Joi } from 'celebrate';
import JobApplicationService from '../services/JobApplicationService';
import { Logger } from 'winston';
import { JobApplication } from '../entities/JobApplication';
import { attachUser, isAuth } from '../middlewares';
import { User } from '../entities/User';
import CompanyService from '../services/CompanyService';
import { ObjectID } from 'typeorm';
const route = Router();
route.get('/', isAuth, async (req, res, next) => {
const logger: Logger = Container.get('logger');
logger.debug('Calling GET to /jobApplication endpoint');
try {
const jobApplicationServiceInstance = Container.get(JobApplicationService);
const jobApplications = await jobApplicationServiceInstance.find();
return res.status(200).json(jobApplications);
} catch (e) {
return next(e);
}
});
route.get('/:id', isAuth, attachUser, async (req, res, next) => {
const logger: Logger = Container.get('logger');
logger.debug(
'Calling GET to /jobApplication/:id endpoint with id: %s',
req.params.id
);
try {
const jobApplicationServiceInstance = Container.get(JobApplicationService);
const jobApplication = await jobApplicationServiceInstance.findOne(
req.params.id
);
const jobUser = jobApplication.user as User;
if (!jobUser.id.equals(req.currentUser.id)) return res.sendStatus(403);
return res.status(200).json(jobApplication);
} catch (e) {
return next(e);
}
});
route.delete('/:id', isAuth, attachUser, async (req, res, next) => {
const logger: Logger = Container.get('logger');
logger.debug(
'Calling DELETE to /jobApplication/:id endpoint with id: %s',
req.params.id
);
try {
const jobApplicationServiceInstance = Container.get(JobApplicationService);
const jobUser = (await jobApplicationServiceInstance.findOne(req.params.id))
.user as User;
if (!jobUser.id.equals(req.currentUser.id)) return res.sendStatus(403);
await jobApplicationServiceInstance.delete(req.params.id);
return res.status(204).end();
} catch (e) {
return next(e);
}
});
route.post(
'/',
isAuth,
attachUser,
celebrate({
body: Joi.object({
role: Joi.string().required(),
description: Joi.string().required(),
company: Joi.string().required(),
status: Joi.string().required(),
appliedDate: Joi.string().required(),
}),
}),
async (req, res, next) => {
const logger: Logger = Container.get('logger');
logger.debug(
'Calling POST to /jobApplication/:id endpoint with body: %o',
req.body
);
try {
const jobApplicationServiceInstance = Container.get(
JobApplicationService
);
req.body.company = (
await Container.get(CompanyService).findOne(req.body.company)
).id;
req.body.user = req.currentUser.id;
const jobApplication = await jobApplicationServiceInstance.create(
new JobApplication(req.body)
);
return res.status(201).json(jobApplication);
} catch (e) {
return next(e);
}
}
);
route.put(
'/:id',
isAuth,
attachUser,
celebrate({
body: Joi.object({
role: Joi.string(),
description: Joi.string(),
status: Joi.string(),
appliedDate: Joi.string(),
}),
}),
async (req, res, next) => {
const logger: Logger = Container.get('logger');
logger.debug(
'Calling PUT to /jobApplication/:id endpoint with body: %o',
req.body
);
try {
const jobApplicationServiceInstance = Container.get(
JobApplicationService
);
const job = await jobApplicationServiceInstance
.getRepo()
.findOne(req.params.id);
if (!job) return res.sendStatus(500);
if (
req.currentUser.role !== 'admin' &&
!(job.user as ObjectID).equals(req.currentUser.id)
) {
return res.sendStatus(403);
}
const jobApplication = await jobApplicationServiceInstance.update(
req.params.id,
req.body
);
return res.status(200).json(jobApplication);
} catch (e) {
return next(e);
}
}
);
export default route;