0.12.16 : add custom endpoints for contacts
All checks were successful
Build release Docker image / Build Docker Images (push) Successful in 11m26s

This commit is contained in:
2025-12-12 19:29:10 +01:00
parent e9505524bf
commit 34a4f594ce
4 changed files with 196 additions and 6 deletions

View File

@@ -7,6 +7,78 @@ import { factories } from "@strapi/strapi";
export default factories.createCoreController(
"api::contact.contact",
({ strapi }) => ({
async activities(ctx) {
const userId = ctx.state.user?.id;
if (!userId) {
return ctx.unauthorized("User not authenticated");
}
console.log("GET /contacts/activities - Requête reçue:", {
userId: userId,
});
try {
const friends = await strapi
.documents("api::contact.contact")
.findMany({
filters: {
owner: { id: userId },
state: "accepted",
},
populate: {
user: {
fields: ["id", "username"],
populate: {
activities: true,
},
},
},
});
console.log("GET /contacts/activities - Amis trouvés:", {
count: friends.length,
});
const friendsWithLatestActivity = friends.map((contact) => {
const user = contact.user;
let latestActivity = null;
if (user.activities && Array.isArray(user.activities) && user.activities.length > 0) {
latestActivity = user.activities.reduce((latest, activity) => {
const latestDate = new Date(latest.activityDate).getTime();
const currentDate = new Date(activity.activityDate).getTime();
return currentDate > latestDate ? activity : latest;
});
}
return {
id: user.id,
username: user.username,
latestActivity: latestActivity,
};
});
return {
data: friendsWithLatestActivity,
meta: {
pagination: {
page: 1,
pageSize: friendsWithLatestActivity.length,
pageCount: 1,
total: friendsWithLatestActivity.length,
},
},
};
} catch (error) {
console.error("GET /contacts/activities - Erreur:", {
error: error.message,
userId: userId,
});
throw error;
}
},
async find(ctx) {
// Log de la requête entrante
console.log("GET /contacts - Requête reçue:", {
@@ -72,8 +144,8 @@ export default factories.createCoreController(
.documents("api::contact.contact")
.findFirst({
filters: {
owner: owner,
user: user,
owner: { id: owner },
user: { id: user },
},
});
@@ -148,10 +220,10 @@ export default factories.createCoreController(
filters: {
$or: [
{
user: id,
user: { id: id },
},
{
owner: id,
owner: { id: id },
},
],
},
@@ -192,5 +264,90 @@ export default factories.createCoreController(
throw error;
}
},
async suggestions(ctx) {
const userId = ctx.state.user?.id;
if (!userId) {
return ctx.unauthorized("User not authenticated");
}
console.log("GET /contacts/suggestions - Requête reçue:", {
userId: userId,
});
try {
const userFriends = await strapi
.documents("api::contact.contact")
.findMany({
filters: {
owner: { id: userId },
state: "accepted",
},
populate: {
user: {
fields: ["id", "username"],
},
},
});
console.log("GET /contacts/suggestions - Amis trouvés:", {
count: userFriends.length,
});
const friendIds = new Set(userFriends.map((contact) => contact.user.id));
friendIds.add(userId);
const suggestedFriendIds = new Set<string>();
for (const friend of userFriends) {
const friendsFriendsContacts = await strapi
.documents("api::contact.contact")
.findMany({
filters: {
owner: { id: friend.user.id },
state: "accepted",
},
populate: {
user: {
fields: ["id", "username"],
},
},
});
for (const friendFriend of friendsFriendsContacts) {
if (!friendIds.has(friendFriend.user.id)) {
suggestedFriendIds.add(JSON.stringify({
id: friendFriend.user.id,
username: friendFriend.user.username,
}));
}
}
}
const suggestions = Array.from(suggestedFriendIds)
.map((str) => JSON.parse(str))
.sort((a, b) => a.username.localeCompare(b.username));
return {
data: suggestions,
meta: {
pagination: {
page: 1,
pageSize: suggestions.length,
pageCount: 1,
total: suggestions.length,
},
},
};
} catch (error) {
console.error("GET /contacts/suggestions - Erreur:", {
error: error.message,
userId: userId,
});
throw error;
}
},
})
);

View File

@@ -0,0 +1,33 @@
/**
* Custom contact routes
*/
export default {
type: "content-api",
routes: [
{
method: "GET",
path: "/contacts/activities",
handler: "contact.activities",
config: {
// Ajoutez ce bloc 'auth' pour être explicite
auth: {
scope: ["api::contact.contact.activities"], // Nom exact de la permission
},
policies: [], // On garde les politiques par défaut
},
},
{
method: "GET",
path: "/contacts/suggestions",
handler: "contact.suggestions",
config: {
// Ajoutez ce bloc 'auth' pour être explicite
auth: {
scope: ["api::contact.contact.activities"], // Nom exact de la permission
},
policies: [], // On garde les politiques par défaut
},
},
],
};

View File

@@ -14,7 +14,7 @@
"name": "Apache 2.0",
"url": "https://www.apache.org/licenses/LICENSE-2.0.html"
},
"x-generation-date": "2025-12-11T16:29:12.158Z"
"x-generation-date": "2025-12-12T18:29:01.167Z"
},
"x-strapi-config": {
"plugins": [