Md Afiq Iskandar ef5526baf1 Refactor Application Creation and Management Logic
- Simplified the application creation process by consolidating form fields and enhancing validation.
- Updated the create application page to streamline user experience with clearer provider options and improved layout.
- Implemented SweetAlert for success and error notifications during user actions, replacing traditional alerts.
- Enhanced the applications index page with dynamic filtering and improved data fetching from the Authentik API.
- Refactored API endpoints to utilize slugs for application identification, ensuring consistency with Authentik's structure.
- Improved authentication handling by updating the requireAuth utility to support cookie-based authentication.
2025-06-17 11:53:15 +08:00

119 lines
4.0 KiB
JavaScript

import { authentikFetch, clearAuthentikCache } from '../../utils/authentik';
import { requireAuth } from '../../utils/auth';
// /api/applications/[id] - Handle GET, PUT, DELETE for specific application
// Note: [id] is actually the application slug for consistency with Authentik API
export default defineEventHandler(async (event) => {
const method = getMethod(event);
const slug = getRouterParam(event, 'id'); // This is actually a slug
if (!slug) {
throw createError({
statusCode: 400,
message: 'Application slug is required'
});
}
switch (method) {
case 'GET':
// Make GET public for testing - no auth required
try {
const application = await authentikFetch(`/core/applications/${slug}/`);
return application;
} catch (error) {
throw createError({
statusCode: error.statusCode || 404,
message: error.message || 'Application not found'
});
}
case 'PUT':
// Require authentication for updating applications
await requireAuth(event);
try {
const body = await readBody(event);
console.log('🔄 Updating application:', slug, body);
// Prepare the update payload with all fields from frontend
const updatePayload = {
name: body.name,
slug: body.slug,
meta_description: body.meta_description || body.description,
meta_publisher: body.meta_publisher || 'CorradAF RBAC',
meta_launch_url: body.meta_launch_url || body.launchUrl
};
console.log('📦 Update payload:', updatePayload);
const application = await authentikFetch(`/core/applications/${slug}/`, {
method: 'PATCH', // Use PATCH instead of PUT to update only specified fields
body: updatePayload
});
console.log('✅ Application updated successfully:', application.name);
// Clear Authentik cache to ensure changes take effect immediately
try {
await clearAuthentikCache();
console.log('✅ Cache cleared after application update');
} catch (cacheError) {
console.warn('⚠️ Cache clearing failed but application was updated:', cacheError.message);
// Continue even if cache clearing fails
}
// Add success message to the response
return {
...application,
message: 'Application updated successfully'
};
} catch (error) {
console.error('❌ Update failed:', error);
throw createError({
statusCode: error.statusCode || 500,
message: error.message || 'Failed to update application'
});
}
case 'DELETE':
// Require authentication for deleting applications
await requireAuth(event);
try {
console.log(`🗑️ Attempting to delete application with slug: ${slug}`);
// Direct DELETE using slug (no extra GET request needed)
await authentikFetch(`/core/applications/${slug}/`, {
method: 'DELETE'
});
console.log(`✅ Successfully deleted application ${slug}`);
// Clear Authentik cache to ensure changes take effect immediately
try {
await clearAuthentikCache();
console.log('✅ Cache cleared after application deletion');
} catch (cacheError) {
console.warn('⚠️ Cache clearing failed but application was deleted:', cacheError.message);
// Continue even if cache clearing fails
}
return {
success: true,
message: 'Application deleted successfully'
};
} catch (error) {
console.error(`❌ Delete failed for application ${slug}:`, error);
throw createError({
statusCode: error.statusCode || 500,
message: error.message || 'Failed to delete application'
});
}
default:
throw createError({
statusCode: 405,
message: 'Method not allowed'
});
}
});