@dappermountain/payload-plugin-achievements 0.3.0 → 0.4.0
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 +91 -12
- package/dist/admin/SubjectField.d.ts +14 -0
- package/dist/admin/SubjectField.d.ts.map +1 -0
- package/dist/admin/SubjectField.js +38 -0
- package/dist/admin/useEventTypeFlags.d.ts +2 -0
- package/dist/admin/useEventTypeFlags.d.ts.map +1 -1
- package/dist/admin/useEventTypeFlags.js +21 -3
- package/dist/cli/reconcile.d.ts +1 -1
- package/dist/cli/reconcile.d.ts.map +1 -1
- package/dist/collections/EventTypes/index.d.ts.map +1 -1
- package/dist/collections/EventTypes/index.js +30 -0
- package/dist/collections/Logs/fields/validators.d.ts +1 -0
- package/dist/collections/Logs/fields/validators.d.ts.map +1 -1
- package/dist/collections/Logs/fields/validators.js +37 -1
- package/dist/collections/Logs/hooks/ensureTypeRequirements.d.ts.map +1 -1
- package/dist/collections/Logs/hooks/ensureTypeRequirements.js +22 -13
- package/dist/collections/Logs/index.d.ts.map +1 -1
- package/dist/collections/Logs/index.js +34 -3
- package/dist/defaults.d.ts +5 -1
- package/dist/defaults.d.ts.map +1 -1
- package/dist/defaults.js +17 -1
- package/dist/endpoints/me.d.ts +2 -1
- package/dist/endpoints/me.d.ts.map +1 -1
- package/dist/endpoints/me.js +7 -1
- package/dist/exports/client.d.ts +1 -0
- package/dist/exports/client.d.ts.map +1 -1
- package/dist/exports/client.js +1 -0
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/seed/index.d.ts +7 -0
- package/dist/seed/index.d.ts.map +1 -1
- package/dist/seed/index.js +4 -0
- package/dist/services/achievement/buildUnlockRequirementLeaves.d.ts +48 -0
- package/dist/services/achievement/buildUnlockRequirementLeaves.d.ts.map +1 -0
- package/dist/services/achievement/buildUnlockRequirementLeaves.js +192 -0
- package/dist/services/achievement/duration.js +1 -1
- package/dist/services/achievement/eventTypeRequiresActor.d.ts +17 -0
- package/dist/services/achievement/eventTypeRequiresActor.d.ts.map +1 -1
- package/dist/services/achievement/eventTypeRequiresActor.js +56 -5
- package/dist/services/achievement/getUserProgress.d.ts +7 -0
- package/dist/services/achievement/getUserProgress.d.ts.map +1 -1
- package/dist/services/achievement/getUserProgress.js +11 -1
- package/dist/services/achievement/index.d.ts +7 -0
- package/dist/services/achievement/index.d.ts.map +1 -1
- package/dist/services/achievement/index.js +3 -0
- package/dist/services/achievement/loadUserProgressReviews.d.ts +23 -0
- package/dist/services/achievement/loadUserProgressReviews.d.ts.map +1 -0
- package/dist/services/achievement/loadUserProgressReviews.js +79 -0
- package/dist/services/achievement/logSubject.d.ts +13 -0
- package/dist/services/achievement/logSubject.d.ts.map +1 -0
- package/dist/services/achievement/logSubject.js +20 -0
- package/dist/services/achievement/recordEvent.d.ts +6 -0
- package/dist/services/achievement/recordEvent.d.ts.map +1 -1
- package/dist/services/achievement/recordEvent.js +32 -4
- package/dist/types.d.ts +19 -3
- package/dist/types.d.ts.map +1 -1
- package/package.json +7 -7
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { collectionOf } from '../../collections/helpers.js';
|
|
2
|
+
import { loadUserProgressReviews } from './loadUserProgressReviews.js';
|
|
2
3
|
import { relationId } from './relationId.js';
|
|
3
4
|
import { resolveCurrentTier } from './resolveCurrentTier.js';
|
|
4
5
|
import { userScopeWhere } from './where.js';
|
|
@@ -125,7 +126,7 @@ export async function getUserProgress(args) {
|
|
|
125
126
|
const page = args.paging?.page ?? 1;
|
|
126
127
|
const requestsLimit = args.paging?.requestsLimit ?? 20;
|
|
127
128
|
const locale = args.locale ?? (args.req?.locale || undefined);
|
|
128
|
-
const [grants, requests, tiers] = await Promise.all([
|
|
129
|
+
const [grants, requests, tiers, reviews] = await Promise.all([
|
|
129
130
|
args.payload.find({
|
|
130
131
|
collection: collectionOf('grants'),
|
|
131
132
|
depth: 1,
|
|
@@ -155,10 +156,19 @@ export async function getUserProgress(args) {
|
|
|
155
156
|
scopeId,
|
|
156
157
|
locale,
|
|
157
158
|
}),
|
|
159
|
+
args.include?.reviews
|
|
160
|
+
? loadUserProgressReviews({
|
|
161
|
+
payload: args.payload,
|
|
162
|
+
req: args.req,
|
|
163
|
+
userId: args.userId,
|
|
164
|
+
scopeId,
|
|
165
|
+
})
|
|
166
|
+
: Promise.resolve(undefined),
|
|
158
167
|
]);
|
|
159
168
|
return {
|
|
160
169
|
...mapPaginatedDocs(grants, (doc) => leanGrant(doc)),
|
|
161
170
|
tiers,
|
|
162
171
|
requests: requests.docs.map((doc) => leanRequest(doc)),
|
|
172
|
+
...(reviews ? { reviews } : {}),
|
|
163
173
|
};
|
|
164
174
|
}
|
|
@@ -2,13 +2,20 @@ export { evaluateRules, evaluateRuleProgress, normalizeRuleGroup, collectAchieve
|
|
|
2
2
|
export type { RuleGroup, AchievementCompleteRef } from './evaluateRules.js';
|
|
3
3
|
export { buildCatalogProgressGroups } from './buildCatalogProgressGroups.js';
|
|
4
4
|
export type { CatalogProgressGroup, CatalogProgressItem } from './buildCatalogProgressGroups.js';
|
|
5
|
+
export { buildUnlockRequirementLeaves } from './buildUnlockRequirementLeaves.js';
|
|
6
|
+
export type { UnlockRequirementCollectionKey, UnlockRequirementLeaf, UnlockRequirementRelation, } from './buildUnlockRequirementLeaves.js';
|
|
5
7
|
export { getUserProgress } from './getUserProgress.js';
|
|
8
|
+
export type { GetUserProgressInclude, GetUserProgressPaging, UserProgressMeResponse } from './getUserProgress.js';
|
|
9
|
+
export { loadUserProgressReviews } from './loadUserProgressReviews.js';
|
|
10
|
+
export type { UserProgressReviews, UserProgressTierRequest } from './loadUserProgressReviews.js';
|
|
6
11
|
export { getMetricLeaderboard } from './getMetricLeaderboard.js';
|
|
7
12
|
export type { MetricLeaderboardResult, MetricLeaderboardRow } from './getMetricLeaderboard.js';
|
|
8
13
|
export { applyMetricBalanceDelta, findMetricBalance, metricBalanceKey, rebuildMetricBalance, rebuildMetricBalancesForUser, } from './metricBalances.js';
|
|
9
14
|
export { resolveMetricValue, loadMetricDoc } from './resolveMetricValue.js';
|
|
10
15
|
export { resolveElapsedAnchor } from './resolveElapsedAnchor.js';
|
|
11
16
|
export { recordEvent, recordLog, recordMetricChange, syncTierChangedLog } from './recordEvent.js';
|
|
17
|
+
export { logSubject, readLogSubject } from './logSubject.js';
|
|
18
|
+
export type { LogSubjectRef } from './logSubject.js';
|
|
12
19
|
export { resolveCurrentTier } from './resolveCurrentTier.js';
|
|
13
20
|
export type { ResolvedTier } from './resolveCurrentTier.js';
|
|
14
21
|
export { resolveTierProgress } from './resolveTierProgress.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,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,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,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;AAChE,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"}
|
|
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;AAChE,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"}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
export { evaluateRules, evaluateRuleProgress, normalizeRuleGroup, collectAchievementCompleteRefs } from './evaluateRules.js';
|
|
2
2
|
export { buildCatalogProgressGroups } from './buildCatalogProgressGroups.js';
|
|
3
|
+
export { buildUnlockRequirementLeaves } from './buildUnlockRequirementLeaves.js';
|
|
3
4
|
export { getUserProgress } from './getUserProgress.js';
|
|
5
|
+
export { loadUserProgressReviews } from './loadUserProgressReviews.js';
|
|
4
6
|
export { getMetricLeaderboard } from './getMetricLeaderboard.js';
|
|
5
7
|
export { applyMetricBalanceDelta, findMetricBalance, metricBalanceKey, rebuildMetricBalance, rebuildMetricBalancesForUser, } from './metricBalances.js';
|
|
6
8
|
export { resolveMetricValue, loadMetricDoc } from './resolveMetricValue.js';
|
|
7
9
|
export { resolveElapsedAnchor } from './resolveElapsedAnchor.js';
|
|
8
10
|
export { recordEvent, recordLog, recordMetricChange, syncTierChangedLog } from './recordEvent.js';
|
|
11
|
+
export { logSubject, readLogSubject } from './logSubject.js';
|
|
9
12
|
export { resolveCurrentTier } from './resolveCurrentTier.js';
|
|
10
13
|
export { resolveTierProgress } from './resolveTierProgress.js';
|
|
11
14
|
export { grantAchievement, submitAchievementRequest } from './submitAchievementRequest.js';
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Payload, PayloadRequest } from 'payload';
|
|
2
|
+
export type UserProgressTierRequest = {
|
|
3
|
+
id: string;
|
|
4
|
+
status: 'pending' | 'rejected';
|
|
5
|
+
tierId: string | null;
|
|
6
|
+
};
|
|
7
|
+
export type UserProgressReviews = {
|
|
8
|
+
/** Achievement definition ids and slugs with a pending request. */
|
|
9
|
+
pendingAchievementKeys: string[];
|
|
10
|
+
/** Open or rejected tier requests (host decides which badge wins). */
|
|
11
|
+
tierRequests: UserProgressTierRequest[];
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Review-queue snapshot for member UI (pending achievement keys + open/rejected tier requests).
|
|
15
|
+
* Does not decide ready/rejected presentation — hosts apply ladder context themselves.
|
|
16
|
+
*/
|
|
17
|
+
export declare function loadUserProgressReviews(args: {
|
|
18
|
+
payload: Payload;
|
|
19
|
+
req?: PayloadRequest;
|
|
20
|
+
userId: string;
|
|
21
|
+
scopeId?: string | null;
|
|
22
|
+
}): Promise<UserProgressReviews>;
|
|
23
|
+
//# sourceMappingURL=loadUserProgressReviews.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadUserProgressReviews.d.ts","sourceRoot":"","sources":["../../../src/services/achievement/loadUserProgressReviews.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAS,MAAM,SAAS,CAAA;AAQ7D,MAAM,MAAM,uBAAuB,GAAG;IACpC,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,SAAS,GAAG,UAAU,CAAA;IAC9B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,mEAAmE;IACnE,sBAAsB,EAAE,MAAM,EAAE,CAAA;IAChC,sEAAsE;IACtE,YAAY,EAAE,uBAAuB,EAAE,CAAA;CACxC,CAAA;AAyBD;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE;IAClD,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,CAAC,EAAE,cAAc,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA+C/B"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { collectionOf } from '../../collections/helpers.js';
|
|
2
|
+
import { relationId } from './relationId.js';
|
|
3
|
+
const PENDING_ACHIEVEMENT_REQUESTS_LIMIT = 200;
|
|
4
|
+
const TIER_REQUESTS_LIMIT = 50;
|
|
5
|
+
function relationSlug(value) {
|
|
6
|
+
if (value && typeof value === 'object' && 'slug' in value) {
|
|
7
|
+
const slug = value.slug;
|
|
8
|
+
if (typeof slug === 'string' && slug)
|
|
9
|
+
return slug;
|
|
10
|
+
}
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
function pendingAchievementWhere(userId, scopeId) {
|
|
14
|
+
const clauses = [{ user: { equals: userId } }, { status: { equals: 'pending' } }];
|
|
15
|
+
if (scopeId)
|
|
16
|
+
clauses.push({ scope: { equals: scopeId } });
|
|
17
|
+
return { and: clauses };
|
|
18
|
+
}
|
|
19
|
+
function openOrRejectedTierRequestWhere(userId, scopeId) {
|
|
20
|
+
const clauses = [
|
|
21
|
+
{ user: { equals: userId } },
|
|
22
|
+
{ status: { in: ['pending', 'rejected'] } },
|
|
23
|
+
];
|
|
24
|
+
if (scopeId)
|
|
25
|
+
clauses.push({ scope: { equals: scopeId } });
|
|
26
|
+
return { and: clauses };
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Review-queue snapshot for member UI (pending achievement keys + open/rejected tier requests).
|
|
30
|
+
* Does not decide ready/rejected presentation — hosts apply ladder context themselves.
|
|
31
|
+
*/
|
|
32
|
+
export async function loadUserProgressReviews(args) {
|
|
33
|
+
const scopeId = args.scopeId ?? null;
|
|
34
|
+
const [pendingAchievementRequests, tierRequests] = await Promise.all([
|
|
35
|
+
args.payload.find({
|
|
36
|
+
collection: collectionOf('achievementRequests'),
|
|
37
|
+
depth: 1,
|
|
38
|
+
limit: PENDING_ACHIEVEMENT_REQUESTS_LIMIT,
|
|
39
|
+
pagination: false,
|
|
40
|
+
overrideAccess: true,
|
|
41
|
+
req: args.req,
|
|
42
|
+
where: pendingAchievementWhere(args.userId, scopeId),
|
|
43
|
+
}),
|
|
44
|
+
scopeId
|
|
45
|
+
? args.payload.find({
|
|
46
|
+
collection: collectionOf('tierRequests'),
|
|
47
|
+
depth: 0,
|
|
48
|
+
limit: TIER_REQUESTS_LIMIT,
|
|
49
|
+
pagination: false,
|
|
50
|
+
overrideAccess: true,
|
|
51
|
+
req: args.req,
|
|
52
|
+
where: openOrRejectedTierRequestWhere(args.userId, scopeId),
|
|
53
|
+
})
|
|
54
|
+
: Promise.resolve({ docs: [] }),
|
|
55
|
+
]);
|
|
56
|
+
const pendingAchievementKeys = new Set();
|
|
57
|
+
for (const doc of pendingAchievementRequests.docs) {
|
|
58
|
+
const id = relationId(doc.achievement);
|
|
59
|
+
const slug = relationSlug(doc.achievement);
|
|
60
|
+
if (id)
|
|
61
|
+
pendingAchievementKeys.add(id);
|
|
62
|
+
if (slug)
|
|
63
|
+
pendingAchievementKeys.add(slug);
|
|
64
|
+
}
|
|
65
|
+
const reviews = [];
|
|
66
|
+
for (const doc of tierRequests.docs) {
|
|
67
|
+
const status = doc.status === 'rejected' ? 'rejected' : doc.status === 'pending' ? 'pending' : null;
|
|
68
|
+
if (!status)
|
|
69
|
+
continue;
|
|
70
|
+
const id = typeof doc.id === 'string' && doc.id ? doc.id : relationId(doc.id);
|
|
71
|
+
if (!id)
|
|
72
|
+
continue;
|
|
73
|
+
reviews.push({ id, status, tierId: relationId(doc.tier) });
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
pendingAchievementKeys: [...pendingAchievementKeys],
|
|
77
|
+
tierRequests: reviews,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Polymorphic relationship value (Payload `relationTo` + `value`). */
|
|
2
|
+
export type LogSubjectRef = {
|
|
3
|
+
relationTo: string;
|
|
4
|
+
value: string;
|
|
5
|
+
};
|
|
6
|
+
/** Build a log subject ref for `recordLog({ subject })`. */
|
|
7
|
+
export declare function logSubject(relationTo: string, value: string): LogSubjectRef;
|
|
8
|
+
/**
|
|
9
|
+
* Normalize a polymorphic relationship (Admin / Local API shape) to `{ relationTo, value }`.
|
|
10
|
+
* Accepts nested docs (`value: { id }`) and plain ids under `value`.
|
|
11
|
+
*/
|
|
12
|
+
export declare function readLogSubject(value: unknown): LogSubjectRef | null;
|
|
13
|
+
//# sourceMappingURL=logSubject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logSubject.d.ts","sourceRoot":"","sources":["../../../src/services/achievement/logSubject.ts"],"names":[],"mappings":"AAEA,uEAAuE;AACvE,MAAM,MAAM,aAAa,GAAG;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,4DAA4D;AAC5D,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,CAE3E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,GAAG,IAAI,CAOnE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { relationId } from './relationId.js';
|
|
2
|
+
/** Build a log subject ref for `recordLog({ subject })`. */
|
|
3
|
+
export function logSubject(relationTo, value) {
|
|
4
|
+
return { relationTo, value };
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Normalize a polymorphic relationship (Admin / Local API shape) to `{ relationTo, value }`.
|
|
8
|
+
* Accepts nested docs (`value: { id }`) and plain ids under `value`.
|
|
9
|
+
*/
|
|
10
|
+
export function readLogSubject(value) {
|
|
11
|
+
if (!value || typeof value !== 'object')
|
|
12
|
+
return null;
|
|
13
|
+
const row = value;
|
|
14
|
+
if (typeof row.relationTo !== 'string' || !row.relationTo.trim())
|
|
15
|
+
return null;
|
|
16
|
+
const id = relationId(row.value);
|
|
17
|
+
if (!id)
|
|
18
|
+
return null;
|
|
19
|
+
return { relationTo: row.relationTo.trim(), value: id };
|
|
20
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Payload, PayloadRequest } from 'payload';
|
|
2
|
+
import { type LogSubjectRef } from './logSubject.js';
|
|
2
3
|
export type RecordLogInput = {
|
|
3
4
|
payload: Payload;
|
|
4
5
|
req?: PayloadRequest;
|
|
@@ -12,6 +13,11 @@ export type RecordLogInput = {
|
|
|
12
13
|
/** Signed amount the metric moved (for metric.delta logs). */
|
|
13
14
|
change?: number;
|
|
14
15
|
reason?: string;
|
|
16
|
+
/**
|
|
17
|
+
* Host document this entry is about (polymorphic).
|
|
18
|
+
* Preferred over stuffing ids into `data` when the host configured `subjects.collections`.
|
|
19
|
+
*/
|
|
20
|
+
subject?: LogSubjectRef | null;
|
|
15
21
|
data?: Record<string, unknown> | null;
|
|
16
22
|
};
|
|
17
23
|
/** Append a catalogued occurrence to the achievement log. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recordEvent.d.ts","sourceRoot":"","sources":["../../../src/services/achievement/recordEvent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"recordEvent.d.ts","sourceRoot":"","sources":["../../../src/services/achievement/recordEvent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAUtD,OAAO,EAAE,KAAK,aAAa,EAAkB,MAAM,iBAAiB,CAAA;AAQpE,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,CAAC,EAAE,cAAc,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,CAAA;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;CACtC,CAAA;AAgBD,6DAA6D;AAC7D,wBAAsB,SAAS,CAAC,IAAI,EAAE,cAAc,wEA0EnD;AAED,4CAA4C;AAC5C,eAAO,MAAM,WAAW,kBAAY,CAAA;AAEpC;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,CAAC,EAAE,cAAc,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB,wEAsDA;AAED,6FAA6F;AAC7F,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,CAAC,EAAE,cAAc,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB,iFA0DA"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { APIError } from 'payload';
|
|
2
2
|
import { DEFAULT_ACHIEVEMENT_METRIC_SLUG } from '../../catalog.js';
|
|
3
3
|
import { collectionOf } from '../../collections/helpers.js';
|
|
4
|
-
import {
|
|
4
|
+
import { getAchievementOptions } from '../../options-store.js';
|
|
5
|
+
import { eventTypeSubjectRelationTo, getEventTypeFlags, } from './eventTypeRequiresActor.js';
|
|
6
|
+
import { readLogSubject } from './logSubject.js';
|
|
5
7
|
import { applyMetricBalanceDelta } from './metricBalances.js';
|
|
6
8
|
import { transitionLogData, transitionToId } from './logData.js';
|
|
7
9
|
import { loadMetricDoc } from './resolveMetricValue.js';
|
|
@@ -33,9 +35,34 @@ export async function recordLog(args) {
|
|
|
33
35
|
value: args.metric,
|
|
34
36
|
})
|
|
35
37
|
: undefined;
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
38
|
+
const flags = await getEventTypeFlags({
|
|
39
|
+
payload: args.payload,
|
|
40
|
+
req: args.req,
|
|
41
|
+
typeIdOrDoc: typeId,
|
|
42
|
+
});
|
|
43
|
+
if (flags.requiresActor && !args.actorId) {
|
|
44
|
+
throw new APIError('This log type needs an actor (who caused it).', 400);
|
|
45
|
+
}
|
|
46
|
+
const allowlist = getAchievementOptions().subjectCollections;
|
|
47
|
+
let subject;
|
|
48
|
+
if (args.subject) {
|
|
49
|
+
const parsed = readLogSubject(args.subject) ?? args.subject;
|
|
50
|
+
subject = parsed;
|
|
51
|
+
}
|
|
52
|
+
if (flags.requiresSubject && allowlist.length > 0) {
|
|
53
|
+
if (!subject) {
|
|
54
|
+
throw new APIError('This log type needs a subject (the host document it is about).', 400);
|
|
55
|
+
}
|
|
56
|
+
if (!allowlist.includes(subject.relationTo)) {
|
|
57
|
+
throw new APIError(`Subject collection "${subject.relationTo}" is not in the plugin subjects allowlist.`, 400);
|
|
58
|
+
}
|
|
59
|
+
const allowed = await eventTypeSubjectRelationTo({
|
|
60
|
+
payload: args.payload,
|
|
61
|
+
req: args.req,
|
|
62
|
+
typeIdOrDoc: typeId,
|
|
63
|
+
});
|
|
64
|
+
if (allowed.length > 0 && !allowed.includes(subject.relationTo)) {
|
|
65
|
+
throw new APIError(`This log type only allows subjects from: ${allowed.join(', ')}.`, 400);
|
|
39
66
|
}
|
|
40
67
|
}
|
|
41
68
|
return args.payload.create({
|
|
@@ -48,6 +75,7 @@ export async function recordLog(args) {
|
|
|
48
75
|
metric: metricId,
|
|
49
76
|
change: args.change,
|
|
50
77
|
reason: args.reason,
|
|
78
|
+
...(subject ? { subject } : {}),
|
|
51
79
|
data: args.data ?? undefined,
|
|
52
80
|
},
|
|
53
81
|
overrideAccess: true,
|
package/dist/types.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ export type AchievementMetricAnchor = (args: {
|
|
|
9
9
|
/**
|
|
10
10
|
* Anchor with an Admin label.
|
|
11
11
|
* `label` is a Payload Admin UI string ({@link OptionLabel}): plain string, `{ en, es, … }`,
|
|
12
|
-
* or `({ t }) => t('custom:…')`
|
|
12
|
+
* or `({ t }) => t('custom:…')` (Admin UI / OptionLabel).
|
|
13
13
|
*/
|
|
14
14
|
export type AchievementMetricAnchorConfig = {
|
|
15
15
|
label: OptionLabel;
|
|
@@ -40,11 +40,11 @@ export type AchievementRuleType = {
|
|
|
40
40
|
/**
|
|
41
41
|
* Optional fractional progress toward this leaf (0..1).
|
|
42
42
|
* When omitted, progress falls back to `evaluate` → 0 or 1.
|
|
43
|
-
* Used for next-tier ladder fill and host UIs
|
|
43
|
+
* Used for next-tier ladder fill and host UIs (progress display).
|
|
44
44
|
*/
|
|
45
45
|
progress?: (args: AchievementRuleEvalArgs) => Promise<number> | number;
|
|
46
46
|
/**
|
|
47
|
-
* `gate` rules (e.g. `tier-at-least`) are prerequisites
|
|
47
|
+
* `gate` rules (e.g. `tier-at-least`) are prerequisites that must already hold.
|
|
48
48
|
* They are omitted from AND averages. Default: `requirement`.
|
|
49
49
|
*/
|
|
50
50
|
progressRole?: 'requirement' | 'gate';
|
|
@@ -110,6 +110,17 @@ export type AchievementEndpointsOptions = {
|
|
|
110
110
|
*/
|
|
111
111
|
reconcile?: string | false;
|
|
112
112
|
};
|
|
113
|
+
/**
|
|
114
|
+
* Host documents that achievement logs may point at (polymorphic `subject`).
|
|
115
|
+
* Empty / omitted → subject field is not registered (engine stays host-agnostic).
|
|
116
|
+
*/
|
|
117
|
+
export type AchievementSubjectsOptions = {
|
|
118
|
+
/**
|
|
119
|
+
* Collection slugs allowed on log `subject.relationTo` (e.g. `posts`, `comments`).
|
|
120
|
+
* Event types pick a subset via `subjectRelationTo`; validation rejects anything outside this list.
|
|
121
|
+
*/
|
|
122
|
+
collections?: string[];
|
|
123
|
+
};
|
|
113
124
|
export type AchievementPluginOptions = {
|
|
114
125
|
/**
|
|
115
126
|
* Whether the user may review requests and manage achievement catalogs for a scope.
|
|
@@ -121,6 +132,11 @@ export type AchievementPluginOptions = {
|
|
|
121
132
|
enabled?: boolean;
|
|
122
133
|
/** Custom root API routes registered by the plugin. */
|
|
123
134
|
endpoints?: AchievementEndpointsOptions;
|
|
135
|
+
/**
|
|
136
|
+
* Polymorphic log subjects — host allowlist of collections.
|
|
137
|
+
* When set, event types gain `requiresSubject` / `subjectRelationTo` and logs gain `subject`.
|
|
138
|
+
*/
|
|
139
|
+
subjects?: AchievementSubjectsOptions;
|
|
124
140
|
extensions?: {
|
|
125
141
|
/** Custom rule evaluators merged with built-ins. */
|
|
126
142
|
ruleTypes?: AchievementRuleType[];
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dappermountain/payload-plugin-achievements",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "A robust, Admin-configured achievements engine for Payload: composable unlock rules, derived rank progress, request/review grants, metrics, and scoped multi-tenant support.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -69,21 +69,21 @@
|
|
|
69
69
|
"skills:check": "bunx skills check -p"
|
|
70
70
|
},
|
|
71
71
|
"peerDependencies": {
|
|
72
|
-
"@payloadcms/richtext-lexical": "^3.
|
|
73
|
-
"@payloadcms/ui": "^3.
|
|
72
|
+
"@payloadcms/richtext-lexical": "^3.89.0",
|
|
73
|
+
"@payloadcms/ui": "^3.89.0",
|
|
74
74
|
"lucide-react": "^0.543.0",
|
|
75
|
-
"payload": "^3.
|
|
75
|
+
"payload": "^3.89.0",
|
|
76
76
|
"react": "^19.0.0"
|
|
77
77
|
},
|
|
78
78
|
"devDependencies": {
|
|
79
79
|
"@dappermountain/agent-payload": "^0.1.5",
|
|
80
80
|
"@dappermountain/agent-practices": "^0.1.2",
|
|
81
|
-
"@payloadcms/richtext-lexical": "3.
|
|
82
|
-
"@payloadcms/ui": "3.
|
|
81
|
+
"@payloadcms/richtext-lexical": "3.89.0",
|
|
82
|
+
"@payloadcms/ui": "3.89.0",
|
|
83
83
|
"@types/bun": "1.4.0",
|
|
84
84
|
"@types/react": "^19.0.0",
|
|
85
85
|
"lucide-react": "0.543.0",
|
|
86
|
-
"payload": "3.
|
|
86
|
+
"payload": "3.89.0",
|
|
87
87
|
"prettier": "^3.6.2",
|
|
88
88
|
"react": "19.2.4",
|
|
89
89
|
"typescript": "5.9.2"
|