Skip to content
Snippets Groups Projects
Commit be9076d7 authored by Ramiro's avatar Ramiro
Browse files

FAQs service, model

parent dcf35b8a
No related branches found
No related tags found
No related merge requests found
......@@ -18,7 +18,6 @@ FAQ.init({
},
position: {
type: DataTypes.INTEGER,
unique: true,
},
createdBy: {
type: DataTypes.INTEGER,
......
......@@ -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;
};
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment