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 { Request, Response, NextFunction } from 'express';
|
||||||
import { asyncWrapper } from '../middleware';
|
import { asyncWrapper } from '../middleware';
|
||||||
import { SnippetModel } from '../models';
|
import { SnippetModel } from '../models';
|
||||||
|
import { ErrorResponse } from '../utils';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description Create new snippet
|
||||||
|
* @route /api/snippets
|
||||||
|
* @request POST
|
||||||
|
*/
|
||||||
export const createSnippet = asyncWrapper(
|
export const createSnippet = asyncWrapper(
|
||||||
async (req: Request, res: Response, next: NextFunction): Promise<void> => {
|
async (req: Request, res: Response, next: NextFunction): Promise<void> => {
|
||||||
const snippet = await SnippetModel.create(req.body);
|
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 './asyncWrapper';
|
||||||
export * from './requireBody';
|
export * from './requireBody';
|
||||||
|
export * from './errorHandler';
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { Request, Response, NextFunction } from 'express';
|
import { Request, Response, NextFunction } from 'express';
|
||||||
|
import { ErrorResponse } from '../utils';
|
||||||
|
|
||||||
export const requireBody =
|
export const requireBody =
|
||||||
(...fields: string[]) =>
|
(...fields: string[]) =>
|
||||||
@@ -12,5 +13,11 @@ export const requireBody =
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (missingKeys.length > 0) {
|
||||||
|
return next(
|
||||||
|
new ErrorResponse(400, `These fields are required: ${missingKeys}`)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
next();
|
next();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,7 +1,22 @@
|
|||||||
import { Router } from 'express';
|
import { Router } from 'express';
|
||||||
import { createSnippet } from '../controllers/snippets';
|
import {
|
||||||
|
createSnippet,
|
||||||
|
deleteSnippet,
|
||||||
|
getAllSnippets,
|
||||||
|
getSnippet,
|
||||||
|
updateSnippet
|
||||||
|
} from '../controllers/snippets';
|
||||||
import { requireBody } from '../middleware';
|
import { requireBody } from '../middleware';
|
||||||
|
|
||||||
export const snippetRouter = Router();
|
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 express from 'express';
|
||||||
import { Logger } from './utils';
|
import { Logger } from './utils';
|
||||||
import { connectDB } from './db';
|
import { connectDB } from './db';
|
||||||
|
import { errorHandler } from './middleware';
|
||||||
|
|
||||||
// Routers
|
// Routers
|
||||||
import { snippetRouter } from './routes/snippets';
|
import { snippetRouter } from './routes/snippets';
|
||||||
@@ -11,7 +12,7 @@ dotenv.config({ path: './src/config/.env' });
|
|||||||
|
|
||||||
const app = express();
|
const app = express();
|
||||||
const logger = new Logger('server');
|
const logger = new Logger('server');
|
||||||
const PORT = process.env.PORT;
|
const PORT = process.env.PORT || 5000;
|
||||||
|
|
||||||
// App config
|
// App config
|
||||||
app.use(express.json());
|
app.use(express.json());
|
||||||
@@ -19,6 +20,9 @@ app.use(express.json());
|
|||||||
// Routes
|
// Routes
|
||||||
app.use('/api/snippets', snippetRouter);
|
app.use('/api/snippets', snippetRouter);
|
||||||
|
|
||||||
|
// Error handler
|
||||||
|
app.use(errorHandler);
|
||||||
|
|
||||||
(async () => {
|
(async () => {
|
||||||
await connectDB();
|
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 './Logger';
|
||||||
|
export * from './ErrorResponse';
|
||||||
|
|||||||
Reference in New Issue
Block a user