@brandlift/payload-loggs 1.0.5 → 1.2.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.
@@ -1,7 +1,7 @@
1
1
  import type { CollectionConfig } from 'payload';
2
2
  export type SiteActivityLogData = {
3
3
  title: string;
4
- operation: 'create' | 'update' | 'delete' | 'login' | 'logout';
4
+ operation: 'create' | 'update' | 'delete' | 'login' | 'logout' | 'publish' | 'unpublish';
5
5
  resourceName?: string;
6
6
  resourceType: 'collection' | 'global';
7
7
  collectionLabel?: string;
@@ -48,6 +48,14 @@ export const SiteActivityCollection = {
48
48
  label: 'Delete',
49
49
  value: 'delete'
50
50
  },
51
+ {
52
+ label: 'Publish',
53
+ value: 'publish'
54
+ },
55
+ {
56
+ label: 'Unpublish',
57
+ value: 'unpublish'
58
+ },
51
59
  {
52
60
  label: 'Login',
53
61
  value: 'login'
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/collections/SiteActivityCollection.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload';\n\nexport type SiteActivityLogData = {\n title: string;\n operation: 'create' | 'update' | 'delete' | 'login' | 'logout';\n resourceName?: string;\n resourceType: 'collection' | 'global';\n collectionLabel?: string;\n slug: string;\n documentId?: string;\n locale?: string;\n user?: string | number;\n userEmail?: string;\n userDisplay?: string;\n createdAt?: string;\n};\n\nexport const SITE_ACTIVITY_SLUG = 'site-activity';\n\nexport const SiteActivityCollection: CollectionConfig = {\n slug: SITE_ACTIVITY_SLUG,\n labels: {\n plural: 'Site Activities',\n singular: 'Site Activity',\n },\n admin: {\n defaultColumns: ['title', 'operation', 'resourceName', 'collectionLabel', 'userDisplay', 'createdAt'],\n useAsTitle: 'title',\n },\n access: {\n read: ({ req }) => Boolean(req.user),\n create: () => false,\n update: () => false,\n delete: () => false,\n },\n fields: [\n {\n name: 'title',\n type: 'text',\n required: true,\n admin: {\n readOnly: true,\n },\n },\n {\n name: 'operation',\n type: 'select',\n required: true,\n options: [\n { label: 'Create', value: 'create' },\n { label: 'Update', value: 'update' },\n { label: 'Delete', value: 'delete' },\n { label: 'Login', value: 'login' },\n { label: 'Logout', value: 'logout' },\n ],\n admin: {\n readOnly: true,\n },\n },\n {\n name: 'resourceName',\n type: 'text',\n admin: {\n readOnly: true,\n },\n },\n {\n name: 'resourceType',\n type: 'select',\n required: true,\n options: [\n { label: 'Collection', value: 'collection' },\n { label: 'Global', value: 'global' },\n ],\n admin: {\n readOnly: true,\n },\n },\n {\n name: 'collectionLabel',\n type: 'text',\n admin: {\n readOnly: true,\n },\n },\n {\n name: 'slug',\n type: 'text',\n required: true,\n admin: {\n readOnly: true,\n },\n },\n {\n name: 'documentId',\n type: 'text',\n admin: {\n readOnly: true,\n },\n },\n {\n name: 'locale',\n type: 'text',\n admin: {\n readOnly: true,\n },\n },\n {\n name: 'user',\n type: 'relationship',\n relationTo: 'users',\n admin: {\n readOnly: true,\n },\n },\n {\n name: 'userEmail',\n type: 'text',\n admin: {\n readOnly: true,\n },\n },\n {\n name: 'userDisplay',\n type: 'text',\n admin: {\n readOnly: true,\n },\n },\n {\n name: 'createdAt',\n type: 'date',\n admin: {\n readOnly: true,\n },\n defaultValue: () => new Date().toISOString(),\n required: true,\n },\n ],\n timestamps: false,\n};\n\nexport default SiteActivityCollection;\n"],"names":["SITE_ACTIVITY_SLUG","SiteActivityCollection","slug","labels","plural","singular","admin","defaultColumns","useAsTitle","access","read","req","Boolean","user","create","update","delete","fields","name","type","required","readOnly","options","label","value","relationTo","defaultValue","Date","toISOString","timestamps"],"mappings":"AAiBA,OAAO,MAAMA,qBAAqB,gBAAgB;AAElD,OAAO,MAAMC,yBAA2C;IACtDC,MAAMF;IACNG,QAAQ;QACNC,QAAQ;QACRC,UAAU;IACZ;IACAC,OAAO;QACLC,gBAAgB;YAAC;YAAS;YAAa;YAAgB;YAAmB;YAAe;SAAY;QACrGC,YAAY;IACd;IACAC,QAAQ;QACNC,MAAM,CAAC,EAAEC,GAAG,EAAE,GAAKC,QAAQD,IAAIE,IAAI;QACnCC,QAAQ,IAAM;QACdC,QAAQ,IAAM;QACdC,QAAQ,IAAM;IAChB;IACAC,QAAQ;QACN;YACEC,MAAM;YACNC,MAAM;YACNC,UAAU;YACVd,OAAO;gBACLe,UAAU;YACZ;QACF;QACA;YACEH,MAAM;YACNC,MAAM;YACNC,UAAU;YACVE,SAAS;gBACP;oBAAEC,OAAO;oBAAUC,OAAO;gBAAS;gBACnC;oBAAED,OAAO;oBAAUC,OAAO;gBAAS;gBACnC;oBAAED,OAAO;oBAAUC,OAAO;gBAAS;gBACnC;oBAAED,OAAO;oBAASC,OAAO;gBAAQ;gBACjC;oBAAED,OAAO;oBAAUC,OAAO;gBAAS;aACpC;YACDlB,OAAO;gBACLe,UAAU;YACZ;QACF;QACA;YACEH,MAAM;YACNC,MAAM;YACNb,OAAO;gBACLe,UAAU;YACZ;QACF;QACA;YACEH,MAAM;YACNC,MAAM;YACNC,UAAU;YACVE,SAAS;gBACP;oBAAEC,OAAO;oBAAcC,OAAO;gBAAa;gBAC3C;oBAAED,OAAO;oBAAUC,OAAO;gBAAS;aACpC;YACDlB,OAAO;gBACLe,UAAU;YACZ;QACF;QACA;YACEH,MAAM;YACNC,MAAM;YACNb,OAAO;gBACLe,UAAU;YACZ;QACF;QACA;YACEH,MAAM;YACNC,MAAM;YACNC,UAAU;YACVd,OAAO;gBACLe,UAAU;YACZ;QACF;QACA;YACEH,MAAM;YACNC,MAAM;YACNb,OAAO;gBACLe,UAAU;YACZ;QACF;QACA;YACEH,MAAM;YACNC,MAAM;YACNb,OAAO;gBACLe,UAAU;YACZ;QACF;QACA;YACEH,MAAM;YACNC,MAAM;YACNM,YAAY;YACZnB,OAAO;gBACLe,UAAU;YACZ;QACF;QACA;YACEH,MAAM;YACNC,MAAM;YACNb,OAAO;gBACLe,UAAU;YACZ;QACF;QACA;YACEH,MAAM;YACNC,MAAM;YACNb,OAAO;gBACLe,UAAU;YACZ;QACF;QACA;YACEH,MAAM;YACNC,MAAM;YACNb,OAAO;gBACLe,UAAU;YACZ;YACAK,cAAc,IAAM,IAAIC,OAAOC,WAAW;YAC1CR,UAAU;QACZ;KACD;IACDS,YAAY;AACd,EAAE;AAEF,eAAe5B,uBAAuB"}
1
+ {"version":3,"sources":["../../src/collections/SiteActivityCollection.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload';\n\nexport type SiteActivityLogData = {\n title: string;\n operation: 'create' | 'update' | 'delete' | 'login' | 'logout' | 'publish' | 'unpublish';\n resourceName?: string;\n resourceType: 'collection' | 'global';\n collectionLabel?: string;\n slug: string;\n documentId?: string;\n locale?: string;\n user?: string | number;\n userEmail?: string;\n userDisplay?: string;\n createdAt?: string;\n};\n\nexport const SITE_ACTIVITY_SLUG = 'site-activity';\n\nexport const SiteActivityCollection: CollectionConfig = {\n slug: SITE_ACTIVITY_SLUG,\n labels: {\n plural: 'Site Activities',\n singular: 'Site Activity',\n },\n admin: {\n defaultColumns: ['title', 'operation', 'resourceName', 'collectionLabel', 'userDisplay', 'createdAt'],\n useAsTitle: 'title',\n },\n access: {\n read: ({ req }) => Boolean(req.user),\n create: () => false,\n update: () => false,\n delete: () => false,\n },\n fields: [\n {\n name: 'title',\n type: 'text',\n required: true,\n admin: {\n readOnly: true,\n },\n },\n {\n name: 'operation',\n type: 'select',\n required: true,\n options: [\n { label: 'Create', value: 'create' },\n { label: 'Update', value: 'update' },\n { label: 'Delete', value: 'delete' },\n { label: 'Publish', value: 'publish' },\n { label: 'Unpublish', value: 'unpublish' },\n { label: 'Login', value: 'login' },\n { label: 'Logout', value: 'logout' },\n ],\n admin: {\n readOnly: true,\n },\n },\n {\n name: 'resourceName',\n type: 'text',\n admin: {\n readOnly: true,\n },\n },\n {\n name: 'resourceType',\n type: 'select',\n required: true,\n options: [\n { label: 'Collection', value: 'collection' },\n { label: 'Global', value: 'global' },\n ],\n admin: {\n readOnly: true,\n },\n },\n {\n name: 'collectionLabel',\n type: 'text',\n admin: {\n readOnly: true,\n },\n },\n {\n name: 'slug',\n type: 'text',\n required: true,\n admin: {\n readOnly: true,\n },\n },\n {\n name: 'documentId',\n type: 'text',\n admin: {\n readOnly: true,\n },\n },\n {\n name: 'locale',\n type: 'text',\n admin: {\n readOnly: true,\n },\n },\n {\n name: 'user',\n type: 'relationship',\n relationTo: 'users',\n admin: {\n readOnly: true,\n },\n },\n {\n name: 'userEmail',\n type: 'text',\n admin: {\n readOnly: true,\n },\n },\n {\n name: 'userDisplay',\n type: 'text',\n admin: {\n readOnly: true,\n },\n },\n {\n name: 'createdAt',\n type: 'date',\n admin: {\n readOnly: true,\n },\n defaultValue: () => new Date().toISOString(),\n required: true,\n },\n ],\n timestamps: false,\n};\n\nexport default SiteActivityCollection;\n"],"names":["SITE_ACTIVITY_SLUG","SiteActivityCollection","slug","labels","plural","singular","admin","defaultColumns","useAsTitle","access","read","req","Boolean","user","create","update","delete","fields","name","type","required","readOnly","options","label","value","relationTo","defaultValue","Date","toISOString","timestamps"],"mappings":"AAiBA,OAAO,MAAMA,qBAAqB,gBAAgB;AAElD,OAAO,MAAMC,yBAA2C;IACtDC,MAAMF;IACNG,QAAQ;QACNC,QAAQ;QACRC,UAAU;IACZ;IACAC,OAAO;QACLC,gBAAgB;YAAC;YAAS;YAAa;YAAgB;YAAmB;YAAe;SAAY;QACrGC,YAAY;IACd;IACAC,QAAQ;QACNC,MAAM,CAAC,EAAEC,GAAG,EAAE,GAAKC,QAAQD,IAAIE,IAAI;QACnCC,QAAQ,IAAM;QACdC,QAAQ,IAAM;QACdC,QAAQ,IAAM;IAChB;IACAC,QAAQ;QACN;YACEC,MAAM;YACNC,MAAM;YACNC,UAAU;YACVd,OAAO;gBACLe,UAAU;YACZ;QACF;QACA;YACEH,MAAM;YACNC,MAAM;YACNC,UAAU;YACVE,SAAS;gBACP;oBAAEC,OAAO;oBAAUC,OAAO;gBAAS;gBACnC;oBAAED,OAAO;oBAAUC,OAAO;gBAAS;gBACnC;oBAAED,OAAO;oBAAUC,OAAO;gBAAS;gBACnC;oBAAED,OAAO;oBAAWC,OAAO;gBAAU;gBACrC;oBAAED,OAAO;oBAAaC,OAAO;gBAAY;gBACzC;oBAAED,OAAO;oBAASC,OAAO;gBAAQ;gBACjC;oBAAED,OAAO;oBAAUC,OAAO;gBAAS;aACpC;YACDlB,OAAO;gBACLe,UAAU;YACZ;QACF;QACA;YACEH,MAAM;YACNC,MAAM;YACNb,OAAO;gBACLe,UAAU;YACZ;QACF;QACA;YACEH,MAAM;YACNC,MAAM;YACNC,UAAU;YACVE,SAAS;gBACP;oBAAEC,OAAO;oBAAcC,OAAO;gBAAa;gBAC3C;oBAAED,OAAO;oBAAUC,OAAO;gBAAS;aACpC;YACDlB,OAAO;gBACLe,UAAU;YACZ;QACF;QACA;YACEH,MAAM;YACNC,MAAM;YACNb,OAAO;gBACLe,UAAU;YACZ;QACF;QACA;YACEH,MAAM;YACNC,MAAM;YACNC,UAAU;YACVd,OAAO;gBACLe,UAAU;YACZ;QACF;QACA;YACEH,MAAM;YACNC,MAAM;YACNb,OAAO;gBACLe,UAAU;YACZ;QACF;QACA;YACEH,MAAM;YACNC,MAAM;YACNb,OAAO;gBACLe,UAAU;YACZ;QACF;QACA;YACEH,MAAM;YACNC,MAAM;YACNM,YAAY;YACZnB,OAAO;gBACLe,UAAU;YACZ;QACF;QACA;YACEH,MAAM;YACNC,MAAM;YACNb,OAAO;gBACLe,UAAU;YACZ;QACF;QACA;YACEH,MAAM;YACNC,MAAM;YACNb,OAAO;gBACLe,UAAU;YACZ;QACF;QACA;YACEH,MAAM;YACNC,MAAM;YACNb,OAAO;gBACLe,UAAU;YACZ;YACAK,cAAc,IAAM,IAAIC,OAAOC,WAAW;YAC1CR,UAAU;QACZ;KACD;IACDS,YAAY;AACd,EAAE;AAEF,eAAe5B,uBAAuB"}
@@ -2,16 +2,15 @@ import { getResourceTitle } from '../pluginUtils/getResourceTitle.js';
2
2
  import { formatUserDisplay } from '../pluginUtils/formatUserDisplay.js';
3
3
  import { getCollectionLabel } from '../pluginUtils/getCollectionLabel.js';
4
4
  import { SITE_ACTIVITY_SLUG } from '../collections/SiteActivityCollection.js';
5
+ import { getCollectionActivityDetails } from '../pluginUtils/getActivityDetails.js';
5
6
  export const createCollectionAfterChangeHook = (collection, payloadConfig, _pluginConfig)=>{
6
7
  return async ({ doc, previousDoc, operation, req })=>{
7
8
  if (!req || req.context?.skipLogs || req.context?.skipAuditorLogs) {
8
9
  return doc;
9
10
  }
10
11
  try {
11
- const isCreate = operation === 'create' || !previousDoc;
12
- const opType = isCreate ? 'create' : 'update';
12
+ const { title, operation: opType } = getCollectionActivityDetails(collection, operation, doc, previousDoc);
13
13
  const label = getCollectionLabel(collection);
14
- const title = isCreate ? `${label} created` : `${label} modified`;
15
14
  const resourceName = getResourceTitle(doc, doc?.id);
16
15
  const isLocalizationEnabled = Boolean(payloadConfig.localization);
17
16
  const locale = isLocalizationEnabled ? req.locale : undefined;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/collectionHooks.ts"],"sourcesContent":["import type { CollectionAfterChangeHook, CollectionAfterDeleteHook, CollectionAfterLoginHook, CollectionAfterLogoutHook, CollectionConfig, Config } from 'payload';\n\nimport type { PluginConfig } from '../types/config.js';\nimport { getResourceTitle } from '../pluginUtils/getResourceTitle.js';\nimport { formatUserDisplay } from '../pluginUtils/formatUserDisplay.js';\nimport { getCollectionLabel } from '../pluginUtils/getCollectionLabel.js';\nimport { SITE_ACTIVITY_SLUG } from '../collections/SiteActivityCollection.js';\n\nexport const createCollectionAfterChangeHook = (\n collection: CollectionConfig,\n payloadConfig: Config,\n _pluginConfig?: PluginConfig,\n): CollectionAfterChangeHook => {\n return async ({ doc, previousDoc, operation, req }) => {\n if (!req || req.context?.skipLogs || req.context?.skipAuditorLogs) {\n return doc;\n }\n\n try {\n const isCreate = operation === 'create' || !previousDoc;\n const opType = isCreate ? 'create' : 'update';\n const label = getCollectionLabel(collection);\n const title = isCreate ? `${label} created` : `${label} modified`;\n\n const resourceName = getResourceTitle(doc, doc?.id);\n const isLocalizationEnabled = Boolean(payloadConfig.localization);\n const locale = isLocalizationEnabled ? req.locale : undefined;\n\n const userEmail = req.user?.email || (doc && typeof doc === 'object' && 'email' in doc && typeof doc.email === 'string' ? doc.email : undefined);\n const userDisplay = formatUserDisplay(userEmail);\n const userId = req.user?.id || (doc && typeof doc === 'object' && 'id' in doc ? doc.id : undefined);\n\n await req.payload.create({\n collection: SITE_ACTIVITY_SLUG,\n data: {\n title,\n operation: opType,\n resourceName,\n resourceType: 'collection',\n collectionLabel: label,\n slug: collection.slug,\n documentId: doc?.id ? String(doc.id) : undefined,\n ...(locale ? { locale } : {}),\n ...(userId !== undefined && userId !== null ? { user: userId } : {}),\n ...(userEmail ? { userEmail } : {}),\n ...(userDisplay ? { userDisplay } : {}),\n },\n req,\n overrideAccess: true,\n context: {\n ...req.context,\n skipLogs: true,\n skipAuditorLogs: true,\n },\n });\n }\n catch (error) {\n req.payload?.logger?.error?.(`[payload-loggs] Error logging collection afterChange for ${collection.slug}: ${error}`);\n }\n\n return doc;\n };\n};\n\nexport const createCollectionAfterDeleteHook = (\n collection: CollectionConfig,\n payloadConfig: Config,\n _pluginConfig?: PluginConfig,\n): CollectionAfterDeleteHook => {\n return async ({ doc, id, req }) => {\n if (!req || req.context?.skipLogs || req.context?.skipAuditorLogs) {\n return doc;\n }\n\n try {\n const label = getCollectionLabel(collection);\n const title = `${label} deleted`;\n\n const resourceName = getResourceTitle(doc, id);\n const isLocalizationEnabled = Boolean(payloadConfig.localization);\n const locale = isLocalizationEnabled ? req.locale : undefined;\n\n const userEmail = req.user?.email || (doc && typeof doc === 'object' && 'email' in doc && typeof doc.email === 'string' ? doc.email : undefined);\n const userDisplay = formatUserDisplay(userEmail);\n const userId = req.user?.id || (doc && typeof doc === 'object' && 'id' in doc ? doc.id : undefined);\n\n await req.payload.create({\n collection: SITE_ACTIVITY_SLUG,\n data: {\n title,\n operation: 'delete',\n resourceName,\n resourceType: 'collection',\n collectionLabel: label,\n slug: collection.slug,\n documentId: id ? String(id) : undefined,\n ...(locale ? { locale } : {}),\n ...(userId !== undefined && userId !== null ? { user: userId } : {}),\n ...(userEmail ? { userEmail } : {}),\n ...(userDisplay ? { userDisplay } : {}),\n },\n req,\n overrideAccess: true,\n context: {\n ...req.context,\n skipLogs: true,\n skipAuditorLogs: true,\n },\n });\n }\n catch (error) {\n req.payload?.logger?.error?.(`[payload-loggs] Error logging collection afterDelete for ${collection.slug}: ${error}`);\n }\n\n return doc;\n };\n};\n\nexport const createCollectionAfterLoginHook = (\n collection: CollectionConfig,\n _payloadConfig: Config,\n _pluginConfig?: PluginConfig,\n): CollectionAfterLoginHook => {\n return async ({ user, req }) => {\n if (!req || req.context?.skipLogs || req.context?.skipAuditorLogs) {\n return user;\n }\n\n try {\n const label = getCollectionLabel(collection);\n const userEmail = user?.email || req.user?.email;\n const userDisplay = formatUserDisplay(userEmail);\n const title = userDisplay ? `User ${userDisplay} logged in` : `${label} logged in`;\n\n await req.payload.create({\n collection: SITE_ACTIVITY_SLUG,\n data: {\n title,\n operation: 'login',\n resourceName: userEmail || String(user?.id || 'User'),\n resourceType: 'collection',\n collectionLabel: label,\n slug: collection.slug,\n documentId: user?.id ? String(user.id) : undefined,\n ...(user?.id !== undefined && user?.id !== null ? { user: user.id } : {}),\n ...(userEmail ? { userEmail } : {}),\n ...(userDisplay ? { userDisplay } : {}),\n },\n req,\n overrideAccess: true,\n context: {\n ...req.context,\n skipLogs: true,\n skipAuditorLogs: true,\n },\n });\n }\n catch (error) {\n req.payload?.logger?.error?.(`[payload-loggs] Error logging afterLogin for ${collection.slug}: ${error}`);\n }\n\n return user;\n };\n};\n\nexport const createCollectionAfterLogoutHook = (\n collection: CollectionConfig,\n _payloadConfig: Config,\n _pluginConfig?: PluginConfig,\n): CollectionAfterLogoutHook => {\n return async ({ req }) => {\n if (!req || req.context?.skipLogs || req.context?.skipAuditorLogs) {\n return;\n }\n\n try {\n const label = getCollectionLabel(collection);\n const userEmail = req.user?.email;\n const userDisplay = formatUserDisplay(userEmail);\n const title = userDisplay ? `User ${userDisplay} logged out` : `${label} logged out`;\n\n await req.payload.create({\n collection: SITE_ACTIVITY_SLUG,\n data: {\n title,\n operation: 'logout',\n resourceName: userEmail || String(req.user?.id || 'User'),\n resourceType: 'collection',\n collectionLabel: label,\n slug: collection.slug,\n documentId: req.user?.id ? String(req.user.id) : undefined,\n ...(req.user?.id !== undefined && req.user?.id !== null ? { user: req.user.id } : {}),\n ...(userEmail ? { userEmail } : {}),\n ...(userDisplay ? { userDisplay } : {}),\n },\n req,\n overrideAccess: true,\n context: {\n ...req.context,\n skipLogs: true,\n skipAuditorLogs: true,\n },\n });\n }\n catch (error) {\n req.payload?.logger?.error?.(`[payload-loggs] Error logging afterLogout for ${collection.slug}: ${error}`);\n }\n };\n};\n"],"names":["getResourceTitle","formatUserDisplay","getCollectionLabel","SITE_ACTIVITY_SLUG","createCollectionAfterChangeHook","collection","payloadConfig","_pluginConfig","doc","previousDoc","operation","req","context","skipLogs","skipAuditorLogs","isCreate","opType","label","title","resourceName","id","isLocalizationEnabled","Boolean","localization","locale","undefined","userEmail","user","email","userDisplay","userId","payload","create","data","resourceType","collectionLabel","slug","documentId","String","overrideAccess","error","logger","createCollectionAfterDeleteHook","createCollectionAfterLoginHook","_payloadConfig","createCollectionAfterLogoutHook"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/hooks/collectionHooks.ts"],"sourcesContent":["import type { CollectionAfterChangeHook, CollectionAfterDeleteHook, CollectionAfterLoginHook, CollectionAfterLogoutHook, CollectionConfig, Config } from 'payload';\n\nimport type { PluginConfig } from '../types/config.js';\nimport { getResourceTitle } from '../pluginUtils/getResourceTitle.js';\nimport { formatUserDisplay } from '../pluginUtils/formatUserDisplay.js';\nimport { getCollectionLabel } from '../pluginUtils/getCollectionLabel.js';\nimport { SITE_ACTIVITY_SLUG } from '../collections/SiteActivityCollection.js';\nimport { getCollectionActivityDetails } from '../pluginUtils/getActivityDetails.js';\n\nexport const createCollectionAfterChangeHook = (\n collection: CollectionConfig,\n payloadConfig: Config,\n _pluginConfig?: PluginConfig,\n): CollectionAfterChangeHook => {\n return async ({ doc, previousDoc, operation, req }) => {\n if (!req || req.context?.skipLogs || req.context?.skipAuditorLogs) {\n return doc;\n }\n\n try {\n const { title, operation: opType } = getCollectionActivityDetails(\n collection,\n operation as 'create' | 'update',\n doc as Record<string, unknown>,\n previousDoc as Record<string, unknown> | undefined,\n );\n const label = getCollectionLabel(collection);\n\n const resourceName = getResourceTitle(doc, doc?.id);\n const isLocalizationEnabled = Boolean(payloadConfig.localization);\n const locale = isLocalizationEnabled ? req.locale : undefined;\n\n const userEmail = req.user?.email || (doc && typeof doc === 'object' && 'email' in doc && typeof doc.email === 'string' ? doc.email : undefined);\n const userDisplay = formatUserDisplay(userEmail);\n const userId = req.user?.id || (doc && typeof doc === 'object' && 'id' in doc ? doc.id : undefined);\n\n await req.payload.create({\n collection: SITE_ACTIVITY_SLUG,\n data: {\n title,\n operation: opType,\n resourceName,\n resourceType: 'collection',\n collectionLabel: label,\n slug: collection.slug,\n documentId: doc?.id ? String(doc.id) : undefined,\n ...(locale ? { locale } : {}),\n ...(userId !== undefined && userId !== null ? { user: userId } : {}),\n ...(userEmail ? { userEmail } : {}),\n ...(userDisplay ? { userDisplay } : {}),\n },\n req,\n overrideAccess: true,\n context: {\n ...req.context,\n skipLogs: true,\n skipAuditorLogs: true,\n },\n });\n }\n catch (error) {\n req.payload?.logger?.error?.(`[payload-loggs] Error logging collection afterChange for ${collection.slug}: ${error}`);\n }\n\n return doc;\n };\n};\n\nexport const createCollectionAfterDeleteHook = (\n collection: CollectionConfig,\n payloadConfig: Config,\n _pluginConfig?: PluginConfig,\n): CollectionAfterDeleteHook => {\n return async ({ doc, id, req }) => {\n if (!req || req.context?.skipLogs || req.context?.skipAuditorLogs) {\n return doc;\n }\n\n try {\n const label = getCollectionLabel(collection);\n const title = `${label} deleted`;\n\n const resourceName = getResourceTitle(doc, id);\n const isLocalizationEnabled = Boolean(payloadConfig.localization);\n const locale = isLocalizationEnabled ? req.locale : undefined;\n\n const userEmail = req.user?.email || (doc && typeof doc === 'object' && 'email' in doc && typeof doc.email === 'string' ? doc.email : undefined);\n const userDisplay = formatUserDisplay(userEmail);\n const userId = req.user?.id || (doc && typeof doc === 'object' && 'id' in doc ? doc.id : undefined);\n\n await req.payload.create({\n collection: SITE_ACTIVITY_SLUG,\n data: {\n title,\n operation: 'delete',\n resourceName,\n resourceType: 'collection',\n collectionLabel: label,\n slug: collection.slug,\n documentId: id ? String(id) : undefined,\n ...(locale ? { locale } : {}),\n ...(userId !== undefined && userId !== null ? { user: userId } : {}),\n ...(userEmail ? { userEmail } : {}),\n ...(userDisplay ? { userDisplay } : {}),\n },\n req,\n overrideAccess: true,\n context: {\n ...req.context,\n skipLogs: true,\n skipAuditorLogs: true,\n },\n });\n }\n catch (error) {\n req.payload?.logger?.error?.(`[payload-loggs] Error logging collection afterDelete for ${collection.slug}: ${error}`);\n }\n\n return doc;\n };\n};\n\nexport const createCollectionAfterLoginHook = (\n collection: CollectionConfig,\n _payloadConfig: Config,\n _pluginConfig?: PluginConfig,\n): CollectionAfterLoginHook => {\n return async ({ user, req }) => {\n if (!req || req.context?.skipLogs || req.context?.skipAuditorLogs) {\n return user;\n }\n\n try {\n const label = getCollectionLabel(collection);\n const userEmail = user?.email || req.user?.email;\n const userDisplay = formatUserDisplay(userEmail);\n const title = userDisplay ? `User ${userDisplay} logged in` : `${label} logged in`;\n\n await req.payload.create({\n collection: SITE_ACTIVITY_SLUG,\n data: {\n title,\n operation: 'login',\n resourceName: userEmail || String(user?.id || 'User'),\n resourceType: 'collection',\n collectionLabel: label,\n slug: collection.slug,\n documentId: user?.id ? String(user.id) : undefined,\n ...(user?.id !== undefined && user?.id !== null ? { user: user.id } : {}),\n ...(userEmail ? { userEmail } : {}),\n ...(userDisplay ? { userDisplay } : {}),\n },\n req,\n overrideAccess: true,\n context: {\n ...req.context,\n skipLogs: true,\n skipAuditorLogs: true,\n },\n });\n }\n catch (error) {\n req.payload?.logger?.error?.(`[payload-loggs] Error logging afterLogin for ${collection.slug}: ${error}`);\n }\n\n return user;\n };\n};\n\nexport const createCollectionAfterLogoutHook = (\n collection: CollectionConfig,\n _payloadConfig: Config,\n _pluginConfig?: PluginConfig,\n): CollectionAfterLogoutHook => {\n return async ({ req }) => {\n if (!req || req.context?.skipLogs || req.context?.skipAuditorLogs) {\n return;\n }\n\n try {\n const label = getCollectionLabel(collection);\n const userEmail = req.user?.email;\n const userDisplay = formatUserDisplay(userEmail);\n const title = userDisplay ? `User ${userDisplay} logged out` : `${label} logged out`;\n\n await req.payload.create({\n collection: SITE_ACTIVITY_SLUG,\n data: {\n title,\n operation: 'logout',\n resourceName: userEmail || String(req.user?.id || 'User'),\n resourceType: 'collection',\n collectionLabel: label,\n slug: collection.slug,\n documentId: req.user?.id ? String(req.user.id) : undefined,\n ...(req.user?.id !== undefined && req.user?.id !== null ? { user: req.user.id } : {}),\n ...(userEmail ? { userEmail } : {}),\n ...(userDisplay ? { userDisplay } : {}),\n },\n req,\n overrideAccess: true,\n context: {\n ...req.context,\n skipLogs: true,\n skipAuditorLogs: true,\n },\n });\n }\n catch (error) {\n req.payload?.logger?.error?.(`[payload-loggs] Error logging afterLogout for ${collection.slug}: ${error}`);\n }\n };\n};\n"],"names":["getResourceTitle","formatUserDisplay","getCollectionLabel","SITE_ACTIVITY_SLUG","getCollectionActivityDetails","createCollectionAfterChangeHook","collection","payloadConfig","_pluginConfig","doc","previousDoc","operation","req","context","skipLogs","skipAuditorLogs","title","opType","label","resourceName","id","isLocalizationEnabled","Boolean","localization","locale","undefined","userEmail","user","email","userDisplay","userId","payload","create","data","resourceType","collectionLabel","slug","documentId","String","overrideAccess","error","logger","createCollectionAfterDeleteHook","createCollectionAfterLoginHook","_payloadConfig","createCollectionAfterLogoutHook"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -2,14 +2,15 @@ import { getResourceTitle } from '../pluginUtils/getResourceTitle.js';
2
2
  import { formatUserDisplay } from '../pluginUtils/formatUserDisplay.js';
3
3
  import { getCollectionLabel } from '../pluginUtils/getCollectionLabel.js';
4
4
  import { SITE_ACTIVITY_SLUG } from '../collections/SiteActivityCollection.js';
5
+ import { getGlobalActivityDetails } from '../pluginUtils/getActivityDetails.js';
5
6
  export const createGlobalAfterChangeHook = (globalConfig, payloadConfig, _pluginConfig)=>{
6
- return async ({ doc, req })=>{
7
+ return async ({ doc, previousDoc, req })=>{
7
8
  if (!req || req.context?.skipLogs || req.context?.skipAuditorLogs) {
8
9
  return doc;
9
10
  }
10
11
  try {
12
+ const { title, operation: opType } = getGlobalActivityDetails(globalConfig, doc, previousDoc);
11
13
  const label = getCollectionLabel(globalConfig);
12
- const title = `Global ${label} updated`;
13
14
  const resourceName = getResourceTitle(doc) || label;
14
15
  const isLocalizationEnabled = Boolean(payloadConfig.localization);
15
16
  const locale = isLocalizationEnabled ? req.locale : undefined;
@@ -20,7 +21,7 @@ export const createGlobalAfterChangeHook = (globalConfig, payloadConfig, _plugin
20
21
  collection: SITE_ACTIVITY_SLUG,
21
22
  data: {
22
23
  title,
23
- operation: 'update',
24
+ operation: opType,
24
25
  resourceName,
25
26
  resourceType: 'global',
26
27
  collectionLabel: label,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/globalHooks.ts"],"sourcesContent":["import type { Config, GlobalAfterChangeHook, GlobalConfig } from 'payload';\n\nimport type { PluginConfig } from '../types/config.js';\nimport { getResourceTitle } from '../pluginUtils/getResourceTitle.js';\nimport { formatUserDisplay } from '../pluginUtils/formatUserDisplay.js';\nimport { getCollectionLabel } from '../pluginUtils/getCollectionLabel.js';\nimport { SITE_ACTIVITY_SLUG } from '../collections/SiteActivityCollection.js';\n\nexport const createGlobalAfterChangeHook = (\n globalConfig: GlobalConfig,\n payloadConfig: Config,\n _pluginConfig?: PluginConfig,\n): GlobalAfterChangeHook => {\n return async ({ doc, req }) => {\n if (!req || req.context?.skipLogs || req.context?.skipAuditorLogs) {\n return doc;\n }\n\n try {\n const label = getCollectionLabel(globalConfig);\n const title = `Global ${label} updated`;\n\n const resourceName = getResourceTitle(doc) || label;\n const isLocalizationEnabled = Boolean(payloadConfig.localization);\n const locale = isLocalizationEnabled ? req.locale : undefined;\n\n const userEmail = req.user?.email;\n const userDisplay = formatUserDisplay(userEmail);\n const userId = req.user?.id;\n\n await req.payload.create({\n collection: SITE_ACTIVITY_SLUG,\n data: {\n title,\n operation: 'update',\n resourceName,\n resourceType: 'global',\n collectionLabel: label,\n slug: globalConfig.slug,\n ...(locale ? { locale } : {}),\n ...(userId !== undefined && userId !== null ? { user: userId } : {}),\n ...(userEmail ? { userEmail } : {}),\n ...(userDisplay ? { userDisplay } : {}),\n },\n req,\n overrideAccess: true,\n context: {\n ...req.context,\n skipLogs: true,\n skipAuditorLogs: true,\n },\n });\n }\n catch (error) {\n req.payload?.logger?.error?.(`[payload-loggs] Error logging global afterChange for ${globalConfig.slug}: ${error}`);\n }\n\n return doc;\n };\n};\n"],"names":["getResourceTitle","formatUserDisplay","getCollectionLabel","SITE_ACTIVITY_SLUG","createGlobalAfterChangeHook","globalConfig","payloadConfig","_pluginConfig","doc","req","context","skipLogs","skipAuditorLogs","label","title","resourceName","isLocalizationEnabled","Boolean","localization","locale","undefined","userEmail","user","email","userDisplay","userId","id","payload","create","collection","data","operation","resourceType","collectionLabel","slug","overrideAccess","error","logger"],"mappings":"AAGA,SAASA,gBAAgB,QAAQ,qCAAqC;AACtE,SAASC,iBAAiB,QAAQ,sCAAsC;AACxE,SAASC,kBAAkB,QAAQ,uCAAuC;AAC1E,SAASC,kBAAkB,QAAQ,2CAA2C;AAE9E,OAAO,MAAMC,8BAA8B,CACzCC,cACAC,eACAC;IAEA,OAAO,OAAO,EAAEC,GAAG,EAAEC,GAAG,EAAE;QACxB,IAAI,CAACA,OAAOA,IAAIC,OAAO,EAAEC,YAAYF,IAAIC,OAAO,EAAEE,iBAAiB;YACjE,OAAOJ;QACT;QAEA,IAAI;YACF,MAAMK,QAAQX,mBAAmBG;YACjC,MAAMS,QAAQ,CAAC,OAAO,EAAED,MAAM,QAAQ,CAAC;YAEvC,MAAME,eAAef,iBAAiBQ,QAAQK;YAC9C,MAAMG,wBAAwBC,QAAQX,cAAcY,YAAY;YAChE,MAAMC,SAASH,wBAAwBP,IAAIU,MAAM,GAAGC;YAEpD,MAAMC,YAAYZ,IAAIa,IAAI,EAAEC;YAC5B,MAAMC,cAAcvB,kBAAkBoB;YACtC,MAAMI,SAAShB,IAAIa,IAAI,EAAEI;YAEzB,MAAMjB,IAAIkB,OAAO,CAACC,MAAM,CAAC;gBACvBC,YAAY1B;gBACZ2B,MAAM;oBACJhB;oBACAiB,WAAW;oBACXhB;oBACAiB,cAAc;oBACdC,iBAAiBpB;oBACjBqB,MAAM7B,aAAa6B,IAAI;oBACvB,GAAIf,SAAS;wBAAEA;oBAAO,IAAI,CAAC,CAAC;oBAC5B,GAAIM,WAAWL,aAAaK,WAAW,OAAO;wBAAEH,MAAMG;oBAAO,IAAI,CAAC,CAAC;oBACnE,GAAIJ,YAAY;wBAAEA;oBAAU,IAAI,CAAC,CAAC;oBAClC,GAAIG,cAAc;wBAAEA;oBAAY,IAAI,CAAC,CAAC;gBACxC;gBACAf;gBACA0B,gBAAgB;gBAChBzB,SAAS;oBACP,GAAGD,IAAIC,OAAO;oBACdC,UAAU;oBACVC,iBAAiB;gBACnB;YACF;QACF,EACA,OAAOwB,OAAO;YACZ3B,IAAIkB,OAAO,EAAEU,QAAQD,QAAQ,CAAC,qDAAqD,EAAE/B,aAAa6B,IAAI,CAAC,EAAE,EAAEE,OAAO;QACpH;QAEA,OAAO5B;IACT;AACF,EAAE"}
1
+ {"version":3,"sources":["../../src/hooks/globalHooks.ts"],"sourcesContent":["import type { Config, GlobalAfterChangeHook, GlobalConfig } from 'payload';\n\nimport type { PluginConfig } from '../types/config.js';\nimport { getResourceTitle } from '../pluginUtils/getResourceTitle.js';\nimport { formatUserDisplay } from '../pluginUtils/formatUserDisplay.js';\nimport { getCollectionLabel } from '../pluginUtils/getCollectionLabel.js';\nimport { SITE_ACTIVITY_SLUG } from '../collections/SiteActivityCollection.js';\nimport { getGlobalActivityDetails } from '../pluginUtils/getActivityDetails.js';\n\nexport const createGlobalAfterChangeHook = (\n globalConfig: GlobalConfig,\n payloadConfig: Config,\n _pluginConfig?: PluginConfig,\n): GlobalAfterChangeHook => {\n return async ({ doc, previousDoc, req }: { doc: Record<string, unknown>; previousDoc?: Record<string, unknown>; req?: any }) => {\n if (!req || req.context?.skipLogs || req.context?.skipAuditorLogs) {\n return doc;\n }\n\n try {\n const { title, operation: opType } = getGlobalActivityDetails(\n globalConfig,\n doc as Record<string, unknown>,\n previousDoc as Record<string, unknown> | undefined,\n );\n const label = getCollectionLabel(globalConfig);\n\n const resourceName = getResourceTitle(doc) || label;\n const isLocalizationEnabled = Boolean(payloadConfig.localization);\n const locale = isLocalizationEnabled ? req.locale : undefined;\n\n const userEmail = req.user?.email;\n const userDisplay = formatUserDisplay(userEmail);\n const userId = req.user?.id;\n\n await req.payload.create({\n collection: SITE_ACTIVITY_SLUG,\n data: {\n title,\n operation: opType,\n resourceName,\n resourceType: 'global',\n collectionLabel: label,\n slug: globalConfig.slug,\n ...(locale ? { locale } : {}),\n ...(userId !== undefined && userId !== null ? { user: userId } : {}),\n ...(userEmail ? { userEmail } : {}),\n ...(userDisplay ? { userDisplay } : {}),\n },\n req,\n overrideAccess: true,\n context: {\n ...req.context,\n skipLogs: true,\n skipAuditorLogs: true,\n },\n });\n }\n catch (error) {\n req.payload?.logger?.error?.(`[payload-loggs] Error logging global afterChange for ${globalConfig.slug}: ${error}`);\n }\n\n return doc;\n };\n};\n"],"names":["getResourceTitle","formatUserDisplay","getCollectionLabel","SITE_ACTIVITY_SLUG","getGlobalActivityDetails","createGlobalAfterChangeHook","globalConfig","payloadConfig","_pluginConfig","doc","previousDoc","req","context","skipLogs","skipAuditorLogs","title","operation","opType","label","resourceName","isLocalizationEnabled","Boolean","localization","locale","undefined","userEmail","user","email","userDisplay","userId","id","payload","create","collection","data","resourceType","collectionLabel","slug","overrideAccess","error","logger"],"mappings":"AAGA,SAASA,gBAAgB,QAAQ,qCAAqC;AACtE,SAASC,iBAAiB,QAAQ,sCAAsC;AACxE,SAASC,kBAAkB,QAAQ,uCAAuC;AAC1E,SAASC,kBAAkB,QAAQ,2CAA2C;AAC9E,SAASC,wBAAwB,QAAQ,uCAAuC;AAEhF,OAAO,MAAMC,8BAA8B,CACzCC,cACAC,eACAC;IAEA,OAAO,OAAO,EAAEC,GAAG,EAAEC,WAAW,EAAEC,GAAG,EAAsF;QACzH,IAAI,CAACA,OAAOA,IAAIC,OAAO,EAAEC,YAAYF,IAAIC,OAAO,EAAEE,iBAAiB;YACjE,OAAOL;QACT;QAEA,IAAI;YACF,MAAM,EAAEM,KAAK,EAAEC,WAAWC,MAAM,EAAE,GAAGb,yBACnCE,cACAG,KACAC;YAEF,MAAMQ,QAAQhB,mBAAmBI;YAEjC,MAAMa,eAAenB,iBAAiBS,QAAQS;YAC9C,MAAME,wBAAwBC,QAAQd,cAAce,YAAY;YAChE,MAAMC,SAASH,wBAAwBT,IAAIY,MAAM,GAAGC;YAEpD,MAAMC,YAAYd,IAAIe,IAAI,EAAEC;YAC5B,MAAMC,cAAc3B,kBAAkBwB;YACtC,MAAMI,SAASlB,IAAIe,IAAI,EAAEI;YAEzB,MAAMnB,IAAIoB,OAAO,CAACC,MAAM,CAAC;gBACvBC,YAAY9B;gBACZ+B,MAAM;oBACJnB;oBACAC,WAAWC;oBACXE;oBACAgB,cAAc;oBACdC,iBAAiBlB;oBACjBmB,MAAM/B,aAAa+B,IAAI;oBACvB,GAAId,SAAS;wBAAEA;oBAAO,IAAI,CAAC,CAAC;oBAC5B,GAAIM,WAAWL,aAAaK,WAAW,OAAO;wBAAEH,MAAMG;oBAAO,IAAI,CAAC,CAAC;oBACnE,GAAIJ,YAAY;wBAAEA;oBAAU,IAAI,CAAC,CAAC;oBAClC,GAAIG,cAAc;wBAAEA;oBAAY,IAAI,CAAC,CAAC;gBACxC;gBACAjB;gBACA2B,gBAAgB;gBAChB1B,SAAS;oBACP,GAAGD,IAAIC,OAAO;oBACdC,UAAU;oBACVC,iBAAiB;gBACnB;YACF;QACF,EACA,OAAOyB,OAAO;YACZ5B,IAAIoB,OAAO,EAAES,QAAQD,QAAQ,CAAC,qDAAqD,EAAEjC,aAAa+B,IAAI,CAAC,EAAE,EAAEE,OAAO;QACpH;QAEA,OAAO9B;IACT;AACF,EAAE"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,8 @@
1
+ import type { CollectionConfig, GlobalConfig } from 'payload';
2
+ import type { SiteActivityLogData } from '../collections/SiteActivityCollection.js';
3
+ export interface ActivityDetails {
4
+ title: string;
5
+ operation: SiteActivityLogData['operation'];
6
+ }
7
+ export declare function getCollectionActivityDetails(collection: CollectionConfig, operation: 'create' | 'update', doc: Record<string, unknown> | undefined, previousDoc?: Record<string, unknown>): ActivityDetails;
8
+ export declare function getGlobalActivityDetails(globalConfig: GlobalConfig, doc: Record<string, unknown> | undefined, previousDoc?: Record<string, unknown>): ActivityDetails;
@@ -0,0 +1,89 @@
1
+ import { getCollectionLabel } from './getCollectionLabel.js';
2
+ export function getCollectionActivityDetails(collection, operation, doc, previousDoc) {
3
+ const label = getCollectionLabel(collection);
4
+ const isCreate = operation === 'create' || !previousDoc;
5
+ const currentStatus = doc && typeof doc === 'object' && '_status' in doc && typeof doc._status === 'string' ? doc._status : undefined;
6
+ const prevStatus = previousDoc && typeof previousDoc === 'object' && '_status' in previousDoc && typeof previousDoc._status === 'string' ? previousDoc._status : undefined;
7
+ if (currentStatus) {
8
+ if (isCreate) {
9
+ if (currentStatus === 'draft') {
10
+ return {
11
+ title: `${label} created as draft`,
12
+ operation: 'create'
13
+ };
14
+ }
15
+ if (currentStatus === 'published') {
16
+ return {
17
+ title: `${label} published`,
18
+ operation: 'publish'
19
+ };
20
+ }
21
+ } else {
22
+ if (prevStatus === 'draft' && currentStatus === 'published') {
23
+ return {
24
+ title: `${label} published`,
25
+ operation: 'publish'
26
+ };
27
+ }
28
+ if (prevStatus === 'published' && currentStatus === 'draft') {
29
+ return {
30
+ title: `${label} unpublished`,
31
+ operation: 'unpublish'
32
+ };
33
+ }
34
+ if (currentStatus === 'draft') {
35
+ return {
36
+ title: `${label} draft updated`,
37
+ operation: 'update'
38
+ };
39
+ }
40
+ if (currentStatus === 'published') {
41
+ return {
42
+ title: `${label} modified`,
43
+ operation: 'update'
44
+ };
45
+ }
46
+ }
47
+ }
48
+ return {
49
+ title: isCreate ? `${label} created` : `${label} modified`,
50
+ operation: isCreate ? 'create' : 'update'
51
+ };
52
+ }
53
+ export function getGlobalActivityDetails(globalConfig, doc, previousDoc) {
54
+ const label = getCollectionLabel(globalConfig);
55
+ const currentStatus = doc && typeof doc === 'object' && '_status' in doc && typeof doc._status === 'string' ? doc._status : undefined;
56
+ const prevStatus = previousDoc && typeof previousDoc === 'object' && '_status' in previousDoc && typeof previousDoc._status === 'string' ? previousDoc._status : undefined;
57
+ if (currentStatus) {
58
+ if (prevStatus === 'draft' && currentStatus === 'published') {
59
+ return {
60
+ title: `Global ${label} published`,
61
+ operation: 'publish'
62
+ };
63
+ }
64
+ if (prevStatus === 'published' && currentStatus === 'draft') {
65
+ return {
66
+ title: `Global ${label} unpublished`,
67
+ operation: 'unpublish'
68
+ };
69
+ }
70
+ if (currentStatus === 'draft') {
71
+ return {
72
+ title: `Global ${label} draft updated`,
73
+ operation: 'update'
74
+ };
75
+ }
76
+ if (currentStatus === 'published') {
77
+ return {
78
+ title: `Global ${label} updated`,
79
+ operation: 'update'
80
+ };
81
+ }
82
+ }
83
+ return {
84
+ title: `Global ${label} updated`,
85
+ operation: 'update'
86
+ };
87
+ }
88
+
89
+ //# sourceMappingURL=getActivityDetails.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/pluginUtils/getActivityDetails.ts"],"sourcesContent":["import type { CollectionConfig, GlobalConfig } from 'payload';\n\nimport { getCollectionLabel } from './getCollectionLabel.js';\nimport type { SiteActivityLogData } from '../collections/SiteActivityCollection.js';\n\nexport interface ActivityDetails {\n title: string;\n operation: SiteActivityLogData['operation'];\n}\n\nexport function getCollectionActivityDetails(\n collection: CollectionConfig,\n operation: 'create' | 'update',\n doc: Record<string, unknown> | undefined,\n previousDoc?: Record<string, unknown>,\n): ActivityDetails {\n const label = getCollectionLabel(collection);\n const isCreate = operation === 'create' || !previousDoc;\n\n const currentStatus = doc && typeof doc === 'object' && '_status' in doc && typeof doc._status === 'string'\n ? doc._status\n : undefined;\n const prevStatus = previousDoc && typeof previousDoc === 'object' && '_status' in previousDoc && typeof previousDoc._status === 'string'\n ? previousDoc._status\n : undefined;\n\n if (currentStatus) {\n if (isCreate) {\n if (currentStatus === 'draft') {\n return {\n title: `${label} created as draft`,\n operation: 'create',\n };\n }\n if (currentStatus === 'published') {\n return {\n title: `${label} published`,\n operation: 'publish',\n };\n }\n }\n else {\n if (prevStatus === 'draft' && currentStatus === 'published') {\n return {\n title: `${label} published`,\n operation: 'publish',\n };\n }\n if (prevStatus === 'published' && currentStatus === 'draft') {\n return {\n title: `${label} unpublished`,\n operation: 'unpublish',\n };\n }\n if (currentStatus === 'draft') {\n return {\n title: `${label} draft updated`,\n operation: 'update',\n };\n }\n if (currentStatus === 'published') {\n return {\n title: `${label} modified`,\n operation: 'update',\n };\n }\n }\n }\n\n return {\n title: isCreate ? `${label} created` : `${label} modified`,\n operation: isCreate ? 'create' : 'update',\n };\n}\n\nexport function getGlobalActivityDetails(\n globalConfig: GlobalConfig,\n doc: Record<string, unknown> | undefined,\n previousDoc?: Record<string, unknown>,\n): ActivityDetails {\n const label = getCollectionLabel(globalConfig);\n\n const currentStatus = doc && typeof doc === 'object' && '_status' in doc && typeof doc._status === 'string'\n ? doc._status\n : undefined;\n const prevStatus = previousDoc && typeof previousDoc === 'object' && '_status' in previousDoc && typeof previousDoc._status === 'string'\n ? previousDoc._status\n : undefined;\n\n if (currentStatus) {\n if (prevStatus === 'draft' && currentStatus === 'published') {\n return {\n title: `Global ${label} published`,\n operation: 'publish',\n };\n }\n if (prevStatus === 'published' && currentStatus === 'draft') {\n return {\n title: `Global ${label} unpublished`,\n operation: 'unpublish',\n };\n }\n if (currentStatus === 'draft') {\n return {\n title: `Global ${label} draft updated`,\n operation: 'update',\n };\n }\n if (currentStatus === 'published') {\n return {\n title: `Global ${label} updated`,\n operation: 'update',\n };\n }\n }\n\n return {\n title: `Global ${label} updated`,\n operation: 'update',\n };\n}\n"],"names":["getCollectionLabel","getCollectionActivityDetails","collection","operation","doc","previousDoc","label","isCreate","currentStatus","_status","undefined","prevStatus","title","getGlobalActivityDetails","globalConfig"],"mappings":"AAEA,SAASA,kBAAkB,QAAQ,0BAA0B;AAQ7D,OAAO,SAASC,6BACdC,UAA4B,EAC5BC,SAA8B,EAC9BC,GAAwC,EACxCC,WAAqC;IAErC,MAAMC,QAAQN,mBAAmBE;IACjC,MAAMK,WAAWJ,cAAc,YAAY,CAACE;IAE5C,MAAMG,gBAAgBJ,OAAO,OAAOA,QAAQ,YAAY,aAAaA,OAAO,OAAOA,IAAIK,OAAO,KAAK,WAC/FL,IAAIK,OAAO,GACXC;IACJ,MAAMC,aAAaN,eAAe,OAAOA,gBAAgB,YAAY,aAAaA,eAAe,OAAOA,YAAYI,OAAO,KAAK,WAC5HJ,YAAYI,OAAO,GACnBC;IAEJ,IAAIF,eAAe;QACjB,IAAID,UAAU;YACZ,IAAIC,kBAAkB,SAAS;gBAC7B,OAAO;oBACLI,OAAO,GAAGN,MAAM,iBAAiB,CAAC;oBAClCH,WAAW;gBACb;YACF;YACA,IAAIK,kBAAkB,aAAa;gBACjC,OAAO;oBACLI,OAAO,GAAGN,MAAM,UAAU,CAAC;oBAC3BH,WAAW;gBACb;YACF;QACF,OACK;YACH,IAAIQ,eAAe,WAAWH,kBAAkB,aAAa;gBAC3D,OAAO;oBACLI,OAAO,GAAGN,MAAM,UAAU,CAAC;oBAC3BH,WAAW;gBACb;YACF;YACA,IAAIQ,eAAe,eAAeH,kBAAkB,SAAS;gBAC3D,OAAO;oBACLI,OAAO,GAAGN,MAAM,YAAY,CAAC;oBAC7BH,WAAW;gBACb;YACF;YACA,IAAIK,kBAAkB,SAAS;gBAC7B,OAAO;oBACLI,OAAO,GAAGN,MAAM,cAAc,CAAC;oBAC/BH,WAAW;gBACb;YACF;YACA,IAAIK,kBAAkB,aAAa;gBACjC,OAAO;oBACLI,OAAO,GAAGN,MAAM,SAAS,CAAC;oBAC1BH,WAAW;gBACb;YACF;QACF;IACF;IAEA,OAAO;QACLS,OAAOL,WAAW,GAAGD,MAAM,QAAQ,CAAC,GAAG,GAAGA,MAAM,SAAS,CAAC;QAC1DH,WAAWI,WAAW,WAAW;IACnC;AACF;AAEA,OAAO,SAASM,yBACdC,YAA0B,EAC1BV,GAAwC,EACxCC,WAAqC;IAErC,MAAMC,QAAQN,mBAAmBc;IAEjC,MAAMN,gBAAgBJ,OAAO,OAAOA,QAAQ,YAAY,aAAaA,OAAO,OAAOA,IAAIK,OAAO,KAAK,WAC/FL,IAAIK,OAAO,GACXC;IACJ,MAAMC,aAAaN,eAAe,OAAOA,gBAAgB,YAAY,aAAaA,eAAe,OAAOA,YAAYI,OAAO,KAAK,WAC5HJ,YAAYI,OAAO,GACnBC;IAEJ,IAAIF,eAAe;QACjB,IAAIG,eAAe,WAAWH,kBAAkB,aAAa;YAC3D,OAAO;gBACLI,OAAO,CAAC,OAAO,EAAEN,MAAM,UAAU,CAAC;gBAClCH,WAAW;YACb;QACF;QACA,IAAIQ,eAAe,eAAeH,kBAAkB,SAAS;YAC3D,OAAO;gBACLI,OAAO,CAAC,OAAO,EAAEN,MAAM,YAAY,CAAC;gBACpCH,WAAW;YACb;QACF;QACA,IAAIK,kBAAkB,SAAS;YAC7B,OAAO;gBACLI,OAAO,CAAC,OAAO,EAAEN,MAAM,cAAc,CAAC;gBACtCH,WAAW;YACb;QACF;QACA,IAAIK,kBAAkB,aAAa;YACjC,OAAO;gBACLI,OAAO,CAAC,OAAO,EAAEN,MAAM,QAAQ,CAAC;gBAChCH,WAAW;YACb;QACF;IACF;IAEA,OAAO;QACLS,OAAO,CAAC,OAAO,EAAEN,MAAM,QAAQ,CAAC;QAChCH,WAAW;IACb;AACF"}
@@ -0,0 +1 @@
1
+ export {};
@@ -7,7 +7,7 @@ export type CollectionHookDebugConfig = {
7
7
  skipDatabaseSave?: true;
8
8
  } | true;
9
9
  export type CollectionHooksKeys = keyof NonNullable<CollectionConfig['hooks']>;
10
- export type CollectionHooksOperation = AllOperations | 'read' | 'delete' | 'error' | 'login' | 'logout' | 'me' | 'refresh' | 'forgotPassword' | '';
10
+ export type CollectionHooksOperation = AllOperations | 'read' | 'delete' | 'error' | 'login' | 'logout' | 'me' | 'refresh' | 'forgotPassword' | 'publish' | 'unpublish' | '';
11
11
  export type CollectionHooksArgsParameterUnion = Parameters<NonNullable<NonNullable<CollectionConfig['hooks']>[CollectionHooksKeys]>[number]>[0];
12
12
  export type PayloadCollectionHooksMap = {
13
13
  [K in CollectionHooksKeys]: NonNullable<NonNullable<CollectionConfig['hooks']>[K]>[number];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/types/collection.ts"],"sourcesContent":["import type { AllOperations, CollectionConfig, PayloadTypes } from 'payload';\n\nimport type { SiteActivityLog } from '../collections/siteActivity.js';\n\nexport type OperationDebugConfig = {\n skipDatabaseSave?: boolean;\n} | true;\n\nexport type CollectionHookDebugConfig = {\n skipDatabaseSave?: true;\n} | true;\n\nexport type CollectionHooksKeys = keyof NonNullable<CollectionConfig['hooks']>;\nexport type CollectionHooksOperation = AllOperations | 'read' | 'delete' | 'error' | 'login' | 'logout' | 'me' | 'refresh' | 'forgotPassword' | '';\nexport type CollectionHooksArgsParameterUnion = Parameters<\n NonNullable<\n NonNullable<\n CollectionConfig['hooks']\n >[CollectionHooksKeys]\n >[number]\n>[0];\n\nexport type PayloadCollectionHooksMap = {\n [K in CollectionHooksKeys]: NonNullable<NonNullable<CollectionConfig['hooks']>[K]>[number]\n};\nexport type CollectionsHookConfigForTracking = {\n [K in keyof NonNullable<CollectionConfig['hooks']>]:\n Partial<\n {\n // @ts-expect-error\n [O in Parameters<\n NonNullable<\n NonNullable<\n CollectionConfig['hooks']\n >[K]\n >[number]\n >[0]['operation']]: CollectionOperationLogConfig | boolean\n } & CollectionHookLevelLogConfig<K>\n > | boolean\n};\n\nexport interface CollectionOperationLogConfig<\n HookName extends CollectionHooksKeys = CollectionHooksKeys,\n> {\n customLogger?: (\n args: Parameters<PayloadCollectionHooksMap[HookName]>[0],\n fields: Omit<SiteActivityLog, 'hook' | 'operation'>,\n ) => any | Promise<any>;\n enabled?: boolean;\n debug?: OperationDebugConfig;\n}\n\nexport interface CollectionHookLevelLogConfig<\n HookName extends CollectionHooksKeys = CollectionHooksKeys,\n> {\n customLogger?: (\n args: Parameters<PayloadCollectionHooksMap[HookName]>[0],\n fields: Omit<SiteActivityLog, 'hook'>,\n ) => Omit<SiteActivityLog, 'hook'> | Promise<Omit<SiteActivityLog, 'hook'>>;\n enabled?: boolean;\n debug?: CollectionHookDebugConfig;\n}\n\nexport interface TrackedCollection {\n hooks?: Partial<CollectionsHookConfigForTracking>;\n slug: keyof PayloadTypes['collections'];\n}\nexport interface CollectionsTrackConfig {\n track: TrackedCollection[];\n}\n"],"names":[],"mappings":"AAmEA,WAEC"}
1
+ {"version":3,"sources":["../../src/types/collection.ts"],"sourcesContent":["import type { AllOperations, CollectionConfig, PayloadTypes } from 'payload';\n\nimport type { SiteActivityLog } from '../collections/siteActivity.js';\n\nexport type OperationDebugConfig = {\n skipDatabaseSave?: boolean;\n} | true;\n\nexport type CollectionHookDebugConfig = {\n skipDatabaseSave?: true;\n} | true;\n\nexport type CollectionHooksKeys = keyof NonNullable<CollectionConfig['hooks']>;\nexport type CollectionHooksOperation = AllOperations | 'read' | 'delete' | 'error' | 'login' | 'logout' | 'me' | 'refresh' | 'forgotPassword' | 'publish' | 'unpublish' | '';\nexport type CollectionHooksArgsParameterUnion = Parameters<\n NonNullable<\n NonNullable<\n CollectionConfig['hooks']\n >[CollectionHooksKeys]\n >[number]\n>[0];\n\nexport type PayloadCollectionHooksMap = {\n [K in CollectionHooksKeys]: NonNullable<NonNullable<CollectionConfig['hooks']>[K]>[number]\n};\nexport type CollectionsHookConfigForTracking = {\n [K in keyof NonNullable<CollectionConfig['hooks']>]:\n Partial<\n {\n // @ts-expect-error\n [O in Parameters<\n NonNullable<\n NonNullable<\n CollectionConfig['hooks']\n >[K]\n >[number]\n >[0]['operation']]: CollectionOperationLogConfig | boolean\n } & CollectionHookLevelLogConfig<K>\n > | boolean\n};\n\nexport interface CollectionOperationLogConfig<\n HookName extends CollectionHooksKeys = CollectionHooksKeys,\n> {\n customLogger?: (\n args: Parameters<PayloadCollectionHooksMap[HookName]>[0],\n fields: Omit<SiteActivityLog, 'hook' | 'operation'>,\n ) => any | Promise<any>;\n enabled?: boolean;\n debug?: OperationDebugConfig;\n}\n\nexport interface CollectionHookLevelLogConfig<\n HookName extends CollectionHooksKeys = CollectionHooksKeys,\n> {\n customLogger?: (\n args: Parameters<PayloadCollectionHooksMap[HookName]>[0],\n fields: Omit<SiteActivityLog, 'hook'>,\n ) => Omit<SiteActivityLog, 'hook'> | Promise<Omit<SiteActivityLog, 'hook'>>;\n enabled?: boolean;\n debug?: CollectionHookDebugConfig;\n}\n\nexport interface TrackedCollection {\n hooks?: Partial<CollectionsHookConfigForTracking>;\n slug: keyof PayloadTypes['collections'];\n}\nexport interface CollectionsTrackConfig {\n track: TrackedCollection[];\n}\n"],"names":[],"mappings":"AAmEA,WAEC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@brandlift/payload-loggs",
3
3
  "type": "module",
4
- "version": "1.0.5",
4
+ "version": "1.2.0",
5
5
  "packageManager": "pnpm@10.2.0",
6
6
  "description": "Zero-config activity feed, audit logging, and security tracking plugin for Payload CMS",
7
7
  "author": {
@@ -122,6 +122,7 @@
122
122
  },
123
123
  "publishConfig": {
124
124
  "access": "public",
125
+ "minimumReleaseAge": 0,
125
126
  "exports": {
126
127
  ".": {
127
128
  "types": "./dist/index.d.ts",