payload 3.0.0-beta.115 → 3.0.0-beta.117
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/dist/auth/jwt.d.ts +9 -0
- package/dist/auth/jwt.d.ts.map +1 -0
- package/dist/auth/jwt.js +16 -0
- package/dist/auth/jwt.js.map +1 -0
- package/dist/auth/operations/login.d.ts.map +1 -1
- package/dist/auth/operations/login.js +6 -4
- package/dist/auth/operations/login.js.map +1 -1
- package/dist/auth/operations/me.js +2 -2
- package/dist/auth/operations/me.js.map +1 -1
- package/dist/auth/operations/refresh.d.ts.map +1 -1
- package/dist/auth/operations/refresh.js +5 -4
- package/dist/auth/operations/refresh.js.map +1 -1
- package/dist/auth/operations/resetPassword.d.ts.map +1 -1
- package/dist/auth/operations/resetPassword.js +5 -3
- package/dist/auth/operations/resetPassword.js.map +1 -1
- package/dist/auth/strategies/jwt.js +3 -2
- package/dist/auth/strategies/jwt.js.map +1 -1
- package/dist/database/migrations/migrationsCollection.d.ts.map +1 -1
- package/dist/database/migrations/migrationsCollection.js +2 -1
- package/dist/database/migrations/migrationsCollection.js.map +1 -1
- package/dist/lockedDocuments/lockedDocumentsCollection.d.ts.map +1 -1
- package/dist/lockedDocuments/lockedDocumentsCollection.js +2 -1
- package/dist/lockedDocuments/lockedDocumentsCollection.js.map +1 -1
- package/dist/preferences/preferencesCollection.d.ts.map +1 -1
- package/dist/preferences/preferencesCollection.js +2 -1
- package/dist/preferences/preferencesCollection.js.map +1 -1
- package/dist/utilities/checkDocumentLockStatus.d.ts.map +1 -1
- package/dist/utilities/checkDocumentLockStatus.js +4 -1
- package/dist/utilities/checkDocumentLockStatus.js.map +1 -1
- package/dist/utilities/getEntityPolicies.d.ts.map +1 -1
- package/dist/utilities/getEntityPolicies.js +6 -11
- package/dist/utilities/getEntityPolicies.js.map +1 -1
- package/dist/utilities/logger.d.ts +3 -2
- package/dist/utilities/logger.d.ts.map +1 -1
- package/dist/utilities/logger.js.map +1 -1
- package/dist/versions/drafts/appendVersionToQueryKey.d.ts +1 -1
- package/dist/versions/drafts/appendVersionToQueryKey.d.ts.map +1 -1
- package/dist/versions/drafts/appendVersionToQueryKey.js +1 -1
- package/dist/versions/drafts/appendVersionToQueryKey.js.map +1 -1
- package/dist/versions/getLatestCollectionVersion.d.ts.map +1 -1
- package/dist/versions/getLatestCollectionVersion.js +3 -1
- package/dist/versions/getLatestCollectionVersion.js.map +1 -1
- package/package.json +6 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../../src/auth/jwt.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,OAAO,+CAIjB;IACD,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,MAAM,EAAE,MAAM,CAAA;IACd,eAAe,EAAE,MAAM,CAAA;CACxB;;;EAUA,CAAA"}
|
package/dist/auth/jwt.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { SignJWT } from 'jose';
|
|
2
|
+
export const jwtSign = async ({ fieldsToSign, secret, tokenExpiration })=>{
|
|
3
|
+
const secretKey = new TextEncoder().encode(secret);
|
|
4
|
+
const issuedAt = Math.floor(Date.now() / 1000);
|
|
5
|
+
const exp = issuedAt + tokenExpiration;
|
|
6
|
+
const token = await new SignJWT(fieldsToSign).setProtectedHeader({
|
|
7
|
+
alg: 'HS256',
|
|
8
|
+
typ: 'JWT'
|
|
9
|
+
}).setIssuedAt(issuedAt).setExpirationTime(exp).sign(secretKey);
|
|
10
|
+
return {
|
|
11
|
+
exp,
|
|
12
|
+
token
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=jwt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/auth/jwt.ts"],"sourcesContent":["import { SignJWT } from 'jose'\n\nexport const jwtSign = async ({\n fieldsToSign,\n secret,\n tokenExpiration,\n}: {\n fieldsToSign: Record<string, unknown>\n secret: string\n tokenExpiration: number\n}) => {\n const secretKey = new TextEncoder().encode(secret)\n const issuedAt = Math.floor(Date.now() / 1000)\n const exp = issuedAt + tokenExpiration\n const token = await new SignJWT(fieldsToSign)\n .setProtectedHeader({ alg: 'HS256', typ: 'JWT' })\n .setIssuedAt(issuedAt)\n .setExpirationTime(exp)\n .sign(secretKey)\n return { exp, token }\n}\n"],"names":["SignJWT","jwtSign","fieldsToSign","secret","tokenExpiration","secretKey","TextEncoder","encode","issuedAt","Math","floor","Date","now","exp","token","setProtectedHeader","alg","typ","setIssuedAt","setExpirationTime","sign"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAM;AAE9B,OAAO,MAAMC,UAAU,OAAO,EAC5BC,YAAY,EACZC,MAAM,EACNC,eAAe,EAKhB;IACC,MAAMC,YAAY,IAAIC,cAAcC,MAAM,CAACJ;IAC3C,MAAMK,WAAWC,KAAKC,KAAK,CAACC,KAAKC,GAAG,KAAK;IACzC,MAAMC,MAAML,WAAWJ;IACvB,MAAMU,QAAQ,MAAM,IAAId,QAAQE,cAC7Ba,kBAAkB,CAAC;QAAEC,KAAK;QAASC,KAAK;IAAM,GAC9CC,WAAW,CAACV,UACZW,iBAAiB,CAACN,KAClBO,IAAI,CAACf;IACR,OAAO;QAAEQ;QAAKC;IAAM;AACtB,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/auth/operations/login.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/auth/operations/login.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gCAAgC,EAChC,UAAU,EACV,sBAAsB,EACvB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,KAAK,EAAE,cAAc,EAAS,MAAM,sBAAsB,CAAA;AACjE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAcvC,MAAM,MAAM,MAAM,GAAG;IACnB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,IAAI,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,SAAS,CAAC,KAAK,SAAS,cAAc,IAAI;IACpD,UAAU,EAAE,UAAU,CAAA;IACtB,IAAI,EAAE,gCAAgC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAA;IACtD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,GAAG,EAAE,cAAc,CAAA;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,CAAA;AAED,eAAO,MAAM,cAAc,GAAU,KAAK,SAAS,cAAc,gBACjD,SAAS,CAAC,KAAK,CAAC,KAC7B,OAAO,CAAC;IAAE,IAAI,EAAE,sBAAsB,CAAC,KAAK,CAAC,CAAA;CAAE,GAAG,MAAM,CA0S1D,CAAA"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import jwt from 'jsonwebtoken';
|
|
2
1
|
import { buildAfterOperation } from '../../collections/operations/utils.js';
|
|
3
2
|
import { AuthenticationError, LockedAuth, ValidationError } from '../../errors/index.js';
|
|
4
3
|
import { afterRead } from '../../fields/hooks/afterRead/index.js';
|
|
@@ -6,6 +5,7 @@ import { killTransaction } from '../../utilities/killTransaction.js';
|
|
|
6
5
|
import sanitizeInternalFields from '../../utilities/sanitizeInternalFields.js';
|
|
7
6
|
import { getFieldsToSign } from '../getFieldsToSign.js';
|
|
8
7
|
import isLocked from '../isLocked.js';
|
|
8
|
+
import { jwtSign } from '../jwt.js';
|
|
9
9
|
import { authenticateLocalStrategy } from '../strategies/local/authenticate.js';
|
|
10
10
|
import { incrementLoginAttempts } from '../strategies/local/incrementLoginAttempts.js';
|
|
11
11
|
import { resetLoginAttempts } from '../strategies/local/resetLoginAttempts.js';
|
|
@@ -182,8 +182,10 @@ export const loginOperation = async (incomingArgs)=>{
|
|
|
182
182
|
user
|
|
183
183
|
}) || user;
|
|
184
184
|
}, Promise.resolve());
|
|
185
|
-
const token =
|
|
186
|
-
|
|
185
|
+
const { exp, token } = await jwtSign({
|
|
186
|
+
fieldsToSign,
|
|
187
|
+
secret,
|
|
188
|
+
tokenExpiration: collectionConfig.auth.tokenExpiration
|
|
187
189
|
});
|
|
188
190
|
req.user = user;
|
|
189
191
|
// /////////////////////////////////////
|
|
@@ -240,7 +242,7 @@ export const loginOperation = async (incomingArgs)=>{
|
|
|
240
242
|
}) || user;
|
|
241
243
|
}, Promise.resolve());
|
|
242
244
|
let result = {
|
|
243
|
-
exp
|
|
245
|
+
exp,
|
|
244
246
|
token,
|
|
245
247
|
user
|
|
246
248
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/auth/operations/login.ts"],"sourcesContent":["import jwt from 'jsonwebtoken'\n\nimport type {\n AuthOperationsFromCollectionSlug,\n Collection,\n DataFromCollectionSlug,\n} from '../../collections/config/types.js'\nimport type { CollectionSlug } from '../../index.js'\nimport type { PayloadRequest, Where } from '../../types/index.js'\nimport type { User } from '../types.js'\n\nimport { buildAfterOperation } from '../../collections/operations/utils.js'\nimport { AuthenticationError, LockedAuth, ValidationError } from '../../errors/index.js'\nimport { afterRead } from '../../fields/hooks/afterRead/index.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport sanitizeInternalFields from '../../utilities/sanitizeInternalFields.js'\nimport { getFieldsToSign } from '../getFieldsToSign.js'\nimport isLocked from '../isLocked.js'\nimport { authenticateLocalStrategy } from '../strategies/local/authenticate.js'\nimport { incrementLoginAttempts } from '../strategies/local/incrementLoginAttempts.js'\nimport { resetLoginAttempts } from '../strategies/local/resetLoginAttempts.js'\n\nexport type Result = {\n exp?: number\n token?: string\n user?: User\n}\n\nexport type Arguments<TSlug extends CollectionSlug> = {\n collection: Collection\n data: AuthOperationsFromCollectionSlug<TSlug>['login']\n depth?: number\n overrideAccess?: boolean\n req: PayloadRequest\n showHiddenFields?: boolean\n}\n\nexport const loginOperation = async <TSlug extends CollectionSlug>(\n incomingArgs: Arguments<TSlug>,\n): Promise<{ user: DataFromCollectionSlug<TSlug> } & Result> => {\n let args = incomingArgs\n\n try {\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n await args.collection.config.hooks.beforeOperation.reduce(async (priorHook, hook) => {\n await priorHook\n\n args =\n (await hook({\n args,\n collection: args.collection?.config,\n context: args.req.context,\n operation: 'login',\n req: args.req,\n })) || args\n }, Promise.resolve())\n\n const {\n collection: { config: collectionConfig },\n data,\n depth,\n overrideAccess,\n req,\n req: {\n fallbackLocale,\n locale,\n payload,\n payload: { secret },\n },\n showHiddenFields,\n } = args\n\n // /////////////////////////////////////\n // Login\n // /////////////////////////////////////\n\n let user\n const { email: unsanitizedEmail, password } = data\n const loginWithUsername = collectionConfig.auth.loginWithUsername\n\n const sanitizedEmail =\n typeof unsanitizedEmail === 'string' ? unsanitizedEmail.toLowerCase().trim() : null\n const sanitizedUsername =\n 'username' in data && typeof data?.username === 'string'\n ? data.username.toLowerCase().trim()\n : null\n\n const canLoginWithUsername = Boolean(loginWithUsername)\n const canLoginWithEmail = !loginWithUsername || loginWithUsername.allowEmailLogin\n\n // cannot login with email, did not provide username\n if (!canLoginWithEmail && !sanitizedUsername) {\n throw new ValidationError({\n collection: collectionConfig.slug,\n errors: [{ field: 'username', message: req.i18n.t('validation:required') }],\n })\n }\n\n // cannot login with username, did not provide email\n if (!canLoginWithUsername && !sanitizedEmail) {\n throw new ValidationError({\n collection: collectionConfig.slug,\n errors: [{ field: 'email', message: req.i18n.t('validation:required') }],\n })\n }\n\n // can login with either email or username, did not provide either\n if (!sanitizedUsername && !sanitizedEmail) {\n throw new ValidationError({\n collection: collectionConfig.slug,\n errors: [\n { field: 'email', message: req.i18n.t('validation:required') },\n { field: 'username', message: req.i18n.t('validation:required') },\n ],\n })\n }\n\n // did not provide password for login\n if (typeof password !== 'string' || password.trim() === '') {\n throw new ValidationError({\n collection: collectionConfig.slug,\n errors: [{ field: 'password', message: req.i18n.t('validation:required') }],\n })\n }\n\n let whereConstraint: Where = {}\n const emailConstraint: Where = {\n email: {\n equals: sanitizedEmail,\n },\n }\n const usernameConstraint: Where = {\n username: {\n equals: sanitizedUsername,\n },\n }\n\n if (canLoginWithEmail && canLoginWithUsername && (sanitizedUsername || sanitizedEmail)) {\n if (sanitizedUsername) {\n whereConstraint = {\n or: [\n usernameConstraint,\n {\n email: {\n equals: sanitizedUsername,\n },\n },\n ],\n }\n } else {\n whereConstraint = {\n or: [\n emailConstraint,\n {\n username: {\n equals: sanitizedEmail,\n },\n },\n ],\n }\n }\n } else if (canLoginWithEmail && sanitizedEmail) {\n whereConstraint = emailConstraint\n } else if (canLoginWithUsername && sanitizedUsername) {\n whereConstraint = usernameConstraint\n }\n\n user = await payload.db.findOne<any>({\n collection: collectionConfig.slug,\n req,\n where: whereConstraint,\n })\n\n if (!user || (args.collection.config.auth.verify && user._verified === false)) {\n throw new AuthenticationError(req.t, Boolean(canLoginWithUsername && sanitizedUsername))\n }\n\n user.collection = collectionConfig.slug\n\n if (isLocked(new Date(user.lockUntil).getTime())) {\n throw new LockedAuth(req.t)\n }\n\n const authResult = await authenticateLocalStrategy({ doc: user, password })\n\n user = sanitizeInternalFields(user)\n\n const maxLoginAttemptsEnabled = args.collection.config.auth.maxLoginAttempts > 0\n\n if (!authResult) {\n if (maxLoginAttemptsEnabled) {\n await incrementLoginAttempts({\n collection: collectionConfig,\n doc: user,\n payload: req.payload,\n req,\n })\n }\n\n throw new AuthenticationError(req.t)\n }\n\n if (maxLoginAttemptsEnabled) {\n await resetLoginAttempts({\n collection: collectionConfig,\n doc: user,\n payload: req.payload,\n req,\n })\n }\n\n const fieldsToSign = getFieldsToSign({\n collectionConfig,\n email: sanitizedEmail,\n user,\n })\n\n // /////////////////////////////////////\n // beforeLogin - Collection\n // /////////////////////////////////////\n\n await collectionConfig.hooks.beforeLogin.reduce(async (priorHook, hook) => {\n await priorHook\n\n user =\n (await hook({\n collection: args.collection?.config,\n context: args.req.context,\n req: args.req,\n user,\n })) || user\n }, Promise.resolve())\n\n const token = jwt.sign(fieldsToSign, secret, {\n expiresIn: collectionConfig.auth.tokenExpiration,\n })\n\n req.user = user\n\n // /////////////////////////////////////\n // afterLogin - Collection\n // /////////////////////////////////////\n\n await collectionConfig.hooks.afterLogin.reduce(async (priorHook, hook) => {\n await priorHook\n\n user =\n (await hook({\n collection: args.collection?.config,\n context: args.req.context,\n req: args.req,\n token,\n user,\n })) || user\n }, Promise.resolve())\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n user = await afterRead({\n collection: collectionConfig,\n context: req.context,\n depth,\n doc: user,\n draft: undefined,\n fallbackLocale,\n global: null,\n locale,\n overrideAccess,\n req,\n showHiddenFields,\n })\n\n // /////////////////////////////////////\n // afterRead - Collection\n // /////////////////////////////////////\n\n await collectionConfig.hooks.afterRead.reduce(async (priorHook, hook) => {\n await priorHook\n\n user =\n (await hook({\n collection: args.collection?.config,\n context: req.context,\n doc: user,\n req,\n })) || user\n }, Promise.resolve())\n\n // /////////////////////////////////////\n // afterRead - Collection\n // /////////////////////////////////////\n\n await collectionConfig.hooks.afterRead.reduce(async (priorHook, hook) => {\n await priorHook\n\n user =\n (await hook({\n collection: args.collection?.config,\n context: req.context,\n doc: user,\n req,\n })) || user\n }, Promise.resolve())\n\n let result: { user: DataFromCollectionSlug<TSlug> } & Result = {\n exp: (jwt.decode(token) as jwt.JwtPayload).exp,\n token,\n user,\n }\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation({\n args,\n collection: args.collection?.config,\n operation: 'login',\n result,\n })\n\n // /////////////////////////////////////\n // Return results\n // /////////////////////////////////////\n\n return result\n } catch (error: unknown) {\n await killTransaction(args.req)\n throw error\n }\n}\n"],"names":["jwt","buildAfterOperation","AuthenticationError","LockedAuth","ValidationError","afterRead","killTransaction","sanitizeInternalFields","getFieldsToSign","isLocked","authenticateLocalStrategy","incrementLoginAttempts","resetLoginAttempts","loginOperation","incomingArgs","args","collection","config","hooks","beforeOperation","reduce","priorHook","hook","context","req","operation","Promise","resolve","collectionConfig","data","depth","overrideAccess","fallbackLocale","locale","payload","secret","showHiddenFields","user","email","unsanitizedEmail","password","loginWithUsername","auth","sanitizedEmail","toLowerCase","trim","sanitizedUsername","username","canLoginWithUsername","Boolean","canLoginWithEmail","allowEmailLogin","slug","errors","field","message","i18n","t","whereConstraint","emailConstraint","equals","usernameConstraint","or","db","findOne","where","verify","_verified","Date","lockUntil","getTime","authResult","doc","maxLoginAttemptsEnabled","maxLoginAttempts","fieldsToSign","beforeLogin","token","sign","expiresIn","tokenExpiration","afterLogin","draft","undefined","global","result","exp","decode","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/auth/operations/login.ts"],"sourcesContent":["import type {\n AuthOperationsFromCollectionSlug,\n Collection,\n DataFromCollectionSlug,\n} from '../../collections/config/types.js'\nimport type { CollectionSlug } from '../../index.js'\nimport type { PayloadRequest, Where } from '../../types/index.js'\nimport type { User } from '../types.js'\n\nimport { buildAfterOperation } from '../../collections/operations/utils.js'\nimport { AuthenticationError, LockedAuth, ValidationError } from '../../errors/index.js'\nimport { afterRead } from '../../fields/hooks/afterRead/index.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport sanitizeInternalFields from '../../utilities/sanitizeInternalFields.js'\nimport { getFieldsToSign } from '../getFieldsToSign.js'\nimport isLocked from '../isLocked.js'\nimport { jwtSign } from '../jwt.js'\nimport { authenticateLocalStrategy } from '../strategies/local/authenticate.js'\nimport { incrementLoginAttempts } from '../strategies/local/incrementLoginAttempts.js'\nimport { resetLoginAttempts } from '../strategies/local/resetLoginAttempts.js'\n\nexport type Result = {\n exp?: number\n token?: string\n user?: User\n}\n\nexport type Arguments<TSlug extends CollectionSlug> = {\n collection: Collection\n data: AuthOperationsFromCollectionSlug<TSlug>['login']\n depth?: number\n overrideAccess?: boolean\n req: PayloadRequest\n showHiddenFields?: boolean\n}\n\nexport const loginOperation = async <TSlug extends CollectionSlug>(\n incomingArgs: Arguments<TSlug>,\n): Promise<{ user: DataFromCollectionSlug<TSlug> } & Result> => {\n let args = incomingArgs\n\n try {\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n await args.collection.config.hooks.beforeOperation.reduce(async (priorHook, hook) => {\n await priorHook\n\n args =\n (await hook({\n args,\n collection: args.collection?.config,\n context: args.req.context,\n operation: 'login',\n req: args.req,\n })) || args\n }, Promise.resolve())\n\n const {\n collection: { config: collectionConfig },\n data,\n depth,\n overrideAccess,\n req,\n req: {\n fallbackLocale,\n locale,\n payload,\n payload: { secret },\n },\n showHiddenFields,\n } = args\n\n // /////////////////////////////////////\n // Login\n // /////////////////////////////////////\n\n let user\n const { email: unsanitizedEmail, password } = data\n const loginWithUsername = collectionConfig.auth.loginWithUsername\n\n const sanitizedEmail =\n typeof unsanitizedEmail === 'string' ? unsanitizedEmail.toLowerCase().trim() : null\n const sanitizedUsername =\n 'username' in data && typeof data?.username === 'string'\n ? data.username.toLowerCase().trim()\n : null\n\n const canLoginWithUsername = Boolean(loginWithUsername)\n const canLoginWithEmail = !loginWithUsername || loginWithUsername.allowEmailLogin\n\n // cannot login with email, did not provide username\n if (!canLoginWithEmail && !sanitizedUsername) {\n throw new ValidationError({\n collection: collectionConfig.slug,\n errors: [{ field: 'username', message: req.i18n.t('validation:required') }],\n })\n }\n\n // cannot login with username, did not provide email\n if (!canLoginWithUsername && !sanitizedEmail) {\n throw new ValidationError({\n collection: collectionConfig.slug,\n errors: [{ field: 'email', message: req.i18n.t('validation:required') }],\n })\n }\n\n // can login with either email or username, did not provide either\n if (!sanitizedUsername && !sanitizedEmail) {\n throw new ValidationError({\n collection: collectionConfig.slug,\n errors: [\n { field: 'email', message: req.i18n.t('validation:required') },\n { field: 'username', message: req.i18n.t('validation:required') },\n ],\n })\n }\n\n // did not provide password for login\n if (typeof password !== 'string' || password.trim() === '') {\n throw new ValidationError({\n collection: collectionConfig.slug,\n errors: [{ field: 'password', message: req.i18n.t('validation:required') }],\n })\n }\n\n let whereConstraint: Where = {}\n const emailConstraint: Where = {\n email: {\n equals: sanitizedEmail,\n },\n }\n const usernameConstraint: Where = {\n username: {\n equals: sanitizedUsername,\n },\n }\n\n if (canLoginWithEmail && canLoginWithUsername && (sanitizedUsername || sanitizedEmail)) {\n if (sanitizedUsername) {\n whereConstraint = {\n or: [\n usernameConstraint,\n {\n email: {\n equals: sanitizedUsername,\n },\n },\n ],\n }\n } else {\n whereConstraint = {\n or: [\n emailConstraint,\n {\n username: {\n equals: sanitizedEmail,\n },\n },\n ],\n }\n }\n } else if (canLoginWithEmail && sanitizedEmail) {\n whereConstraint = emailConstraint\n } else if (canLoginWithUsername && sanitizedUsername) {\n whereConstraint = usernameConstraint\n }\n\n user = await payload.db.findOne<any>({\n collection: collectionConfig.slug,\n req,\n where: whereConstraint,\n })\n\n if (!user || (args.collection.config.auth.verify && user._verified === false)) {\n throw new AuthenticationError(req.t, Boolean(canLoginWithUsername && sanitizedUsername))\n }\n\n user.collection = collectionConfig.slug\n\n if (isLocked(new Date(user.lockUntil).getTime())) {\n throw new LockedAuth(req.t)\n }\n\n const authResult = await authenticateLocalStrategy({ doc: user, password })\n\n user = sanitizeInternalFields(user)\n\n const maxLoginAttemptsEnabled = args.collection.config.auth.maxLoginAttempts > 0\n\n if (!authResult) {\n if (maxLoginAttemptsEnabled) {\n await incrementLoginAttempts({\n collection: collectionConfig,\n doc: user,\n payload: req.payload,\n req,\n })\n }\n\n throw new AuthenticationError(req.t)\n }\n\n if (maxLoginAttemptsEnabled) {\n await resetLoginAttempts({\n collection: collectionConfig,\n doc: user,\n payload: req.payload,\n req,\n })\n }\n\n const fieldsToSign = getFieldsToSign({\n collectionConfig,\n email: sanitizedEmail,\n user,\n })\n\n // /////////////////////////////////////\n // beforeLogin - Collection\n // /////////////////////////////////////\n\n await collectionConfig.hooks.beforeLogin.reduce(async (priorHook, hook) => {\n await priorHook\n\n user =\n (await hook({\n collection: args.collection?.config,\n context: args.req.context,\n req: args.req,\n user,\n })) || user\n }, Promise.resolve())\n\n const { exp, token } = await jwtSign({\n fieldsToSign,\n secret,\n tokenExpiration: collectionConfig.auth.tokenExpiration,\n })\n\n req.user = user\n\n // /////////////////////////////////////\n // afterLogin - Collection\n // /////////////////////////////////////\n\n await collectionConfig.hooks.afterLogin.reduce(async (priorHook, hook) => {\n await priorHook\n\n user =\n (await hook({\n collection: args.collection?.config,\n context: args.req.context,\n req: args.req,\n token,\n user,\n })) || user\n }, Promise.resolve())\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n user = await afterRead({\n collection: collectionConfig,\n context: req.context,\n depth,\n doc: user,\n draft: undefined,\n fallbackLocale,\n global: null,\n locale,\n overrideAccess,\n req,\n showHiddenFields,\n })\n\n // /////////////////////////////////////\n // afterRead - Collection\n // /////////////////////////////////////\n\n await collectionConfig.hooks.afterRead.reduce(async (priorHook, hook) => {\n await priorHook\n\n user =\n (await hook({\n collection: args.collection?.config,\n context: req.context,\n doc: user,\n req,\n })) || user\n }, Promise.resolve())\n\n // /////////////////////////////////////\n // afterRead - Collection\n // /////////////////////////////////////\n\n await collectionConfig.hooks.afterRead.reduce(async (priorHook, hook) => {\n await priorHook\n\n user =\n (await hook({\n collection: args.collection?.config,\n context: req.context,\n doc: user,\n req,\n })) || user\n }, Promise.resolve())\n\n let result: { user: DataFromCollectionSlug<TSlug> } & Result = {\n exp,\n token,\n user,\n }\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation({\n args,\n collection: args.collection?.config,\n operation: 'login',\n result,\n })\n\n // /////////////////////////////////////\n // Return results\n // /////////////////////////////////////\n\n return result\n } catch (error: unknown) {\n await killTransaction(args.req)\n throw error\n }\n}\n"],"names":["buildAfterOperation","AuthenticationError","LockedAuth","ValidationError","afterRead","killTransaction","sanitizeInternalFields","getFieldsToSign","isLocked","jwtSign","authenticateLocalStrategy","incrementLoginAttempts","resetLoginAttempts","loginOperation","incomingArgs","args","collection","config","hooks","beforeOperation","reduce","priorHook","hook","context","req","operation","Promise","resolve","collectionConfig","data","depth","overrideAccess","fallbackLocale","locale","payload","secret","showHiddenFields","user","email","unsanitizedEmail","password","loginWithUsername","auth","sanitizedEmail","toLowerCase","trim","sanitizedUsername","username","canLoginWithUsername","Boolean","canLoginWithEmail","allowEmailLogin","slug","errors","field","message","i18n","t","whereConstraint","emailConstraint","equals","usernameConstraint","or","db","findOne","where","verify","_verified","Date","lockUntil","getTime","authResult","doc","maxLoginAttemptsEnabled","maxLoginAttempts","fieldsToSign","beforeLogin","exp","token","tokenExpiration","afterLogin","draft","undefined","global","result","error"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { decodeJwt } from 'jose';
|
|
2
2
|
export const meOperation = async (args)=>{
|
|
3
3
|
const { collection, currentToken, req } = args;
|
|
4
4
|
let result = {
|
|
@@ -42,7 +42,7 @@ export const meOperation = async (args)=>{
|
|
|
42
42
|
if (!result.user) {
|
|
43
43
|
result.user = user;
|
|
44
44
|
if (currentToken) {
|
|
45
|
-
const decoded =
|
|
45
|
+
const decoded = decodeJwt(currentToken);
|
|
46
46
|
if (decoded) {
|
|
47
47
|
result.exp = decoded.exp;
|
|
48
48
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/auth/operations/me.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"sources":["../../../src/auth/operations/me.ts"],"sourcesContent":["import { decodeJwt } from 'jose'\n\nimport type { Collection } from '../../collections/config/types.js'\nimport type { PayloadRequest } from '../../types/index.js'\nimport type { ClientUser, User } from '../types.js'\n\nexport type MeOperationResult = {\n collection?: string\n exp?: number\n strategy?: string\n token?: string\n user?: ClientUser\n}\n\nexport type Arguments = {\n collection: Collection\n currentToken?: string\n req: PayloadRequest\n}\n\nexport const meOperation = async (args: Arguments): Promise<MeOperationResult> => {\n const { collection, currentToken, req } = args\n\n let result: MeOperationResult = {\n user: null,\n }\n\n if (req.user) {\n const { pathname } = req\n const isGraphQL = pathname === `/api${req.payload.config.routes.graphQL}`\n\n const user = (await req.payload.findByID({\n id: req.user.id,\n collection: collection.config.slug,\n depth: isGraphQL ? 0 : collection.config.auth.depth,\n overrideAccess: false,\n req,\n showHiddenFields: false,\n })) as User\n\n if (user) {\n user.collection = collection.config.slug\n }\n\n if (req.user.collection !== collection.config.slug) {\n return {\n user: null,\n }\n }\n\n // /////////////////////////////////////\n // me hook - Collection\n // /////////////////////////////////////\n\n for (const meHook of collection.config.hooks.me) {\n const hookResult = await meHook({ args, user })\n\n if (hookResult) {\n result.user = hookResult.user\n result.exp = hookResult.exp\n\n break\n }\n }\n\n result.collection = req.user.collection\n result.strategy = req.user._strategy\n\n if (!result.user) {\n result.user = user\n\n if (currentToken) {\n const decoded = decodeJwt(currentToken)\n if (decoded) {\n result.exp = decoded.exp\n }\n if (!collection.config.auth.removeTokenFromResponses) {\n result.token = currentToken\n }\n }\n }\n }\n\n // /////////////////////////////////////\n // After Me - Collection\n // /////////////////////////////////////\n\n await collection.config.hooks.afterMe.reduce(async (priorHook, hook) => {\n await priorHook\n\n result =\n (await hook({\n collection: collection?.config,\n context: req.context,\n req,\n response: result,\n })) || result\n }, Promise.resolve())\n\n return result\n}\n"],"names":["decodeJwt","meOperation","args","collection","currentToken","req","result","user","pathname","isGraphQL","payload","config","routes","graphQL","findByID","id","slug","depth","auth","overrideAccess","showHiddenFields","meHook","hooks","me","hookResult","exp","strategy","_strategy","decoded","removeTokenFromResponses","token","afterMe","reduce","priorHook","hook","context","response","Promise","resolve"],"mappings":"AAAA,SAASA,SAAS,QAAQ,OAAM;AAoBhC,OAAO,MAAMC,cAAc,OAAOC;IAChC,MAAM,EAAEC,UAAU,EAAEC,YAAY,EAAEC,GAAG,EAAE,GAAGH;IAE1C,IAAII,SAA4B;QAC9BC,MAAM;IACR;IAEA,IAAIF,IAAIE,IAAI,EAAE;QACZ,MAAM,EAAEC,QAAQ,EAAE,GAAGH;QACrB,MAAMI,YAAYD,aAAa,CAAC,IAAI,EAAEH,IAAIK,OAAO,CAACC,MAAM,CAACC,MAAM,CAACC,OAAO,CAAC,CAAC;QAEzE,MAAMN,OAAQ,MAAMF,IAAIK,OAAO,CAACI,QAAQ,CAAC;YACvCC,IAAIV,IAAIE,IAAI,CAACQ,EAAE;YACfZ,YAAYA,WAAWQ,MAAM,CAACK,IAAI;YAClCC,OAAOR,YAAY,IAAIN,WAAWQ,MAAM,CAACO,IAAI,CAACD,KAAK;YACnDE,gBAAgB;YAChBd;YACAe,kBAAkB;QACpB;QAEA,IAAIb,MAAM;YACRA,KAAKJ,UAAU,GAAGA,WAAWQ,MAAM,CAACK,IAAI;QAC1C;QAEA,IAAIX,IAAIE,IAAI,CAACJ,UAAU,KAAKA,WAAWQ,MAAM,CAACK,IAAI,EAAE;YAClD,OAAO;gBACLT,MAAM;YACR;QACF;QAEA,wCAAwC;QACxC,uBAAuB;QACvB,wCAAwC;QAExC,KAAK,MAAMc,UAAUlB,WAAWQ,MAAM,CAACW,KAAK,CAACC,EAAE,CAAE;YAC/C,MAAMC,aAAa,MAAMH,OAAO;gBAAEnB;gBAAMK;YAAK;YAE7C,IAAIiB,YAAY;gBACdlB,OAAOC,IAAI,GAAGiB,WAAWjB,IAAI;gBAC7BD,OAAOmB,GAAG,GAAGD,WAAWC,GAAG;gBAE3B;YACF;QACF;QAEAnB,OAAOH,UAAU,GAAGE,IAAIE,IAAI,CAACJ,UAAU;QACvCG,OAAOoB,QAAQ,GAAGrB,IAAIE,IAAI,CAACoB,SAAS;QAEpC,IAAI,CAACrB,OAAOC,IAAI,EAAE;YAChBD,OAAOC,IAAI,GAAGA;YAEd,IAAIH,cAAc;gBAChB,MAAMwB,UAAU5B,UAAUI;gBAC1B,IAAIwB,SAAS;oBACXtB,OAAOmB,GAAG,GAAGG,QAAQH,GAAG;gBAC1B;gBACA,IAAI,CAACtB,WAAWQ,MAAM,CAACO,IAAI,CAACW,wBAAwB,EAAE;oBACpDvB,OAAOwB,KAAK,GAAG1B;gBACjB;YACF;QACF;IACF;IAEA,wCAAwC;IACxC,wBAAwB;IACxB,wCAAwC;IAExC,MAAMD,WAAWQ,MAAM,CAACW,KAAK,CAACS,OAAO,CAACC,MAAM,CAAC,OAAOC,WAAWC;QAC7D,MAAMD;QAEN3B,SACE,AAAC,MAAM4B,KAAK;YACV/B,YAAYA,YAAYQ;YACxBwB,SAAS9B,IAAI8B,OAAO;YACpB9B;YACA+B,UAAU9B;QACZ,MAAOA;IACX,GAAG+B,QAAQC,OAAO;IAElB,OAAOhC;AACT,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../../../src/auth/operations/refresh.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../../../src/auth/operations/refresh.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAuB,UAAU,EAAE,MAAM,mCAAmC,CAAA;AACxF,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAUpE,MAAM,MAAM,MAAM,GAAG;IACnB,GAAG,EAAE,MAAM,CAAA;IACX,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,QAAQ,CAAA;CACf,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,UAAU,EAAE,UAAU,CAAA;IACtB,GAAG,EAAE,cAAc,CAAA;CACpB,CAAA;AAED,eAAO,MAAM,gBAAgB,iBAAwB,SAAS,KAAG,OAAO,CAAC,MAAM,CAsI9E,CAAA"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import jwt from 'jsonwebtoken';
|
|
2
1
|
import url from 'url';
|
|
3
2
|
import { buildAfterOperation } from '../../collections/operations/utils.js';
|
|
4
3
|
import { Forbidden } from '../../errors/index.js';
|
|
@@ -6,6 +5,7 @@ import { commitTransaction } from '../../utilities/commitTransaction.js';
|
|
|
6
5
|
import { initTransaction } from '../../utilities/initTransaction.js';
|
|
7
6
|
import { killTransaction } from '../../utilities/killTransaction.js';
|
|
8
7
|
import { getFieldsToSign } from '../getFieldsToSign.js';
|
|
8
|
+
import { jwtSign } from '../jwt.js';
|
|
9
9
|
export const refreshOperation = async (incomingArgs)=>{
|
|
10
10
|
let args = incomingArgs;
|
|
11
11
|
try {
|
|
@@ -61,10 +61,11 @@ export const refreshOperation = async (incomingArgs)=>{
|
|
|
61
61
|
email: user?.email,
|
|
62
62
|
user: args?.req?.user
|
|
63
63
|
});
|
|
64
|
-
const refreshedToken =
|
|
65
|
-
|
|
64
|
+
const { exp, token: refreshedToken } = await jwtSign({
|
|
65
|
+
fieldsToSign,
|
|
66
|
+
secret,
|
|
67
|
+
tokenExpiration: collectionConfig.auth.tokenExpiration
|
|
66
68
|
});
|
|
67
|
-
const exp = jwt.decode(refreshedToken).exp;
|
|
68
69
|
result = {
|
|
69
70
|
exp,
|
|
70
71
|
refreshedToken,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/auth/operations/refresh.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"sources":["../../../src/auth/operations/refresh.ts"],"sourcesContent":["import url from 'url'\n\nimport type { BeforeOperationHook, Collection } from '../../collections/config/types.js'\nimport type { Document, PayloadRequest } from '../../types/index.js'\n\nimport { buildAfterOperation } from '../../collections/operations/utils.js'\nimport { Forbidden } from '../../errors/index.js'\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { getFieldsToSign } from '../getFieldsToSign.js'\nimport { jwtSign } from '../jwt.js'\n\nexport type Result = {\n exp: number\n refreshedToken: string\n setCookie?: boolean\n strategy?: string\n user: Document\n}\n\nexport type Arguments = {\n collection: Collection\n req: PayloadRequest\n}\n\nexport const refreshOperation = async (incomingArgs: Arguments): Promise<Result> => {\n let args = incomingArgs\n\n try {\n const shouldCommit = await initTransaction(args.req)\n\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n await args.collection.config.hooks.beforeOperation.reduce(\n async (priorHook: BeforeOperationHook | Promise<void>, hook: BeforeOperationHook) => {\n await priorHook\n\n args =\n (await hook({\n args,\n collection: args.collection?.config,\n context: args.req.context,\n operation: 'refresh',\n req: args.req,\n })) || args\n },\n Promise.resolve(),\n )\n\n // /////////////////////////////////////\n // Refresh\n // /////////////////////////////////////\n\n const {\n collection: { config: collectionConfig },\n req,\n req: {\n payload: { config, secret },\n },\n } = args\n\n if (!args.req.user) {\n throw new Forbidden(args.req.t)\n }\n\n const parsedURL = url.parse(args.req.url)\n const isGraphQL = parsedURL.pathname === config.routes.graphQL\n\n const user = await args.req.payload.findByID({\n id: args.req.user.id,\n collection: args.req.user.collection,\n depth: isGraphQL ? 0 : args.collection.config.auth.depth,\n req: args.req,\n })\n\n if (user) {\n user.collection = args.req.user.collection\n }\n\n let result: Result\n\n // /////////////////////////////////////\n // refresh hook - Collection\n // /////////////////////////////////////\n\n for (const refreshHook of args.collection.config.hooks.refresh) {\n const hookResult = await refreshHook({ args, user })\n\n if (hookResult) {\n result = hookResult\n break\n }\n }\n\n if (!result) {\n const fieldsToSign = getFieldsToSign({\n collectionConfig,\n email: user?.email as string,\n user: args?.req?.user,\n })\n\n const { exp, token: refreshedToken } = await jwtSign({\n fieldsToSign,\n secret,\n tokenExpiration: collectionConfig.auth.tokenExpiration,\n })\n\n result = {\n exp,\n refreshedToken,\n setCookie: true,\n strategy: args.req.user._strategy,\n user,\n }\n }\n\n // /////////////////////////////////////\n // After Refresh - Collection\n // /////////////////////////////////////\n\n await collectionConfig.hooks.afterRefresh.reduce(async (priorHook, hook) => {\n await priorHook\n\n result =\n (await hook({\n collection: args.collection?.config,\n context: args.req.context,\n exp: result.exp,\n req: args.req,\n token: result.refreshedToken,\n })) || result\n }, Promise.resolve())\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation({\n args,\n collection: args.collection?.config,\n operation: 'refresh',\n result,\n })\n\n // /////////////////////////////////////\n // Return results\n // /////////////////////////////////////\n\n if (shouldCommit) {\n await commitTransaction(req)\n }\n\n return result\n } catch (error: unknown) {\n await killTransaction(args.req)\n throw error\n }\n}\n"],"names":["url","buildAfterOperation","Forbidden","commitTransaction","initTransaction","killTransaction","getFieldsToSign","jwtSign","refreshOperation","incomingArgs","args","shouldCommit","req","collection","config","hooks","beforeOperation","reduce","priorHook","hook","context","operation","Promise","resolve","collectionConfig","payload","secret","user","t","parsedURL","parse","isGraphQL","pathname","routes","graphQL","findByID","id","depth","auth","result","refreshHook","refresh","hookResult","fieldsToSign","email","exp","token","refreshedToken","tokenExpiration","setCookie","strategy","_strategy","afterRefresh","error"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resetPassword.d.ts","sourceRoot":"","sources":["../../../src/auth/operations/resetPassword.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"resetPassword.d.ts","sourceRoot":"","sources":["../../../src/auth/operations/resetPassword.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAW1D,MAAM,MAAM,MAAM,GAAG;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC9B,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,UAAU,EAAE,UAAU,CAAA;IACtB,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAA;QAChB,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;IACD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,GAAG,EAAE,cAAc,CAAA;CACpB,CAAA;AAED,eAAO,MAAM,sBAAsB,SAAgB,SAAS,KAAG,OAAO,CAAC,MAAM,CAqH5E,CAAA"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import httpStatus from 'http-status';
|
|
2
|
-
import jwt from 'jsonwebtoken';
|
|
3
2
|
import { APIError } from '../../errors/index.js';
|
|
4
3
|
import { commitTransaction } from '../../utilities/commitTransaction.js';
|
|
5
4
|
import { initTransaction } from '../../utilities/initTransaction.js';
|
|
6
5
|
import { killTransaction } from '../../utilities/killTransaction.js';
|
|
7
6
|
import { getFieldsToSign } from '../getFieldsToSign.js';
|
|
7
|
+
import { jwtSign } from '../jwt.js';
|
|
8
8
|
import { authenticateLocalStrategy } from '../strategies/local/authenticate.js';
|
|
9
9
|
import { generatePasswordSaltHash } from '../strategies/local/generatePasswordSaltHash.js';
|
|
10
10
|
export const resetPasswordOperation = async (args)=>{
|
|
@@ -75,8 +75,10 @@ export const resetPasswordOperation = async (args)=>{
|
|
|
75
75
|
email: user.email,
|
|
76
76
|
user
|
|
77
77
|
});
|
|
78
|
-
const token =
|
|
79
|
-
|
|
78
|
+
const { token } = await jwtSign({
|
|
79
|
+
fieldsToSign,
|
|
80
|
+
secret,
|
|
81
|
+
tokenExpiration: collectionConfig.auth.tokenExpiration
|
|
80
82
|
});
|
|
81
83
|
const fullUser = await payload.findByID({
|
|
82
84
|
id: user.id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/auth/operations/resetPassword.ts"],"sourcesContent":["import httpStatus from 'http-status'\
|
|
1
|
+
{"version":3,"sources":["../../../src/auth/operations/resetPassword.ts"],"sourcesContent":["import httpStatus from 'http-status'\n\nimport type { Collection } from '../../collections/config/types.js'\nimport type { PayloadRequest } from '../../types/index.js'\n\nimport { APIError } from '../../errors/index.js'\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { getFieldsToSign } from '../getFieldsToSign.js'\nimport { jwtSign } from '../jwt.js'\nimport { authenticateLocalStrategy } from '../strategies/local/authenticate.js'\nimport { generatePasswordSaltHash } from '../strategies/local/generatePasswordSaltHash.js'\n\nexport type Result = {\n token?: string\n user: Record<string, unknown>\n}\n\nexport type Arguments = {\n collection: Collection\n data: {\n password: string\n token: string\n }\n depth?: number\n overrideAccess?: boolean\n req: PayloadRequest\n}\n\nexport const resetPasswordOperation = async (args: Arguments): Promise<Result> => {\n if (\n !Object.prototype.hasOwnProperty.call(args.data, 'token') ||\n !Object.prototype.hasOwnProperty.call(args.data, 'password')\n ) {\n throw new APIError('Missing required data.', httpStatus.BAD_REQUEST)\n }\n\n const {\n collection: { config: collectionConfig },\n data,\n depth,\n overrideAccess,\n req: {\n payload: { secret },\n payload,\n },\n req,\n } = args\n\n try {\n const shouldCommit = await initTransaction(req)\n\n // /////////////////////////////////////\n // Reset Password\n // /////////////////////////////////////\n\n const user = await payload.db.findOne<any>({\n collection: collectionConfig.slug,\n req,\n where: {\n resetPasswordExpiration: { greater_than: new Date().toISOString() },\n resetPasswordToken: { equals: data.token },\n },\n })\n\n if (!user) {\n throw new APIError('Token is either invalid or has expired.', httpStatus.FORBIDDEN)\n }\n\n // TODO: replace this method\n const { hash, salt } = await generatePasswordSaltHash({\n collection: collectionConfig,\n password: data.password,\n req,\n })\n\n user.salt = salt\n user.hash = hash\n\n user.resetPasswordExpiration = new Date().toISOString()\n\n if (collectionConfig.auth.verify) {\n user._verified = Boolean(user._verified)\n }\n // /////////////////////////////////////\n // beforeValidate - Collection\n // /////////////////////////////////////\n\n await collectionConfig.hooks.beforeValidate.reduce(async (priorHook, hook) => {\n await priorHook\n\n await hook({\n collection: args.collection?.config,\n context: req.context,\n data: user,\n operation: 'update',\n req,\n })\n }, Promise.resolve())\n\n // /////////////////////////////////////\n // Update new password\n // /////////////////////////////////////\n\n const doc = await payload.db.updateOne({\n id: user.id,\n collection: collectionConfig.slug,\n data: user,\n req,\n })\n\n await authenticateLocalStrategy({ doc, password: data.password })\n\n const fieldsToSign = getFieldsToSign({\n collectionConfig,\n email: user.email,\n user,\n })\n\n const { token } = await jwtSign({\n fieldsToSign,\n secret,\n tokenExpiration: collectionConfig.auth.tokenExpiration,\n })\n\n const fullUser = await payload.findByID({\n id: user.id,\n collection: collectionConfig.slug,\n depth,\n overrideAccess,\n req,\n })\n if (shouldCommit) {\n await commitTransaction(req)\n }\n\n const result = {\n token,\n user: fullUser,\n }\n\n return result\n } catch (error: unknown) {\n await killTransaction(req)\n throw error\n }\n}\n"],"names":["httpStatus","APIError","commitTransaction","initTransaction","killTransaction","getFieldsToSign","jwtSign","authenticateLocalStrategy","generatePasswordSaltHash","resetPasswordOperation","args","Object","prototype","hasOwnProperty","call","data","BAD_REQUEST","collection","config","collectionConfig","depth","overrideAccess","req","payload","secret","shouldCommit","user","db","findOne","slug","where","resetPasswordExpiration","greater_than","Date","toISOString","resetPasswordToken","equals","token","FORBIDDEN","hash","salt","password","auth","verify","_verified","Boolean","hooks","beforeValidate","reduce","priorHook","hook","context","operation","Promise","resolve","doc","updateOne","id","fieldsToSign","email","tokenExpiration","fullUser","findByID","result","error"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { jwtVerify } from 'jose';
|
|
2
2
|
import { extractJWT } from '../extractJWT.js';
|
|
3
3
|
async function autoLogin({ isGraphQL, payload }) {
|
|
4
4
|
if (typeof payload?.config?.admin?.autoLogin !== 'object' || payload.config.admin?.autoLogin.prefillOnly || !payload?.config?.admin?.autoLogin || !payload.config.admin?.autoLogin.email && !payload.config.admin?.autoLogin.username) {
|
|
@@ -56,7 +56,8 @@ export const JWTAuthentication = async ({ headers, isGraphQL = false, payload })
|
|
|
56
56
|
user: null
|
|
57
57
|
};
|
|
58
58
|
}
|
|
59
|
-
const
|
|
59
|
+
const secretKey = new TextEncoder().encode(payload.secret);
|
|
60
|
+
const { payload: decodedPayload } = await jwtVerify(token, secretKey);
|
|
60
61
|
const collection = payload.collections[decodedPayload.collection];
|
|
61
62
|
const user = await payload.findByID({
|
|
62
63
|
id: decodedPayload.id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/auth/strategies/jwt.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"sources":["../../../src/auth/strategies/jwt.ts"],"sourcesContent":["import { jwtVerify } from 'jose'\n\nimport type { Payload, Where } from '../../types/index.js'\nimport type { AuthStrategyFunction, User } from '../index.js'\n\nimport { extractJWT } from '../extractJWT.js'\n\ntype JWTToken = {\n collection: string\n id: string\n}\n\nasync function autoLogin({\n isGraphQL,\n payload,\n}: {\n isGraphQL: boolean\n payload: Payload\n}): Promise<{\n user: null | User\n}> {\n if (\n typeof payload?.config?.admin?.autoLogin !== 'object' ||\n payload.config.admin?.autoLogin.prefillOnly ||\n !payload?.config?.admin?.autoLogin ||\n (!payload.config.admin?.autoLogin.email && !payload.config.admin?.autoLogin.username)\n ) {\n return { user: null }\n }\n\n const collection = payload.collections[payload.config.admin.user]\n\n const where: Where = {\n or: [],\n }\n if (payload.config.admin?.autoLogin.email) {\n where.or.push({\n email: {\n equals: payload.config.admin?.autoLogin.email,\n },\n })\n } else if (payload.config.admin?.autoLogin.username) {\n where.or.push({\n username: {\n equals: payload.config.admin?.autoLogin.username,\n },\n })\n }\n\n const user = (\n await payload.find({\n collection: collection.config.slug,\n depth: isGraphQL ? 0 : collection.config.auth.depth,\n where,\n })\n ).docs[0]\n\n if (!user) {\n return { user: null }\n }\n user.collection = collection.config.slug\n user._strategy = 'local-jwt'\n\n return {\n user: user as User,\n }\n}\n\nexport const JWTAuthentication: AuthStrategyFunction = async ({\n headers,\n isGraphQL = false,\n payload,\n}) => {\n try {\n const token = extractJWT({ headers, payload })\n\n if (!token) {\n if (headers.get('DisableAutologin') !== 'true') {\n return await autoLogin({ isGraphQL, payload })\n }\n return { user: null }\n }\n\n const secretKey = new TextEncoder().encode(payload.secret)\n const { payload: decodedPayload } = await jwtVerify<JWTToken>(token, secretKey)\n const collection = payload.collections[decodedPayload.collection]\n\n const user = await payload.findByID({\n id: decodedPayload.id,\n collection: decodedPayload.collection,\n depth: isGraphQL ? 0 : collection.config.auth.depth,\n })\n\n if (user && (!collection.config.auth.verify || user._verified)) {\n user.collection = collection.config.slug\n user._strategy = 'local-jwt'\n return {\n user: user as User,\n }\n } else {\n if (headers.get('DisableAutologin') !== 'true') {\n return await autoLogin({ isGraphQL, payload })\n }\n return { user: null }\n }\n } catch (error) {\n if (headers.get('DisableAutologin') !== 'true') {\n return await autoLogin({ isGraphQL, payload })\n }\n return { user: null }\n }\n}\n"],"names":["jwtVerify","extractJWT","autoLogin","isGraphQL","payload","config","admin","prefillOnly","email","username","user","collection","collections","where","or","push","equals","find","slug","depth","auth","docs","_strategy","JWTAuthentication","headers","token","get","secretKey","TextEncoder","encode","secret","decodedPayload","findByID","id","verify","_verified","error"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrationsCollection.d.ts","sourceRoot":"","sources":["../../../src/database/migrations/migrationsCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AAEzE,eAAO,MAAM,oBAAoB,EAAE,
|
|
1
|
+
{"version":3,"file":"migrationsCollection.d.ts","sourceRoot":"","sources":["../../../src/database/migrations/migrationsCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AAEzE,eAAO,MAAM,oBAAoB,EAAE,gBAmBlC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/database/migrations/migrationsCollection.ts"],"sourcesContent":["import type { CollectionConfig } from '../../collections/config/types.js'\n\nexport const migrationsCollection: CollectionConfig = {\n slug: 'payload-migrations',\n admin: {\n hidden: true,\n },\n endpoints: false,\n fields: [\n {\n name: 'name',\n type: 'text',\n },\n {\n name: 'batch',\n type: 'number',\n // NOTE: This value is -1 if it is a \"dev push\"\n },\n ],\n graphQL: false,\n}\n"],"names":["migrationsCollection","slug","admin","hidden","endpoints","fields","name","type","graphQL"],"mappings":"AAEA,OAAO,MAAMA,uBAAyC;IACpDC,MAAM;IACNC,OAAO;QACLC,QAAQ;IACV;IACAC,WAAW;IACXC,QAAQ;QACN;YACEC,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;QAER;KACD;IACDC,SAAS;
|
|
1
|
+
{"version":3,"sources":["../../../src/database/migrations/migrationsCollection.ts"],"sourcesContent":["import type { CollectionConfig } from '../../collections/config/types.js'\n\nexport const migrationsCollection: CollectionConfig = {\n slug: 'payload-migrations',\n admin: {\n hidden: true,\n },\n endpoints: false,\n fields: [\n {\n name: 'name',\n type: 'text',\n },\n {\n name: 'batch',\n type: 'number',\n // NOTE: This value is -1 if it is a \"dev push\"\n },\n ],\n graphQL: false,\n lockDocuments: false,\n}\n"],"names":["migrationsCollection","slug","admin","hidden","endpoints","fields","name","type","graphQL","lockDocuments"],"mappings":"AAEA,OAAO,MAAMA,uBAAyC;IACpDC,MAAM;IACNC,OAAO;QACLC,QAAQ;IACV;IACAC,WAAW;IACXC,QAAQ;QACN;YACEC,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;QAER;KACD;IACDC,SAAS;IACTC,eAAe;AACjB,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lockedDocumentsCollection.d.ts","sourceRoot":"","sources":["../../src/lockedDocuments/lockedDocumentsCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACtE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD,eAAO,MAAM,4BAA4B,WAAY,MAAM,KAAG,
|
|
1
|
+
{"version":3,"file":"lockedDocumentsCollection.d.ts","sourceRoot":"","sources":["../../src/lockedDocuments/lockedDocumentsCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACtE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD,eAAO,MAAM,4BAA4B,WAAY,MAAM,KAAG,gBA6B5D,CAAA"}
|
|
@@ -25,7 +25,8 @@ export const getLockedDocumentsCollection = (config)=>({
|
|
|
25
25
|
relationTo: config.collections.filter((collectionConfig)=>collectionConfig.auth).map((collectionConfig)=>collectionConfig.slug),
|
|
26
26
|
required: true
|
|
27
27
|
}
|
|
28
|
-
]
|
|
28
|
+
],
|
|
29
|
+
lockDocuments: false
|
|
29
30
|
});
|
|
30
31
|
|
|
31
32
|
//# sourceMappingURL=lockedDocumentsCollection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lockedDocuments/lockedDocumentsCollection.ts"],"sourcesContent":["import type { CollectionConfig } from '../collections/config/types.js'\nimport type { Config } from '../config/types.js'\n\nexport const getLockedDocumentsCollection = (config: Config): CollectionConfig => ({\n slug: 'payload-locked-documents',\n admin: {\n hidden: true,\n },\n fields: [\n {\n name: 'document',\n type: 'relationship',\n index: true,\n maxDepth: 0,\n relationTo: [...config.collections.map((collectionConfig) => collectionConfig.slug)],\n },\n {\n name: 'globalSlug',\n type: 'text',\n index: true,\n },\n {\n name: 'user',\n type: 'relationship',\n maxDepth: 1,\n relationTo: config.collections\n .filter((collectionConfig) => collectionConfig.auth)\n .map((collectionConfig) => collectionConfig.slug),\n required: true,\n },\n ],\n})\n"],"names":["getLockedDocumentsCollection","config","slug","admin","hidden","fields","name","type","index","maxDepth","relationTo","collections","map","collectionConfig","filter","auth","required"],"mappings":"AAGA,OAAO,MAAMA,+BAA+B,CAACC,SAAsC,CAAA;QACjFC,MAAM;QACNC,OAAO;YACLC,QAAQ;QACV;QACAC,QAAQ;YACN;gBACEC,MAAM;gBACNC,MAAM;gBACNC,OAAO;gBACPC,UAAU;gBACVC,YAAY;uBAAIT,OAAOU,WAAW,CAACC,GAAG,CAAC,CAACC,mBAAqBA,iBAAiBX,IAAI;iBAAE;YACtF;YACA;gBACEI,MAAM;gBACNC,MAAM;gBACNC,OAAO;YACT;YACA;gBACEF,MAAM;gBACNC,MAAM;gBACNE,UAAU;gBACVC,YAAYT,OAAOU,WAAW,CAC3BG,MAAM,CAAC,CAACD,mBAAqBA,iBAAiBE,IAAI,EAClDH,GAAG,CAAC,CAACC,mBAAqBA,iBAAiBX,IAAI;gBAClDc,UAAU;YACZ;SACD;
|
|
1
|
+
{"version":3,"sources":["../../src/lockedDocuments/lockedDocumentsCollection.ts"],"sourcesContent":["import type { CollectionConfig } from '../collections/config/types.js'\nimport type { Config } from '../config/types.js'\n\nexport const getLockedDocumentsCollection = (config: Config): CollectionConfig => ({\n slug: 'payload-locked-documents',\n admin: {\n hidden: true,\n },\n fields: [\n {\n name: 'document',\n type: 'relationship',\n index: true,\n maxDepth: 0,\n relationTo: [...config.collections.map((collectionConfig) => collectionConfig.slug)],\n },\n {\n name: 'globalSlug',\n type: 'text',\n index: true,\n },\n {\n name: 'user',\n type: 'relationship',\n maxDepth: 1,\n relationTo: config.collections\n .filter((collectionConfig) => collectionConfig.auth)\n .map((collectionConfig) => collectionConfig.slug),\n required: true,\n },\n ],\n lockDocuments: false,\n})\n"],"names":["getLockedDocumentsCollection","config","slug","admin","hidden","fields","name","type","index","maxDepth","relationTo","collections","map","collectionConfig","filter","auth","required","lockDocuments"],"mappings":"AAGA,OAAO,MAAMA,+BAA+B,CAACC,SAAsC,CAAA;QACjFC,MAAM;QACNC,OAAO;YACLC,QAAQ;QACV;QACAC,QAAQ;YACN;gBACEC,MAAM;gBACNC,MAAM;gBACNC,OAAO;gBACPC,UAAU;gBACVC,YAAY;uBAAIT,OAAOU,WAAW,CAACC,GAAG,CAAC,CAACC,mBAAqBA,iBAAiBX,IAAI;iBAAE;YACtF;YACA;gBACEI,MAAM;gBACNC,MAAM;gBACNC,OAAO;YACT;YACA;gBACEF,MAAM;gBACNC,MAAM;gBACNE,UAAU;gBACVC,YAAYT,OAAOU,WAAW,CAC3BG,MAAM,CAAC,CAACD,mBAAqBA,iBAAiBE,IAAI,EAClDH,GAAG,CAAC,CAACC,mBAAqBA,iBAAiBX,IAAI;gBAClDc,UAAU;YACZ;SACD;QACDC,eAAe;IACjB,CAAA,EAAE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preferencesCollection.d.ts","sourceRoot":"","sources":["../../src/preferences/preferencesCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACtE,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAYxD,QAAA,MAAM,wBAAwB,WAAY,MAAM,KAAG,
|
|
1
|
+
{"version":3,"file":"preferencesCollection.d.ts","sourceRoot":"","sources":["../../src/preferences/preferencesCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACtE,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAYxD,QAAA,MAAM,wBAAwB,WAAY,MAAM,KAAG,gBA4DjD,CAAA;AAEF,eAAe,wBAAwB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/preferences/preferencesCollection.ts"],"sourcesContent":["import type { CollectionConfig } from '../collections/config/types.js'\nimport type { Access, Config } from '../config/types.js'\n\nimport { deleteHandler } from './requestHandlers/delete.js'\nimport { findByIDHandler } from './requestHandlers/findOne.js'\nimport { updateHandler } from './requestHandlers/update.js'\n\nconst preferenceAccess: Access = ({ req }) => ({\n 'user.value': {\n equals: req?.user?.id,\n },\n})\n\nconst getPreferencesCollection = (config: Config): CollectionConfig => ({\n slug: 'payload-preferences',\n access: {\n delete: preferenceAccess,\n read: preferenceAccess,\n },\n admin: {\n hidden: true,\n },\n endpoints: [\n {\n handler: findByIDHandler,\n method: 'get',\n path: '/:key',\n },\n {\n handler: deleteHandler,\n method: 'delete',\n path: '/:key',\n },\n {\n handler: updateHandler,\n method: 'post',\n path: '/:key',\n },\n ],\n fields: [\n {\n name: 'user',\n type: 'relationship',\n hooks: {\n beforeValidate: [\n ({ req }) => {\n if (!req?.user) {\n return null\n }\n return {\n relationTo: req?.user.collection,\n value: req?.user.id,\n }\n },\n ],\n },\n index: true,\n relationTo: config.collections\n .filter((collectionConfig) => collectionConfig.auth)\n .map((collectionConfig) => collectionConfig.slug),\n required: true,\n },\n {\n name: 'key',\n type: 'text',\n index: true,\n },\n {\n name: 'value',\n type: 'json',\n },\n ],\n})\n\nexport default getPreferencesCollection\n"],"names":["deleteHandler","findByIDHandler","updateHandler","preferenceAccess","req","equals","user","id","getPreferencesCollection","config","slug","access","delete","read","admin","hidden","endpoints","handler","method","path","fields","name","type","hooks","beforeValidate","relationTo","collection","value","index","collections","filter","collectionConfig","auth","map","required"],"mappings":"AAGA,SAASA,aAAa,QAAQ,8BAA6B;AAC3D,SAASC,eAAe,QAAQ,+BAA8B;AAC9D,SAASC,aAAa,QAAQ,8BAA6B;AAE3D,MAAMC,mBAA2B,CAAC,EAAEC,GAAG,EAAE,GAAM,CAAA;QAC7C,cAAc;YACZC,QAAQD,KAAKE,MAAMC;QACrB;IACF,CAAA;AAEA,MAAMC,2BAA2B,CAACC,SAAsC,CAAA;QACtEC,MAAM;QACNC,QAAQ;YACNC,QAAQT;YACRU,MAAMV;QACR;QACAW,OAAO;YACLC,QAAQ;QACV;QACAC,WAAW;YACT;gBACEC,SAAShB;gBACTiB,QAAQ;gBACRC,MAAM;YACR;YACA;gBACEF,SAASjB;gBACTkB,QAAQ;gBACRC,MAAM;YACR;YACA;gBACEF,SAASf;gBACTgB,QAAQ;gBACRC,MAAM;YACR;SACD;QACDC,QAAQ;YACN;gBACEC,MAAM;gBACNC,MAAM;gBACNC,OAAO;oBACLC,gBAAgB;wBACd,CAAC,EAAEpB,GAAG,EAAE;4BACN,IAAI,CAACA,KAAKE,MAAM;gCACd,OAAO;4BACT;4BACA,OAAO;gCACLmB,YAAYrB,KAAKE,KAAKoB;gCACtBC,OAAOvB,KAAKE,KAAKC;4BACnB;wBACF;qBACD;gBACH;gBACAqB,OAAO;gBACPH,YAAYhB,OAAOoB,WAAW,CAC3BC,MAAM,CAAC,CAACC,mBAAqBA,iBAAiBC,IAAI,EAClDC,GAAG,CAAC,CAACF,mBAAqBA,iBAAiBrB,IAAI;gBAClDwB,UAAU;YACZ;YACA;gBACEb,MAAM;gBACNC,MAAM;gBACNM,OAAO;YACT;YACA;gBACEP,MAAM;gBACNC,MAAM;YACR;SACD;
|
|
1
|
+
{"version":3,"sources":["../../src/preferences/preferencesCollection.ts"],"sourcesContent":["import type { CollectionConfig } from '../collections/config/types.js'\nimport type { Access, Config } from '../config/types.js'\n\nimport { deleteHandler } from './requestHandlers/delete.js'\nimport { findByIDHandler } from './requestHandlers/findOne.js'\nimport { updateHandler } from './requestHandlers/update.js'\n\nconst preferenceAccess: Access = ({ req }) => ({\n 'user.value': {\n equals: req?.user?.id,\n },\n})\n\nconst getPreferencesCollection = (config: Config): CollectionConfig => ({\n slug: 'payload-preferences',\n access: {\n delete: preferenceAccess,\n read: preferenceAccess,\n },\n admin: {\n hidden: true,\n },\n endpoints: [\n {\n handler: findByIDHandler,\n method: 'get',\n path: '/:key',\n },\n {\n handler: deleteHandler,\n method: 'delete',\n path: '/:key',\n },\n {\n handler: updateHandler,\n method: 'post',\n path: '/:key',\n },\n ],\n fields: [\n {\n name: 'user',\n type: 'relationship',\n hooks: {\n beforeValidate: [\n ({ req }) => {\n if (!req?.user) {\n return null\n }\n return {\n relationTo: req?.user.collection,\n value: req?.user.id,\n }\n },\n ],\n },\n index: true,\n relationTo: config.collections\n .filter((collectionConfig) => collectionConfig.auth)\n .map((collectionConfig) => collectionConfig.slug),\n required: true,\n },\n {\n name: 'key',\n type: 'text',\n index: true,\n },\n {\n name: 'value',\n type: 'json',\n },\n ],\n lockDocuments: false,\n})\n\nexport default getPreferencesCollection\n"],"names":["deleteHandler","findByIDHandler","updateHandler","preferenceAccess","req","equals","user","id","getPreferencesCollection","config","slug","access","delete","read","admin","hidden","endpoints","handler","method","path","fields","name","type","hooks","beforeValidate","relationTo","collection","value","index","collections","filter","collectionConfig","auth","map","required","lockDocuments"],"mappings":"AAGA,SAASA,aAAa,QAAQ,8BAA6B;AAC3D,SAASC,eAAe,QAAQ,+BAA8B;AAC9D,SAASC,aAAa,QAAQ,8BAA6B;AAE3D,MAAMC,mBAA2B,CAAC,EAAEC,GAAG,EAAE,GAAM,CAAA;QAC7C,cAAc;YACZC,QAAQD,KAAKE,MAAMC;QACrB;IACF,CAAA;AAEA,MAAMC,2BAA2B,CAACC,SAAsC,CAAA;QACtEC,MAAM;QACNC,QAAQ;YACNC,QAAQT;YACRU,MAAMV;QACR;QACAW,OAAO;YACLC,QAAQ;QACV;QACAC,WAAW;YACT;gBACEC,SAAShB;gBACTiB,QAAQ;gBACRC,MAAM;YACR;YACA;gBACEF,SAASjB;gBACTkB,QAAQ;gBACRC,MAAM;YACR;YACA;gBACEF,SAASf;gBACTgB,QAAQ;gBACRC,MAAM;YACR;SACD;QACDC,QAAQ;YACN;gBACEC,MAAM;gBACNC,MAAM;gBACNC,OAAO;oBACLC,gBAAgB;wBACd,CAAC,EAAEpB,GAAG,EAAE;4BACN,IAAI,CAACA,KAAKE,MAAM;gCACd,OAAO;4BACT;4BACA,OAAO;gCACLmB,YAAYrB,KAAKE,KAAKoB;gCACtBC,OAAOvB,KAAKE,KAAKC;4BACnB;wBACF;qBACD;gBACH;gBACAqB,OAAO;gBACPH,YAAYhB,OAAOoB,WAAW,CAC3BC,MAAM,CAAC,CAACC,mBAAqBA,iBAAiBC,IAAI,EAClDC,GAAG,CAAC,CAACF,mBAAqBA,iBAAiBrB,IAAI;gBAClDwB,UAAU;YACZ;YACA;gBACEb,MAAM;gBACNC,MAAM;gBACNM,OAAO;YACT;YACA;gBACEP,MAAM;gBACNC,MAAM;YACR;SACD;QACDa,eAAe;IACjB,CAAA;AAEA,eAAe3B,yBAAwB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkDocumentLockStatus.d.ts","sourceRoot":"","sources":["../../src/utilities/checkDocumentLockStatus.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAc,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAInE,KAAK,2BAA2B,GAAG;IACjC,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,GAAG,EAAE,cAAc,CAAA;CACpB,CAAA;AAED,eAAO,MAAM,uBAAuB,kGAQjC,2BAA2B,KAAG,OAAO,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"checkDocumentLockStatus.d.ts","sourceRoot":"","sources":["../../src/utilities/checkDocumentLockStatus.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAc,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAInE,KAAK,2BAA2B,GAAG;IACjC,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,GAAG,EAAE,cAAc,CAAA;CACpB,CAAA;AAED,eAAO,MAAM,uBAAuB,kGAQjC,2BAA2B,KAAG,OAAO,CAAC,IAAI,CA0E5C,CAAA"}
|
|
@@ -29,8 +29,11 @@ export const checkDocumentLockStatus = async ({ id, collectionSlug, globalSlug,
|
|
|
29
29
|
} else {
|
|
30
30
|
throw new Error('Either collectionSlug or globalSlug must be provided.');
|
|
31
31
|
}
|
|
32
|
+
if (!isLockingEnabled) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
32
35
|
// Only perform lock checks if overrideLock is false and locking is enabled
|
|
33
|
-
if (!overrideLock
|
|
36
|
+
if (!overrideLock) {
|
|
34
37
|
const defaultLockErrorMessage = collectionSlug ? `Document with ID ${id} is currently locked by another user and cannot be modified.` : `Global document with slug "${globalSlug}" is currently locked by another user and cannot be modified.`;
|
|
35
38
|
const finalLockErrorMessage = lockErrorMessage || defaultLockErrorMessage;
|
|
36
39
|
const lockedDocumentResult = await payload.db.find({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/checkDocumentLockStatus.ts"],"sourcesContent":["import type { TypeWithID } from '../collections/config/types.js'\nimport type { PaginatedDocs } from '../database/types.js'\nimport type { JsonObject, PayloadRequest } from '../types/index.js'\n\nimport { Locked } from '../errors/index.js'\n\ntype CheckDocumentLockStatusArgs = {\n collectionSlug?: string\n globalSlug?: string\n id?: number | string\n lockDurationDefault?: number\n lockErrorMessage?: string\n overrideLock?: boolean\n req: PayloadRequest\n}\n\nexport const checkDocumentLockStatus = async ({\n id,\n collectionSlug,\n globalSlug,\n lockDurationDefault = 300, // Default 5 minutes in seconds\n lockErrorMessage,\n overrideLock = true,\n req,\n}: CheckDocumentLockStatusArgs): Promise<void> => {\n const { payload } = req\n\n // Retrieve the lockDocuments property for either collection or global\n const lockDocumentsProp = collectionSlug\n ? payload.config?.collections?.find((c) => c.slug === collectionSlug)?.lockDocuments\n : payload.config?.globals?.find((g) => g.slug === globalSlug)?.lockDocuments\n\n const isLockingEnabled = lockDocumentsProp !== false\n\n let lockedDocumentQuery = {}\n\n if (collectionSlug) {\n lockedDocumentQuery = {\n and: [\n { 'document.relationTo': { equals: collectionSlug } },\n { 'document.value': { equals: id } },\n ],\n }\n } else if (globalSlug) {\n lockedDocumentQuery = { globalSlug: { equals: globalSlug } }\n } else {\n throw new Error('Either collectionSlug or globalSlug must be provided.')\n }\n\n // Only perform lock checks if overrideLock is false and locking is enabled\n if (!overrideLock
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/checkDocumentLockStatus.ts"],"sourcesContent":["import type { TypeWithID } from '../collections/config/types.js'\nimport type { PaginatedDocs } from '../database/types.js'\nimport type { JsonObject, PayloadRequest } from '../types/index.js'\n\nimport { Locked } from '../errors/index.js'\n\ntype CheckDocumentLockStatusArgs = {\n collectionSlug?: string\n globalSlug?: string\n id?: number | string\n lockDurationDefault?: number\n lockErrorMessage?: string\n overrideLock?: boolean\n req: PayloadRequest\n}\n\nexport const checkDocumentLockStatus = async ({\n id,\n collectionSlug,\n globalSlug,\n lockDurationDefault = 300, // Default 5 minutes in seconds\n lockErrorMessage,\n overrideLock = true,\n req,\n}: CheckDocumentLockStatusArgs): Promise<void> => {\n const { payload } = req\n\n // Retrieve the lockDocuments property for either collection or global\n const lockDocumentsProp = collectionSlug\n ? payload.config?.collections?.find((c) => c.slug === collectionSlug)?.lockDocuments\n : payload.config?.globals?.find((g) => g.slug === globalSlug)?.lockDocuments\n\n const isLockingEnabled = lockDocumentsProp !== false\n\n let lockedDocumentQuery = {}\n\n if (collectionSlug) {\n lockedDocumentQuery = {\n and: [\n { 'document.relationTo': { equals: collectionSlug } },\n { 'document.value': { equals: id } },\n ],\n }\n } else if (globalSlug) {\n lockedDocumentQuery = { globalSlug: { equals: globalSlug } }\n } else {\n throw new Error('Either collectionSlug or globalSlug must be provided.')\n }\n\n if (!isLockingEnabled) {\n return\n }\n\n // Only perform lock checks if overrideLock is false and locking is enabled\n if (!overrideLock) {\n const defaultLockErrorMessage = collectionSlug\n ? `Document with ID ${id} is currently locked by another user and cannot be modified.`\n : `Global document with slug \"${globalSlug}\" is currently locked by another user and cannot be modified.`\n\n const finalLockErrorMessage = lockErrorMessage || defaultLockErrorMessage\n\n const lockedDocumentResult: PaginatedDocs<JsonObject & TypeWithID> = await payload.db.find({\n collection: 'payload-locked-documents',\n limit: 1,\n pagination: false,\n req,\n sort: '-updatedAt',\n where: lockedDocumentQuery,\n })\n\n // If there's a locked document, check lock conditions\n const lockedDoc = lockedDocumentResult?.docs[0]\n if (lockedDoc) {\n const lastEditedAt = new Date(lockedDoc?.updatedAt).getTime()\n const now = new Date().getTime()\n\n const lockDuration =\n typeof lockDocumentsProp === 'object' ? lockDocumentsProp.duration : lockDurationDefault\n\n const lockDurationInMilliseconds = lockDuration * 1000\n const currentUserId = req.user?.id\n\n // document is locked by another user and the lock hasn't expired\n if (\n lockedDoc.user?.value !== currentUserId &&\n now - lastEditedAt <= lockDurationInMilliseconds\n ) {\n throw new Locked(finalLockErrorMessage)\n }\n }\n }\n\n // Perform the delete operation regardless of overrideLock status\n await payload.db.deleteMany({\n collection: 'payload-locked-documents',\n req,\n where: lockedDocumentQuery,\n })\n}\n"],"names":["Locked","checkDocumentLockStatus","id","collectionSlug","globalSlug","lockDurationDefault","lockErrorMessage","overrideLock","req","payload","lockDocumentsProp","config","collections","find","c","slug","lockDocuments","globals","g","isLockingEnabled","lockedDocumentQuery","and","equals","Error","defaultLockErrorMessage","finalLockErrorMessage","lockedDocumentResult","db","collection","limit","pagination","sort","where","lockedDoc","docs","lastEditedAt","Date","updatedAt","getTime","now","lockDuration","duration","lockDurationInMilliseconds","currentUserId","user","value","deleteMany"],"mappings":"AAIA,SAASA,MAAM,QAAQ,qBAAoB;AAY3C,OAAO,MAAMC,0BAA0B,OAAO,EAC5CC,EAAE,EACFC,cAAc,EACdC,UAAU,EACVC,sBAAsB,GAAG,EACzBC,gBAAgB,EAChBC,eAAe,IAAI,EACnBC,GAAG,EACyB;IAC5B,MAAM,EAAEC,OAAO,EAAE,GAAGD;IAEpB,sEAAsE;IACtE,MAAME,oBAAoBP,iBACtBM,QAAQE,MAAM,EAAEC,aAAaC,KAAK,CAACC,IAAMA,EAAEC,IAAI,KAAKZ,iBAAiBa,gBACrEP,QAAQE,MAAM,EAAEM,SAASJ,KAAK,CAACK,IAAMA,EAAEH,IAAI,KAAKX,aAAaY;IAEjE,MAAMG,mBAAmBT,sBAAsB;IAE/C,IAAIU,sBAAsB,CAAC;IAE3B,IAAIjB,gBAAgB;QAClBiB,sBAAsB;YACpBC,KAAK;gBACH;oBAAE,uBAAuB;wBAAEC,QAAQnB;oBAAe;gBAAE;gBACpD;oBAAE,kBAAkB;wBAAEmB,QAAQpB;oBAAG;gBAAE;aACpC;QACH;IACF,OAAO,IAAIE,YAAY;QACrBgB,sBAAsB;YAAEhB,YAAY;gBAAEkB,QAAQlB;YAAW;QAAE;IAC7D,OAAO;QACL,MAAM,IAAImB,MAAM;IAClB;IAEA,IAAI,CAACJ,kBAAkB;QACrB;IACF;IAEA,2EAA2E;IAC3E,IAAI,CAACZ,cAAc;QACjB,MAAMiB,0BAA0BrB,iBAC5B,CAAC,iBAAiB,EAAED,GAAG,4DAA4D,CAAC,GACpF,CAAC,2BAA2B,EAAEE,WAAW,6DAA6D,CAAC;QAE3G,MAAMqB,wBAAwBnB,oBAAoBkB;QAElD,MAAME,uBAA+D,MAAMjB,QAAQkB,EAAE,CAACd,IAAI,CAAC;YACzFe,YAAY;YACZC,OAAO;YACPC,YAAY;YACZtB;YACAuB,MAAM;YACNC,OAAOZ;QACT;QAEA,sDAAsD;QACtD,MAAMa,YAAYP,sBAAsBQ,IAAI,CAAC,EAAE;QAC/C,IAAID,WAAW;YACb,MAAME,eAAe,IAAIC,KAAKH,WAAWI,WAAWC,OAAO;YAC3D,MAAMC,MAAM,IAAIH,OAAOE,OAAO;YAE9B,MAAME,eACJ,OAAO9B,sBAAsB,WAAWA,kBAAkB+B,QAAQ,GAAGpC;YAEvE,MAAMqC,6BAA6BF,eAAe;YAClD,MAAMG,gBAAgBnC,IAAIoC,IAAI,EAAE1C;YAEhC,iEAAiE;YACjE,IACE+B,UAAUW,IAAI,EAAEC,UAAUF,iBAC1BJ,MAAMJ,gBAAgBO,4BACtB;gBACA,MAAM,IAAI1C,OAAOyB;YACnB;QACF;IACF;IAEA,iEAAiE;IACjE,MAAMhB,QAAQkB,EAAE,CAACmB,UAAU,CAAC;QAC1BlB,YAAY;QACZpB;QACAwB,OAAOZ;IACT;AACF,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getEntityPolicies.d.ts","sourceRoot":"","sources":["../../src/utilities/getEntityPolicies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAC9E,OAAO,KAAK,EAAE,yBAAyB,EAAc,MAAM,gCAAgC,CAAA;AAG3F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AACvE,OAAO,KAAK,EAAE,aAAa,EAAY,cAAc,EAAS,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"getEntityPolicies.d.ts","sourceRoot":"","sources":["../../src/utilities/getEntityPolicies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAC9E,OAAO,KAAK,EAAE,yBAAyB,EAAc,MAAM,gCAAgC,CAAA;AAG3F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AACvE,OAAO,KAAK,EAAE,aAAa,EAAY,cAAc,EAAS,MAAM,mBAAmB,CAAA;AAKvF,KAAK,IAAI,GAAG;IACV,MAAM,EAAE,yBAAyB,GAAG,qBAAqB,CAAA;IACzD,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACpB,UAAU,EAAE,aAAa,EAAE,CAAA;IAC3B,GAAG,EAAE,cAAc,CAAA;IACnB,IAAI,EAAE,YAAY,GAAG,QAAQ,CAAA;CAC9B,CAAA;AAED,KAAK,UAAU,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,QAAQ,GACxD,gBAAgB,GAChB,oBAAoB,CAAA;AAYxB,wBAAsB,iBAAiB,CAAC,CAAC,SAAS,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAwOvF"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { combineQueries } from '../database/combineQueries.js';
|
|
1
2
|
import { tabHasName } from '../fields/config/types.js';
|
|
2
3
|
export async function getEntityPolicies(args) {
|
|
3
4
|
const { id, type, entity, operations, req } = args;
|
|
@@ -29,17 +30,11 @@ export async function getEntityPolicies(args) {
|
|
|
29
30
|
overrideAccess: true,
|
|
30
31
|
pagination: false,
|
|
31
32
|
req,
|
|
32
|
-
where: {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
id: {
|
|
38
|
-
equals: id
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
]
|
|
42
|
-
}
|
|
33
|
+
where: combineQueries(where, {
|
|
34
|
+
id: {
|
|
35
|
+
equals: id
|
|
36
|
+
}
|
|
37
|
+
})
|
|
43
38
|
});
|
|
44
39
|
return paginatedRes?.docs?.[0] || undefined;
|
|
45
40
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/getEntityPolicies.ts"],"sourcesContent":["import type { CollectionPermission, GlobalPermission } from '../auth/types.js'\nimport type { SanitizedCollectionConfig, TypeWithID } from '../collections/config/types.js'\nimport type { Access } from '../config/types.js'\nimport type { Field, FieldAccess } from '../fields/config/types.js'\nimport type { SanitizedGlobalConfig } from '../globals/config/types.js'\nimport type { AllOperations, Document, PayloadRequest, Where } from '../types/index.js'\n\nimport { tabHasName } from '../fields/config/types.js'\n\ntype Args = {\n entity: SanitizedCollectionConfig | SanitizedGlobalConfig\n id?: number | string\n operations: AllOperations[]\n req: PayloadRequest\n type: 'collection' | 'global'\n}\n\ntype ReturnType<T extends Args> = T['type'] extends 'global'\n ? GlobalPermission\n : CollectionPermission\n\ntype CreateAccessPromise = (args: {\n access: Access | FieldAccess\n accessLevel: 'entity' | 'field'\n disableWhere?: boolean\n operation: AllOperations\n policiesObj: {\n [key: string]: any\n }\n}) => Promise<void>\n\nexport async function getEntityPolicies<T extends Args>(args: T): Promise<ReturnType<T>> {\n const { id, type, entity, operations, req } = args\n const { data, locale, payload, user } = req\n const isLoggedIn = !!user\n\n const policies = {\n fields: {},\n } as ReturnType<T>\n\n let docBeingAccessed\n\n async function getEntityDoc({ where }: { where?: Where } = {}): Promise<Document & TypeWithID> {\n if (entity.slug) {\n if (type === 'global') {\n return payload.findGlobal({\n slug: entity.slug,\n fallbackLocale: null,\n locale,\n overrideAccess: true,\n req,\n })\n }\n\n if (type === 'collection' && id) {\n if (typeof where === 'object') {\n const paginatedRes = await payload.find({\n collection: entity.slug,\n depth: 0,\n fallbackLocale: null,\n limit: 1,\n locale,\n overrideAccess: true,\n pagination: false,\n req,\n where: {\n ...where,\n and: [\n ...(where.and || []),\n {\n id: {\n equals: id,\n },\n },\n ],\n },\n })\n\n return paginatedRes?.docs?.[0] || undefined\n }\n\n return payload.findByID({\n id,\n collection: entity.slug,\n depth: 0,\n fallbackLocale: null,\n locale,\n overrideAccess: true,\n req,\n })\n }\n }\n\n return undefined\n }\n\n const createAccessPromise: CreateAccessPromise = async ({\n access,\n accessLevel,\n disableWhere = false,\n operation,\n policiesObj,\n }) => {\n const mutablePolicies = policiesObj\n\n if (accessLevel === 'field' && docBeingAccessed === undefined) {\n // assign docBeingAccessed first as the promise to avoid multiple calls to getEntityDoc\n docBeingAccessed = getEntityDoc().then((doc) => {\n docBeingAccessed = doc\n })\n }\n // awaiting the promise to ensure docBeingAccessed is assigned before it is used\n await docBeingAccessed\n\n // https://payloadcms.slack.com/archives/C048Z9C2BEX/p1702054928343769\n const accessResult = await access({ id, data, doc: docBeingAccessed, req })\n\n if (typeof accessResult === 'object' && !disableWhere) {\n mutablePolicies[operation] = {\n permission:\n id || type === 'global' ? !!(await getEntityDoc({ where: accessResult })) : true,\n where: accessResult,\n }\n } else if (mutablePolicies[operation]?.permission !== false) {\n mutablePolicies[operation] = {\n permission: !!accessResult,\n }\n }\n }\n\n const executeFieldPolicies = async ({\n entityPermission,\n fields,\n operation,\n policiesObj,\n }: {\n entityPermission\n fields: Field[]\n operation: AllOperations\n policiesObj\n }) => {\n const mutablePolicies = policiesObj.fields\n\n await Promise.all(\n fields.map(async (field) => {\n if ('name' in field && field.name) {\n if (!mutablePolicies[field.name]) {\n mutablePolicies[field.name] = {}\n }\n\n if ('access' in field && field.access && typeof field.access[operation] === 'function') {\n await createAccessPromise({\n access: field.access[operation],\n accessLevel: 'field',\n disableWhere: true,\n operation,\n policiesObj: mutablePolicies[field.name],\n })\n } else {\n mutablePolicies[field.name][operation] = {\n permission: policiesObj[operation]?.permission,\n }\n }\n\n if ('fields' in field && field.fields) {\n if (!mutablePolicies[field.name].fields) {\n mutablePolicies[field.name].fields = {}\n }\n\n await executeFieldPolicies({\n entityPermission,\n fields: field.fields,\n operation,\n policiesObj: mutablePolicies[field.name],\n })\n }\n\n if ('blocks' in field && field?.blocks) {\n if (!mutablePolicies[field.name]?.blocks) {\n mutablePolicies[field.name].blocks = {}\n }\n\n await Promise.all(\n field.blocks.map(async (block) => {\n if (!mutablePolicies[field.name].blocks?.[block.slug]) {\n mutablePolicies[field.name].blocks[block.slug] = {\n fields: {},\n [operation]: { permission: entityPermission },\n }\n } else if (!mutablePolicies[field.name].blocks[block.slug][operation]) {\n mutablePolicies[field.name].blocks[block.slug][operation] = {\n permission: entityPermission,\n }\n }\n\n await executeFieldPolicies({\n entityPermission,\n fields: block.fields,\n operation,\n policiesObj: mutablePolicies[field.name].blocks[block.slug],\n })\n }),\n )\n }\n } else if ('fields' in field && field.fields) {\n await executeFieldPolicies({\n entityPermission,\n fields: field.fields,\n operation,\n policiesObj,\n })\n } else if (field.type === 'tabs') {\n await Promise.all(\n field.tabs.map(async (tab) => {\n if (tabHasName(tab)) {\n if (!mutablePolicies[tab.name]) {\n mutablePolicies[tab.name] = {\n fields: {},\n [operation]: { permission: entityPermission },\n }\n } else if (!mutablePolicies[tab.name][operation]) {\n mutablePolicies[tab.name][operation] = { permission: entityPermission }\n }\n await executeFieldPolicies({\n entityPermission,\n fields: tab.fields,\n operation,\n policiesObj: mutablePolicies[tab.name],\n })\n } else {\n await executeFieldPolicies({\n entityPermission,\n fields: tab.fields,\n operation,\n policiesObj,\n })\n }\n }),\n )\n }\n }),\n )\n }\n\n await operations.reduce(async (priorOperation, operation) => {\n await priorOperation\n\n let entityAccessPromise: Promise<void>\n\n if (typeof entity.access[operation] === 'function') {\n entityAccessPromise = createAccessPromise({\n access: entity.access[operation],\n accessLevel: 'entity',\n operation,\n policiesObj: policies,\n })\n } else {\n policies[operation] = {\n permission: isLoggedIn,\n }\n }\n\n await entityAccessPromise\n\n await executeFieldPolicies({\n entityPermission: policies[operation].permission,\n fields: entity.fields,\n operation,\n policiesObj: policies,\n })\n }, Promise.resolve())\n\n return policies\n}\n"],"names":["tabHasName","getEntityPolicies","args","id","type","entity","operations","req","data","locale","payload","user","isLoggedIn","policies","fields","docBeingAccessed","getEntityDoc","where","slug","findGlobal","fallbackLocale","overrideAccess","paginatedRes","find","collection","depth","limit","pagination","and","equals","docs","undefined","findByID","createAccessPromise","access","accessLevel","disableWhere","operation","policiesObj","mutablePolicies","then","doc","accessResult","permission","executeFieldPolicies","entityPermission","Promise","all","map","field","name","blocks","block","tabs","tab","reduce","priorOperation","entityAccessPromise","resolve"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/getEntityPolicies.ts"],"sourcesContent":["import type { CollectionPermission, GlobalPermission } from '../auth/types.js'\nimport type { SanitizedCollectionConfig, TypeWithID } from '../collections/config/types.js'\nimport type { Access } from '../config/types.js'\nimport type { Field, FieldAccess } from '../fields/config/types.js'\nimport type { SanitizedGlobalConfig } from '../globals/config/types.js'\nimport type { AllOperations, Document, PayloadRequest, Where } from '../types/index.js'\n\nimport { combineQueries } from '../database/combineQueries.js'\nimport { tabHasName } from '../fields/config/types.js'\n\ntype Args = {\n entity: SanitizedCollectionConfig | SanitizedGlobalConfig\n id?: number | string\n operations: AllOperations[]\n req: PayloadRequest\n type: 'collection' | 'global'\n}\n\ntype ReturnType<T extends Args> = T['type'] extends 'global'\n ? GlobalPermission\n : CollectionPermission\n\ntype CreateAccessPromise = (args: {\n access: Access | FieldAccess\n accessLevel: 'entity' | 'field'\n disableWhere?: boolean\n operation: AllOperations\n policiesObj: {\n [key: string]: any\n }\n}) => Promise<void>\n\nexport async function getEntityPolicies<T extends Args>(args: T): Promise<ReturnType<T>> {\n const { id, type, entity, operations, req } = args\n const { data, locale, payload, user } = req\n const isLoggedIn = !!user\n\n const policies = {\n fields: {},\n } as ReturnType<T>\n\n let docBeingAccessed\n\n async function getEntityDoc({ where }: { where?: Where } = {}): Promise<Document & TypeWithID> {\n if (entity.slug) {\n if (type === 'global') {\n return payload.findGlobal({\n slug: entity.slug,\n fallbackLocale: null,\n locale,\n overrideAccess: true,\n req,\n })\n }\n\n if (type === 'collection' && id) {\n if (typeof where === 'object') {\n const paginatedRes = await payload.find({\n collection: entity.slug,\n depth: 0,\n fallbackLocale: null,\n limit: 1,\n locale,\n overrideAccess: true,\n pagination: false,\n req,\n where: combineQueries(where, { id: { equals: id } }),\n })\n\n return paginatedRes?.docs?.[0] || undefined\n }\n\n return payload.findByID({\n id,\n collection: entity.slug,\n depth: 0,\n fallbackLocale: null,\n locale,\n overrideAccess: true,\n req,\n })\n }\n }\n\n return undefined\n }\n\n const createAccessPromise: CreateAccessPromise = async ({\n access,\n accessLevel,\n disableWhere = false,\n operation,\n policiesObj,\n }) => {\n const mutablePolicies = policiesObj\n\n if (accessLevel === 'field' && docBeingAccessed === undefined) {\n // assign docBeingAccessed first as the promise to avoid multiple calls to getEntityDoc\n docBeingAccessed = getEntityDoc().then((doc) => {\n docBeingAccessed = doc\n })\n }\n // awaiting the promise to ensure docBeingAccessed is assigned before it is used\n await docBeingAccessed\n\n // https://payloadcms.slack.com/archives/C048Z9C2BEX/p1702054928343769\n const accessResult = await access({ id, data, doc: docBeingAccessed, req })\n\n if (typeof accessResult === 'object' && !disableWhere) {\n mutablePolicies[operation] = {\n permission:\n id || type === 'global' ? !!(await getEntityDoc({ where: accessResult })) : true,\n where: accessResult,\n }\n } else if (mutablePolicies[operation]?.permission !== false) {\n mutablePolicies[operation] = {\n permission: !!accessResult,\n }\n }\n }\n\n const executeFieldPolicies = async ({\n entityPermission,\n fields,\n operation,\n policiesObj,\n }: {\n entityPermission\n fields: Field[]\n operation: AllOperations\n policiesObj\n }) => {\n const mutablePolicies = policiesObj.fields\n\n await Promise.all(\n fields.map(async (field) => {\n if ('name' in field && field.name) {\n if (!mutablePolicies[field.name]) {\n mutablePolicies[field.name] = {}\n }\n\n if ('access' in field && field.access && typeof field.access[operation] === 'function') {\n await createAccessPromise({\n access: field.access[operation],\n accessLevel: 'field',\n disableWhere: true,\n operation,\n policiesObj: mutablePolicies[field.name],\n })\n } else {\n mutablePolicies[field.name][operation] = {\n permission: policiesObj[operation]?.permission,\n }\n }\n\n if ('fields' in field && field.fields) {\n if (!mutablePolicies[field.name].fields) {\n mutablePolicies[field.name].fields = {}\n }\n\n await executeFieldPolicies({\n entityPermission,\n fields: field.fields,\n operation,\n policiesObj: mutablePolicies[field.name],\n })\n }\n\n if ('blocks' in field && field?.blocks) {\n if (!mutablePolicies[field.name]?.blocks) {\n mutablePolicies[field.name].blocks = {}\n }\n\n await Promise.all(\n field.blocks.map(async (block) => {\n if (!mutablePolicies[field.name].blocks?.[block.slug]) {\n mutablePolicies[field.name].blocks[block.slug] = {\n fields: {},\n [operation]: { permission: entityPermission },\n }\n } else if (!mutablePolicies[field.name].blocks[block.slug][operation]) {\n mutablePolicies[field.name].blocks[block.slug][operation] = {\n permission: entityPermission,\n }\n }\n\n await executeFieldPolicies({\n entityPermission,\n fields: block.fields,\n operation,\n policiesObj: mutablePolicies[field.name].blocks[block.slug],\n })\n }),\n )\n }\n } else if ('fields' in field && field.fields) {\n await executeFieldPolicies({\n entityPermission,\n fields: field.fields,\n operation,\n policiesObj,\n })\n } else if (field.type === 'tabs') {\n await Promise.all(\n field.tabs.map(async (tab) => {\n if (tabHasName(tab)) {\n if (!mutablePolicies[tab.name]) {\n mutablePolicies[tab.name] = {\n fields: {},\n [operation]: { permission: entityPermission },\n }\n } else if (!mutablePolicies[tab.name][operation]) {\n mutablePolicies[tab.name][operation] = { permission: entityPermission }\n }\n await executeFieldPolicies({\n entityPermission,\n fields: tab.fields,\n operation,\n policiesObj: mutablePolicies[tab.name],\n })\n } else {\n await executeFieldPolicies({\n entityPermission,\n fields: tab.fields,\n operation,\n policiesObj,\n })\n }\n }),\n )\n }\n }),\n )\n }\n\n await operations.reduce(async (priorOperation, operation) => {\n await priorOperation\n\n let entityAccessPromise: Promise<void>\n\n if (typeof entity.access[operation] === 'function') {\n entityAccessPromise = createAccessPromise({\n access: entity.access[operation],\n accessLevel: 'entity',\n operation,\n policiesObj: policies,\n })\n } else {\n policies[operation] = {\n permission: isLoggedIn,\n }\n }\n\n await entityAccessPromise\n\n await executeFieldPolicies({\n entityPermission: policies[operation].permission,\n fields: entity.fields,\n operation,\n policiesObj: policies,\n })\n }, Promise.resolve())\n\n return policies\n}\n"],"names":["combineQueries","tabHasName","getEntityPolicies","args","id","type","entity","operations","req","data","locale","payload","user","isLoggedIn","policies","fields","docBeingAccessed","getEntityDoc","where","slug","findGlobal","fallbackLocale","overrideAccess","paginatedRes","find","collection","depth","limit","pagination","equals","docs","undefined","findByID","createAccessPromise","access","accessLevel","disableWhere","operation","policiesObj","mutablePolicies","then","doc","accessResult","permission","executeFieldPolicies","entityPermission","Promise","all","map","field","name","blocks","block","tabs","tab","reduce","priorOperation","entityAccessPromise","resolve"],"mappings":"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"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { type Logger } from 'pino';
|
|
2
|
+
import { type PinoPretty } from 'pino-pretty';
|
|
2
3
|
import type { Config } from '../config/types.js';
|
|
3
4
|
/**
|
|
4
5
|
* Payload internal logger. Uses Pino.
|
|
5
6
|
* This allows you to bring your own logger instance and let payload use it
|
|
6
7
|
*/
|
|
7
8
|
export type PayloadLogger = Logger;
|
|
8
|
-
export declare const prettySyncLoggerDestination:
|
|
9
|
-
export declare const defaultLoggerOptions:
|
|
9
|
+
export declare const prettySyncLoggerDestination: PinoPretty.PrettyStream;
|
|
10
|
+
export declare const defaultLoggerOptions: PinoPretty.PrettyStream;
|
|
10
11
|
export declare const getLogger: (name?: string, logger?: Config["logger"]) => PayloadLogger;
|
|
11
12
|
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utilities/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAQ,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utilities/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAQ,MAAM,MAAM,CAAA;AACxC,OAAO,EAAS,KAAK,UAAU,EAAsB,MAAM,aAAa,CAAA;AAExE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAA;AAQlC,eAAO,MAAM,2BAA2B,EAAE,UAAU,CAAC,YAInD,CAAA;AAEF,eAAO,MAAM,oBAAoB,EAAE,UAAU,CAAC,YAAmC,CAAA;AAEjF,eAAO,MAAM,SAAS,2BAA+B,MAAM,CAAC,QAAQ,CAAC,KAAG,aA2BvE,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/logger.ts"],"sourcesContent":["import { type Logger, pino } from 'pino'\nimport { build, type PrettyOptions } from 'pino-pretty'\n\nimport type { Config } from '../config/types.js'\n\n/**\n * Payload internal logger. Uses Pino.\n * This allows you to bring your own logger instance and let payload use it\n */\nexport type PayloadLogger = Logger\n\nconst prettyOptions: PrettyOptions = {\n colorize: true,\n ignore: 'pid,hostname',\n translateTime: 'SYS:HH:MM:ss',\n}\n\nexport const prettySyncLoggerDestination = build({\n ...prettyOptions,\n destination: 1, // stdout\n sync: true,\n})\n\nexport const defaultLoggerOptions = build(prettyOptions)\n\nexport const getLogger = (name = 'payload', logger?: Config['logger']): PayloadLogger => {\n if (!logger) {\n return pino(defaultLoggerOptions)\n }\n\n // Synchronous logger used by bin scripts\n if (logger === 'sync') {\n return pino(prettySyncLoggerDestination)\n }\n\n // Check if logger is an object\n if ('options' in logger) {\n const { destination, options } = logger\n\n if (!options.name) {\n options.name = name\n }\n\n if (!options.enabled) {\n options.enabled = process.env.DISABLE_LOGGING !== 'true'\n }\n\n return pino(options, destination)\n } else {\n // Instantiated logger\n return logger\n }\n}\n"],"names":["pino","build","prettyOptions","colorize","ignore","translateTime","prettySyncLoggerDestination","destination","sync","defaultLoggerOptions","getLogger","name","logger","options","enabled","process","env","DISABLE_LOGGING"],"mappings":"AAAA,SAAsBA,IAAI,QAAQ,OAAM;AACxC,SAASC,KAAK,
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/logger.ts"],"sourcesContent":["import { type Logger, pino } from 'pino'\nimport { build, type PinoPretty, type PrettyOptions } from 'pino-pretty'\n\nimport type { Config } from '../config/types.js'\n\n/**\n * Payload internal logger. Uses Pino.\n * This allows you to bring your own logger instance and let payload use it\n */\nexport type PayloadLogger = Logger\n\nconst prettyOptions: PrettyOptions = {\n colorize: true,\n ignore: 'pid,hostname',\n translateTime: 'SYS:HH:MM:ss',\n}\n\nexport const prettySyncLoggerDestination: PinoPretty.PrettyStream = build({\n ...prettyOptions,\n destination: 1, // stdout\n sync: true,\n})\n\nexport const defaultLoggerOptions: PinoPretty.PrettyStream = build(prettyOptions)\n\nexport const getLogger = (name = 'payload', logger?: Config['logger']): PayloadLogger => {\n if (!logger) {\n return pino(defaultLoggerOptions)\n }\n\n // Synchronous logger used by bin scripts\n if (logger === 'sync') {\n return pino(prettySyncLoggerDestination)\n }\n\n // Check if logger is an object\n if ('options' in logger) {\n const { destination, options } = logger\n\n if (!options.name) {\n options.name = name\n }\n\n if (!options.enabled) {\n options.enabled = process.env.DISABLE_LOGGING !== 'true'\n }\n\n return pino(options, destination)\n } else {\n // Instantiated logger\n return logger\n }\n}\n"],"names":["pino","build","prettyOptions","colorize","ignore","translateTime","prettySyncLoggerDestination","destination","sync","defaultLoggerOptions","getLogger","name","logger","options","enabled","process","env","DISABLE_LOGGING"],"mappings":"AAAA,SAAsBA,IAAI,QAAQ,OAAM;AACxC,SAASC,KAAK,QAA6C,cAAa;AAUxE,MAAMC,gBAA+B;IACnCC,UAAU;IACVC,QAAQ;IACRC,eAAe;AACjB;AAEA,OAAO,MAAMC,8BAAuDL,MAAM;IACxE,GAAGC,aAAa;IAChBK,aAAa;IACbC,MAAM;AACR,GAAE;AAEF,OAAO,MAAMC,uBAAgDR,MAAMC,eAAc;AAEjF,OAAO,MAAMQ,YAAY,CAACC,OAAO,SAAS,EAAEC;IAC1C,IAAI,CAACA,QAAQ;QACX,OAAOZ,KAAKS;IACd;IAEA,yCAAyC;IACzC,IAAIG,WAAW,QAAQ;QACrB,OAAOZ,KAAKM;IACd;IAEA,+BAA+B;IAC/B,IAAI,aAAaM,QAAQ;QACvB,MAAM,EAAEL,WAAW,EAAEM,OAAO,EAAE,GAAGD;QAEjC,IAAI,CAACC,QAAQF,IAAI,EAAE;YACjBE,QAAQF,IAAI,GAAGA;QACjB;QAEA,IAAI,CAACE,QAAQC,OAAO,EAAE;YACpBD,QAAQC,OAAO,GAAGC,QAAQC,GAAG,CAACC,eAAe,KAAK;QACpD;QAEA,OAAOjB,KAAKa,SAASN;IACvB,OAAO;QACL,sBAAsB;QACtB,OAAOK;IACT;AACF,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appendVersionToQueryKey.d.ts","sourceRoot":"","sources":["../../../src/versions/drafts/appendVersionToQueryKey.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAEjD,eAAO,MAAM,uBAAuB,
|
|
1
|
+
{"version":3,"file":"appendVersionToQueryKey.d.ts","sourceRoot":"","sources":["../../../src/versions/drafts/appendVersionToQueryKey.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAEjD,eAAO,MAAM,uBAAuB,WAAW,KAAK,KAAQ,KAqB3D,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/versions/drafts/appendVersionToQueryKey.ts"],"sourcesContent":["import type { Where } from '../../types/index.js'\n\nexport const appendVersionToQueryKey = (query: Where): Where => {\n return Object.entries(query).reduce((res, [key, val]) => {\n if (['AND', 'and', 'OR', 'or'].includes(key) && Array.isArray(val)) {\n return {\n ...res,\n [key.toLowerCase()]: val.map((subQuery) => appendVersionToQueryKey(subQuery)),\n }\n }\n\n if (key !== 'id') {\n return {\n ...res,\n [`version.${key}`]: val,\n }\n }\n\n return {\n ...res,\n parent: val,\n }\n }, {})\n}\n"],"names":["appendVersionToQueryKey","query","Object","entries","reduce","res","key","val","includes","Array","isArray","toLowerCase","map","subQuery","parent"],"mappings":"AAEA,OAAO,MAAMA,0BAA0B,CAACC;
|
|
1
|
+
{"version":3,"sources":["../../../src/versions/drafts/appendVersionToQueryKey.ts"],"sourcesContent":["import type { Where } from '../../types/index.js'\n\nexport const appendVersionToQueryKey = (query: Where = {}): Where => {\n return Object.entries(query).reduce((res, [key, val]) => {\n if (['AND', 'and', 'OR', 'or'].includes(key) && Array.isArray(val)) {\n return {\n ...res,\n [key.toLowerCase()]: val.map((subQuery) => appendVersionToQueryKey(subQuery)),\n }\n }\n\n if (key !== 'id') {\n return {\n ...res,\n [`version.${key}`]: val,\n }\n }\n\n return {\n ...res,\n parent: val,\n }\n }, {})\n}\n"],"names":["appendVersionToQueryKey","query","Object","entries","reduce","res","key","val","includes","Array","isArray","toLowerCase","map","subQuery","parent"],"mappings":"AAEA,OAAO,MAAMA,0BAA0B,CAACC,QAAe,CAAC,CAAC;IACvD,OAAOC,OAAOC,OAAO,CAACF,OAAOG,MAAM,CAAC,CAACC,KAAK,CAACC,KAAKC,IAAI;QAClD,IAAI;YAAC;YAAO;YAAO;YAAM;SAAK,CAACC,QAAQ,CAACF,QAAQG,MAAMC,OAAO,CAACH,MAAM;YAClE,OAAO;gBACL,GAAGF,GAAG;gBACN,CAACC,IAAIK,WAAW,GAAG,EAAEJ,IAAIK,GAAG,CAAC,CAACC,WAAab,wBAAwBa;YACrE;QACF;QAEA,IAAIP,QAAQ,MAAM;YAChB,OAAO;gBACL,GAAGD,GAAG;gBACN,CAAC,CAAC,QAAQ,EAAEC,IAAI,CAAC,CAAC,EAAEC;YACtB;QACF;QAEA,OAAO;YACL,GAAGF,GAAG;YACNS,QAAQP;QACV;IACF,GAAG,CAAC;AACN,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getLatestCollectionVersion.d.ts","sourceRoot":"","sources":["../../src/versions/getLatestCollectionVersion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAC3F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"getLatestCollectionVersion.d.ts","sourceRoot":"","sources":["../../src/versions/getLatestCollectionVersion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAC3F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAMhE,KAAK,IAAI,GAAG;IACV,MAAM,EAAE,yBAAyB,CAAA;IACjC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,KAAK,EAAE,WAAW,CAAA;IAClB,GAAG,CAAC,EAAE,cAAc,CAAA;CACrB,CAAA;AAED,eAAO,MAAM,0BAA0B,GAAU,CAAC,SAAS,UAAU,yDAOlE,IAAI,KAAG,OAAO,CAAC,CAAC,CAgClB,CAAA"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { combineQueries } from '../database/combineQueries.js';
|
|
2
|
+
import { appendVersionToQueryKey } from './drafts/appendVersionToQueryKey.js';
|
|
1
3
|
export const getLatestCollectionVersion = async ({ id, config, payload, published, query, req })=>{
|
|
2
4
|
let latestVersion;
|
|
3
5
|
const whereQuery = published ? {
|
|
@@ -34,7 +36,7 @@ export const getLatestCollectionVersion = async ({ id, config, payload, publishe
|
|
|
34
36
|
pagination: false,
|
|
35
37
|
req,
|
|
36
38
|
sort: '-updatedAt',
|
|
37
|
-
where: whereQuery
|
|
39
|
+
where: combineQueries(appendVersionToQueryKey(query.where), whereQuery)
|
|
38
40
|
});
|
|
39
41
|
[latestVersion] = docs;
|
|
40
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/versions/getLatestCollectionVersion.ts"],"sourcesContent":["import type { SanitizedCollectionConfig, TypeWithID } from '../collections/config/types.js'\nimport type { FindOneArgs } from '../database/types.js'\nimport type { Payload, PayloadRequest } from '../types/index.js'\nimport type { TypeWithVersion } from './types.js'\n\ntype Args = {\n config: SanitizedCollectionConfig\n id: number | string\n payload: Payload\n published?: boolean\n query: FindOneArgs\n req?: PayloadRequest\n}\n\nexport const getLatestCollectionVersion = async <T extends TypeWithID = any>({\n id,\n config,\n payload,\n published,\n query,\n req,\n}: Args): Promise<T> => {\n let latestVersion: TypeWithVersion<T>\n\n const whereQuery = published\n ? { and: [{ parent: { equals: id } }, { 'version._status': { equals: 'published' } }] }\n : { and: [{ parent: { equals: id } }, { latest: { equals: true } }] }\n\n if (config.versions?.drafts) {\n const { docs } = await payload.db.findVersions<T>({\n collection: config.slug,\n limit: 1,\n pagination: false,\n req,\n sort: '-updatedAt',\n where: whereQuery,\n })\n ;[latestVersion] = docs\n }\n\n if (!latestVersion) {\n if (!published) {\n const doc = await payload.db.findOne<T>({ ...query, req })\n\n return doc\n }\n\n return undefined\n }\n\n latestVersion.version.id = id\n\n return latestVersion.version\n}\n"],"names":["getLatestCollectionVersion","id","config","payload","published","query","req","latestVersion","whereQuery","and","parent","equals","latest","versions","drafts","docs","db","findVersions","collection","slug","limit","pagination","sort","where","doc","findOne","undefined","version"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/versions/getLatestCollectionVersion.ts"],"sourcesContent":["import type { SanitizedCollectionConfig, TypeWithID } from '../collections/config/types.js'\nimport type { FindOneArgs } from '../database/types.js'\nimport type { Payload, PayloadRequest } from '../types/index.js'\nimport type { TypeWithVersion } from './types.js'\n\nimport { combineQueries } from '../database/combineQueries.js'\nimport { appendVersionToQueryKey } from './drafts/appendVersionToQueryKey.js'\n\ntype Args = {\n config: SanitizedCollectionConfig\n id: number | string\n payload: Payload\n published?: boolean\n query: FindOneArgs\n req?: PayloadRequest\n}\n\nexport const getLatestCollectionVersion = async <T extends TypeWithID = any>({\n id,\n config,\n payload,\n published,\n query,\n req,\n}: Args): Promise<T> => {\n let latestVersion: TypeWithVersion<T>\n\n const whereQuery = published\n ? { and: [{ parent: { equals: id } }, { 'version._status': { equals: 'published' } }] }\n : { and: [{ parent: { equals: id } }, { latest: { equals: true } }] }\n\n if (config.versions?.drafts) {\n const { docs } = await payload.db.findVersions<T>({\n collection: config.slug,\n limit: 1,\n pagination: false,\n req,\n sort: '-updatedAt',\n where: combineQueries(appendVersionToQueryKey(query.where), whereQuery),\n })\n ;[latestVersion] = docs\n }\n\n if (!latestVersion) {\n if (!published) {\n const doc = await payload.db.findOne<T>({ ...query, req })\n\n return doc\n }\n\n return undefined\n }\n\n latestVersion.version.id = id\n\n return latestVersion.version\n}\n"],"names":["combineQueries","appendVersionToQueryKey","getLatestCollectionVersion","id","config","payload","published","query","req","latestVersion","whereQuery","and","parent","equals","latest","versions","drafts","docs","db","findVersions","collection","slug","limit","pagination","sort","where","doc","findOne","undefined","version"],"mappings":"AAKA,SAASA,cAAc,QAAQ,gCAA+B;AAC9D,SAASC,uBAAuB,QAAQ,sCAAqC;AAW7E,OAAO,MAAMC,6BAA6B,OAAmC,EAC3EC,EAAE,EACFC,MAAM,EACNC,OAAO,EACPC,SAAS,EACTC,KAAK,EACLC,GAAG,EACE;IACL,IAAIC;IAEJ,MAAMC,aAAaJ,YACf;QAAEK,KAAK;YAAC;gBAAEC,QAAQ;oBAAEC,QAAQV;gBAAG;YAAE;YAAG;gBAAE,mBAAmB;oBAAEU,QAAQ;gBAAY;YAAE;SAAE;IAAC,IACpF;QAAEF,KAAK;YAAC;gBAAEC,QAAQ;oBAAEC,QAAQV;gBAAG;YAAE;YAAG;gBAAEW,QAAQ;oBAAED,QAAQ;gBAAK;YAAE;SAAE;IAAC;IAEtE,IAAIT,OAAOW,QAAQ,EAAEC,QAAQ;QAC3B,MAAM,EAAEC,IAAI,EAAE,GAAG,MAAMZ,QAAQa,EAAE,CAACC,YAAY,CAAI;YAChDC,YAAYhB,OAAOiB,IAAI;YACvBC,OAAO;YACPC,YAAY;YACZf;YACAgB,MAAM;YACNC,OAAOzB,eAAeC,wBAAwBM,MAAMkB,KAAK,GAAGf;QAC9D;QACC,CAACD,cAAc,GAAGQ;IACrB;IAEA,IAAI,CAACR,eAAe;QAClB,IAAI,CAACH,WAAW;YACd,MAAMoB,MAAM,MAAMrB,QAAQa,EAAE,CAACS,OAAO,CAAI;gBAAE,GAAGpB,KAAK;gBAAEC;YAAI;YAExD,OAAOkB;QACT;QAEA,OAAOE;IACT;IAEAnB,cAAcoB,OAAO,CAAC1B,EAAE,GAAGA;IAE3B,OAAOM,cAAcoB,OAAO;AAC9B,EAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "payload",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.117",
|
|
4
4
|
"description": "Node, React, Headless CMS and Application Framework built on Next.js",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"admin panel",
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
],
|
|
73
73
|
"dependencies": {
|
|
74
74
|
"@monaco-editor/react": "4.6.0",
|
|
75
|
-
"@next/env": "^15.0.0
|
|
75
|
+
"@next/env": "^15.0.0",
|
|
76
76
|
"@types/busboy": "1.5.4",
|
|
77
77
|
"ajv": "8.17.1",
|
|
78
78
|
"bson-objectid": "2.0.4",
|
|
@@ -84,23 +84,22 @@
|
|
|
84
84
|
"get-tsconfig": "^4.7.2",
|
|
85
85
|
"http-status": "1.6.2",
|
|
86
86
|
"image-size": "^1.1.1",
|
|
87
|
+
"jose": "5.9.2",
|
|
87
88
|
"json-schema-to-typescript": "15.0.1",
|
|
88
|
-
"jsonwebtoken": "9.0.2",
|
|
89
89
|
"minimist": "1.2.8",
|
|
90
|
-
"pino": "9.
|
|
91
|
-
"pino-pretty": "11.
|
|
90
|
+
"pino": "9.5.0",
|
|
91
|
+
"pino-pretty": "11.3.0",
|
|
92
92
|
"pluralize": "8.0.0",
|
|
93
93
|
"sanitize-filename": "1.6.3",
|
|
94
94
|
"scmp": "2.1.0",
|
|
95
95
|
"ts-essentials": "10.0.2",
|
|
96
96
|
"tsx": "4.19.1",
|
|
97
97
|
"uuid": "10.0.0",
|
|
98
|
-
"@payloadcms/translations": "3.0.0-beta.
|
|
98
|
+
"@payloadcms/translations": "3.0.0-beta.117"
|
|
99
99
|
},
|
|
100
100
|
"devDependencies": {
|
|
101
101
|
"@hyrious/esbuild-plugin-commonjs": "^0.2.4",
|
|
102
102
|
"@types/json-schema": "7.0.15",
|
|
103
|
-
"@types/jsonwebtoken": "8.5.9",
|
|
104
103
|
"@types/minimist": "1.2.2",
|
|
105
104
|
"@types/nodemailer": "6.4.14",
|
|
106
105
|
"@types/pluralize": "0.0.33",
|