Added delete option to scene edits.
This commit is contained in:
@@ -817,7 +817,18 @@ async function applySceneMoviesDelta(sceneId, delta, trx) {
|
||||
}
|
||||
}
|
||||
|
||||
async function applySceneRevision(revisionIds) {
|
||||
async function applySceneDeleteDelta(sceneId, _delta, trx, reqUser) {
|
||||
if (!reqUser.abilities.some((ability) => ability.subject === 'scene' && ability.action === 'delete')) {
|
||||
throw new HttpError('You are not privileged to delete scenes', 400);
|
||||
}
|
||||
|
||||
await knexOwner('releases')
|
||||
.where('id', sceneId)
|
||||
.delete()
|
||||
.transacting(trx);
|
||||
}
|
||||
|
||||
async function applySceneRevision(revisionIds, reqUser) {
|
||||
const revisions = await knexOwner('scenes_revisions')
|
||||
.whereIn('id', revisionIds)
|
||||
.whereNull('applied_at'); // should not re-apply revision that was already applied
|
||||
@@ -827,6 +838,10 @@ async function applySceneRevision(revisionIds) {
|
||||
|
||||
await knexOwner.transaction(async (trx) => {
|
||||
await Promise.all(revision.deltas.map(async (delta) => {
|
||||
if (delta.key === 'delete') {
|
||||
return applySceneDeleteDelta(revision.scene_id, delta, trx, reqUser);
|
||||
}
|
||||
|
||||
if ([
|
||||
'title',
|
||||
'description',
|
||||
@@ -858,11 +873,13 @@ async function applySceneRevision(revisionIds) {
|
||||
|
||||
await knexOwner('scenes_revisions')
|
||||
.where('id', revision.id)
|
||||
.update('applied_at', knex.fn.now());
|
||||
.update('applied_at', knexOwner.fn.now())
|
||||
.transacting(trx);
|
||||
|
||||
// await trx.commit();
|
||||
}).catch(async (error) => {
|
||||
logger.error(`Failed to apply revision ${revision.id} on scene ${revision.scene_id}: ${error.message}`);
|
||||
throw error;
|
||||
});
|
||||
}, Promise.resolve());
|
||||
}
|
||||
@@ -892,7 +909,19 @@ export async function reviewSceneRevision(revisionId, isApproved, { feedback },
|
||||
}
|
||||
|
||||
if (isApproved) {
|
||||
await applySceneRevision([revisionId]);
|
||||
try {
|
||||
await applySceneRevision([revisionId], reqUser);
|
||||
} catch (error) {
|
||||
await knexOwner('scenes_revisions')
|
||||
.where('id', revisionId)
|
||||
.update({
|
||||
approved: null,
|
||||
reviewed_at: null,
|
||||
reviewed_by: null,
|
||||
});
|
||||
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -946,6 +975,10 @@ export async function createSceneRevision(sceneId, { edits, comment, apply }, re
|
||||
}).filter(Boolean));
|
||||
|
||||
const deltas = Object.entries(edits).map(([key, value]) => {
|
||||
if (key === 'delete') {
|
||||
return { key: 'delete' };
|
||||
}
|
||||
|
||||
if (baseScene[key] === value || typeof value === 'undefined') {
|
||||
return null;
|
||||
}
|
||||
@@ -984,6 +1017,6 @@ export async function createSceneRevision(sceneId, { edits, comment, apply }, re
|
||||
|
||||
if (['admin', 'editor'].includes(reqUser.role) && apply) {
|
||||
// don't keep the editor waiting for the revision to apply
|
||||
reviewSceneRevision(revisionEntry.id, true, {}, reqUser);
|
||||
reviewSceneRevision(revisionEntry.id, true, {}, reqUser).catch(() => {});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user