diff --git a/package.json b/package.json index eb51a7c..ef5d169 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "harmony-back", - "version": "0.12.0", + "version": "0.12.1", "private": true, "description": "A Strapi application", "scripts": { diff --git a/src/components/group/activity.json b/src/components/group/activity.json index 57e328d..3994543 100644 --- a/src/components/group/activity.json +++ b/src/components/group/activity.json @@ -25,6 +25,17 @@ "videos", "audios" ] + }, + "activityType": { + "type": "enumeration", + "enum": [ + "user", + "group", + "choral", + "message", + "post", + "contact" + ] } } } 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 59c5070..844df48 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-11-11T18:08:56.370Z" + "x-generation-date": "2025-11-12T14:43:35.118Z" }, "x-strapi-config": { "plugins": [ @@ -15079,18 +15079,6 @@ } } }, - "nbFollowers": { - "type": "integer" - }, - "nbFollowing": { - "type": "integer" - }, - "nbPosts": { - "type": "integer" - }, - "nbSaved": { - "type": "integer" - }, "choralOwner": { "type": "object", "properties": { @@ -18343,6 +18331,17 @@ } } } + }, + "activityType": { + "type": "string", + "enum": [ + "user", + "group", + "choral", + "message", + "post", + "contact" + ] } } }, @@ -19414,18 +19413,6 @@ } } }, - "nbFollowers": { - "type": "integer" - }, - "nbFollowing": { - "type": "integer" - }, - "nbPosts": { - "type": "integer" - }, - "nbSaved": { - "type": "integer" - }, "choralOwner": { "type": "object", "properties": { @@ -23369,18 +23356,6 @@ } } }, - "nbFollowers": { - "type": "integer" - }, - "nbFollowing": { - "type": "integer" - }, - "nbPosts": { - "type": "integer" - }, - "nbSaved": { - "type": "integer" - }, "choralOwner": { "type": "object", "properties": { @@ -27393,18 +27368,6 @@ } } }, - "nbFollowers": { - "type": "integer" - }, - "nbFollowing": { - "type": "integer" - }, - "nbPosts": { - "type": "integer" - }, - "nbSaved": { - "type": "integer" - }, "choralOwner": { "type": "object", "properties": { @@ -31355,18 +31318,6 @@ } } }, - "nbFollowers": { - "type": "integer" - }, - "nbFollowing": { - "type": "integer" - }, - "nbPosts": { - "type": "integer" - }, - "nbSaved": { - "type": "integer" - }, "choralOwner": { "type": "object", "properties": { @@ -35058,18 +35009,6 @@ } } }, - "nbFollowers": { - "type": "integer" - }, - "nbFollowing": { - "type": "integer" - }, - "nbPosts": { - "type": "integer" - }, - "nbSaved": { - "type": "integer" - }, "choralOwner": { "type": "object", "properties": { @@ -39016,18 +38955,6 @@ } } }, - "nbFollowers": { - "type": "integer" - }, - "nbFollowing": { - "type": "integer" - }, - "nbPosts": { - "type": "integer" - }, - "nbSaved": { - "type": "integer" - }, "choralOwner": { "type": "object", "properties": { @@ -42968,18 +42895,6 @@ } } }, - "nbFollowers": { - "type": "integer" - }, - "nbFollowing": { - "type": "integer" - }, - "nbPosts": { - "type": "integer" - }, - "nbSaved": { - "type": "integer" - }, "choralOwner": { "type": "object", "properties": { @@ -46822,18 +46737,6 @@ } } }, - "nbFollowers": { - "type": "integer" - }, - "nbFollowing": { - "type": "integer" - }, - "nbPosts": { - "type": "integer" - }, - "nbSaved": { - "type": "integer" - }, "choralOwner": { "type": "object", "properties": { @@ -50663,18 +50566,6 @@ } } }, - "nbFollowers": { - "type": "integer" - }, - "nbFollowing": { - "type": "integer" - }, - "nbPosts": { - "type": "integer" - }, - "nbSaved": { - "type": "integer" - }, "choralOwner": { "type": "object", "properties": { @@ -54540,18 +54431,6 @@ } } }, - "nbFollowers": { - "type": "integer" - }, - "nbFollowing": { - "type": "integer" - }, - "nbPosts": { - "type": "integer" - }, - "nbSaved": { - "type": "integer" - }, "choralOwner": { "type": "object", "properties": { @@ -58417,18 +58296,6 @@ } } }, - "nbFollowers": { - "type": "integer" - }, - "nbFollowing": { - "type": "integer" - }, - "nbPosts": { - "type": "integer" - }, - "nbSaved": { - "type": "integer" - }, "choralOwner": { "type": "object", "properties": { @@ -62255,18 +62122,6 @@ } } }, - "nbFollowers": { - "type": "integer" - }, - "nbFollowing": { - "type": "integer" - }, - "nbPosts": { - "type": "integer" - }, - "nbSaved": { - "type": "integer" - }, "choralOwner": { "type": "object", "properties": { @@ -66274,18 +66129,6 @@ } } }, - "nbFollowers": { - "type": "integer" - }, - "nbFollowing": { - "type": "integer" - }, - "nbPosts": { - "type": "integer" - }, - "nbSaved": { - "type": "integer" - }, "choralOwner": { "type": "object", "properties": { @@ -70486,18 +70329,6 @@ } } }, - "nbFollowers": { - "type": "integer" - }, - "nbFollowing": { - "type": "integer" - }, - "nbPosts": { - "type": "integer" - }, - "nbSaved": { - "type": "integer" - }, "choralOwner": { "type": "object", "properties": { @@ -74219,18 +74050,6 @@ } } }, - "nbFollowers": { - "type": "integer" - }, - "nbFollowing": { - "type": "integer" - }, - "nbPosts": { - "type": "integer" - }, - "nbSaved": { - "type": "integer" - }, "choralOwner": { "type": "object", "properties": { @@ -78358,18 +78177,6 @@ } } }, - "nbFollowers": { - "type": "integer" - }, - "nbFollowing": { - "type": "integer" - }, - "nbPosts": { - "type": "integer" - }, - "nbSaved": { - "type": "integer" - }, "choralOwner": { "type": "object", "properties": { @@ -82192,18 +81999,6 @@ } } }, - "nbFollowers": { - "type": "integer" - }, - "nbFollowing": { - "type": "integer" - }, - "nbPosts": { - "type": "integer" - }, - "nbSaved": { - "type": "integer" - }, "choralOwner": { "type": "object", "properties": { @@ -86051,18 +85846,6 @@ } } }, - "nbFollowers": { - "type": "integer" - }, - "nbFollowing": { - "type": "integer" - }, - "nbPosts": { - "type": "integer" - }, - "nbSaved": { - "type": "integer" - }, "choralOwner": { "type": "object", "properties": { @@ -90014,18 +89797,6 @@ } } }, - "nbFollowers": { - "type": "integer" - }, - "nbFollowing": { - "type": "integer" - }, - "nbPosts": { - "type": "integer" - }, - "nbSaved": { - "type": "integer" - }, "choralOwner": { "type": "object", "properties": { @@ -93878,18 +93649,6 @@ } } }, - "nbFollowers": { - "type": "integer" - }, - "nbFollowing": { - "type": "integer" - }, - "nbPosts": { - "type": "integer" - }, - "nbSaved": { - "type": "integer" - }, "choralOwner": { "type": "object", "properties": { @@ -97951,18 +97710,6 @@ } } }, - "nbFollowers": { - "type": "integer" - }, - "nbFollowing": { - "type": "integer" - }, - "nbPosts": { - "type": "integer" - }, - "nbSaved": { - "type": "integer" - }, "choralOwner": { "type": "object", "properties": { @@ -101825,18 +101572,6 @@ } } }, - "nbFollowers": { - "type": "integer" - }, - "nbFollowing": { - "type": "integer" - }, - "nbPosts": { - "type": "integer" - }, - "nbSaved": { - "type": "integer" - }, "choralOwner": { "type": "object", "properties": { @@ -105732,18 +105467,6 @@ } } }, - "nbFollowers": { - "type": "integer" - }, - "nbFollowing": { - "type": "integer" - }, - "nbPosts": { - "type": "integer" - }, - "nbSaved": { - "type": "integer" - }, "choralOwner": { "type": "object", "properties": { @@ -109599,18 +109322,6 @@ } } }, - "nbFollowers": { - "type": "integer" - }, - "nbFollowing": { - "type": "integer" - }, - "nbPosts": { - "type": "integer" - }, - "nbSaved": { - "type": "integer" - }, "choralOwner": { "type": "object", "properties": { diff --git a/src/extensions/users-permissions/content-types/user/schema.json b/src/extensions/users-permissions/content-types/user/schema.json index 16dd453..2d6e834 100644 --- a/src/extensions/users-permissions/content-types/user/schema.json +++ b/src/extensions/users-permissions/content-types/user/schema.json @@ -73,22 +73,6 @@ "images" ] }, - "nbFollowers": { - "type": "integer", - "default": 0 - }, - "nbFollowing": { - "type": "integer", - "default": 0 - }, - "nbPosts": { - "type": "integer", - "default": 0 - }, - "nbSaved": { - "type": "integer", - "default": 0 - }, "choralOwner": { "type": "relation", "relation": "oneToOne", diff --git a/src/extensions/users-permissions/strapi-server.ts b/src/extensions/users-permissions/strapi-server.ts index 1584955..56807cf 100644 --- a/src/extensions/users-permissions/strapi-server.ts +++ b/src/extensions/users-permissions/strapi-server.ts @@ -33,12 +33,10 @@ module.exports = (plugin) => { throw new Error("No access_token."); } - // Get the profile. const profile = await getProfile(provider, query); const email = lod.toLower(profile.email); - // We need at least the mail. if (!email) { throw new Error("Email was not available."); } @@ -70,15 +68,13 @@ module.exports = (plugin) => { throw new Error("Email is already taken."); } - // Retrieve default role. const defaultRole = await strapi.db .query("plugin::users-permissions.role") .findOne({ where: { type: advancedSettings.default_role } }); - // Create the new user. const newUser = { ...profile, - email, // overwrite with lowercased email + email, provider, role: defaultRole.id, confirmed: true, @@ -93,6 +89,73 @@ module.exports = (plugin) => { }; }; + const originalMe = plugin.controllers.user.me; + + plugin.controllers.user.me = async (ctx) => { + const fullUser = await strapi.db + .query("plugin::users-permissions.user") + .findOne({ + where: { id: ctx.state.user.id }, + populate: true, + }); + + const user = ctx.state.user; + + const userId = user.id; + + const [ + contactsCount, + groupsCount, + postsCount, + eventsCount, + followersCount, + followingCount, + ] = await Promise.all([ + strapi.db.query("api::contact.contact").count({ + where: { + $or: [{ owner: userId }, { user: userId }], + }, + }), + strapi.db.query("api::group-membership.group-membership").count({ + where: { + user: userId, + role: { $in: ["owner", "member", "admin"] }, + }, + }), + strapi.db + .query("api::post-ownership.post-ownership") + .count({ where: { author: userId } }), + strapi.db + .query("api::event-relationship.event-relationship") + .count({ where: { author: userId } }), + strapi.db.query("api::contact.contact").count({ + where: { + user: userId, + state: "follow", + }, + }), + strapi.db.query("api::contact.contact").count({ + where: { + owner: userId, + state: "follow", + }, + }), + ]); + const result = { + ...JSON.parse(JSON.stringify(fullUser)), + stats: { + contacts: contactsCount, + groups: groupsCount, + posts: postsCount, + events: eventsCount, + followers: followersCount, + following: followingCount, + }, + }; + + return result; + }; + const uploadImage = async (ctx, label: string, username: string) => { const key = `${label}Image`; if (ctx.request.files[key]) { @@ -122,7 +185,6 @@ module.exports = (plugin) => { plugin.controllers.user.updateMe = async (ctx) => { const user = ctx.state.user; - // User has to be logged in to update themselves if (!user) { return ctx.unauthorized(); } @@ -139,9 +201,24 @@ module.exports = (plugin) => { "voice", "job", "dob", + "phone", + "bio", + "experience", ]); - // Make sure there is no duplicate user with the same username + if (data.tags) { + newData.tags = data.tags.map((tag) => ({ + text: tag.text, + })); + } + + if (data.languages) { + newData.languages = data.languages.map((lang) => ({ + language: lang.language, + level: lang.level, + })); + } + if (newData.username) { const userWithSameUsername = await strapi .query("plugin::users-permissions.user") @@ -152,7 +229,6 @@ module.exports = (plugin) => { } } - // Make sure there is no duplicate user with the same email if (newData.email) { const userWithSameEmail = await strapi .query("plugin::users-permissions.user") @@ -169,9 +245,6 @@ module.exports = (plugin) => { const avatarId = await uploadImage(ctx, "avatar", newData.username); if (avatarId != 0) ctx.request.body.avatar = avatarId; - const backgroundId = await uploadImage(ctx, "background", newData.username); - if (backgroundId != 0) ctx.request.body.background = backgroundId; - return plugin.controllers.user.update(ctx); }; diff --git a/types/generated/components.d.ts b/types/generated/components.d.ts index 76c86ce..b1a6dc5 100644 --- a/types/generated/components.d.ts +++ b/types/generated/components.d.ts @@ -31,6 +31,9 @@ export interface GroupActivity extends Struct.ComponentSchema { >; activityDate: Schema.Attribute.DateTime; activityMessage: Schema.Attribute.String; + activityType: Schema.Attribute.Enumeration< + ['user', 'group', 'choral', 'message', 'post', 'contact'] + >; activityUser: Schema.Attribute.String; }; } diff --git a/types/generated/contentTypes.d.ts b/types/generated/contentTypes.d.ts index 7dfc3a7..1e6872a 100644 --- a/types/generated/contentTypes.d.ts +++ b/types/generated/contentTypes.d.ts @@ -1889,10 +1889,6 @@ export interface PluginUsersPermissionsUser > & Schema.Attribute.Private; name: Schema.Attribute.String; - nbFollowers: Schema.Attribute.Integer & Schema.Attribute.DefaultTo<0>; - nbFollowing: Schema.Attribute.Integer & Schema.Attribute.DefaultTo<0>; - nbPosts: Schema.Attribute.Integer & Schema.Attribute.DefaultTo<0>; - nbSaved: Schema.Attribute.Integer & Schema.Attribute.DefaultTo<0>; password: Schema.Attribute.Password & Schema.Attribute.Private & Schema.Attribute.SetMinMaxLength<{