import { Request, Response } from 'express'; import Beer from '../models/Beer'; import { isValidObjectId, Types } from 'mongoose'; import fs from 'fs'; import path from 'path'; import {Log} from 'nork' import Docs from '../services/docsService'; import { addExam, delExam, editExam, IBeer } from '../validators/beerValidator'; new Docs('beer', 'add', '/api/v1/beer/add', 'POST', 'beer add api', undefined, { ...addExam, photos: 'optional field | max 4 images | formData' }, 'status object | beer object'); export async function add_post(req: Request, res: Response) { try { if (req.files) { req.body.imgs = []; const files: any = req.files; files.forEach((el: any) => { req.body.imgs.push(el.filename); }); } const beer = new Beer(req.body); await beer.save(); res.status(201).json(Log.info(201, 'beer was created', beer)); } catch (err: any) { Log.error(500, 'error in add_post', err); res.status(500).json(Log.error(500, 'something went wrong')); } } new Docs('beer', 'get', '/api/v1/beer/get', 'GET', 'beer get api', undefined, undefined, 'status object | array of beer objects'); export async function get_get(req: Request, res: Response) { try { const beer = await Beer.find({}, '-__v'); res.status(200).json(Log.info(200, 'beers fetched', beer)); } catch (err: any) { Log.error(500, 'error in get_get', err); res.status(500).json(Log.error(500, 'something went wrong')); } } new Docs('beer', 'del', '/api/v1/beer/del', 'POST', 'beer del api', undefined, delExam, 'status object'); export async function del_post(req: Request, res: Response) { try { if (!isValidObjectId(req.body._id)) throw Log.error(400, 'this is not valid _id'); const beer = await Beer.deleteOne(new Types.ObjectId(req.body._id)); if (beer.deletedCount > 0) { res.status(200).json(Log.info(200, `beer ${req.body._id} deleted`)); return; } throw Log.error(400, `beer ${req.body._id} does not exist`); } catch (err: any) { if (err.code) { res.status(err.code).json(err); return; } Log.error(500, 'error in del_post', err); res.status(500).json(Log.error(500, 'something went wrong')); } } new Docs('beer', 'edit', '/api/v1/beer/edit', 'POST', 'beer edit api', undefined, { ...editExam, photos: 'optional field | max 4 images | formData' }, 'status object | beer data'); export async function edit_post(req: Request, res: Response) { try { if (!isValidObjectId(req.body._id)) throw Log.error(400, 'this is not valid _id'); if (req.files) { if (!req.body.imgs) { req.body.imgs = []; } if (typeof req.body.imgs == 'string') { req.body.imgs = [req.body.imgs]; } if (req.body.imgs.length + req.files.length > 4) { req.body.imgs.forEach((el: string[]) => { fs.rmSync(path.join(__dirname, '../../uploads/' + el)); }); throw Log.error(400, 'exceeds the 4 image limit'); } const files: any = req.files; files.forEach((el: any) => { req.body.imgs.push(el.filename); }); } const payload = { ...req.body }; const beer = await Beer.findOneAndUpdate(new Types.ObjectId(req.body._id), payload, { new: true }); res.json(Log.info(200, `beer ${req.body._id} edited`, beer)); } catch (err: any) { if (err.code && typeof err.code == 'number') { res.status(err.code).json(err); return; } Log.error(500, 'error in del_post', err); res.status(500).json(Log.error(500, 'something went wrong')); } }