mirror of
https://github.com/pawelmalak/snippet-box.git
synced 2025-12-21 13:23:05 +01:00
Finished snippet controller
This commit is contained in:
@@ -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: {}
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
17
src/middleware/errorHandler.ts
Normal file
17
src/middleware/errorHandler.ts
Normal 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'
|
||||
});
|
||||
};
|
||||
@@ -1,2 +1,3 @@
|
||||
export * from './asyncWrapper';
|
||||
export * from './requireBody';
|
||||
export * from './errorHandler';
|
||||
|
||||
@@ -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();
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
8
src/utils/ErrorResponse.ts
Normal file
8
src/utils/ErrorResponse.ts
Normal file
@@ -0,0 +1,8 @@
|
||||
export class ErrorResponse extends Error {
|
||||
public statusCode: number;
|
||||
|
||||
constructor(statusCode: number, msg: string) {
|
||||
super(msg);
|
||||
this.statusCode = statusCode;
|
||||
}
|
||||
}
|
||||
@@ -1 +1,2 @@
|
||||
export * from './Logger';
|
||||
export * from './ErrorResponse';
|
||||
|
||||
Reference in New Issue
Block a user