From 1df7244981f2892d4d08b04679e33e7245104964 Mon Sep 17 00:00:00 2001 From: Carlos Lopez Date: Tue, 25 Aug 2026 20:05:44 +0200 Subject: [PATCH 01/12] alias $modules --- .github/copilot-instructions.md | 4 ++-- CLAUDE.md | 4 ++-- src/app.d.ts | 2 +- src/hooks.server.ts | 4 ++-- src/routes/+layout.server.ts | 8 ++++---- src/routes/+page.server.ts | 2 +- src/routes/api/auth/login/+server.ts | 2 +- src/routes/api/code-report/scan/+server.ts | 6 +++--- src/routes/cluster-settings/orgs/+page.server.ts | 4 ++-- src/routes/cluster-settings/orgs/[org]/+page.server.ts | 4 ++-- .../cluster-settings/roles-permissions/+page.server.ts | 2 +- .../roles-permissions/[id]/+page.server.ts | 2 +- .../roles-permissions/new/+page.server.ts | 2 +- src/routes/cluster-settings/users/+page.server.ts | 2 +- src/routes/org/+page.server.ts | 2 +- src/routes/org/[org]/+layout.server.ts | 2 +- src/routes/org/[org]/+page.server.ts | 2 +- src/routes/org/[org]/cves/+page.server.ts | 6 +++--- src/routes/org/[org]/cves/[cve]/+page.server.ts | 6 +++--- src/routes/org/[org]/overview/+page.server.ts | 4 ++-- src/routes/org/[org]/projects/[slug]/+layout.server.ts | 4 ++-- .../projects/[slug]/code-report/dashboard/+page.server.ts | 4 ++-- .../projects/[slug]/code-report/history/+page.server.ts | 4 ++-- .../code-report/history/[analysisID]/+page.server.ts | 4 ++-- .../[slug]/code-report/security-policy/+page.server.ts | 6 +++--- .../code-report/security-policy/[id]/+page.server.ts | 6 +++--- .../code-report/security-policy/new/+page.server.ts | 6 +++--- .../projects/[slug]/code-report/services/+page.server.ts | 6 +++--- .../code-report/services/[serviceSlug]/+page.server.ts | 6 +++--- .../projects/[slug]/code-report/settings/+page.server.ts | 2 +- .../[slug]/code-report/settings/tools/+page.server.ts | 2 +- .../projects/[slug]/settings/overview/+page.server.ts | 4 ++-- .../[slug]/settings/roles-permissions/+page.server.ts | 4 ++-- .../settings/roles-permissions/[id]/+page.server.ts | 4 ++-- .../[slug]/settings/roles-permissions/new/+page.server.ts | 4 ++-- .../[slug]/settings/server-access-keys/+page.server.ts | 4 ++-- .../projects/[slug]/settings/users-groups/+page.server.ts | 4 ++-- src/routes/org/[org]/settings/projects/+page.server.ts | 6 +++--- .../org/[org]/settings/roles-permissions/+page.server.ts | 4 ++-- .../[org]/settings/roles-permissions/[id]/+page.server.ts | 4 ++-- .../[org]/settings/roles-permissions/new/+page.server.ts | 4 ++-- src/routes/org/[org]/settings/users/+page.server.ts | 4 ++-- src/routes/profile/+page.server.ts | 2 +- svelte.config.js | 3 +++ 44 files changed, 87 insertions(+), 84 deletions(-) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index e9f3a1a..99b3a0d 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -38,7 +38,7 @@ La lógica de negocio vive en `src/modules//` (`auth`, `config`, `projec - `infrastructure/repositories/` — implementaciones concretas de repositorio - `index.ts` — composition root del módulo: instancia repositorios + servicios y exporta singletons -Las rutas y otros módulos importan únicamente desde el `index.ts` de cada módulo (p. ej. `import { can, isAdmin, roleService } from '../../modules/auth'`), nunca de `application/`, `domain/` o `infrastructure/` directamente. +Las rutas y otros módulos importan únicamente desde el `index.ts` de cada módulo (p. ej. `import { can, isAdmin, roleService } from '$modules/auth'`), nunca de `application/`, `domain/` o `infrastructure/` directamente. `src/lib/` contiene infraestructura transversal: `src/lib/server/gitdb/index.ts` (cliente gitdb, `getGitDb()`), `src/lib/db.ts` + `src/lib/database/` (cliente sqlite `databaseClient`), `src/lib/permissions/index.ts` (helpers RBAC). @@ -61,7 +61,7 @@ Permisos = strings `section:action` (`vault|openreport|stateiac` : `read|create| ```typescript // ✅ patrón correcto en un endpoint (api/roles, api/projects, api/backends) -import { can, isAdmin } from '../../../modules/auth'; +import { can, isAdmin } from '$modules/auth'; if (!can(locals.user, 'stateiac:read')) return json({ error: 'Forbidden' }, { status: 403 }); ``` diff --git a/CLAUDE.md b/CLAUDE.md index 2cb1c85..4f213b7 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -52,7 +52,7 @@ La lógica de negocio vive en `src/modules//`, cada uno separado en: Módulos existentes: `auth`, `config`, `projects`, `storage`. -**Regla de acceso**: las rutas y otros módulos importan únicamente desde el `index.ts` de cada módulo (p. ej. `import { can, isAdmin, roleService } from '../../modules/auth'`), nunca de `application/`, `domain/` o `infrastructure/` directamente. +**Regla de acceso**: las rutas y otros módulos importan únicamente desde el `index.ts` de cada módulo (p. ej. `import { can, isAdmin, roleService } from '$modules/auth'`), nunca de `application/`, `domain/` o `infrastructure/` directamente. `src/lib/` contiene infraestructura transversal compartida entre módulos: @@ -96,7 +96,7 @@ Los roles (y su array de `permissions`) viven en gitdb (`.gitdb/roles.json`), ge ```typescript // ✅ BIEN -import { can, isAdmin } from '../../../modules/auth'; +import { can, isAdmin } from '$modules/auth'; export async function GET({ locals }) { if (!can(locals.user, 'stateiac:read')) { diff --git a/src/app.d.ts b/src/app.d.ts index 841dd9a..13e444f 100644 --- a/src/app.d.ts +++ b/src/app.d.ts @@ -1,4 +1,4 @@ -import type { AuthenticatedUser } from './modules/auth/domain/entities'; +import type { AuthenticatedUser } from '$modules/auth/domain/entities'; declare global { namespace App { diff --git a/src/hooks.server.ts b/src/hooks.server.ts index 3651215..8e84afd 100644 --- a/src/hooks.server.ts +++ b/src/hooks.server.ts @@ -1,6 +1,6 @@ import type { Handle } from '@sveltejs/kit'; -import { authService, cancanService, ensureAuthReady } from './modules/auth'; -import { ensureOrganizationReady, organizationService } from './modules/organization'; +import { authService, cancanService, ensureAuthReady } from '$modules/auth'; +import { ensureOrganizationReady, organizationService } from '$modules/organization'; import { getGitDb } from '$lib/server/gitdb'; getGitDb(); diff --git a/src/routes/+layout.server.ts b/src/routes/+layout.server.ts index e6a7e53..b97767f 100644 --- a/src/routes/+layout.server.ts +++ b/src/routes/+layout.server.ts @@ -1,7 +1,7 @@ -import { projectService } from '../modules/projects'; -import { organizationService } from '../modules/organization'; -import { cancanService } from '../modules/auth'; -// import { configService, storageBackendService } from '../modules/config'; +import { projectService } from '$modules/projects'; +import { organizationService } from '$modules/organization'; +import { cancanService } from '$modules/auth'; +// import { configService, storageBackendService } from '$modules/config'; export async function load({ locals, url }) { // const config = configService.getConfig(); diff --git a/src/routes/+page.server.ts b/src/routes/+page.server.ts index d9ab3b0..2e7c7f0 100644 --- a/src/routes/+page.server.ts +++ b/src/routes/+page.server.ts @@ -1,5 +1,5 @@ import { redirect } from '@sveltejs/kit'; -import { organizationService } from '../modules/organization'; +import { organizationService } from '$modules/organization'; export async function load() { const organization = await organizationService.getDefaultOrganization(); diff --git a/src/routes/api/auth/login/+server.ts b/src/routes/api/auth/login/+server.ts index 73f5565..6b6e51d 100644 --- a/src/routes/api/auth/login/+server.ts +++ b/src/routes/api/auth/login/+server.ts @@ -1,5 +1,5 @@ import { json } from '@sveltejs/kit'; -import { authService, ensureAuthReady } from '../../../../modules/auth'; +import { authService, ensureAuthReady } from '$modules/auth'; export async function POST({ request, cookies }) { try { diff --git a/src/routes/api/code-report/scan/+server.ts b/src/routes/api/code-report/scan/+server.ts index 5d4d61b..0c243e6 100644 --- a/src/routes/api/code-report/scan/+server.ts +++ b/src/routes/api/code-report/scan/+server.ts @@ -1,7 +1,7 @@ import { json } from '@sveltejs/kit'; -import { codeReportService, codeReportAnalysisService } from '../../../../modules/code-report'; -import { apiKeysService } from '../../../../modules/auth'; -import { projectService } from '../../../../modules/projects'; +import { codeReportService, codeReportAnalysisService } from '$modules/code-report'; +import { apiKeysService } from '$modules/auth'; +import { projectService } from '$modules/projects'; type ProjectSettingsTool = { id: string; diff --git a/src/routes/cluster-settings/orgs/+page.server.ts b/src/routes/cluster-settings/orgs/+page.server.ts index 553e657..f8a72e2 100644 --- a/src/routes/cluster-settings/orgs/+page.server.ts +++ b/src/routes/cluster-settings/orgs/+page.server.ts @@ -1,6 +1,6 @@ import { fail } from '@sveltejs/kit'; -import { cancanService } from '../../../modules/auth'; -import { organizationService } from '../../../modules/organization'; +import { cancanService } from '$modules/auth'; +import { organizationService } from '$modules/organization'; function errorResponse(error: unknown) { return fail(400, { diff --git a/src/routes/cluster-settings/orgs/[org]/+page.server.ts b/src/routes/cluster-settings/orgs/[org]/+page.server.ts index e6585d9..6fbe4be 100644 --- a/src/routes/cluster-settings/orgs/[org]/+page.server.ts +++ b/src/routes/cluster-settings/orgs/[org]/+page.server.ts @@ -1,6 +1,6 @@ import { error, fail, redirect } from '@sveltejs/kit'; -import { cancanService } from '../../../../modules/auth'; -import { organizationService } from '../../../../modules/organization'; +import { cancanService } from '$modules/auth'; +import { organizationService } from '$modules/organization'; function errorResponse(error: unknown) { return fail(400, { diff --git a/src/routes/cluster-settings/roles-permissions/+page.server.ts b/src/routes/cluster-settings/roles-permissions/+page.server.ts index 485aea7..a161269 100644 --- a/src/routes/cluster-settings/roles-permissions/+page.server.ts +++ b/src/routes/cluster-settings/roles-permissions/+page.server.ts @@ -1,5 +1,5 @@ import { fail } from '@sveltejs/kit'; -import { cancanService, roleService } from '../../../modules/auth'; +import { cancanService, roleService } from '$modules/auth'; function parsePermissions(value: unknown): string[] { if (typeof value !== 'string') return []; diff --git a/src/routes/cluster-settings/roles-permissions/[id]/+page.server.ts b/src/routes/cluster-settings/roles-permissions/[id]/+page.server.ts index c9e1335..dab6f0a 100644 --- a/src/routes/cluster-settings/roles-permissions/[id]/+page.server.ts +++ b/src/routes/cluster-settings/roles-permissions/[id]/+page.server.ts @@ -1,5 +1,5 @@ import { error, fail } from '@sveltejs/kit'; -import { cancanService, roleService } from '../../../../modules/auth'; +import { cancanService, roleService } from '$modules/auth'; function parsePermissions(value: unknown): string[] { if (typeof value !== 'string') return []; diff --git a/src/routes/cluster-settings/roles-permissions/new/+page.server.ts b/src/routes/cluster-settings/roles-permissions/new/+page.server.ts index 8a996b5..7eb0ce2 100644 --- a/src/routes/cluster-settings/roles-permissions/new/+page.server.ts +++ b/src/routes/cluster-settings/roles-permissions/new/+page.server.ts @@ -1,5 +1,5 @@ import { fail } from '@sveltejs/kit'; -import { cancanService, roleService } from '../../../../modules/auth'; +import { cancanService, roleService } from '$modules/auth'; function parsePermissions(value: unknown): string[] { if (typeof value !== 'string') return []; diff --git a/src/routes/cluster-settings/users/+page.server.ts b/src/routes/cluster-settings/users/+page.server.ts index 4ca0a30..a78569e 100644 --- a/src/routes/cluster-settings/users/+page.server.ts +++ b/src/routes/cluster-settings/users/+page.server.ts @@ -1,5 +1,5 @@ import { fail } from '@sveltejs/kit'; -import { cancanService, roleService, userAccessService } from '../../../modules/auth'; +import { cancanService, roleService, userAccessService } from '$modules/auth'; function errorResponse(error: unknown) { return fail(400, { error: error instanceof Error ? error.message : 'User action failed.' }); diff --git a/src/routes/org/+page.server.ts b/src/routes/org/+page.server.ts index 217317a..6d71f5d 100644 --- a/src/routes/org/+page.server.ts +++ b/src/routes/org/+page.server.ts @@ -1,4 +1,4 @@ -import { organizationService } from '../../modules/organization'; +import { organizationService } from '$modules/organization'; export async function load() { const organizations = await organizationService.listOrganizations(); diff --git a/src/routes/org/[org]/+layout.server.ts b/src/routes/org/[org]/+layout.server.ts index bc3cb65..69ea15e 100644 --- a/src/routes/org/[org]/+layout.server.ts +++ b/src/routes/org/[org]/+layout.server.ts @@ -1,5 +1,5 @@ import { redirect } from '@sveltejs/kit'; -import { organizationService } from '../../../modules/organization'; +import { organizationService } from '$modules/organization'; export async function load({ params }) { const organization = await organizationService.tryFindBySlug(params.org); diff --git a/src/routes/org/[org]/+page.server.ts b/src/routes/org/[org]/+page.server.ts index a6fdeaf..4156c9b 100644 --- a/src/routes/org/[org]/+page.server.ts +++ b/src/routes/org/[org]/+page.server.ts @@ -1,5 +1,5 @@ import { redirect } from '@sveltejs/kit'; -import { organizationService } from '../../../modules/organization'; +import { organizationService } from '$modules/organization'; export async function load({ params }) { const organization = await organizationService.tryFindBySlug(params.org); diff --git a/src/routes/org/[org]/cves/+page.server.ts b/src/routes/org/[org]/cves/+page.server.ts index 7473e55..5cc48dc 100644 --- a/src/routes/org/[org]/cves/+page.server.ts +++ b/src/routes/org/[org]/cves/+page.server.ts @@ -1,7 +1,7 @@ import { error } from '@sveltejs/kit'; -import { cancanService } from '../../../../modules/auth'; -import { codeReportCveService } from '../../../../modules/code-report'; -import { projectService } from '../../../../modules/projects'; +import { cancanService } from '$modules/auth'; +import { codeReportCveService } from '$modules/code-report'; +import { projectService } from '$modules/projects'; import { summarizeCves } from '$lib/code-report/cve-aggregation'; export async function load({ parent, locals, url }) { diff --git a/src/routes/org/[org]/cves/[cve]/+page.server.ts b/src/routes/org/[org]/cves/[cve]/+page.server.ts index 62b1704..f817d5a 100644 --- a/src/routes/org/[org]/cves/[cve]/+page.server.ts +++ b/src/routes/org/[org]/cves/[cve]/+page.server.ts @@ -1,7 +1,7 @@ import { error } from '@sveltejs/kit'; -import { cancanService } from '../../../../../modules/auth'; -import { codeReportCveService } from '../../../../../modules/code-report'; -import { projectService } from '../../../../../modules/projects'; +import { cancanService } from '$modules/auth'; +import { codeReportCveService } from '$modules/code-report'; +import { projectService } from '$modules/projects'; import { highestCvssScore, highestEpssPercentile, diff --git a/src/routes/org/[org]/overview/+page.server.ts b/src/routes/org/[org]/overview/+page.server.ts index 5d25f99..65cb459 100644 --- a/src/routes/org/[org]/overview/+page.server.ts +++ b/src/routes/org/[org]/overview/+page.server.ts @@ -1,6 +1,6 @@ import { error } from '@sveltejs/kit'; -import { projectService } from '../../../../modules/projects'; -import { cancanService } from '../../../../modules/auth'; +import { projectService } from '$modules/projects'; +import { cancanService } from '$modules/auth'; export async function load({ locals, parent }) { const { organization } = await parent(); diff --git a/src/routes/org/[org]/projects/[slug]/+layout.server.ts b/src/routes/org/[org]/projects/[slug]/+layout.server.ts index 9baa385..d00bfb7 100644 --- a/src/routes/org/[org]/projects/[slug]/+layout.server.ts +++ b/src/routes/org/[org]/projects/[slug]/+layout.server.ts @@ -1,6 +1,6 @@ import { error } from '@sveltejs/kit'; -import { projectService } from '../../../../../modules/projects'; -import { cancanService } from '../../../../../modules/auth'; +import { projectService } from '$modules/projects'; +import { cancanService } from '$modules/auth'; export async function load({ params, locals }) { try { diff --git a/src/routes/org/[org]/projects/[slug]/code-report/dashboard/+page.server.ts b/src/routes/org/[org]/projects/[slug]/code-report/dashboard/+page.server.ts index 571c150..715eeff 100644 --- a/src/routes/org/[org]/projects/[slug]/code-report/dashboard/+page.server.ts +++ b/src/routes/org/[org]/projects/[slug]/code-report/dashboard/+page.server.ts @@ -1,11 +1,11 @@ import { error } from '@sveltejs/kit'; -import { cancanService } from '../../../../../../../modules/auth'; +import { cancanService } from '$modules/auth'; import { codeReportAnalysisService, codeReportCveService, codeReportSecurityPolicyService, codeReportService, -} from '../../../../../../../modules/code-report'; +} from '$modules/code-report'; import { extractSecrets, summarizeAnalysisResult } from '$lib/code-report/analysis-summary'; import { summarizeCves } from '$lib/code-report/cve-aggregation'; import type { PolicyComplianceReport } from '$lib/code-report/policy-evaluation'; diff --git a/src/routes/org/[org]/projects/[slug]/code-report/history/+page.server.ts b/src/routes/org/[org]/projects/[slug]/code-report/history/+page.server.ts index 8c746c6..a2ea7ee 100644 --- a/src/routes/org/[org]/projects/[slug]/code-report/history/+page.server.ts +++ b/src/routes/org/[org]/projects/[slug]/code-report/history/+page.server.ts @@ -1,9 +1,9 @@ import { error } from '@sveltejs/kit'; -import { cancanService } from '../../../../../../../modules/auth'; +import { cancanService } from '$modules/auth'; import { codeReportAnalysisService, codeReportService, -} from '../../../../../../../modules/code-report'; +} from '$modules/code-report'; export async function load({ parent, locals }) { const { project } = await parent(); diff --git a/src/routes/org/[org]/projects/[slug]/code-report/history/[analysisID]/+page.server.ts b/src/routes/org/[org]/projects/[slug]/code-report/history/[analysisID]/+page.server.ts index 7cd0e05..03eed45 100644 --- a/src/routes/org/[org]/projects/[slug]/code-report/history/[analysisID]/+page.server.ts +++ b/src/routes/org/[org]/projects/[slug]/code-report/history/[analysisID]/+page.server.ts @@ -1,9 +1,9 @@ import { error } from '@sveltejs/kit'; -import { cancanService } from '../../../../../../../../modules/auth'; +import { cancanService } from '$modules/auth'; import { codeReportAnalysisService, codeReportService, -} from '../../../../../../../../modules/code-report'; +} from '$modules/code-report'; export async function load({ parent, params, locals }) { const { project } = await parent(); diff --git a/src/routes/org/[org]/projects/[slug]/code-report/security-policy/+page.server.ts b/src/routes/org/[org]/projects/[slug]/code-report/security-policy/+page.server.ts index 899f312..02a3c90 100644 --- a/src/routes/org/[org]/projects/[slug]/code-report/security-policy/+page.server.ts +++ b/src/routes/org/[org]/projects/[slug]/code-report/security-policy/+page.server.ts @@ -1,7 +1,7 @@ import { error, fail } from '@sveltejs/kit'; -import { cancanService } from '../../../../../../../modules/auth'; -import { codeReportSecurityPolicyService } from '../../../../../../../modules/code-report'; -import { projectService } from '../../../../../../../modules/projects'; +import { cancanService } from '$modules/auth'; +import { codeReportSecurityPolicyService } from '$modules/code-report'; +import { projectService } from '$modules/projects'; export async function load({ parent, locals }) { const { project } = await parent(); diff --git a/src/routes/org/[org]/projects/[slug]/code-report/security-policy/[id]/+page.server.ts b/src/routes/org/[org]/projects/[slug]/code-report/security-policy/[id]/+page.server.ts index 4ef4595..9886df1 100644 --- a/src/routes/org/[org]/projects/[slug]/code-report/security-policy/[id]/+page.server.ts +++ b/src/routes/org/[org]/projects/[slug]/code-report/security-policy/[id]/+page.server.ts @@ -1,11 +1,11 @@ import { error, fail, redirect } from '@sveltejs/kit'; -import { cancanService } from '../../../../../../../../modules/auth'; +import { cancanService } from '$modules/auth'; import { codeReportAnalysisService, codeReportSecurityPolicyService, codeReportService, -} from '../../../../../../../../modules/code-report'; -import { projectService } from '../../../../../../../../modules/projects'; +} from '$modules/code-report'; +import { projectService } from '$modules/projects'; export async function load({ parent, params, locals }) { const { project } = await parent(); diff --git a/src/routes/org/[org]/projects/[slug]/code-report/security-policy/new/+page.server.ts b/src/routes/org/[org]/projects/[slug]/code-report/security-policy/new/+page.server.ts index 17d192a..c5f958e 100644 --- a/src/routes/org/[org]/projects/[slug]/code-report/security-policy/new/+page.server.ts +++ b/src/routes/org/[org]/projects/[slug]/code-report/security-policy/new/+page.server.ts @@ -1,10 +1,10 @@ import { error, fail, redirect } from '@sveltejs/kit'; -import { cancanService } from '../../../../../../../../modules/auth'; +import { cancanService } from '$modules/auth'; import { codeReportSecurityPolicyService, codeReportService, -} from '../../../../../../../../modules/code-report'; -import { projectService } from '../../../../../../../../modules/projects'; +} from '$modules/code-report'; +import { projectService } from '$modules/projects'; export async function load({ parent, locals }) { const { project } = await parent(); diff --git a/src/routes/org/[org]/projects/[slug]/code-report/services/+page.server.ts b/src/routes/org/[org]/projects/[slug]/code-report/services/+page.server.ts index 7cb97b9..e8d1411 100644 --- a/src/routes/org/[org]/projects/[slug]/code-report/services/+page.server.ts +++ b/src/routes/org/[org]/projects/[slug]/code-report/services/+page.server.ts @@ -1,7 +1,7 @@ import { error, fail } from '@sveltejs/kit'; -import { codeReportService, codeReportAnalysisService } from '../../../../../../../modules/code-report'; -import { projectService } from '../../../../../../../modules/projects'; -import { cancanService } from '../../../../../../../modules/auth'; +import { codeReportService, codeReportAnalysisService } from '$modules/code-report'; +import { projectService } from '$modules/projects'; +import { cancanService } from '$modules/auth'; import { summarizeAnalysisResult } from '$lib/code-report/analysis-summary'; export async function load({ parent, locals }) { diff --git a/src/routes/org/[org]/projects/[slug]/code-report/services/[serviceSlug]/+page.server.ts b/src/routes/org/[org]/projects/[slug]/code-report/services/[serviceSlug]/+page.server.ts index 27855ff..f80b1a6 100644 --- a/src/routes/org/[org]/projects/[slug]/code-report/services/[serviceSlug]/+page.server.ts +++ b/src/routes/org/[org]/projects/[slug]/code-report/services/[serviceSlug]/+page.server.ts @@ -2,9 +2,9 @@ import { error, fail, redirect } from '@sveltejs/kit'; import { codeReportService, codeReportAnalysisService, -} from '../../../../../../../../modules/code-report'; -import { projectService } from '../../../../../../../../modules/projects'; -import { cancanService } from '../../../../../../../../modules/auth'; +} from '$modules/code-report'; +import { projectService } from '$modules/projects'; +import { cancanService } from '$modules/auth'; export async function load({ parent, params, locals }) { const { project } = await parent(); diff --git a/src/routes/org/[org]/projects/[slug]/code-report/settings/+page.server.ts b/src/routes/org/[org]/projects/[slug]/code-report/settings/+page.server.ts index c1e0867..d5101f5 100644 --- a/src/routes/org/[org]/projects/[slug]/code-report/settings/+page.server.ts +++ b/src/routes/org/[org]/projects/[slug]/code-report/settings/+page.server.ts @@ -1,5 +1,5 @@ import { error } from '@sveltejs/kit'; -import { projectService } from '../../../../../../../modules/projects'; +import { projectService } from '$modules/projects'; export async function load({ params }) { const project = await projectService.getProjectBySlug(params.slug); diff --git a/src/routes/org/[org]/projects/[slug]/code-report/settings/tools/+page.server.ts b/src/routes/org/[org]/projects/[slug]/code-report/settings/tools/+page.server.ts index bd83e2d..a61a3d2 100644 --- a/src/routes/org/[org]/projects/[slug]/code-report/settings/tools/+page.server.ts +++ b/src/routes/org/[org]/projects/[slug]/code-report/settings/tools/+page.server.ts @@ -1,4 +1,4 @@ -import { projectService } from '../../../../../../../../modules/projects'; +import { projectService } from '$modules/projects'; const DEFAULT_CODE_REPORT_TOOLS = [ { diff --git a/src/routes/org/[org]/projects/[slug]/settings/overview/+page.server.ts b/src/routes/org/[org]/projects/[slug]/settings/overview/+page.server.ts index e7c4fbc..2bb6a18 100644 --- a/src/routes/org/[org]/projects/[slug]/settings/overview/+page.server.ts +++ b/src/routes/org/[org]/projects/[slug]/settings/overview/+page.server.ts @@ -1,6 +1,6 @@ import { error, fail, redirect } from '@sveltejs/kit'; -import { cancanService } from '../../../../../../../modules/auth'; -import { projectService } from '../../../../../../../modules/projects'; +import { cancanService } from '$modules/auth'; +import { projectService } from '$modules/projects'; function errorResponse(error: unknown) { return fail(400, { error: error instanceof Error ? error.message : 'Project action failed.' }); diff --git a/src/routes/org/[org]/projects/[slug]/settings/roles-permissions/+page.server.ts b/src/routes/org/[org]/projects/[slug]/settings/roles-permissions/+page.server.ts index ac5e448..211f931 100644 --- a/src/routes/org/[org]/projects/[slug]/settings/roles-permissions/+page.server.ts +++ b/src/routes/org/[org]/projects/[slug]/settings/roles-permissions/+page.server.ts @@ -1,6 +1,6 @@ import { fail } from '@sveltejs/kit'; -import { cancanService, roleService } from '../../../../../../../modules/auth'; -import { projectService } from '../../../../../../../modules/projects'; +import { cancanService, roleService } from '$modules/auth'; +import { projectService } from '$modules/projects'; function parsePermissions(value: unknown): string[] { if (typeof value !== 'string') return []; diff --git a/src/routes/org/[org]/projects/[slug]/settings/roles-permissions/[id]/+page.server.ts b/src/routes/org/[org]/projects/[slug]/settings/roles-permissions/[id]/+page.server.ts index 8070a25..3bc24a4 100644 --- a/src/routes/org/[org]/projects/[slug]/settings/roles-permissions/[id]/+page.server.ts +++ b/src/routes/org/[org]/projects/[slug]/settings/roles-permissions/[id]/+page.server.ts @@ -1,6 +1,6 @@ import { error, fail } from '@sveltejs/kit'; -import { cancanService, roleService } from '../../../../../../../../modules/auth'; -import { projectService } from '../../../../../../../../modules/projects'; +import { cancanService, roleService } from '$modules/auth'; +import { projectService } from '$modules/projects'; function parsePermissions(value: unknown): string[] { if (typeof value !== 'string') return []; diff --git a/src/routes/org/[org]/projects/[slug]/settings/roles-permissions/new/+page.server.ts b/src/routes/org/[org]/projects/[slug]/settings/roles-permissions/new/+page.server.ts index fd66f12..99a0c4c 100644 --- a/src/routes/org/[org]/projects/[slug]/settings/roles-permissions/new/+page.server.ts +++ b/src/routes/org/[org]/projects/[slug]/settings/roles-permissions/new/+page.server.ts @@ -1,6 +1,6 @@ import { fail } from '@sveltejs/kit'; -import { cancanService, roleService } from '../../../../../../../../modules/auth'; -import { projectService } from '../../../../../../../../modules/projects'; +import { cancanService, roleService } from '$modules/auth'; +import { projectService } from '$modules/projects'; function parsePermissions(value: unknown): string[] { if (typeof value !== 'string') return []; diff --git a/src/routes/org/[org]/projects/[slug]/settings/server-access-keys/+page.server.ts b/src/routes/org/[org]/projects/[slug]/settings/server-access-keys/+page.server.ts index 0a1c4c0..8f56b7d 100644 --- a/src/routes/org/[org]/projects/[slug]/settings/server-access-keys/+page.server.ts +++ b/src/routes/org/[org]/projects/[slug]/settings/server-access-keys/+page.server.ts @@ -1,6 +1,6 @@ import { error, fail } from '@sveltejs/kit'; -import { apiKeysService, cancanService } from '../../../../../../../modules/auth'; -import { projectService } from '../../../../../../../modules/projects'; +import { apiKeysService, cancanService } from '$modules/auth'; +import { projectService } from '$modules/projects'; export async function load({ parent, locals }) { const { project } = await parent(); diff --git a/src/routes/org/[org]/projects/[slug]/settings/users-groups/+page.server.ts b/src/routes/org/[org]/projects/[slug]/settings/users-groups/+page.server.ts index 4685533..9f52f79 100644 --- a/src/routes/org/[org]/projects/[slug]/settings/users-groups/+page.server.ts +++ b/src/routes/org/[org]/projects/[slug]/settings/users-groups/+page.server.ts @@ -1,6 +1,6 @@ import { fail } from '@sveltejs/kit'; -import { cancanService, roleService, userAccessService } from '../../../../../../../modules/auth'; -import { projectService } from '../../../../../../../modules/projects'; +import { cancanService, roleService, userAccessService } from '$modules/auth'; +import { projectService } from '$modules/projects'; function errorResponse(error: unknown) { return fail(400, { error: error instanceof Error ? error.message : 'User action failed.' }); diff --git a/src/routes/org/[org]/settings/projects/+page.server.ts b/src/routes/org/[org]/settings/projects/+page.server.ts index 7c6f6a4..b74021c 100644 --- a/src/routes/org/[org]/settings/projects/+page.server.ts +++ b/src/routes/org/[org]/settings/projects/+page.server.ts @@ -1,7 +1,7 @@ import { fail } from '@sveltejs/kit'; -import { cancanService } from '../../../../../modules/auth'; -import { organizationService } from '../../../../../modules/organization'; -import { projectService } from '../../../../../modules/projects'; +import { cancanService } from '$modules/auth'; +import { organizationService } from '$modules/organization'; +import { projectService } from '$modules/projects'; function errorResponse(error: unknown) { return fail(400, { error: error instanceof Error ? error.message : 'Project action failed.' }); diff --git a/src/routes/org/[org]/settings/roles-permissions/+page.server.ts b/src/routes/org/[org]/settings/roles-permissions/+page.server.ts index 56da67a..3d5da10 100644 --- a/src/routes/org/[org]/settings/roles-permissions/+page.server.ts +++ b/src/routes/org/[org]/settings/roles-permissions/+page.server.ts @@ -1,6 +1,6 @@ import { fail } from '@sveltejs/kit'; -import { cancanService, roleService } from '../../../../../modules/auth'; -import { organizationService } from '../../../../../modules/organization'; +import { cancanService, roleService } from '$modules/auth'; +import { organizationService } from '$modules/organization'; function parsePermissions(value: unknown): string[] { if (typeof value !== 'string') return []; diff --git a/src/routes/org/[org]/settings/roles-permissions/[id]/+page.server.ts b/src/routes/org/[org]/settings/roles-permissions/[id]/+page.server.ts index b3847b1..e613552 100644 --- a/src/routes/org/[org]/settings/roles-permissions/[id]/+page.server.ts +++ b/src/routes/org/[org]/settings/roles-permissions/[id]/+page.server.ts @@ -1,6 +1,6 @@ import { error, fail } from '@sveltejs/kit'; -import { cancanService, roleService } from '../../../../../../modules/auth'; -import { organizationService } from '../../../../../../modules/organization'; +import { cancanService, roleService } from '$modules/auth'; +import { organizationService } from '$modules/organization'; function parsePermissions(value: unknown): string[] { if (typeof value !== 'string') return []; diff --git a/src/routes/org/[org]/settings/roles-permissions/new/+page.server.ts b/src/routes/org/[org]/settings/roles-permissions/new/+page.server.ts index 375fb42..6dd471b 100644 --- a/src/routes/org/[org]/settings/roles-permissions/new/+page.server.ts +++ b/src/routes/org/[org]/settings/roles-permissions/new/+page.server.ts @@ -1,6 +1,6 @@ import { fail } from '@sveltejs/kit'; -import { cancanService, roleService } from '../../../../../../modules/auth'; -import { organizationService } from '../../../../../../modules/organization'; +import { cancanService, roleService } from '$modules/auth'; +import { organizationService } from '$modules/organization'; function parsePermissions(value: unknown): string[] { if (typeof value !== 'string') return []; diff --git a/src/routes/org/[org]/settings/users/+page.server.ts b/src/routes/org/[org]/settings/users/+page.server.ts index 2f8dd3e..48b40f7 100644 --- a/src/routes/org/[org]/settings/users/+page.server.ts +++ b/src/routes/org/[org]/settings/users/+page.server.ts @@ -1,6 +1,6 @@ import { fail } from '@sveltejs/kit'; -import { cancanService, roleService, userAccessService } from '../../../../../modules/auth'; -import { organizationService } from '../../../../../modules/organization'; +import { cancanService, roleService, userAccessService } from '$modules/auth'; +import { organizationService } from '$modules/organization'; function errorResponse(error: unknown) { return fail(400, { error: error instanceof Error ? error.message : 'User action failed.' }); diff --git a/src/routes/profile/+page.server.ts b/src/routes/profile/+page.server.ts index 1fde3ee..2e238e9 100644 --- a/src/routes/profile/+page.server.ts +++ b/src/routes/profile/+page.server.ts @@ -1,5 +1,5 @@ import { fail, redirect } from '@sveltejs/kit'; -import { apiKeysService, profileService } from '../../modules/auth'; +import { apiKeysService, profileService } from '$modules/auth'; function expiresAtFromDays(expiresInDays: string | null): string | null { if (!expiresInDays) { diff --git a/svelte.config.js b/svelte.config.js index c3e4914..fa21996 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -5,6 +5,9 @@ const config = { preprocess: vitePreprocess(), kit: { adapter: adapter(), + alias: { + '$modules': './src/modules', + } }, }; From 98cb8385e6d12f66ed039841c5d6303df700ce78 Mon Sep 17 00:00:00 2001 From: Carlos Lopez Date: Tue, 25 Aug 2026 20:43:48 +0200 Subject: [PATCH 02/12] bootstrap --- .gitignore | 3 +- src/hooks.server.ts | 35 +- src/lib/components/AppSidebar.svelte | 1 + src/lib/components/Footer.svelte | 33 ++ src/lib/components/GitDbStatusBadge.svelte | 35 ++ src/lib/server/bootstrap.ts | 65 +++ src/lib/server/gitdb/config.ts | 209 +++++++++ src/lib/server/gitdb/index.ts | 32 +- src/lib/server/gitdb/sync.ts | 308 +++++++++++++ src/lib/server/infra/repository.ts | 5 +- src/modules/auth/index.ts | 10 +- .../infrastructure/repositories/repository.ts | 5 +- .../application/organization.service.ts | 7 +- src/modules/organization/index.ts | 10 +- src/routes/+layout.server.ts | 11 + src/routes/+layout.svelte | 7 +- src/routes/bootstrap/+page.server.ts | 131 ++++++ src/routes/bootstrap/+page.svelte | 398 +++++++++++++++++ .../cluster-settings/database/+page.server.ts | 91 ++++ .../cluster-settings/database/+page.svelte | 403 ++++++++++++++++++ src/routes/gitdb/status/+server.ts | 8 + 21 files changed, 1781 insertions(+), 26 deletions(-) create mode 100644 src/lib/components/GitDbStatusBadge.svelte create mode 100644 src/lib/server/bootstrap.ts create mode 100644 src/lib/server/gitdb/config.ts create mode 100644 src/lib/server/gitdb/sync.ts create mode 100644 src/routes/bootstrap/+page.server.ts create mode 100644 src/routes/bootstrap/+page.svelte create mode 100644 src/routes/cluster-settings/database/+page.server.ts create mode 100644 src/routes/cluster-settings/database/+page.svelte create mode 100644 src/routes/gitdb/status/+server.ts diff --git a/.gitignore b/.gitignore index 244ec89..cf546bc 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ data/ .gitdb/ .env .claude/.claude-md-review-state -code-report-analysis/ \ No newline at end of file +code-report-analysis/ +.gitdb2/ \ No newline at end of file diff --git a/src/hooks.server.ts b/src/hooks.server.ts index 8e84afd..573eb8a 100644 --- a/src/hooks.server.ts +++ b/src/hooks.server.ts @@ -1,20 +1,46 @@ import type { Handle } from '@sveltejs/kit'; import { authService, cancanService, ensureAuthReady } from '$modules/auth'; import { ensureOrganizationReady, organizationService } from '$modules/organization'; +import { getBootstrapState, isBootstrapCompletedCached } from '$lib/server/bootstrap'; import { getGitDb } from '$lib/server/gitdb'; -getGitDb(); - const authWithToken = async (token: string) => { return true; }; +async function isBootstrapCompleted(): Promise { + if (isBootstrapCompletedCached()) return true; + return (await getBootstrapState()).completed; +} + export const handle: Handle = async ({ event, resolve }) => { - if (event.url.pathname === '/login') { + const pathname = event.url.pathname; + const isApiRequest = pathname.startsWith('/api/'); + + if (pathname.startsWith('/bootstrap')) { + if (await isBootstrapCompleted()) { + return new Response(null, { status: 302, headers: { location: '/' } }); + } + return resolve(event); + } + + if (!(await isBootstrapCompleted())) { + if (isApiRequest) { + return new Response(JSON.stringify({ error: 'Cluster is not bootstrapped yet' }), { + status: 503, + headers: { 'content-type': 'application/json' }, + }); + } + return new Response(null, { status: 302, headers: { location: '/bootstrap' } }); + } + + getGitDb(); + + if (pathname === '/login') { return resolve(event); } - if (event.url.pathname.startsWith('/api/')) { + if (isApiRequest) { const token = event.request.headers.get('Authorization') || ''; if (!token || token.trim() === '') { return new Response(null, { status: 401 }); @@ -25,7 +51,6 @@ export const handle: Handle = async ({ event, resolve }) => { if (!isAuthenticated) { return new Response(null, { status: 401 }); } - console.log('✅ [API] Authenticated successfully with token:', token); return resolve(event); } diff --git a/src/lib/components/AppSidebar.svelte b/src/lib/components/AppSidebar.svelte index 2143062..da101a9 100644 --- a/src/lib/components/AppSidebar.svelte +++ b/src/lib/components/AppSidebar.svelte @@ -237,6 +237,7 @@ icon: Shield, }, { label: 'Users', href: '/cluster-settings/users', icon: Users }, + { label: 'Database', href: '/cluster-settings/database', icon: Database }, ], }, ], diff --git a/src/lib/components/Footer.svelte b/src/lib/components/Footer.svelte index 8f8f037..6bb6c1c 100644 --- a/src/lib/components/Footer.svelte +++ b/src/lib/components/Footer.svelte @@ -1,5 +1,30 @@