From 3cb23ef4b7bf553e7e4ed52e1ed8f7589b01fc23 Mon Sep 17 00:00:00 2001 From: julien vdb Date: Wed, 16 Apr 2025 16:44:41 +0200 Subject: [PATCH] Add choral permissions --- .../choral-permission/schema.json | 33 +++++++++++++ .../controllers/choral-permission.ts | 7 +++ .../routes/choral-permission.ts | 7 +++ .../services/choral-permission.ts | 7 +++ .../choral/content-types/choral/schema.json | 12 ++++- src/api/choral/controllers/choral.ts | 34 +++++++++++++- .../permissions-template/schema.json | 12 +++-- .../controllers/permissions-template.ts | 13 ++++- .../content-types/user/schema.json | 6 +++ src/index.ts | 20 +++++++- types/generated/contentTypes.d.ts | 47 ++++++++++++++++++- 11 files changed, 186 insertions(+), 12 deletions(-) create mode 100644 src/api/choral-permission/content-types/choral-permission/schema.json create mode 100644 src/api/choral-permission/controllers/choral-permission.ts create mode 100644 src/api/choral-permission/routes/choral-permission.ts create mode 100644 src/api/choral-permission/services/choral-permission.ts diff --git a/src/api/choral-permission/content-types/choral-permission/schema.json b/src/api/choral-permission/content-types/choral-permission/schema.json new file mode 100644 index 0000000..ca98ad6 --- /dev/null +++ b/src/api/choral-permission/content-types/choral-permission/schema.json @@ -0,0 +1,33 @@ +{ + "kind": "collectionType", + "collectionName": "choral_permissions", + "info": { + "singularName": "choral-permission", + "pluralName": "choral-permissions", + "displayName": "ChoralPermission", + "description": "" + }, + "options": { + "draftAndPublish": false + }, + "pluginOptions": {}, + "attributes": { + "choralName": { + "type": "string" + }, + "choralId": { + "type": "integer" + }, + "permissions": { + "type": "component", + "repeatable": true, + "component": "user.permissions" + }, + "user": { + "type": "relation", + "relation": "manyToOne", + "target": "plugin::users-permissions.user", + "inversedBy": "choral_permissions" + } + } +} diff --git a/src/api/choral-permission/controllers/choral-permission.ts b/src/api/choral-permission/controllers/choral-permission.ts new file mode 100644 index 0000000..a322801 --- /dev/null +++ b/src/api/choral-permission/controllers/choral-permission.ts @@ -0,0 +1,7 @@ +/** + * choral-permission controller + */ + +import { factories } from '@strapi/strapi' + +export default factories.createCoreController('api::choral-permission.choral-permission'); diff --git a/src/api/choral-permission/routes/choral-permission.ts b/src/api/choral-permission/routes/choral-permission.ts new file mode 100644 index 0000000..4e3f6c4 --- /dev/null +++ b/src/api/choral-permission/routes/choral-permission.ts @@ -0,0 +1,7 @@ +/** + * choral-permission router + */ + +import { factories } from '@strapi/strapi'; + +export default factories.createCoreRouter('api::choral-permission.choral-permission'); diff --git a/src/api/choral-permission/services/choral-permission.ts b/src/api/choral-permission/services/choral-permission.ts new file mode 100644 index 0000000..25be2a9 --- /dev/null +++ b/src/api/choral-permission/services/choral-permission.ts @@ -0,0 +1,7 @@ +/** + * choral-permission service + */ + +import { factories } from '@strapi/strapi'; + +export default factories.createCoreService('api::choral-permission.choral-permission'); diff --git a/src/api/choral/content-types/choral/schema.json b/src/api/choral/content-types/choral/schema.json index 0418876..f551f81 100644 --- a/src/api/choral/content-types/choral/schema.json +++ b/src/api/choral/content-types/choral/schema.json @@ -71,7 +71,17 @@ "permissions_templates": { "type": "relation", "relation": "oneToMany", - "target": "api::permissions-template.permissions-template" + "target": "api::permissions-template.permissions-template", + "mappedBy": "choral" + }, + "email": { + "type": "email" + }, + "phoneNumber": { + "type": "string" + }, + "website": { + "type": "string" } } } diff --git a/src/api/choral/controllers/choral.ts b/src/api/choral/controllers/choral.ts index 2676295..a9b6339 100644 --- a/src/api/choral/controllers/choral.ts +++ b/src/api/choral/controllers/choral.ts @@ -2,6 +2,36 @@ * choral controller */ -import { factories } from '@strapi/strapi' +import { factories } from "@strapi/strapi"; -export default factories.createCoreController('api::choral.choral'); +export default factories.createCoreController( + "api::choral.choral", + ({ strapi }) => ({ + async create(ctx) { + const data = JSON.parse(ctx.request.body.data); + + if (ctx.request.files.coverImage) { + const files = Array.isArray(ctx.request.files.coverImage) + ? ctx.request.files.coverImage[0] + : ctx.request.files.coverImage; + const extension = files.originalFilename.match(/\.[0-9a-z]+$/i); + const payload = { + fileInfo: { + caption: "undefined", + alternativeText: data.name || "", + name: `${data.name}_cover${extension}`, + }, + }; + const asset = await strapi.services["plugin::upload.upload"].upload({ + data: payload, + files, + }); + data.cover = asset[0].id; + } + + ctx.request.body = { data }; + const result = await super.create(ctx); + return result; + }, + }) +); diff --git a/src/api/permissions-template/content-types/permissions-template/schema.json b/src/api/permissions-template/content-types/permissions-template/schema.json index 4587928..9b4118d 100644 --- a/src/api/permissions-template/content-types/permissions-template/schema.json +++ b/src/api/permissions-template/content-types/permissions-template/schema.json @@ -4,16 +4,14 @@ "info": { "singularName": "permissions-template", "pluralName": "permissions-templates", - "displayName": "PermissionsTemplate" + "displayName": "PermissionsTemplate", + "description": "" }, "options": { "draftAndPublish": false }, "pluginOptions": {}, "attributes": { - "key": { - "type": "uid" - }, "title": { "type": "string" }, @@ -24,6 +22,12 @@ "type": "component", "repeatable": true, "component": "user.permissions" + }, + "choral": { + "type": "relation", + "relation": "manyToOne", + "target": "api::choral.choral", + "inversedBy": "permissions_templates" } } } diff --git a/src/api/permissions-template/controllers/permissions-template.ts b/src/api/permissions-template/controllers/permissions-template.ts index 8ada77c..491f192 100644 --- a/src/api/permissions-template/controllers/permissions-template.ts +++ b/src/api/permissions-template/controllers/permissions-template.ts @@ -2,6 +2,15 @@ * permissions-template controller */ -import { factories } from '@strapi/strapi' +import { factories } from "@strapi/strapi"; -export default factories.createCoreController('api::permissions-template.permissions-template'); +export default factories.createCoreController( + "api::permissions-template.permissions-template", + ({ strapi }) => ({ + async create(ctx) { + console.log(ctx); + const { data, meta } = await super.create(ctx); + return { data, meta }; + }, + }) +); diff --git a/src/extensions/users-permissions/content-types/user/schema.json b/src/extensions/users-permissions/content-types/user/schema.json index a993f07..52255d1 100644 --- a/src/extensions/users-permissions/content-types/user/schema.json +++ b/src/extensions/users-permissions/content-types/user/schema.json @@ -163,6 +163,12 @@ }, "dob": { "type": "date" + }, + "choral_permissions": { + "type": "relation", + "relation": "oneToMany", + "target": "api::choral-permission.choral-permission", + "mappedBy": "user" } } } diff --git a/src/index.ts b/src/index.ts index 58be268..7ca75e6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ -// import type { Core } from '@strapi/strapi'; +import type { Core } from "@strapi/strapi"; export default { /** @@ -16,5 +16,21 @@ export default { * This gives you an opportunity to set up your data model, * run jobs, or perform some special logic. */ - bootstrap(/* { strapi }: { strapi: Core.Strapi } */) {}, + bootstrap({ strapi }: { strapi: Core.Strapi }) { + strapi.db.lifecycles.subscribe({ + models: ["plugin::users-permissions.user"], // Applies only to users in users-permissions + + /** + * Lifecycle hook triggered after a new user is created. + * Ensures that a user profile is created with either the provided full name and bio + * or a default generated username and bio if missing. + * @param {any} event - The event object containing the created user's details. + */ + async afterCreate(event: any) { + const { result, params } = event; + console.log(result); + console.log(params); + }, + }); + }, }; diff --git a/types/generated/contentTypes.d.ts b/types/generated/contentTypes.d.ts index 35c6d6f..3c9b648 100644 --- a/types/generated/contentTypes.d.ts +++ b/types/generated/contentTypes.d.ts @@ -475,6 +475,42 @@ export interface ApiBoardBoard extends Struct.CollectionTypeSchema { }; } +export interface ApiChoralPermissionChoralPermission + extends Struct.CollectionTypeSchema { + collectionName: 'choral_permissions'; + info: { + description: ''; + displayName: 'ChoralPermission'; + pluralName: 'choral-permissions'; + singularName: 'choral-permission'; + }; + options: { + draftAndPublish: false; + }; + attributes: { + choralId: Schema.Attribute.Integer; + choralName: Schema.Attribute.String; + createdAt: Schema.Attribute.DateTime; + createdBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> & + Schema.Attribute.Private; + locale: Schema.Attribute.String & Schema.Attribute.Private; + localizations: Schema.Attribute.Relation< + 'oneToMany', + 'api::choral-permission.choral-permission' + > & + Schema.Attribute.Private; + permissions: Schema.Attribute.Component<'user.permissions', true>; + publishedAt: Schema.Attribute.DateTime; + updatedAt: Schema.Attribute.DateTime; + updatedBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> & + Schema.Attribute.Private; + user: Schema.Attribute.Relation< + 'manyToOne', + 'plugin::users-permissions.user' + >; + }; +} + export interface ApiChoralChoral extends Struct.CollectionTypeSchema { collectionName: 'chorals'; info: { @@ -500,6 +536,7 @@ export interface ApiChoralChoral extends Struct.CollectionTypeSchema { createdAt: Schema.Attribute.DateTime; createdBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> & Schema.Attribute.Private; + email: Schema.Attribute.Email; locale: Schema.Attribute.String & Schema.Attribute.Private; localizations: Schema.Attribute.Relation< 'oneToMany', @@ -515,6 +552,7 @@ export interface ApiChoralChoral extends Struct.CollectionTypeSchema { 'oneToMany', 'api::permissions-template.permissions-template' >; + phoneNumber: Schema.Attribute.String; postal: Schema.Attribute.Integer; publishedAt: Schema.Attribute.DateTime; updatedAt: Schema.Attribute.DateTime; @@ -524,6 +562,7 @@ export interface ApiChoralChoral extends Struct.CollectionTypeSchema { 'manyToMany', 'plugin::users-permissions.user' >; + website: Schema.Attribute.String; }; } @@ -561,6 +600,7 @@ export interface ApiPermissionsTemplatePermissionsTemplate extends Struct.CollectionTypeSchema { collectionName: 'permissions_templates'; info: { + description: ''; displayName: 'PermissionsTemplate'; pluralName: 'permissions-templates'; singularName: 'permissions-template'; @@ -569,11 +609,11 @@ export interface ApiPermissionsTemplatePermissionsTemplate draftAndPublish: false; }; attributes: { + choral: Schema.Attribute.Relation<'manyToOne', 'api::choral.choral'>; createdAt: Schema.Attribute.DateTime; createdBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> & Schema.Attribute.Private; description: Schema.Attribute.String; - key: Schema.Attribute.UID; locale: Schema.Attribute.String & Schema.Attribute.Private; localizations: Schema.Attribute.Relation< 'oneToMany', @@ -1053,6 +1093,10 @@ export interface PluginUsersPermissionsUser >; blocked: Schema.Attribute.Boolean & Schema.Attribute.DefaultTo; board: Schema.Attribute.Relation<'oneToOne', 'api::board.board'>; + choral_permissions: Schema.Attribute.Relation< + 'oneToMany', + 'api::choral-permission.choral-permission' + >; choralAdmin: Schema.Attribute.Relation<'manyToMany', 'api::choral.choral'>; choralOwner: Schema.Attribute.Relation<'oneToOne', 'api::choral.choral'>; chorals: Schema.Attribute.Relation<'manyToMany', 'api::choral.choral'>; @@ -1123,6 +1167,7 @@ declare module '@strapi/strapi' { 'api::board-card.board-card': ApiBoardCardBoardCard; 'api::board-list.board-list': ApiBoardListBoardList; 'api::board.board': ApiBoardBoard; + 'api::choral-permission.choral-permission': ApiChoralPermissionChoralPermission; 'api::choral.choral': ApiChoralChoral; 'api::event.event': ApiEventEvent; 'api::permissions-template.permissions-template': ApiPermissionsTemplatePermissionsTemplate;