diff --git a/src/Controllers/FAQController.ts b/src/Controllers/FAQController.ts new file mode 100644 index 0000000000000000000000000000000000000000..4ed26253f4da0d96a5a3029b34e78d272a6d9d19 --- /dev/null +++ b/src/Controllers/FAQController.ts @@ -0,0 +1,65 @@ +import { Request, Response, Router } from 'express'; +import FAQ from '../Models/FAQ'; +import FAQService from '../Services/FAQService'; +import { FAQDTO } from '../DTOs/FAQDTO'; + +const router = Router(); + +const list = async (req: Request, res: Response): Promise<Response> => { + try { + const faqs: FAQ[] = await FAQService.list(); + return res.status(200).send(faqs); + } catch (error) { + console.log('error'); + return res.status(400).send('list error'); + } +}; + +const create = async (req: Request, res: Response): Promise<Response> => { + try { + const dto: FAQDTO = req.body; + const newFAQ: FAQ = await FAQService.create(dto); + return res.status(200).send(newFAQ); + } catch (error) { + console.log(error); + return res.status(400).send('create error'); + } +}; + +const update = async (req: Request, res: Response): Promise<Response> => { + try { + const dto: FAQDTO = req.body; + const faqId = Number(req.params.id); + const updatedFAQ: FAQ | null = await FAQService.update(faqId, dto); + if (updatedFAQ) { + return res.status(200).send(updatedFAQ); + } + return res.status(400).send('id error'); + } catch (error) { + console.log(error); + return res.status(400).send('update error'); + } +}; + +const deleteFAQ = async (req: Request, res: Response): Promise<Response> => { + try { + const faqId = Number(req.params.id); + const success: boolean = await FAQService.deleteFAQ(faqId); + if (success) { + return res.status(200).send(success); + } + return res.status(400).send(success); + } catch (error) { + return res.status(400).send('delete error'); + } +}; + +router + .get('/', list) + .post('/', create); + +router + .put('/:id', update) + .delete('/:id', deleteFAQ); + +export default router; diff --git a/src/DTOs/FAQDTO.ts b/src/DTOs/FAQDTO.ts new file mode 100644 index 0000000000000000000000000000000000000000..33cdffa9c234c994718d03b10e13db4adb83fb03 --- /dev/null +++ b/src/DTOs/FAQDTO.ts @@ -0,0 +1,4 @@ +export interface FAQDTO { + question: string; + answer: string; +} diff --git a/src/Loaders/ParameterDataBaseLoader.ts b/src/Loaders/ParameterDataBaseLoader.ts index f086c2118402a6c8e08bb2d188cb1567e814a901..ec1470a80eecbe55748e44ace9e4404aa9262e04 100644 --- a/src/Loaders/ParameterDataBaseLoader.ts +++ b/src/Loaders/ParameterDataBaseLoader.ts @@ -6,6 +6,7 @@ import EquationConstantDTO from '../DTOs/EquationConstantDTO'; import DefaultExtraData from '../Models/DefaultExtraData'; import DefaultWeight from '../Models/DefaultWeight'; import EquationConstant from '../Models/EquationConstant'; +import FAQ from '../Models/FAQ'; import CSVParser from './CSVParser'; function initParameterDataBase(): void { @@ -48,6 +49,7 @@ function initParameterDataBase(): void { console.log(err); }); }); + FAQ.sync(); } export default { initParameterDataBase }; diff --git a/src/Models/FAQ.ts b/src/Models/FAQ.ts new file mode 100644 index 0000000000000000000000000000000000000000..ee2e2f92e696fc34de2cabcd17752a7862ced28f --- /dev/null +++ b/src/Models/FAQ.ts @@ -0,0 +1,46 @@ +import { DataTypes, Model, NOW } from 'sequelize'; +import sequelize from '../Loaders/ParameterDataBase'; + +class FAQ extends Model {} + +FAQ.init({ + id: { + type: DataTypes.INTEGER, + allowNull: false, + autoIncrement: true, + primaryKey: true, + }, + question: { + type: DataTypes.STRING, + }, + answer: { + type: DataTypes.STRING, + }, + createdBy: { + type: DataTypes.INTEGER, + }, + updatedBy: { + type: DataTypes.INTEGER, + allowNull: true, + defaultValue: null, + }, + createdAt: { + type: DataTypes.DATE, + defaultValue: NOW, + }, + updatedAt: { + type: DataTypes.DATE, + allowNull: true, + defaultValue: null, + }, + deletedAt: { + type: DataTypes.DATE, + allowNull: true, + defaultValue: null, + }, +}, { + sequelize, + modelName: 'FAQ', +}); + +export default FAQ; diff --git a/src/Services/FAQService.ts b/src/Services/FAQService.ts new file mode 100644 index 0000000000000000000000000000000000000000..2b1ac31f68bbda3efe58b535e847341628c6e064 --- /dev/null +++ b/src/Services/FAQService.ts @@ -0,0 +1,50 @@ +import FAQ from '../Models/FAQ'; +import { FAQDTO } from '../DTOs/FAQDTO'; + +const list = (): Promise<FAQ[]> => FAQ.findAll({ + attributes: ['id', 'question', 'answer', 'createdAt'], + where: { + deletedAt: null, + }, +}); + +const create = (createDto: FAQDTO): Promise<FAQ> => FAQ.create(createDto); + +const update = async (id: number, createDto: FAQDTO): Promise<FAQ | null> => { + const faq: FAQ | null = await FAQ.findOne({ + where: { + id, + deletedAt: null, + }, + }); + if (!faq) { + return null; + } + const { question, answer } = createDto; + return faq.update({ + question, answer, + }); +}; + +const deleteFAQ = async (id: number): Promise<boolean> => { + const faq: FAQ | null = await FAQ.findOne({ + where: { + id, + deletedAt: null, + }, + }); + if (!faq) { + return false; + } + await faq.update({ + deletedAt: new Date(), + }); + return true; +}; + +export default { + list, + create, + update, + deleteFAQ, +}; diff --git a/src/routes.ts b/src/routes.ts index c0ea909c381728d2b0e3a226166ec8e1f4102f4e..2afe94112bac83c4086221e30bc3c4c3b237b50a 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -2,6 +2,7 @@ import { Request, Response, Router } from 'express'; import SheetController from './Controllers/SheetController'; import CalculatorController from './Controllers/CalculatorController'; import ParameterController from './Controllers/ParameterController'; +import FAQController from './Controllers/FAQController'; const router = Router(); @@ -15,4 +16,6 @@ router.use('/repCalculator', CalculatorController); router.use('/parameters', ParameterController); +router.use('/faqs', FAQController); + export default router;