Finished snippet controller

This commit is contained in:
unknown
2021-09-21 11:35:27 +02:00
parent 7cfe484a1d
commit e9b024f4df
8 changed files with 159 additions and 3 deletions

View File

@@ -1,7 +1,13 @@
import { Request, Response, NextFunction } from 'express';
import { asyncWrapper } from '../middleware';
import { SnippetModel } from '../models';
import { ErrorResponse } from '../utils';
/**
* @description Create new snippet
* @route /api/snippets
* @request POST
*/
export const createSnippet = asyncWrapper(
async (req: Request, res: Response, next: NextFunction): Promise<void> => {
const snippet = await SnippetModel.create(req.body);
@@ -11,3 +17,100 @@ export const createSnippet = asyncWrapper(
});
}
);
/**
* @description Get all snippets
* @route /api/snippets
* @request GET
*/
export const getAllSnippets = asyncWrapper(
async (req: Request, res: Response, next: NextFunction): Promise<void> => {
const snippets = await SnippetModel.findAll();
res.status(200).json({
data: snippets
});
}
);
/**
* @description Get single sinppet by id
* @route /api/snippets/:id
* @request GET
*/
export const getSnippet = asyncWrapper(
async (req: Request, res: Response, next: NextFunction): Promise<void> => {
const snippet = await SnippetModel.findOne({
where: { id: req.params.id }
});
if (!snippet) {
return next(
new ErrorResponse(
404,
`Snippet with id of ${req.params.id} was not found`
)
);
}
res.status(200).json({
data: snippet
});
}
);
/**
* @description Update snippet
* @route /api/snippets/:id
* @request PUT
*/
export const updateSnippet = asyncWrapper(
async (req: Request, res: Response, next: NextFunction): Promise<void> => {
let snippet = await SnippetModel.findOne({
where: { id: req.params.id }
});
if (!snippet) {
return next(
new ErrorResponse(
404,
`Snippet with id of ${req.params.id} was not found`
)
);
}
snippet = await snippet.update(req.body);
res.status(200).json({
data: snippet
});
}
);
/**
* @description Delete snippet
* @route /api/snippets/:id
* @request DELETE
*/
export const deleteSnippet = asyncWrapper(
async (req: Request, res: Response, next: NextFunction): Promise<void> => {
const snippet = await SnippetModel.findOne({
where: { id: req.params.id }
});
if (!snippet) {
return next(
new ErrorResponse(
404,
`Snippet with id of ${req.params.id} was not found`
)
);
}
await snippet.destroy();
res.status(200).json({
data: {}
});
}
);

View File

@@ -0,0 +1,17 @@
import { Request, Response, NextFunction } from 'express';
import { ErrorResponse, Logger } from '../utils';
const logger = new Logger('errorHandler');
export const errorHandler = (
err: ErrorResponse,
req: Request,
res: Response,
next: NextFunction
) => {
logger.log(err.message, 'ERROR');
res.status(err.statusCode || 500).json({
error: err.message || 'Internal Server Error'
});
};

View File

@@ -1,2 +1,3 @@
export * from './asyncWrapper';
export * from './requireBody';
export * from './errorHandler';

View File

@@ -1,4 +1,5 @@
import { Request, Response, NextFunction } from 'express';
import { ErrorResponse } from '../utils';
export const requireBody =
(...fields: string[]) =>
@@ -12,5 +13,11 @@ export const requireBody =
}
});
if (missingKeys.length > 0) {
return next(
new ErrorResponse(400, `These fields are required: ${missingKeys}`)
);
}
next();
};

View File

@@ -1,7 +1,22 @@
import { Router } from 'express';
import { createSnippet } from '../controllers/snippets';
import {
createSnippet,
deleteSnippet,
getAllSnippets,
getSnippet,
updateSnippet
} from '../controllers/snippets';
import { requireBody } from '../middleware';
export const snippetRouter = Router();
snippetRouter.route('/').post(requireBody('title', 'language'), createSnippet);
snippetRouter
.route('/')
.post(requireBody('title', 'language'), createSnippet)
.get(getAllSnippets);
snippetRouter
.route('/:id')
.get(getSnippet)
.put(updateSnippet)
.delete(deleteSnippet);

View File

@@ -2,6 +2,7 @@ import dotenv from 'dotenv';
import express from 'express';
import { Logger } from './utils';
import { connectDB } from './db';
import { errorHandler } from './middleware';
// Routers
import { snippetRouter } from './routes/snippets';
@@ -11,7 +12,7 @@ dotenv.config({ path: './src/config/.env' });
const app = express();
const logger = new Logger('server');
const PORT = process.env.PORT;
const PORT = process.env.PORT || 5000;
// App config
app.use(express.json());
@@ -19,6 +20,9 @@ app.use(express.json());
// Routes
app.use('/api/snippets', snippetRouter);
// Error handler
app.use(errorHandler);
(async () => {
await connectDB();

View File

@@ -0,0 +1,8 @@
export class ErrorResponse extends Error {
public statusCode: number;
constructor(statusCode: number, msg: string) {
super(msg);
this.statusCode = statusCode;
}
}

View File

@@ -1 +1,2 @@
export * from './Logger';
export * from './ErrorResponse';