From 39c3a516cdc57160b6da214b221596549c6cd88c Mon Sep 17 00:00:00 2001 From: julien vdb Date: Wed, 29 Oct 2025 22:53:35 +0100 Subject: [PATCH] 0.11.10 : add link post --- package.json | 2 +- src/api/event/controllers/feed.ts | 28 +++- .../content-types/post-ownership/schema.json | 6 +- src/api/post/content-types/post/schema.json | 13 +- src/api/post/controllers/post.ts | 52 ++++++ src/api/post/routes/custom.ts | 5 + .../1.0.0/full_documentation.json | 158 ++++++++++++------ types/generated/contentTypes.d.ts | 8 +- 8 files changed, 211 insertions(+), 61 deletions(-) diff --git a/package.json b/package.json index 5507e01..538cab4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "harmony-back", - "version": "0.11.9", + "version": "0.11.10", "private": true, "description": "A Strapi application", "scripts": { diff --git a/src/api/event/controllers/feed.ts b/src/api/event/controllers/feed.ts index e555685..16582e5 100644 --- a/src/api/event/controllers/feed.ts +++ b/src/api/event/controllers/feed.ts @@ -207,7 +207,26 @@ export default ({ strapi }: { strapi: Core.Strapi }) => } }); - // 7️⃣ Enrichir le feed avec les propriétés friend, member, contactFollow, group et registered participants + // 7️⃣ Récupérer les PostOwnership pour vérifier si les events sont déjà partagés + const eventPostOwnerships = await strapi.db + .query("api::post-ownership.post-ownership") + .findMany({ + where: { + contextId: eventIds, + contextType: "event", + relation: "link", + }, + populate: ["author"], + }); + + // Créer une map des events partagés par userId et eventId + const sharedEventsByUserAndEvent = new Map(); + eventPostOwnerships.forEach((po) => { + const key = `${po.author?.id}-${po.contextId}`; + sharedEventsByUserAndEvent.set(key, true); + }); + + // 8️⃣ Enrichir le feed avec les propriétés friend, member, contactFollow, group, registered participants et isShared const enrichedFeed = feed.map((eventRelationship) => { const authorId = eventRelationship.author?.id; const contextType = eventRelationship.contextType; @@ -235,6 +254,12 @@ export default ({ strapi }: { strapi: Core.Strapi }) => ? participantsByEventId.get(eventId) || [] : []; + // Vérifier si l'event est déjà partagé par l'auteur + const isShared = + authorId && eventId + ? sharedEventsByUserAndEvent.has(`${authorId}-${eventId}`) + : false; + return { ...eventRelationship, friend: isFriend, @@ -242,6 +267,7 @@ export default ({ strapi }: { strapi: Core.Strapi }) => member: isMember, ...(group && { group }), // Ajouter group seulement s'il existe registered, // Ajouter les participants enregistrés + isShared, // Indiquer si l'event est partagé par l'auteur }; }); diff --git a/src/api/post-ownership/content-types/post-ownership/schema.json b/src/api/post-ownership/content-types/post-ownership/schema.json index d0c06c7..d249beb 100644 --- a/src/api/post-ownership/content-types/post-ownership/schema.json +++ b/src/api/post-ownership/content-types/post-ownership/schema.json @@ -23,7 +23,8 @@ "enum": [ "user", "group", - "system" + "system", + "event" ] }, "contextId": { @@ -34,7 +35,8 @@ "enum": [ "owner", "saved", - "hidden" + "hidden", + "link" ] }, "metas": { diff --git a/src/api/post/content-types/post/schema.json b/src/api/post/content-types/post/schema.json index 1da6198..b048a75 100644 --- a/src/api/post/content-types/post/schema.json +++ b/src/api/post/content-types/post/schema.json @@ -19,7 +19,12 @@ "type": "media", "multiple": true, "required": false, - "allowedTypes": ["images", "files", "videos", "audios"] + "allowedTypes": [ + "images", + "files", + "videos", + "audios" + ] }, "likes": { "type": "relation", @@ -28,7 +33,11 @@ }, "category": { "type": "enumeration", - "enum": ["photo", "video", "event"] + "enum": [ + "photo", + "video", + "event" + ] }, "comments": { "type": "relation", diff --git a/src/api/post/controllers/post.ts b/src/api/post/controllers/post.ts index 2990bfb..9be929a 100644 --- a/src/api/post/controllers/post.ts +++ b/src/api/post/controllers/post.ts @@ -720,5 +720,57 @@ export default factories.createCoreController( return ctx.internalServerError("Failed to add comment"); } }, + + async link(ctx) { + const user = ctx.state.user; + if (!user) { + return ctx.unauthorized("You must be logged in to link events"); + } + + const { contextType, contextId, relation } = ctx.request.body; + + if (!contextType || contextId === undefined || !relation) { + return ctx.badRequest( + "contextType, contextId, and relation are required" + ); + } + + try { + // Check if link already exists + const existingLink = await strapi.db + .query("api::post-ownership.post-ownership") + .findOne({ + where: { + author: user.id, + contextType, + contextId, + relation, + }, + }); + + if (existingLink) { + return ctx.badRequest("This event is already linked"); + } + + const postOwnership = await strapi.db + .query("api::post-ownership.post-ownership") + .create({ + data: { + author: user.id, + contextType, + contextId, + relation, + }, + }); + + return ctx.send({ + message: "Event linked successfully", + postOwnership, + }); + } catch (error: any) { + console.error("Error linking event:", error); + return ctx.internalServerError("Failed to link event"); + } + }, }) ); diff --git a/src/api/post/routes/custom.ts b/src/api/post/routes/custom.ts index f23f62d..97f45b9 100644 --- a/src/api/post/routes/custom.ts +++ b/src/api/post/routes/custom.ts @@ -39,5 +39,10 @@ export default { path: "/posts/:id/comment", handler: "post.addComment", }, + { + method: "POST", + path: "/posts/link", + handler: "post.link", + }, ], }; diff --git a/src/extensions/documentation/documentation/1.0.0/full_documentation.json b/src/extensions/documentation/documentation/1.0.0/full_documentation.json index 7141339..8d8e77b 100644 --- a/src/extensions/documentation/documentation/1.0.0/full_documentation.json +++ b/src/extensions/documentation/documentation/1.0.0/full_documentation.json @@ -14,7 +14,7 @@ "name": "Apache 2.0", "url": "https://www.apache.org/licenses/LICENSE-2.0.html" }, - "x-generation-date": "2025-10-24T10:39:51.987Z" + "x-generation-date": "2025-10-29T21:53:00.271Z" }, "x-strapi-config": { "plugins": [ @@ -16968,7 +16968,8 @@ "enum": [ "user", "group", - "system" + "system", + "event" ] }, "contextId": { @@ -16979,7 +16980,8 @@ "enum": [ "owner", "saved", - "hidden" + "hidden", + "link" ] }, "metas": {}, @@ -20417,7 +20419,8 @@ "enum": [ "user", "group", - "system" + "system", + "event" ] }, "contextId": { @@ -20428,7 +20431,8 @@ "enum": [ "owner", "saved", - "hidden" + "hidden", + "link" ] }, "metas": {}, @@ -24351,7 +24355,8 @@ "enum": [ "user", "group", - "system" + "system", + "event" ] }, "contextId": { @@ -24362,7 +24367,8 @@ "enum": [ "owner", "saved", - "hidden" + "hidden", + "link" ] }, "metas": {}, @@ -27844,7 +27850,8 @@ "enum": [ "user", "group", - "system" + "system", + "event" ] }, "contextId": { @@ -27855,7 +27862,8 @@ "enum": [ "owner", "saved", - "hidden" + "hidden", + "link" ] }, "metas": {}, @@ -31785,7 +31793,8 @@ "enum": [ "user", "group", - "system" + "system", + "event" ] }, "contextId": { @@ -31796,7 +31805,8 @@ "enum": [ "owner", "saved", - "hidden" + "hidden", + "link" ] }, "metas": {}, @@ -35977,7 +35987,8 @@ "enum": [ "user", "group", - "system" + "system", + "event" ] }, "contextId": { @@ -35988,7 +35999,8 @@ "enum": [ "owner", "saved", - "hidden" + "hidden", + "link" ] }, "metas": {}, @@ -40618,7 +40630,8 @@ "enum": [ "user", "group", - "system" + "system", + "event" ] }, "contextId": { @@ -40629,7 +40642,8 @@ "enum": [ "owner", "saved", - "hidden" + "hidden", + "link" ] }, "metas": {}, @@ -44549,7 +44563,8 @@ "enum": [ "user", "group", - "system" + "system", + "event" ] }, "contextId": { @@ -44560,7 +44575,8 @@ "enum": [ "owner", "saved", - "hidden" + "hidden", + "link" ] }, "metas": {}, @@ -48382,7 +48398,8 @@ "enum": [ "user", "group", - "system" + "system", + "event" ] }, "contextId": { @@ -48393,7 +48410,8 @@ "enum": [ "owner", "saved", - "hidden" + "hidden", + "link" ] }, "metas": {}, @@ -52202,7 +52220,8 @@ "enum": [ "user", "group", - "system" + "system", + "event" ] }, "contextId": { @@ -52213,7 +52232,8 @@ "enum": [ "owner", "saved", - "hidden" + "hidden", + "link" ] }, "metas": {}, @@ -56058,7 +56078,8 @@ "enum": [ "user", "group", - "system" + "system", + "event" ] }, "contextId": { @@ -56069,7 +56090,8 @@ "enum": [ "owner", "saved", - "hidden" + "hidden", + "link" ] }, "metas": {}, @@ -59914,7 +59936,8 @@ "enum": [ "user", "group", - "system" + "system", + "event" ] }, "contextId": { @@ -59925,7 +59948,8 @@ "enum": [ "owner", "saved", - "hidden" + "hidden", + "link" ] }, "metas": {}, @@ -63731,7 +63755,8 @@ "enum": [ "user", "group", - "system" + "system", + "event" ] }, "contextId": { @@ -63742,7 +63767,8 @@ "enum": [ "owner", "saved", - "hidden" + "hidden", + "link" ] }, "metas": {}, @@ -67729,7 +67755,8 @@ "enum": [ "user", "group", - "system" + "system", + "event" ] }, "contextId": { @@ -67740,7 +67767,8 @@ "enum": [ "owner", "saved", - "hidden" + "hidden", + "link" ] }, "metas": {}, @@ -71216,7 +71244,8 @@ "enum": [ "user", "group", - "system" + "system", + "event" ] }, "contextId": { @@ -71227,7 +71256,8 @@ "enum": [ "owner", "saved", - "hidden" + "hidden", + "link" ] }, "metas": {}, @@ -75632,7 +75662,8 @@ "enum": [ "user", "group", - "system" + "system", + "event" ] }, "contextId": { @@ -75643,7 +75674,8 @@ "enum": [ "owner", "saved", - "hidden" + "hidden", + "link" ] }, "metas": {}, @@ -79448,7 +79480,8 @@ "enum": [ "user", "group", - "system" + "system", + "event" ] }, "contextId": { @@ -79459,7 +79492,8 @@ "enum": [ "owner", "saved", - "hidden" + "hidden", + "link" ] }, "metas": {}, @@ -83581,7 +83615,8 @@ "enum": [ "user", "group", - "system" + "system", + "event" ] }, "contextId": { @@ -83592,7 +83627,8 @@ "enum": [ "owner", "saved", - "hidden" + "hidden", + "link" ] }, "metas": {}, @@ -87417,7 +87453,8 @@ "enum": [ "user", "group", - "system" + "system", + "event" ] }, "contextId": { @@ -87428,7 +87465,8 @@ "enum": [ "owner", "saved", - "hidden" + "hidden", + "link" ] }, "metas": {}, @@ -91359,7 +91397,8 @@ "enum": [ "user", "group", - "system" + "system", + "event" ] }, "contextId": { @@ -91370,7 +91409,8 @@ "enum": [ "owner", "saved", - "hidden" + "hidden", + "link" ] }, "metas": {}, @@ -94638,7 +94678,8 @@ "enum": [ "user", "group", - "system" + "system", + "event" ] }, "contextId": { @@ -94649,7 +94690,8 @@ "enum": [ "owner", "saved", - "hidden" + "hidden", + "link" ] }, "metas": {}, @@ -99195,7 +99237,8 @@ "enum": [ "user", "group", - "system" + "system", + "event" ] }, "contextId": { @@ -99206,7 +99249,8 @@ "enum": [ "owner", "saved", - "hidden" + "hidden", + "link" ] }, "metas": {}, @@ -99797,7 +99841,8 @@ "enum": [ "user", "group", - "system" + "system", + "event" ] }, "contextId": { @@ -99808,7 +99853,8 @@ "enum": [ "owner", "saved", - "hidden" + "hidden", + "link" ] }, "metas": {}, @@ -103076,7 +103122,8 @@ "enum": [ "user", "group", - "system" + "system", + "event" ] }, "contextId": { @@ -103087,7 +103134,8 @@ "enum": [ "owner", "saved", - "hidden" + "hidden", + "link" ] }, "metas": {}, @@ -103528,7 +103576,8 @@ "enum": [ "user", "group", - "system" + "system", + "event" ] }, "contextId": { @@ -103539,7 +103588,8 @@ "enum": [ "owner", "saved", - "hidden" + "hidden", + "link" ] }, "metas": {}, @@ -106917,7 +106967,8 @@ "enum": [ "user", "group", - "system" + "system", + "event" ] }, "contextId": { @@ -106928,7 +106979,8 @@ "enum": [ "owner", "saved", - "hidden" + "hidden", + "link" ] }, "metas": {}, diff --git a/types/generated/contentTypes.d.ts b/types/generated/contentTypes.d.ts index a2d7bdf..8509e0b 100644 --- a/types/generated/contentTypes.d.ts +++ b/types/generated/contentTypes.d.ts @@ -1227,7 +1227,9 @@ export interface ApiPostOwnershipPostOwnership 'plugin::users-permissions.user' >; contextId: Schema.Attribute.Integer; - contextType: Schema.Attribute.Enumeration<['user', 'group', 'system']>; + contextType: Schema.Attribute.Enumeration< + ['user', 'group', 'system', 'event'] + >; createdAt: Schema.Attribute.DateTime; createdBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> & Schema.Attribute.Private; @@ -1240,7 +1242,9 @@ export interface ApiPostOwnershipPostOwnership metas: Schema.Attribute.JSON; post: Schema.Attribute.Relation<'manyToOne', 'api::post.post'>; publishedAt: Schema.Attribute.DateTime; - relation: Schema.Attribute.Enumeration<['owner', 'saved', 'hidden']>; + relation: Schema.Attribute.Enumeration< + ['owner', 'saved', 'hidden', 'link'] + >; updatedAt: Schema.Attribute.DateTime; updatedBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> & Schema.Attribute.Private;