feat: implement bulk step update

This commit is contained in:
Takeshi Kimata
2024-06-22 16:54:08 +09:00
parent a4f81c282a
commit f86b2a38cb
8 changed files with 167 additions and 197 deletions

View File

@@ -1,60 +0,0 @@
const express = require('express');
const router = express.Router();
const defineStep = require('../../models/steps');
const defineCaseStep = require('../../models/caseSteps');
const { DataTypes, Op } = require('sequelize');
module.exports = function (sequelize) {
const Step = defineStep(sequelize, DataTypes);
const CaseStep = defineCaseStep(sequelize, DataTypes);
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectDeveloperFromCaseId } = require('../../middleware/verifyEditable')(sequelize);
router.delete('/:stepId', verifySignedIn, verifyProjectDeveloperFromCaseId, async (req, res) => {
const stepId = req.params.stepId;
const caseId = req.query.caseId;
const t = await sequelize.transaction();
try {
const step = await Step.findByPk(stepId);
if (!step) {
await t.rollback();
return res.status(404).send('Step not found');
}
// Get caseStep to be deleted.
const deletingCaseStep = await CaseStep.findOne({
where: {
StepId: stepId,
},
transaction: t,
});
// Decrease stepNo for all caseSteps with greater than the caseStep to be deleted.
await CaseStep.update(
{ stepNo: sequelize.literal('stepNo - 1') },
{
where: {
CaseId: caseId,
stepNo: {
[Op.gt]: deletingCaseStep.stepNo,
},
},
transaction: t,
}
);
await step.destroy({ transaction: t });
await t.commit();
res.status(204).send();
} catch (error) {
console.error(error);
await t.rollback();
res.status(500).send('Internal Server Error');
}
});
return router;
};

View File

@@ -0,0 +1,90 @@
const express = require('express');
const router = express.Router();
const defineStep = require('../../models/steps');
const defineCaseStep = require('../../models/caseSteps');
const { DataTypes } = require('sequelize');
module.exports = function (sequelize) {
const Step = defineStep(sequelize, DataTypes);
const CaseStep = defineCaseStep(sequelize, DataTypes);
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectDeveloperFromCaseId } = require('../../middleware/verifyEditable')(sequelize);
router.post('/update', verifySignedIn, verifyProjectDeveloperFromCaseId, async (req, res) => {
const caseId = req.query.caseId;
const steps = req.body;
const t = await sequelize.transaction();
const createStep = async (step) => {
const newStep = await Step.create(
{
step: step.step,
result: step.result,
},
{ transaction: t }
);
await CaseStep.create(
{
caseId: caseId,
stepId: newStep.id,
stepNo: step.caseSteps.stepNo,
},
{ transaction: t }
);
return newStep;
};
const deleteStep = async (step) => {
await CaseStep.destroy({
where: { stepId: step.id },
transaction: t,
});
await Step.destroy({
where: { id: step.id },
transaction: t,
});
return null;
};
const updateStep = async (step) => {
await Step.update(step, {
where: { id: step.id },
transaction: t,
});
await CaseStep.update(
{
stepNo: step.caseSteps.stepNo,
},
{
where: { stepId: step.id },
transaction: t,
}
);
return step;
};
try {
const results = await Promise.all(
steps.map(async (step) => {
if (step.editState === 'new') {
return createStep(step);
} else if (step.editState === 'deleted') {
return deleteStep(step);
} else if (step.editState === 'changed') {
return updateStep(step);
} else if (step.editState === 'notChanged') {
return step;
}
})
);
await t.commit();
res.json(results.filter((result) => result !== null));
} catch (error) {
console.error(error);
await t.rollback();
res.status(500).send('Internal Server Error');
}
});
return router;
};

View File

@@ -1,65 +0,0 @@
const express = require('express');
const router = express.Router();
const defineStep = require('../../models/steps');
const defineCaseStep = require('../../models/caseSteps');
const { DataTypes, Op } = require('sequelize');
module.exports = function (sequelize) {
const Step = defineStep(sequelize, DataTypes);
const CaseStep = defineCaseStep(sequelize, DataTypes);
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectDeveloperFromCaseId } = require('../../middleware/verifyEditable')(sequelize);
router.post('/', verifySignedIn, verifyProjectDeveloperFromCaseId, async (req, res) => {
const newStepNo = req.query.newStepNo;
const caseId = req.query.caseId;
const t = await sequelize.transaction();
try {
// Update existing stepNo for steps with stepNo greater than or equal to newStepNo
const maxStepNo = await CaseStep.max('stepNo', {
where: { caseId: caseId },
transaction: t,
});
if (maxStepNo >= newStepNo) {
await CaseStep.update(
{ stepNo: sequelize.literal('stepNo + 1') },
{
where: {
caseId: caseId,
stepNo: { [Op.gte]: newStepNo },
},
transaction: t,
}
);
}
const newStep = await Step.create(
{
step: '',
result: '',
},
{ transaction: t }
);
await CaseStep.create(
{
caseId: caseId,
stepId: newStep.id,
stepNo: newStepNo,
},
{ transaction: t }
);
await t.commit();
res.json(newStep);
} catch (error) {
console.error(error);
await t.rollback();
res.status(500).send('Internal Server Error');
}
});
return router;
};