Resolving tag and entity slugs in alert API.
This commit is contained in:
parent
c37a2ce1a1
commit
99cd551fc0
|
@ -2,6 +2,7 @@ import escapeRegexp from 'escape-string-regexp';
|
||||||
|
|
||||||
import { knexOwner as knex } from './knex.js';
|
import { knexOwner as knex } from './knex.js';
|
||||||
import { fetchScenesById } from './scenes.js';
|
import { fetchScenesById } from './scenes.js';
|
||||||
|
import { getIdsBySlug } from './cache.js';
|
||||||
import promiseProps from '../utils/promise-props.js';
|
import promiseProps from '../utils/promise-props.js';
|
||||||
import { HttpError } from './errors.js';
|
import { HttpError } from './errors.js';
|
||||||
|
|
||||||
|
@ -159,12 +160,23 @@ export async function createAlert(alert, reqUser) {
|
||||||
})
|
})
|
||||||
.returning('id');
|
.returning('id');
|
||||||
|
|
||||||
|
const tagIds = (await getIdsBySlug(alert.tags, 'tags') || []).concat(alert.tagIds || []);
|
||||||
|
const entityIds = (await getIdsBySlug(alert.entities || [], 'entities')).concat(alert.entityIds || []);
|
||||||
|
|
||||||
|
if (tagIds.length < (alert.tags?.length || 0) + (alert.tagIds?.length || 0)) {
|
||||||
|
throw new HttpError('Failed to resolve all tags');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entityIds.length < (alert.entities?.length || 0) + (alert.entityIds?.length || 0)) {
|
||||||
|
throw new HttpError('Failed to resolve all entities');
|
||||||
|
}
|
||||||
|
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
alert.actors?.length > 0 && knex('alerts_actors').insert(alert.actors.map((actorId) => ({
|
alert.actors?.length > 0 && knex('alerts_actors').insert(alert.actors.map((actorId) => ({
|
||||||
alert_id: alertId,
|
alert_id: alertId,
|
||||||
actor_id: actorId,
|
actor_id: actorId,
|
||||||
}))),
|
}))),
|
||||||
alert.tags?.length > 0 && knex('alerts_tags').insert(alert.tags.map((tagId) => ({
|
tagIds?.length > 0 && knex('alerts_tags').insert(tagIds.map((tagId) => ({
|
||||||
alert_id: alertId,
|
alert_id: alertId,
|
||||||
tag_id: tagId,
|
tag_id: tagId,
|
||||||
}))),
|
}))),
|
||||||
|
@ -179,7 +191,7 @@ export async function createAlert(alert, reqUser) {
|
||||||
alert_id: alertId,
|
alert_id: alertId,
|
||||||
stash_id: stashId,
|
stash_id: stashId,
|
||||||
}))),
|
}))),
|
||||||
alert.entities?.length > 0 && knex('alerts_entities').insert(alert.entities.map((entityId) => ({
|
entityIds?.length > 0 && knex('alerts_entities').insert(entityIds.map((entityId) => ({
|
||||||
alert_id: alertId,
|
alert_id: alertId,
|
||||||
entity_id: entityId,
|
entity_id: entityId,
|
||||||
})).slice(0, alert.allEntities ? 1 : Infinity)), // one scene can never match multiple entities in AND mode
|
})).slice(0, alert.allEntities ? 1 : Infinity)), // one scene can never match multiple entities in AND mode
|
||||||
|
|
|
@ -10,11 +10,9 @@ export async function getIdsBySlug(slugs, domain, toMap) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* this, naturally, fails if the slug is 69 etc.
|
if (typeof slug === 'number') {
|
||||||
if (Number(slug)) {
|
return slug; // already an ID, tags like 69 should be a string at this stage
|
||||||
return Number(slug); // already an ID or missing
|
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
const id = await redis.hGet(`traxxx:${domain}:id_by_slug`, slug);
|
const id = await redis.hGet(`traxxx:${domain}:id_by_slug`, slug);
|
||||||
|
|
||||||
|
|
|
@ -29,8 +29,10 @@ export const alertsSchema = `
|
||||||
allTags: Boolean = true
|
allTags: Boolean = true
|
||||||
allMatches: Boolean = true
|
allMatches: Boolean = true
|
||||||
actors: [Int!]
|
actors: [Int!]
|
||||||
tags: [Int!]
|
tags: [String!]
|
||||||
entities: [Int!]
|
tagIds: [Int!]
|
||||||
|
entities: [String!]
|
||||||
|
entityIds: [Int!]
|
||||||
matches: [AlertMatchInput!]
|
matches: [AlertMatchInput!]
|
||||||
notify: Boolean = true
|
notify: Boolean = true
|
||||||
email: Boolean = false
|
email: Boolean = false
|
||||||
|
|
Loading…
Reference in New Issue