Added delete option to scene edits.

This commit is contained in:
2026-03-17 01:43:49 +01:00
parent 134664095a
commit f7993a9108
6 changed files with 139 additions and 648051 deletions

View File

@@ -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(() => {});
}
}