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:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user