forked from fr/deguapp
100 lines
3.3 KiB
TypeScript
100 lines
3.3 KiB
TypeScript
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'));
|
|
}
|
|
} |