From 763f32e22f93a25cd6db10f32602e4ae091ff7a3 Mon Sep 17 00:00:00 2001 From: James Date: Tue, 23 Nov 2021 17:14:06 -0500 Subject: [PATCH] chore: separates revisions from drafts --- src/auth/operations/access.ts | 15 ++++++++++++-- src/collections/config/sanitize.ts | 10 --------- src/collections/config/types.ts | 3 ++- src/collections/init.ts | 6 +----- src/graphql/schema/buildPoliciesType.ts | 14 +++++++++++-- src/revisions/baseFields.ts | 27 ------------------------- src/revisions/types.ts | 7 ------- 7 files changed, 28 insertions(+), 54 deletions(-) delete mode 100644 src/revisions/baseFields.ts diff --git a/src/auth/operations/access.ts b/src/auth/operations/access.ts index 1f39c2f17b..4671b7c7aa 100644 --- a/src/auth/operations/access.ts +++ b/src/auth/operations/access.ts @@ -1,3 +1,4 @@ +import { Payload } from '../..'; import { PayloadRequest } from '../../express/types'; import { Permissions } from '../types'; @@ -7,7 +8,7 @@ type Arguments = { req: PayloadRequest } -async function accessOperation(args: Arguments): Promise { +async function accessOperation(this: Payload, args: Arguments): Promise { const { config } = this; const { @@ -102,7 +103,17 @@ async function accessOperation(args: Arguments): Promise { } config.collections.forEach((collection) => { - executeEntityPolicies(collection, allOperations, 'collections'); + const collectionOperations = [...allOperations]; + + if (collection.auth && (typeof collection.auth.maxLoginAttempts !== 'undefined' && collection.auth.maxLoginAttempts !== 0)) { + collectionOperations.push('unlock'); + } + + if (collection.revisions) { + collectionOperations.push('readRevisions'); + } + + executeEntityPolicies(collection, collectionOperations, 'collections'); }); config.globals.forEach((global) => { diff --git a/src/collections/config/sanitize.ts b/src/collections/config/sanitize.ts index be5ff87b42..304c934ca8 100644 --- a/src/collections/config/sanitize.ts +++ b/src/collections/config/sanitize.ts @@ -10,7 +10,6 @@ import getBaseUploadFields from '../../uploads/getBaseFields'; import { formatLabels } from '../../utilities/formatLabels'; import { defaults, authDefaults } from './defaults'; import { Config } from '../../config/types'; -import { baseRevisionFields } from '../../revisions/baseFields'; const mergeBaseFields = (fields, baseFields) => { const mergedFields = []; @@ -67,15 +66,6 @@ const sanitizeCollection = (config: Config, collection: CollectionConfig): Sanit if (sanitized.revisions) { if (sanitized.revisions === true) sanitized.revisions = {}; - - let revisionFields = baseRevisionFields; - - revisionFields = mergeBaseFields(sanitized.fields, revisionFields); - - sanitized.fields = [ - ...revisionFields, - ...sanitized.fields, - ]; } if (sanitized.upload) { diff --git a/src/collections/config/types.ts b/src/collections/config/types.ts index 69f46d7554..f0c5123af5 100644 --- a/src/collections/config/types.ts +++ b/src/collections/config/types.ts @@ -134,8 +134,9 @@ export type CollectionConfig = { read?: Access; update?: Access; delete?: Access; - admin?: Access; + admin?: (args?: any) => boolean; unlock?: Access; + readRevisions?: Access; }; auth?: IncomingAuthType | boolean; upload?: IncomingUploadType | boolean; diff --git a/src/collections/init.ts b/src/collections/init.ts index a5cbc0f9f8..9e425653f0 100644 --- a/src/collections/init.ts +++ b/src/collections/init.ts @@ -14,7 +14,6 @@ import bindCollectionMiddleware from './bindCollection'; import { CollectionModel, SanitizedCollectionConfig } from './config/types'; import { Payload } from '../index'; import { getCollectionRevisionsName } from '../revisions/createCollectionName'; -import { fieldAffectsData } from '../fields/config/types'; const LocalStrategy = Passport.Strategy; @@ -72,10 +71,7 @@ export default function registerCollections(ctx: Payload): void { const revisionSchema = buildSchema( ctx.config, - buildRevisionFields({ - ...collection, - fields: collection.fields.filter((field) => !(fieldAffectsData(field) && field.name === '_status')), - }), + buildRevisionFields(collection), { options: { timestamps: true, diff --git a/src/graphql/schema/buildPoliciesType.ts b/src/graphql/schema/buildPoliciesType.ts index 3299a5b312..e77fa26bb8 100644 --- a/src/graphql/schema/buildPoliciesType.ts +++ b/src/graphql/schema/buildPoliciesType.ts @@ -6,7 +6,7 @@ import { SanitizedCollectionConfig } from '../../collections/config/types'; import { SanitizedGlobalConfig } from '../../globals/config/types'; import { Field } from '../../fields/config/types'; -type OperationType = 'create' | 'read' | 'update' | 'delete'; +type OperationType = 'create' | 'read' | 'update' | 'delete' | 'unlock' | 'readRevisions'; type ObjectTypeFields = { [key in OperationType | 'fields']?: { type: GraphQLObjectType }; @@ -104,10 +104,20 @@ export default function buildPoliciesType(): GraphQLObjectType { }; Object.values(this.config.collections).forEach((collection: SanitizedCollectionConfig) => { + const collectionOperations: OperationType[] = ['create', 'read', 'update', 'delete']; + + if (collection.auth && (typeof collection.auth.maxLoginAttempts !== 'undefined' && collection.auth.maxLoginAttempts !== 0)) { + collectionOperations.push('unlock'); + } + + if (collection.revisions) { + collectionOperations.push('readRevisions'); + } + fields[formatName(collection.slug)] = { type: new GraphQLObjectType({ name: formatName(`${collection.labels.singular}Access`), - fields: buildEntity(collection.labels.singular, collection.fields, ['create', 'read', 'update', 'delete']), + fields: buildEntity(collection.labels.singular, collection.fields, collectionOperations), }), }; }); diff --git a/src/revisions/baseFields.ts b/src/revisions/baseFields.ts deleted file mode 100644 index 908b51039c..0000000000 --- a/src/revisions/baseFields.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Field } from '../fields/config/types'; - -export const baseRevisionFields: Field[] = [ - { - name: '_status', - type: 'select', - defaultValue: 'draft', - access: { - update: () => false, - }, - options: [ - { - label: 'Published', - value: 'published', - }, - { - label: 'Draft', - value: 'draft', - }, - ], - required: true, - index: true, - admin: { - position: 'sidebar', - }, - }, -]; diff --git a/src/revisions/types.ts b/src/revisions/types.ts index 7c73e936f4..51183151d1 100644 --- a/src/revisions/types.ts +++ b/src/revisions/types.ts @@ -1,11 +1,4 @@ -import { Access } from '../config/types'; -import { FieldAccess } from '../fields/config/types'; - export type IncomingRevisionsType = { max?: number retainDeleted?: boolean - access?: { - read?: Access - modifyStatus?: FieldAccess - } }