Add profile image system with MinIO storage
Some checks failed
Build And Push Image / docker (push) Failing after 1m5s
Some checks failed
Build And Push Image / docker (push) Failing after 1m5s
- Implement ProfileAvatar component for user avatars - Integrate MinIO for profile image storage and management - Add profile image fields to Member type definition - Create server utilities and API endpoints for image handling - Replace basic avatar icon with new ProfileAvatar in dashboard - Update sharp dependency to v0.34.3
This commit is contained in:
61
server/api/profile/image/[memberId]/[size].get.ts
Normal file
61
server/api/profile/image/[memberId]/[size].get.ts
Normal file
@@ -0,0 +1,61 @@
|
||||
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',
|
||||
});
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user