Enhance member gallery functionality with latest image retrieval and JSON format support

This commit improves the member gallery feature by allowing users to request the latest member images and receive member information in JSON format. The backend has been updated to handle "latest" as a valid imageId, ensuring the most recent image is fetched. Additionally, the frontend has been modified to support displaying member details in an interactive gallery format, enhancing user experience and providing more flexibility in how member information is presented.
This commit is contained in:
Torsten Schulz (local)
2025-11-12 11:58:37 +01:00
parent 8ef4e1dc9d
commit 1f20737721
4 changed files with 494 additions and 23 deletions

View File

@@ -59,7 +59,9 @@ const getMemberImage = async (req, res) => {
try {
const { clubId, memberId, imageId } = req.params;
const { authcode: userToken } = req.headers;
const result = await MemberService.getMemberImage(userToken, clubId, memberId, imageId || null);
// Support "latest" as imageId to get the latest image
const actualImageId = imageId === 'latest' ? null : (imageId || null);
const result = await MemberService.getMemberImage(userToken, clubId, memberId, actualImageId);
if (result.status === 200) {
res.sendFile(result.imagePath);
} else {
@@ -121,8 +123,20 @@ const generateMemberGallery = async (req, res) => {
const { clubId } = req.params;
const { authcode: userToken } = req.headers;
const size = parseInt(req.query.size) || 200; // Default: 200x200
const format = req.query.format || 'image'; // 'image' or 'json'
const result = await MemberService.generateMemberGallery(userToken, clubId, size);
if (result.status === 200) {
if (format === 'json') {
// Return member information for interactive gallery
return res.status(200).json({
members: result.galleryEntries.map(entry => ({
memberId: entry.memberId,
firstName: entry.firstName,
lastName: entry.lastName,
fullName: entry.fullName
}))
});
}
res.setHeader('Content-Type', 'image/png');
res.setHeader('Cache-Control', 'no-store');
return res.status(200).send(result.buffer);

View File

@@ -282,9 +282,10 @@ class MemberService {
}
if (!imageRecord) {
// Get latest image (highest sortOrder, then highest id)
imageRecord = await MemberImage.findOne({
where: { memberId },
order: [['sortOrder', 'ASC'], ['id', 'ASC']]
order: [['sortOrder', 'DESC'], ['id', 'DESC']]
});
}
@@ -1124,7 +1125,10 @@ class MemberService {
galleryEntries.push({
filePath,
fullName: `${member.firstName || ''} ${member.lastName || ''}`.trim() || member.lastName || member.firstName || 'Unbekannt'
fullName: `${member.firstName || ''} ${member.lastName || ''}`.trim() || member.lastName || member.firstName || 'Unbekannt',
memberId: member.id,
firstName: member.firstName || '',
lastName: member.lastName || ''
});
}
@@ -1194,7 +1198,8 @@ class MemberService {
return {
status: 200,
buffer
buffer,
galleryEntries // Für interaktive Galerie
};
} catch (error) {
console.error('[generateMemberGallery] - Error:', error);