@dappermountain/payload-plugin-achievements 0.5.1 → 1.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +298 -239
- package/dist/admin/LucideIconField.d.ts +3 -2
- package/dist/admin/LucideIconField.d.ts.map +1 -1
- package/dist/admin/LucideIconField.js +2 -2
- package/dist/catalog.d.ts +3 -0
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +8 -0
- package/dist/collections/EventTypes/access/index.d.ts +1 -11
- package/dist/collections/EventTypes/access/index.d.ts.map +1 -1
- package/dist/collections/Grants/hooks/afterGrantMutation.d.ts.map +1 -1
- package/dist/collections/Grants/hooks/afterGrantMutation.js +15 -0
- package/dist/collections/Logs/hooks/afterLogMutation.d.ts +4 -0
- package/dist/collections/Logs/hooks/afterLogMutation.d.ts.map +1 -0
- package/dist/collections/Logs/hooks/afterLogMutation.js +47 -0
- package/dist/collections/Logs/hooks/index.d.ts.map +1 -1
- package/dist/collections/Logs/hooks/index.js +3 -0
- package/dist/collections/Logs/index.js +1 -1
- package/dist/collections/Metrics/access/index.d.ts +1 -11
- package/dist/collections/Metrics/access/index.d.ts.map +1 -1
- package/dist/collections/Reactions/access/index.d.ts +2 -0
- package/dist/collections/Reactions/access/index.d.ts.map +1 -0
- package/dist/collections/Reactions/access/index.js +2 -0
- package/dist/collections/Reactions/index.d.ts +3 -0
- package/dist/collections/Reactions/index.d.ts.map +1 -0
- package/dist/collections/Reactions/index.js +97 -0
- package/dist/collections/fields/ruleFields.d.ts.map +1 -1
- package/dist/collections/fields/ruleFields.js +19 -0
- package/dist/collections/fields/whenSibling.d.ts +7 -0
- package/dist/collections/fields/whenSibling.d.ts.map +1 -0
- package/dist/collections/fields/whenSibling.js +21 -0
- package/dist/collections/index.d.ts.map +1 -1
- package/dist/collections/index.js +15 -1
- package/dist/collections/slugs.d.ts.map +1 -1
- package/dist/collections/slugs.js +1 -0
- package/dist/defaults.d.ts +10 -1
- package/dist/defaults.d.ts.map +1 -1
- package/dist/defaults.js +34 -5
- package/dist/extensions/actions.d.ts +8 -0
- package/dist/extensions/actions.d.ts.map +1 -0
- package/dist/extensions/actions.js +26 -0
- package/dist/extensions/registry.d.ts +2 -0
- package/dist/extensions/registry.d.ts.map +1 -1
- package/dist/extensions/registry.js +19 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +9 -3
- package/dist/services/achievement/eventTypeRequiresActor.d.ts +1 -0
- package/dist/services/achievement/eventTypeRequiresActor.d.ts.map +1 -1
- package/dist/services/achievement/eventTypeRequiresActor.js +2 -0
- package/dist/services/achievement/grantSideEffects.d.ts +11 -0
- package/dist/services/achievement/grantSideEffects.d.ts.map +1 -1
- package/dist/services/achievement/grantSideEffects.js +32 -0
- package/dist/services/achievement/index.d.ts +3 -1
- package/dist/services/achievement/index.d.ts.map +1 -1
- package/dist/services/achievement/index.js +2 -1
- package/dist/services/achievement/runReactions.d.ts +20 -0
- package/dist/services/achievement/runReactions.d.ts.map +1 -0
- package/dist/services/achievement/runReactions.js +86 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types.d.ts +47 -7
- package/dist/types.d.ts.map +1 -1
- package/package.json +10 -9
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import { getAchievementOptions } from '../options-store.js';
|
|
2
2
|
import { builtInRuleTypes } from '../services/achievement/builtInRules.js';
|
|
3
|
+
const BUILTIN_RULE_SELECT_TYPES = new Set([
|
|
4
|
+
'tier-at-least',
|
|
5
|
+
'achievement-complete',
|
|
6
|
+
'metric-minimum',
|
|
7
|
+
'event-count',
|
|
8
|
+
'group',
|
|
9
|
+
]);
|
|
3
10
|
export function getRuleTypeMap() {
|
|
4
11
|
const map = new Map();
|
|
5
12
|
for (const rule of builtInRuleTypes) {
|
|
@@ -10,3 +17,15 @@ export function getRuleTypeMap() {
|
|
|
10
17
|
}
|
|
11
18
|
return map;
|
|
12
19
|
}
|
|
20
|
+
/** Host rule types that can appear in the Admin type select (skips built-in keys). */
|
|
21
|
+
export function getHostRuleTypeAdminEntries() {
|
|
22
|
+
const out = [];
|
|
23
|
+
const seen = new Set();
|
|
24
|
+
for (const rule of getAchievementOptions().extensions?.ruleTypes ?? []) {
|
|
25
|
+
if (!rule.type || BUILTIN_RULE_SELECT_TYPES.has(rule.type) || seen.has(rule.type))
|
|
26
|
+
continue;
|
|
27
|
+
seen.add(rule.type);
|
|
28
|
+
out.push(rule);
|
|
29
|
+
}
|
|
30
|
+
return out;
|
|
31
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
export { DEFAULT_ACHIEVEMENT_METRIC, DEFAULT_ACHIEVEMENT_METRIC_SLUG, ENGINE_EVENT_TYPES, ENGINE_METRICS, } from './catalog.js';
|
|
1
|
+
export { DEFAULT_ACHIEVEMENT_METRIC, DEFAULT_ACHIEVEMENT_METRIC_SLUG, ENGINE_EVENT_TYPES, ENGINE_METRICS, GRANT_AUDIT_EVENT_SLUGS, isGrantAuditEventSlug, } from './catalog.js';
|
|
2
2
|
export type { EngineEventTypeSlug, EngineMetricSlug } from './catalog.js';
|
|
3
3
|
export { achievementPlugin } from './plugin.js';
|
|
4
4
|
export { seedAchievementCatalog, seedAchievements } from './seed/index.js';
|
|
5
5
|
export type { AchievementSeedAchievement, AchievementSeedCatalogRow, AchievementSeedInput, AchievementSeedLocalizedText, AchievementSeedTier, } from './seed/index.js';
|
|
6
|
-
export { evaluateRules, evaluateRuleProgress, collectAchievementCompleteRefs, buildCatalogProgressGroups, buildUnlockRequirementLeaves, getUserProgress, loadUserProgressReviews, getMetricLeaderboard, grantAchievement, loadMetricDoc, recordEvent, recordLog, recordMetricChange, rebuildMetricBalance, rebuildMetricBalancesForUser, reconcileProgression, reconcileUserProgression, releasePendingAchievementReviews, releasePendingTierReviews, resolveCurrentTier, resolveElapsedAnchor, resolveMetricValue, resolveTierProgress, reviewAchievementRequest, submitAchievementRequest, syncTierChangedLog, syncTierProgression, syncCompositeProgression, catalogRef, transitionLogData, transitionToId, logSubject, readLogSubject, validateRuleGroup, validateRuleNode, } from './services/achievement/index.js';
|
|
6
|
+
export { evaluateRules, evaluateRuleProgress, collectAchievementCompleteRefs, buildCatalogProgressGroups, buildUnlockRequirementLeaves, getUserProgress, loadUserProgressReviews, getMetricLeaderboard, grantAchievement, loadMetricDoc, recordEvent, recordLog, recordMetricChange, rebuildMetricBalance, rebuildMetricBalancesForUser, reconcileProgression, reconcileUserProgression, releasePendingAchievementReviews, releasePendingTierReviews, resolveCurrentTier, resolveElapsedAnchor, resolveMetricValue, resolveTierProgress, reviewAchievementRequest, submitAchievementRequest, syncTierChangedLog, syncTierProgression, syncCompositeProgression, syncProgressionFromLog, runReactions, catalogRef, transitionLogData, transitionToId, logSubject, readLogSubject, validateRuleGroup, validateRuleNode, } from './services/achievement/index.js';
|
|
7
7
|
export type { ResolvedTier, RuleGroup, TierLadderProgress, CatalogProgressGroup, CatalogProgressItem, UnlockRequirementLeaf, UnlockRequirementRelation, GetUserProgressInclude, UserProgressMeResponse, UserProgressReviews, UserProgressTierRequest, CatalogRef, TransitionLogData, LogSubjectRef, MetricLeaderboardResult, MetricLeaderboardRow, ReconcileProgressionArgs, ReconcileProgressionResult, ReleaseReviewGateResult, } from './services/achievement/index.js';
|
|
8
|
-
export type { BuiltInEventType, BuiltInRuleType, AchievementCollectionKey, AchievementCollectionOverride, AchievementCollectionsOptions, AchievementEndpointsOptions, AchievementMetricAnchor, AchievementMetricAnchorConfig, AchievementMetricAnchorEntry, AchievementPluginOptions, AchievementRuleType, AchievementScopeConfig, AchievementSubjectsOptions, AchievementUsersOptions, } from './types.js';
|
|
8
|
+
export type { BuiltInEventType, BuiltInRuleType, AchievementCollectionKey, AchievementCollectionOverride, AchievementCollectionsOptions, AchievementEndpointsOptions, AchievementMetricAnchor, AchievementMetricAnchorConfig, AchievementMetricAnchorEntry, AchievementPluginOptions, AchievementRuleType, AchievementAction, AchievementActionRunArgs, AchievementReactionTrigger, AchievementScopeConfig, AchievementSubjectsOptions, AchievementUsersOptions, } from './types.js';
|
|
9
9
|
export { DEFAULT_COLLECTION_BASE_SLUGS, DEFAULT_COLLECTION_PREFIX, DEFAULT_ADMIN_GROUP } from './collections/slugs.js';
|
|
10
|
-
export { DEFAULT_ME_ENDPOINT_PATH, DEFAULT_LEADERBOARD_ENDPOINT_PATH, DEFAULT_RECONCILE_ENDPOINT_PATH, resolveSubjectCollections, } from './defaults.js';
|
|
10
|
+
export { DEFAULT_ME_ENDPOINT_PATH, DEFAULT_LEADERBOARD_ENDPOINT_PATH, DEFAULT_RECONCILE_ENDPOINT_PATH, resolveSubjectCollections, resolveSubjectCollectionsFromConfig, } from './defaults.js';
|
|
11
11
|
export { collectionOf, slugOf } from './collections/helpers.js';
|
|
12
12
|
export { eachRuleLeaf } from './collections/hooks/eachRuleLeaf.js';
|
|
13
13
|
export { isAchievementPluginEnabled } from './enabled.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,+BAA+B,EAC/B,kBAAkB,EAClB,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,+BAA+B,EAC/B,kBAAkB,EAClB,cAAc,EACd,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAC1E,YAAY,EACV,0BAA0B,EAC1B,yBAAyB,EACzB,oBAAoB,EACpB,4BAA4B,EAC5B,mBAAmB,GACpB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,8BAA8B,EAC9B,0BAA0B,EAC1B,4BAA4B,EAC5B,eAAe,EACf,uBAAuB,EACvB,oBAAoB,EACpB,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,SAAS,EACT,kBAAkB,EAClB,oBAAoB,EACpB,4BAA4B,EAC5B,oBAAoB,EACpB,wBAAwB,EACxB,gCAAgC,EAChC,yBAAyB,EACzB,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,wBAAwB,EACxB,wBAAwB,EACxB,kBAAkB,EAClB,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,EACtB,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,iCAAiC,CAAA;AACxC,YAAY,EACV,YAAY,EACZ,SAAS,EACT,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,uBAAuB,EACvB,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,uBAAuB,EACvB,oBAAoB,EACpB,wBAAwB,EACxB,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,iCAAiC,CAAA;AACxC,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,wBAAwB,EACxB,6BAA6B,EAC7B,6BAA6B,EAC7B,2BAA2B,EAC3B,uBAAuB,EACvB,6BAA6B,EAC7B,4BAA4B,EAC5B,wBAAwB,EACxB,mBAAmB,EACnB,iBAAiB,EACjB,wBAAwB,EACxB,0BAA0B,EAC1B,sBAAsB,EACtB,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,6BAA6B,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AACtH,OAAO,EACL,wBAAwB,EACxB,iCAAiC,EACjC,+BAA+B,EAC/B,yBAAyB,EACzB,mCAAmC,GACpC,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAA;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAA;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export { DEFAULT_ACHIEVEMENT_METRIC, DEFAULT_ACHIEVEMENT_METRIC_SLUG, ENGINE_EVENT_TYPES, ENGINE_METRICS, } from './catalog.js';
|
|
1
|
+
export { DEFAULT_ACHIEVEMENT_METRIC, DEFAULT_ACHIEVEMENT_METRIC_SLUG, ENGINE_EVENT_TYPES, ENGINE_METRICS, GRANT_AUDIT_EVENT_SLUGS, isGrantAuditEventSlug, } from './catalog.js';
|
|
2
2
|
export { achievementPlugin } from './plugin.js';
|
|
3
3
|
export { seedAchievementCatalog, seedAchievements } from './seed/index.js';
|
|
4
|
-
export { evaluateRules, evaluateRuleProgress, collectAchievementCompleteRefs, buildCatalogProgressGroups, buildUnlockRequirementLeaves, getUserProgress, loadUserProgressReviews, getMetricLeaderboard, grantAchievement, loadMetricDoc, recordEvent, recordLog, recordMetricChange, rebuildMetricBalance, rebuildMetricBalancesForUser, reconcileProgression, reconcileUserProgression, releasePendingAchievementReviews, releasePendingTierReviews, resolveCurrentTier, resolveElapsedAnchor, resolveMetricValue, resolveTierProgress, reviewAchievementRequest, submitAchievementRequest, syncTierChangedLog, syncTierProgression, syncCompositeProgression, catalogRef, transitionLogData, transitionToId, logSubject, readLogSubject, validateRuleGroup, validateRuleNode, } from './services/achievement/index.js';
|
|
4
|
+
export { evaluateRules, evaluateRuleProgress, collectAchievementCompleteRefs, buildCatalogProgressGroups, buildUnlockRequirementLeaves, getUserProgress, loadUserProgressReviews, getMetricLeaderboard, grantAchievement, loadMetricDoc, recordEvent, recordLog, recordMetricChange, rebuildMetricBalance, rebuildMetricBalancesForUser, reconcileProgression, reconcileUserProgression, releasePendingAchievementReviews, releasePendingTierReviews, resolveCurrentTier, resolveElapsedAnchor, resolveMetricValue, resolveTierProgress, reviewAchievementRequest, submitAchievementRequest, syncTierChangedLog, syncTierProgression, syncCompositeProgression, syncProgressionFromLog, runReactions, catalogRef, transitionLogData, transitionToId, logSubject, readLogSubject, validateRuleGroup, validateRuleNode, } from './services/achievement/index.js';
|
|
5
5
|
export { DEFAULT_COLLECTION_BASE_SLUGS, DEFAULT_COLLECTION_PREFIX, DEFAULT_ADMIN_GROUP } from './collections/slugs.js';
|
|
6
|
-
export { DEFAULT_ME_ENDPOINT_PATH, DEFAULT_LEADERBOARD_ENDPOINT_PATH, DEFAULT_RECONCILE_ENDPOINT_PATH, resolveSubjectCollections, } from './defaults.js';
|
|
6
|
+
export { DEFAULT_ME_ENDPOINT_PATH, DEFAULT_LEADERBOARD_ENDPOINT_PATH, DEFAULT_RECONCILE_ENDPOINT_PATH, resolveSubjectCollections, resolveSubjectCollectionsFromConfig, } from './defaults.js';
|
|
7
7
|
export { collectionOf, slugOf } from './collections/helpers.js';
|
|
8
8
|
export { eachRuleLeaf } from './collections/hooks/eachRuleLeaf.js';
|
|
9
9
|
export { isAchievementPluginEnabled } from './enabled.js';
|
package/dist/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,SAAS,CAAA;AAO7C,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAE1D;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC3B,UAAS,wBAA6B,KAAG,MA0CzC,CAAA"}
|
package/dist/plugin.js
CHANGED
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
import { buildAchievementCollections } from './collections/index.js';
|
|
2
2
|
import { usersAchievementsGroup } from './collections/fields/usersAchievementsGroup.js';
|
|
3
3
|
import { buildAchievementEndpoints } from './endpoints/index.js';
|
|
4
|
+
import { resolveSubjectCollectionsFromConfig } from './defaults.js';
|
|
4
5
|
import { getAchievementOptions, setAchievementOptions } from './options-store.js';
|
|
5
6
|
/**
|
|
6
7
|
* Payload achievements plugin — merges collections (hooks own request/grant flow)
|
|
7
8
|
* and an optional current-user grants endpoint.
|
|
8
9
|
*/
|
|
9
10
|
export const achievementPlugin = (options = {}) => (config) => {
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
setAchievementOptions(
|
|
11
|
+
// Resolve `'all'` against the host Config before storing — polymorphic
|
|
12
|
+
// `relationTo` is schema-time. Explicit slug lists pass through unchanged.
|
|
13
|
+
setAchievementOptions({
|
|
14
|
+
...options,
|
|
15
|
+
subjects: options.subjects
|
|
16
|
+
? { collections: resolveSubjectCollectionsFromConfig(options, config) }
|
|
17
|
+
: options.subjects,
|
|
18
|
+
});
|
|
13
19
|
const resolved = getAchievementOptions();
|
|
14
20
|
if (!resolved.enabled)
|
|
15
21
|
return config;
|
|
@@ -7,6 +7,7 @@ export type EventTypeFlags = {
|
|
|
7
7
|
snapshotActorTiers: boolean;
|
|
8
8
|
/** Allowed host collections for `subject.relationTo` (empty = any plugin allowlist entry). */
|
|
9
9
|
subjectRelationTo: string[];
|
|
10
|
+
slug: string | null;
|
|
10
11
|
};
|
|
11
12
|
/** Read flags from a loaded event-type document (or populated relationship). */
|
|
12
13
|
export declare function readEventTypeFlags(doc: unknown): EventTypeFlags | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eventTypeRequiresActor.d.ts","sourceRoot":"","sources":["../../../src/services/achievement/eventTypeRequiresActor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAMtD,MAAM,MAAM,cAAc,GAAG;IAC3B,aAAa,EAAE,OAAO,CAAA;IACtB,cAAc,EAAE,OAAO,CAAA;IACvB,eAAe,EAAE,OAAO,CAAA;IACxB,uEAAuE;IACvE,kBAAkB,EAAE,OAAO,CAAA;IAC3B,8FAA8F;IAC9F,iBAAiB,EAAE,MAAM,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"eventTypeRequiresActor.d.ts","sourceRoot":"","sources":["../../../src/services/achievement/eventTypeRequiresActor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAMtD,MAAM,MAAM,cAAc,GAAG;IAC3B,aAAa,EAAE,OAAO,CAAA;IACtB,cAAc,EAAE,OAAO,CAAA;IACvB,eAAe,EAAE,OAAO,CAAA;IACxB,uEAAuE;IACvE,kBAAkB,EAAE,OAAO,CAAA;IAC3B,8FAA8F;IAC9F,iBAAiB,EAAE,MAAM,EAAE,CAAA;IAC3B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CACpB,CAAA;AAoBD,gFAAgF;AAChF,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CA0BtE;AAMD,wDAAwD;AACxD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,CAAC,EAAE,cAAc,CAAA;IACpB,WAAW,EAAE,OAAO,CAAA;CACrB,GAAG,OAAO,CAAC,cAAc,CAAC,CA2C1B;AAED,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,CAAC,EAAE,cAAc,CAAA;IACpB,WAAW,EAAE,OAAO,CAAA;CACrB,GAAG,OAAO,CAAC,OAAO,CAAC,CAEnB;AAED,wBAAsB,uBAAuB,CAAC,IAAI,EAAE;IAClD,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,CAAC,EAAE,cAAc,CAAA;IACpB,WAAW,EAAE,OAAO,CAAA;CACrB,GAAG,OAAO,CAAC,OAAO,CAAC,CAEnB;AAED,wBAAsB,wBAAwB,CAAC,IAAI,EAAE;IACnD,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,CAAC,EAAE,cAAc,CAAA;IACpB,WAAW,EAAE,OAAO,CAAA;CACrB,GAAG,OAAO,CAAC,OAAO,CAAC,CAEnB;AAED;;;GAGG;AACH,wBAAsB,0BAA0B,CAAC,IAAI,EAAE;IACrD,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,CAAC,EAAE,cAAc,CAAA;IACpB,WAAW,EAAE,OAAO,CAAA;CACrB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAOpB"}
|
|
@@ -7,6 +7,7 @@ const emptyFlags = {
|
|
|
7
7
|
requiresSubject: false,
|
|
8
8
|
snapshotActorTiers: false,
|
|
9
9
|
subjectRelationTo: [],
|
|
10
|
+
slug: null,
|
|
10
11
|
};
|
|
11
12
|
function readSubjectRelationTo(value) {
|
|
12
13
|
if (!Array.isArray(value))
|
|
@@ -37,6 +38,7 @@ export function readEventTypeFlags(doc) {
|
|
|
37
38
|
requiresSubject: Boolean(row.requiresSubject),
|
|
38
39
|
snapshotActorTiers: Boolean(row.snapshotActorTiers),
|
|
39
40
|
subjectRelationTo: readSubjectRelationTo(row.subjectRelationTo),
|
|
41
|
+
slug: typeof row.slug === 'string' && row.slug ? row.slug : null,
|
|
40
42
|
};
|
|
41
43
|
}
|
|
42
44
|
function flagsFromDoc(doc) {
|
|
@@ -51,4 +51,15 @@ export declare function runAfterGrantDeleted(args: {
|
|
|
51
51
|
achievementSlug?: string;
|
|
52
52
|
cascading?: boolean;
|
|
53
53
|
}): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Re-evaluate composed achievements and derived tiers after a log write/delete.
|
|
56
|
+
* Skips grant/revoke audit types — Grants hooks already run this chain.
|
|
57
|
+
*/
|
|
58
|
+
export declare function syncProgressionFromLog(args: {
|
|
59
|
+
req: PayloadRequest;
|
|
60
|
+
userId: string;
|
|
61
|
+
scopeId: string | null;
|
|
62
|
+
eventTypeSlug: string | null;
|
|
63
|
+
operation: 'create' | 'delete';
|
|
64
|
+
}): Promise<void>;
|
|
54
65
|
//# sourceMappingURL=grantSideEffects.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grantSideEffects.d.ts","sourceRoot":"","sources":["../../../src/services/achievement/grantSideEffects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAS,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"grantSideEffects.d.ts","sourceRoot":"","sources":["../../../src/services/achievement/grantSideEffects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAS,MAAM,SAAS,CAAA;AAYpD,OAAO,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AASzG,wEAAwE;AACxE,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,GAAG,EAAE,cAAc,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA+BnC;AAED,6EAA6E;AAC7E,wBAAsB,wBAAwB,CAAC,IAAI,EAAE;IACnD,GAAG,EAAE,cAAc,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAuC9D;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,IAAI,EAAE;IACnD,GAAG,EAAE,cAAc,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAsElD;AAED,oFAAoF;AACpF,wBAAsB,0BAA0B,CAAC,IAAI,EAAE;IACrD,GAAG,EAAE,cAAc,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiDlB;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,GAAG,EAAE,cAAc,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BhB;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,GAAG,EAAE,cAAc,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuChB;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,GAAG,EAAE,cAAc,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAA;CAC/B,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BhB"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isGrantAuditEventSlug } from '../../catalog.js';
|
|
1
2
|
import { collectionOf } from '../../collections/helpers.js';
|
|
2
3
|
import { CTX_CASCADING_REVOKE, CTX_SYSTEM_REQUEST } from './contextFlags.js';
|
|
3
4
|
import { evaluateRules, ruleGroupHasProgressRequirements } from './evaluateRules.js';
|
|
@@ -268,3 +269,34 @@ export async function runAfterGrantDeleted(args) {
|
|
|
268
269
|
scopeId: args.scopeId,
|
|
269
270
|
});
|
|
270
271
|
}
|
|
272
|
+
/**
|
|
273
|
+
* Re-evaluate composed achievements and derived tiers after a log write/delete.
|
|
274
|
+
* Skips grant/revoke audit types — Grants hooks already run this chain.
|
|
275
|
+
*/
|
|
276
|
+
export async function syncProgressionFromLog(args) {
|
|
277
|
+
if (!args.userId || isGrantAuditEventSlug(args.eventTypeSlug))
|
|
278
|
+
return;
|
|
279
|
+
if (args.operation === 'delete') {
|
|
280
|
+
await revokeIncompleteComposites({
|
|
281
|
+
req: args.req,
|
|
282
|
+
userId: args.userId,
|
|
283
|
+
scopeId: args.scopeId,
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
await syncCompositeProgression({
|
|
287
|
+
req: args.req,
|
|
288
|
+
userId: args.userId,
|
|
289
|
+
scopeId: args.scopeId,
|
|
290
|
+
});
|
|
291
|
+
await syncTierProgression({
|
|
292
|
+
req: args.req,
|
|
293
|
+
userId: args.userId,
|
|
294
|
+
scopeId: args.scopeId,
|
|
295
|
+
});
|
|
296
|
+
await syncTierChangedLog({
|
|
297
|
+
payload: args.req.payload,
|
|
298
|
+
req: args.req,
|
|
299
|
+
userId: args.userId,
|
|
300
|
+
scopeId: args.scopeId,
|
|
301
|
+
});
|
|
302
|
+
}
|
|
@@ -23,7 +23,9 @@ export type { TierLadderProgress } from './resolveTierProgress.js';
|
|
|
23
23
|
export { grantAchievement, submitAchievementRequest } from './submitAchievementRequest.js';
|
|
24
24
|
export { reviewAchievementRequest } from './reviewAchievementRequest.js';
|
|
25
25
|
export { validateRuleGroup, validateRuleNode } from './validateRules.js';
|
|
26
|
-
export { syncCompositeProgression } from './grantSideEffects.js';
|
|
26
|
+
export { syncCompositeProgression, syncProgressionFromLog } from './grantSideEffects.js';
|
|
27
|
+
export { runReactions, reactionMatchWhere } from './runReactions.js';
|
|
28
|
+
export type { RunReactionsArgs } from './runReactions.js';
|
|
27
29
|
export { syncTierProgression } from './tierProgression.js';
|
|
28
30
|
export { reconcileProgression, reconcileUserProgression } from './reconcile.js';
|
|
29
31
|
export type { ReconcileProgressionArgs, ReconcileProgressionResult } from './reconcile.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/achievement/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAA;AAC5H,YAAY,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAC3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAA;AAC5E,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAA;AAChG,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAA;AAChF,YAAY,EACV,8BAA8B,EAC9B,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,YAAY,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AACjH,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AACtE,YAAY,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AAChG,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAChE,YAAY,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAC9F,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,4BAA4B,GAC7B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACjG,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAC5D,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,YAAY,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAClE,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AAC1F,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AACxE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/achievement/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAA;AAC5H,YAAY,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAC3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAA;AAC5E,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAA;AAChG,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAA;AAChF,YAAY,EACV,8BAA8B,EAC9B,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,YAAY,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AACjH,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AACtE,YAAY,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AAChG,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAChE,YAAY,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAC9F,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,4BAA4B,GAC7B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACjG,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAC5D,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,YAAY,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAClE,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AAC1F,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AACxE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACxE,OAAO,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AACxF,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACpE,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AAC/E,YAAY,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAA;AAC1F,OAAO,EACL,wBAAwB,EACxB,gCAAgC,EAChC,yBAAyB,GAC1B,MAAM,wBAAwB,CAAA;AAC/B,YAAY,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AACrE,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,cAAc,GACf,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA"}
|
|
@@ -14,7 +14,8 @@ export { resolveTierProgress } from './resolveTierProgress.js';
|
|
|
14
14
|
export { grantAchievement, submitAchievementRequest } from './submitAchievementRequest.js';
|
|
15
15
|
export { reviewAchievementRequest } from './reviewAchievementRequest.js';
|
|
16
16
|
export { validateRuleGroup, validateRuleNode } from './validateRules.js';
|
|
17
|
-
export { syncCompositeProgression } from './grantSideEffects.js';
|
|
17
|
+
export { syncCompositeProgression, syncProgressionFromLog } from './grantSideEffects.js';
|
|
18
|
+
export { runReactions, reactionMatchWhere } from './runReactions.js';
|
|
18
19
|
export { syncTierProgression } from './tierProgression.js';
|
|
19
20
|
export { reconcileProgression, reconcileUserProgression } from './reconcile.js';
|
|
20
21
|
export { didDisableRequiresReview, releasePendingAchievementReviews, releasePendingTierReviews, } from './releaseReviewGate.js';
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { PayloadRequest, Where } from 'payload';
|
|
2
|
+
import type { AchievementReactionTrigger } from '../../types.js';
|
|
3
|
+
export type RunReactionsArgs = {
|
|
4
|
+
req: PayloadRequest;
|
|
5
|
+
trigger: AchievementReactionTrigger;
|
|
6
|
+
userId: string;
|
|
7
|
+
scopeId: string | null;
|
|
8
|
+
eventTypeId?: string | null;
|
|
9
|
+
eventTypeSlug?: string | null;
|
|
10
|
+
achievementId?: string | null;
|
|
11
|
+
log?: Record<string, unknown> | null;
|
|
12
|
+
};
|
|
13
|
+
export declare function reactionMatchWhere(args: {
|
|
14
|
+
trigger: AchievementReactionTrigger;
|
|
15
|
+
scopeId: string | null;
|
|
16
|
+
eventTypeId?: string | null;
|
|
17
|
+
achievementId?: string | null;
|
|
18
|
+
}): Where | null;
|
|
19
|
+
export declare function runReactions(args: RunReactionsArgs): Promise<number>;
|
|
20
|
+
//# sourceMappingURL=runReactions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runReactions.d.ts","sourceRoot":"","sources":["../../../src/services/achievement/runReactions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAKpD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAA;AAKhE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,cAAc,CAAA;IACnB,OAAO,EAAE,0BAA0B,CAAA;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;CACrC,CAAA;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACvC,OAAO,EAAE,0BAA0B,CAAA;IACnC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC9B,GAAG,KAAK,GAAG,IAAI,CAoBf;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyD1E"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { isGrantAuditEventSlug } from '../../catalog.js';
|
|
2
|
+
import { collectionOf } from '../../collections/helpers.js';
|
|
3
|
+
import { BUILTIN_GRANT_ACTION, getHostAction } from '../../extensions/actions.js';
|
|
4
|
+
import { CTX_SKIP_GRANT_SIDE_EFFECTS } from './contextFlags.js';
|
|
5
|
+
import { createGrantRow } from './grantSideEffects.js';
|
|
6
|
+
import { relationId } from './relationId.js';
|
|
7
|
+
export function reactionMatchWhere(args) {
|
|
8
|
+
const clauses = [{ enabled: { equals: true } }, { trigger: { equals: args.trigger } }];
|
|
9
|
+
if (args.trigger === 'event') {
|
|
10
|
+
if (!args.eventTypeId)
|
|
11
|
+
return null;
|
|
12
|
+
clauses.push({ eventType: { equals: args.eventTypeId } });
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
if (!args.achievementId)
|
|
16
|
+
return null;
|
|
17
|
+
clauses.push({ achievement: { equals: args.achievementId } });
|
|
18
|
+
}
|
|
19
|
+
if (args.scopeId) {
|
|
20
|
+
clauses.push({
|
|
21
|
+
or: [{ scope: { equals: args.scopeId } }, { scope: { exists: false } }, { scope: { equals: null } }],
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
clauses.push({ or: [{ scope: { exists: false } }, { scope: { equals: null } }] });
|
|
26
|
+
}
|
|
27
|
+
return { and: clauses };
|
|
28
|
+
}
|
|
29
|
+
export async function runReactions(args) {
|
|
30
|
+
if (!args.userId || args.req.context?.[CTX_SKIP_GRANT_SIDE_EFFECTS])
|
|
31
|
+
return 0;
|
|
32
|
+
if (args.trigger === 'event' && isGrantAuditEventSlug(args.eventTypeSlug))
|
|
33
|
+
return 0;
|
|
34
|
+
const where = reactionMatchWhere({
|
|
35
|
+
trigger: args.trigger,
|
|
36
|
+
scopeId: args.scopeId,
|
|
37
|
+
eventTypeId: args.eventTypeId,
|
|
38
|
+
achievementId: args.achievementId,
|
|
39
|
+
});
|
|
40
|
+
if (!where)
|
|
41
|
+
return 0;
|
|
42
|
+
const found = await args.req.payload.find({
|
|
43
|
+
collection: collectionOf('reactions'),
|
|
44
|
+
depth: 0,
|
|
45
|
+
limit: 200,
|
|
46
|
+
pagination: false,
|
|
47
|
+
overrideAccess: true,
|
|
48
|
+
req: args.req,
|
|
49
|
+
where,
|
|
50
|
+
});
|
|
51
|
+
let ran = 0;
|
|
52
|
+
for (const doc of found.docs) {
|
|
53
|
+
const reaction = doc;
|
|
54
|
+
const action = typeof reaction.action === 'string' ? reaction.action : '';
|
|
55
|
+
if (!action)
|
|
56
|
+
continue;
|
|
57
|
+
if (action === BUILTIN_GRANT_ACTION) {
|
|
58
|
+
const targetId = relationId(reaction.targetAchievement);
|
|
59
|
+
if (!targetId)
|
|
60
|
+
continue;
|
|
61
|
+
await createGrantRow({
|
|
62
|
+
req: args.req,
|
|
63
|
+
userId: args.userId,
|
|
64
|
+
achievementId: targetId,
|
|
65
|
+
scopeId: args.scopeId,
|
|
66
|
+
});
|
|
67
|
+
ran += 1;
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
const host = getHostAction(action);
|
|
71
|
+
if (!host)
|
|
72
|
+
continue;
|
|
73
|
+
await host.run({
|
|
74
|
+
payload: args.req.payload,
|
|
75
|
+
req: args.req,
|
|
76
|
+
userId: args.userId,
|
|
77
|
+
scopeId: args.scopeId,
|
|
78
|
+
trigger: args.trigger,
|
|
79
|
+
reaction,
|
|
80
|
+
log: args.log ?? null,
|
|
81
|
+
achievementId: args.achievementId ?? null,
|
|
82
|
+
});
|
|
83
|
+
ran += 1;
|
|
84
|
+
}
|
|
85
|
+
return ran;
|
|
86
|
+
}
|