corrad-af-2024/pages/test-api.vue
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

223 lines
6.6 KiB
Vue

<template>
<div class="min-h-screen bg-gray-50 py-8">
<div class="max-w-4xl mx-auto px-4">
<h1 class="text-3xl font-bold text-gray-900 mb-8">API Testing Page</h1>
<!-- Test Application Creation -->
<div class="bg-white rounded-lg shadow p-6 mb-6">
<h2 class="text-xl font-semibold mb-4">Test Application Creation</h2>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4 mb-4">
<button
@click="testCreateApp('oauth2')"
:disabled="loading"
class="bg-blue-500 hover:bg-blue-600 text-white px-4 py-2 rounded disabled:opacity-50"
>
Test OAuth2 App
</button>
<button
@click="testCreateApp('ldap')"
:disabled="loading"
class="bg-green-500 hover:bg-green-600 text-white px-4 py-2 rounded disabled:opacity-50"
>
Test LDAP App
</button>
<button
@click="testCreateApp('saml')"
:disabled="loading"
class="bg-purple-500 hover:bg-purple-600 text-white px-4 py-2 rounded disabled:opacity-50"
>
Test SAML App
</button>
<button
@click="testCreateApp('proxy')"
:disabled="loading"
class="bg-orange-500 hover:bg-orange-600 text-white px-4 py-2 rounded disabled:opacity-50"
>
Test Proxy App
</button>
</div>
<div class="mb-4">
<button
@click="testListApps"
:disabled="loading"
class="bg-gray-500 hover:bg-gray-600 text-white px-4 py-2 rounded disabled:opacity-50 mr-2"
>
List Applications
</button>
<button
@click="testAuthentikConnection"
:disabled="loading"
class="bg-indigo-500 hover:bg-indigo-600 text-white px-4 py-2 rounded disabled:opacity-50"
>
Test Authentik Connection
</button>
</div>
<div v-if="loading" class="text-blue-600 mb-4">
{{ loadingMessage }}
</div>
</div>
<!-- Results Display -->
<div class="bg-white rounded-lg shadow p-6">
<h2 class="text-xl font-semibold mb-4">Results</h2>
<div v-if="result" class="mb-4">
<div class="flex items-center mb-2">
<span class="text-sm font-medium text-gray-500 mr-2">Status:</span>
<span :class="result.success ? 'text-green-600' : 'text-red-600'" class="font-medium">
{{ result.success ? '✅ Success' : '❌ Error' }}
</span>
</div>
<div class="bg-gray-50 rounded p-4 overflow-auto">
<pre class="text-sm">{{ JSON.stringify(result.data, null, 2) }}</pre>
</div>
</div>
<div v-if="!result" class="text-gray-500 text-center py-8">
Click a test button above to see results here
</div>
<button
v-if="result"
@click="result = null"
class="mt-4 bg-gray-300 hover:bg-gray-400 text-gray-700 px-4 py-2 rounded"
>
Clear Results
</button>
</div>
</div>
</div>
</template>
<script setup>
// State
const loading = ref(false)
const loadingMessage = ref('')
const result = ref(null)
// Test functions
const testCreateApp = async (providerType) => {
loading.value = true
loadingMessage.value = `Creating ${providerType.toUpperCase()} application...`
try {
const timestamp = Date.now()
const testApp = {
name: `Test ${providerType.toUpperCase()} ${timestamp}`,
slug: `test-${providerType}-${timestamp}`,
meta_description: `Test ${providerType} application for debugging`,
meta_launch_url: 'http://localhost:5000/test',
meta_publisher: 'IT Department - Test',
setupType: 'web-app',
providerType: providerType
}
console.log(`🧪 Testing ${providerType} application creation:`, testApp)
const response = await $fetch('/api/applications', {
method: 'POST',
body: testApp
})
result.value = {
success: true,
data: {
message: `${providerType.toUpperCase()} application created successfully!`,
application: response,
requestData: testApp
}
}
} catch (error) {
console.error(`${providerType} test failed:`, error)
result.value = {
success: false,
data: {
error: error.message,
statusCode: error.statusCode,
details: error.data,
requestData: testApp
}
}
} finally {
loading.value = false
loadingMessage.value = ''
}
}
const testListApps = async () => {
loading.value = true
loadingMessage.value = 'Fetching applications list...'
try {
const response = await $fetch('/api/applications')
result.value = {
success: true,
data: {
message: 'Applications fetched successfully!',
count: response.results?.length || 0,
applications: response.results || []
}
}
} catch (error) {
console.error('❌ List apps test failed:', error)
result.value = {
success: false,
data: {
error: error.message,
statusCode: error.statusCode,
details: error.data
}
}
} finally {
loading.value = false
loadingMessage.value = ''
}
}
const testAuthentikConnection = async () => {
loading.value = true
loadingMessage.value = 'Testing Authentik connection...'
try {
const response = await $fetch('/api/test-authentik')
result.value = {
success: true,
data: {
message: 'Authentik connection test successful!',
connectionTest: response
}
}
} catch (error) {
console.error('❌ Authentik connection test failed:', error)
result.value = {
success: false,
data: {
error: error.message,
statusCode: error.statusCode,
details: error.data
}
}
} finally {
loading.value = false
loadingMessage.value = ''
}
}
// Page metadata
useHead({
title: 'API Testing - CorradAF RBAC'
})
</script>