Integrated Manticore sync, assuming responsibility from traxxx core/legacy.

This commit is contained in:
2026-06-08 05:18:11 +02:00
parent a048970be6
commit 1bc7dd3a43
15 changed files with 776 additions and 7 deletions

View File

@@ -22,6 +22,8 @@ import slugify from '../utils/slugify.js';
import { curateRevision } from './revisions.js';
import { interpolateProfiles, platformsByHostname } from '../common/actors.mjs'; // eslint-disable-line import/namespace
import { resolvePlace } from '../common/geo.mjs'; // eslint-disable-line import/namespace
import { syncScenes, syncActors } from './sync.js';
import verifyAbility from '../utils/verify-ability.js';
const logger = initLogger();
const mj = new MerkleJson();
@@ -373,6 +375,10 @@ async function queryManticoreSql(filters, options, _reqUser) {
}
}
if (filters.isGlobal) {
builder.where('entity_id', 0);
}
// attribute filters
['country'].forEach((attribute) => {
if (filters[attribute]) {
@@ -540,9 +546,84 @@ export async function createActor(newActor, context, reqUser) {
const curatedActorEntry = curateActorEntry(newActor, context);
const [actorEntry] = await knex('actors').insert(curatedActorEntry).returning('*');
await syncActors([actorEntry.id]);
return curateActor(actorEntry);
}
export async function mergeActors(targetActorId, sourceActorId, reqUser) {
if (!verifyAbility(reqUser, 'actor', 'merge')) {
throw new HttpError('You are not permitted to merge actors', 403);
}
const [targetActor, sourceActor] = await Promise.all([
knex('actors')
.where('id', targetActorId)
.first(),
knex('actors')
.where('id', sourceActorId)
.first(),
]);
if (!targetActor) {
throw new HttpError('Target actor not found', 404);
}
if (!sourceActor) {
throw new HttpError('Source actor not found', 404);
}
if (targetActor.entity_id) {
throw new HttpError('Target actor is not global', 400);
}
if (targetActor.alias_for) {
throw new HttpError('Target actor is aliased', 400);
}
const trx = await knex.transaction();
await trx('actors')
.update('alias_for', targetActorId)
.where('id', sourceActorId);
const mergedProfiles = await trx('actors_profiles')
.update('actor_id', targetActorId)
.where('actor_id', sourceActorId)
.returning('id');
const mergedScenes = await trx('releases_actors')
.update({
actor_id: targetActorId,
alias_id: sourceActorId,
})
.where('actor_id', sourceActorId)
.returning('release_id');
try {
await trx.commit();
} catch (error) {
await trx.rollback();
throw error;
}
await interpolateProfiles([targetActorId, sourceActorId], {
knex,
logger,
moment,
slugify,
omit,
}, { refreshView: false });
await syncScenes(mergedScenes.map((scene) => scene.release_id));
return {
scenes: mergedScenes.length,
profiles: mergedProfiles.length,
};
}
export async function fetchActorRevisions(revisionId, filters = {}, reqUser) {
const limit = filters.limit || 50;
const page = filters.page || 1;
@@ -747,6 +828,8 @@ async function applyActorRevision(revisionIds, reqUser) {
slugify,
omit,
}, { refreshView: false });
await syncActors(actorIds);
}
export async function reviewActorRevision(revisionId, isApproved, { feedback }, reqUser) {