diff --git a/src/Models/FAQ.ts b/src/Models/FAQ.ts index 4dc96b7fccc4e15c5e186ea6057b7746ffcb0ddf..9ad092cb377b3281ba1d5ead053eb5b89f53058f 100644 --- a/src/Models/FAQ.ts +++ b/src/Models/FAQ.ts @@ -18,7 +18,6 @@ FAQ.init({ }, position: { type: DataTypes.INTEGER, - unique: true, }, createdBy: { type: DataTypes.INTEGER, diff --git a/src/Services/FAQService.ts b/src/Services/FAQService.ts index 8734d1ca31f91b438d16cf9f87ba945ca760c7fe..6b56f396b10426e85af474f801a152b512f9f762 100644 --- a/src/Services/FAQService.ts +++ b/src/Services/FAQService.ts @@ -10,34 +10,76 @@ const list = (): Promise<FAQ[]> => FAQ.findAll({ order: ['position'], }); -const create = (createDto: FAQDTO): Promise<FAQ> => FAQ.create(createDto); +const correctFAQs = async (faqs: FAQ[]): Promise<void> => new Promise((resolve, reject) => { + const { length } = faqs; + const sorted: FAQ[] = faqs.sort((faqA: FAQ, faqB: FAQ) => Number(faqA.get('position')) - Number(faqB.get('position'))); + const promises: Promise<FAQ>[] = []; + for (let index = 0; index < length; index += 1) { + const faq: FAQ = sorted[index]; + promises.push(faq.update({ + position: index + 1, + })); + } + return Promise.all(promises) + .then(() => resolve()) + .catch(() => reject()); +}); + +const create = async (createDto: FAQDTO): Promise<FAQ> => { + const faqs: FAQ[] = await FAQ.findAll({ + where: { + deletedAt: null, + }, + order: ['position'], + }); + const newFaq: FAQ = await FAQ.create(createDto); + if (faqs.length + 1 === Number(newFaq.get('position'))) { + newFaq.set('position', Number(newFaq.get('position')) + 0.5); + } else { + newFaq.set('position', Number(newFaq.get('position')) - 0.5); + } + + faqs.push(newFaq); + await correctFAQs(faqs); + + return newFaq; +}; const update = async (id: number, createDto: FAQDTO): Promise<FAQ | null> => { - const faq: FAQ | null = await FAQ.findOne({ + const toUpdate: FAQ | null = await FAQ.findOne({ where: { id, deletedAt: null, }, }); - if (!faq) { + if (!toUpdate) { return null; } const { question, answer, position } = createDto; - const positionFaq: FAQ | null = await FAQ.findOne({ + await toUpdate.update({ + question, answer, position, + }); + + const faqs: FAQ[] = await FAQ.findAll({ where: { id: { - [Op.ne]: id, + [Op.not]: Number(toUpdate.get('id')), }, - position, deletedAt: null, }, + order: ['position'], }); - if (positionFaq) { - return null; + + if (faqs.length + 1 === Number(toUpdate.get('position'))) { + toUpdate.set('position', Number(toUpdate.get('position')) + 0.5); + } else { + toUpdate.set('position', Number(toUpdate.get('position')) - 0.5); } - return faq.update({ - question, answer, position, - }); + + faqs.push(toUpdate); + await correctFAQs(faqs); + + return toUpdate; }; const deleteFAQ = async (id: number): Promise<boolean> => { @@ -53,6 +95,15 @@ const deleteFAQ = async (id: number): Promise<boolean> => { await faq.update({ deletedAt: new Date(), }); + + const faqs: FAQ[] = await FAQ.findAll({ + where: { + deletedAt: null, + }, + order: ['position'], + }); + await correctFAQs(faqs); + return true; };