monacousa-portal/server/api/profile/image/[memberId]/[size].get.ts

62 lines
1.7 KiB
TypeScript

import { getProfileImageUrl } from '~/server/utils/profile-images';
export default defineEventHandler(async (event) => {
try {
// Get route parameters
const memberId = getRouterParam(event, 'memberId');
const size = getRouterParam(event, 'size') as 'original' | 'small' | 'medium';
if (!memberId) {
throw createError({
statusCode: 400,
statusMessage: 'Member ID is required',
});
}
// Validate size parameter
const validSizes = ['original', 'small', 'medium'];
if (!validSizes.includes(size)) {
throw createError({
statusCode: 400,
statusMessage: 'Invalid size. Must be one of: original, small, medium',
});
}
console.log(`[profile-image] Getting image URL for member: ${memberId}, size: ${size}`);
// Get presigned URL for the image
const imageUrl = await getProfileImageUrl(memberId, size);
if (!imageUrl) {
throw createError({
statusCode: 404,
statusMessage: 'Profile image not found',
});
}
// Set cache headers for better performance
setHeader(event, 'Cache-Control', 'public, max-age=300'); // 5 minutes
setHeader(event, 'Content-Type', 'application/json');
return {
success: true,
imageUrl,
memberId,
size,
expiresIn: 3600, // URLs expire in 1 hour
};
} catch (error: any) {
console.error('[profile-image] Failed to get image URL:', error);
if (error.statusCode) {
throw error; // Re-throw HTTP errors
}
throw createError({
statusCode: 500,
statusMessage: 'Failed to retrieve profile image',
});
}
});