diff --git a/app/api/applications/[id]/environments/[envId]/route.ts b/app/api/applications/[id]/environments/[envId]/route.ts index a99de80..cccc54c 100644 --- a/app/api/applications/[id]/environments/[envId]/route.ts +++ b/app/api/applications/[id]/environments/[envId]/route.ts @@ -44,10 +44,13 @@ export async function PUT( if (!response.ok) { const errorText = await response.text(); - return NextResponse.json( - { error: errorText || "Failed to update environment" }, - { status: response.status } - ); + let errorData; + try { + errorData = JSON.parse(errorText); + } catch (e) { + errorData = { error: errorText || "Failed to update environment" }; + } + return NextResponse.json(errorData, { status: response.status }); } const data = await response.json(); @@ -73,10 +76,13 @@ export async function DELETE( if (!response.ok) { const errorText = await response.text(); - return NextResponse.json( - { error: errorText || "Failed to delete environment" }, - { status: response.status } - ); + let errorData; + try { + errorData = JSON.parse(errorText); + } catch (e) { + errorData = { error: errorText || "Failed to delete environment" }; + } + return NextResponse.json(errorData, { status: response.status }); } return new NextResponse(null, { status: 204 }); diff --git a/app/api/applications/[id]/environments/route.ts b/app/api/applications/[id]/environments/route.ts index f7c1cbf..8f842d9 100644 --- a/app/api/applications/[id]/environments/route.ts +++ b/app/api/applications/[id]/environments/route.ts @@ -10,10 +10,13 @@ export async function GET( const response = await fetchBackend(`/v1/applications/${id}/environments?size=50`); if (!response.ok) { const errorText = await response.text(); - return NextResponse.json( - { error: errorText || "Failed to fetch environments" }, - { status: response.status } - ); + let errorData; + try { + errorData = JSON.parse(errorText); + } catch (e) { + errorData = { error: errorText || "Failed to fetch environments" }; + } + return NextResponse.json(errorData, { status: response.status }); } const data = await response.json(); @@ -44,10 +47,13 @@ export async function POST( if (!response.ok) { const errorText = await response.text(); - return NextResponse.json( - { error: errorText || "Failed to create environment" }, - { status: response.status } - ); + let errorData; + try { + errorData = JSON.parse(errorText); + } catch (e) { + errorData = { error: errorText || "Failed to create environment" }; + } + return NextResponse.json(errorData, { status: response.status }); } const data = await response.json(); diff --git a/app/api/applications/[id]/route.ts b/app/api/applications/[id]/route.ts index 77f3490..fc19e20 100644 --- a/app/api/applications/[id]/route.ts +++ b/app/api/applications/[id]/route.ts @@ -70,10 +70,13 @@ export async function DELETE( if (!response.ok) { const errorText = await response.text(); - return NextResponse.json( - { error: errorText || "Failed to delete application" }, - { status: response.status } - ); + let errorData; + try { + errorData = JSON.parse(errorText); + } catch (e) { + errorData = { error: errorText || "Failed to delete application" }; + } + return NextResponse.json(errorData, { status: response.status }); } return new NextResponse(null, { status: 204 }); diff --git a/app/api/applications/route.ts b/app/api/applications/route.ts index 1977eff..5d4715a 100644 --- a/app/api/applications/route.ts +++ b/app/api/applications/route.ts @@ -1,6 +1,8 @@ import { NextRequest, NextResponse } from "next/server"; import { fetchBackend } from "@/lib/api"; +export const dynamic = "force-dynamic"; + export async function GET(request: NextRequest) { try { const { searchParams } = new URL(request.url); diff --git a/app/dashboard/applications/[id]/settings/page.tsx b/app/dashboard/applications/[id]/settings/page.tsx index 6b1be27..be4347e 100644 --- a/app/dashboard/applications/[id]/settings/page.tsx +++ b/app/dashboard/applications/[id]/settings/page.tsx @@ -38,6 +38,7 @@ export default function ApplicationSettingsPage({ const [isLoading, setIsLoading] = useState(true) const [isSaving, setIsSaving] = useState(false) const [deleteDialogOpen, setDeleteDialogOpen] = useState(false) + const [deleteAppError, setDeleteAppError] = useState<{ message: string, details?: string[] } | null>(null) const [formData, setFormData] = useState({ name: "", description: "", @@ -53,6 +54,7 @@ export default function ApplicationSettingsPage({ const [isSavingEnv, setIsSavingEnv] = useState(false) const [confirmDeleteEnvOpen, setConfirmDeleteEnvOpen] = useState(false) const [selectedEnvForDelete, setSelectedEnvForDelete] = useState(null) + const [deleteEnvError, setDeleteEnvError] = useState<{ message: string, details?: string[] } | null>(null) useEffect(() => { const fetchAppAndEnvs = async () => { @@ -153,7 +155,7 @@ export default function ApplicationSettingsPage({ setEnvDialogOpen(false) } else { const errData = await res.json().catch(() => ({})) - setEnvFormError(errData.error || "Error al crear el ambiente") + setEnvFormError(errData.message || errData.error || "Error al crear el ambiente") } } else if (envDialogMode === "edit" && selectedEnvForEdit) { const res = await fetch(`/api/applications/${id}/environments/${selectedEnvForEdit.id}`, { @@ -181,7 +183,7 @@ export default function ApplicationSettingsPage({ setEnvDialogOpen(false) } else { const errData = await res.json().catch(() => ({})) - setEnvFormError(errData.error || "Error al actualizar el ambiente") + setEnvFormError(errData.message || errData.error || "Error al actualizar el ambiente") } } } catch (error) { @@ -194,13 +196,17 @@ export default function ApplicationSettingsPage({ const handleOpenDeleteEnv = (env: Environment) => { setSelectedEnvForDelete(env) + setDeleteEnvError(null) setConfirmDeleteEnvOpen(true) } const handleDeleteEnvConfirm = async () => { if (!selectedEnvForDelete) return + console.log("INTENTANDO ELIMINAR ENTORNO:", selectedEnvForDelete.name, "CON ID:", selectedEnvForDelete.id) setIsSavingEnv(true) + setDeleteEnvError(null) try { + console.log("URL DE FETCH:", `/api/applications/${id}/environments/${selectedEnvForDelete.id}`) const res = await fetch(`/api/applications/${id}/environments/${selectedEnvForDelete.id}`, { method: "DELETE", }) @@ -209,10 +215,15 @@ export default function ApplicationSettingsPage({ setConfirmDeleteEnvOpen(false) setSelectedEnvForDelete(null) } else { - console.error("Failed to delete environment") + const errData = await res.json().catch(() => ({ message: "Error al eliminar el ambiente" })) + setDeleteEnvError({ + message: errData.message || errData.error || "Error al eliminar el ambiente", + details: errData.details + }) } } catch (error) { console.error("Error deleting environment:", error) + setDeleteEnvError({ message: "Ocurrió un error inesperado al eliminar el ambiente" }) } finally { setIsSavingEnv(false) } @@ -242,6 +253,7 @@ export default function ApplicationSettingsPage({ const handleDelete = async () => { setIsSaving(true) + setDeleteAppError(null) try { const response = await fetch(`/api/applications/${id}`, { method: "DELETE", @@ -249,10 +261,15 @@ export default function ApplicationSettingsPage({ if (response.ok) { router.push("/dashboard/applications") } else { - console.error("Failed to delete application") + const errData = await response.json().catch(() => ({ message: "Error al eliminar la aplicación" })) + setDeleteAppError({ + message: errData.message || errData.error || "Error al eliminar la aplicación", + details: errData.details + }) } } catch (error) { console.error("Error deleting application:", error) + setDeleteAppError({ message: "Ocurrió un error inesperado al eliminar la aplicación" }) } finally { setIsSaving(false) } @@ -467,7 +484,10 @@ export default function ApplicationSettingsPage({ {/* Delete Dialog */} - + { + setDeleteDialogOpen(open) + if (!open) setDeleteAppError(null) + }}> Eliminar Aplicación @@ -480,10 +500,25 @@ export default function ApplicationSettingsPage({ Esta acción no se puede deshacer. + {deleteAppError && ( +
+
{deleteAppError.message}
+ {deleteAppError.details && deleteAppError.details.length > 0 && ( +
    + {deleteAppError.details.map((detail, idx) => ( +
  • {detail}
  • + ))} +
+ )} +
+ )} @@ -559,7 +594,10 @@ export default function ApplicationSettingsPage({
{/* Delete Environment Confirmation Dialog */} - + { + setConfirmDeleteEnvOpen(open) + if (!open) setDeleteEnvError(null) + }}> Eliminar Ambiente @@ -569,10 +607,25 @@ export default function ApplicationSettingsPage({ Esta acción es irreversible y eliminará todos los recursos, locks y API keys asociados a este ambiente. + {deleteEnvError && ( +
+
{deleteEnvError.message}
+ {deleteEnvError.details && deleteEnvError.details.length > 0 && ( +
    + {deleteEnvError.details.map((detail, idx) => ( +
  • {detail}
  • + ))} +
+ )} +
+ )}