openship 0.1.1 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -0
- package/dist/index.js +5786 -0
- package/dist/server/index.js +324319 -0
- package/dist/server/migrations/0000_init.sql +666 -0
- package/dist/server/migrations/0001_brief_tomorrow_man.sql +47 -0
- package/dist/server/migrations/0002_funny_dazzler.sql +2 -0
- package/dist/server/migrations/0003_third_killer_shrike.sql +1 -0
- package/dist/server/migrations/0004_session_active_org_not_null.sql +10 -0
- package/dist/server/migrations/0005_warm_amazoness.sql +3 -0
- package/dist/server/migrations/0006_lumpy_joystick.sql +1 -0
- package/dist/server/migrations/0007_outgoing_maginty.sql +2 -0
- package/dist/server/migrations/0008_frozen_cutover.sql +3 -0
- package/dist/server/migrations/0009_credits_billing.sql +142 -0
- package/dist/server/migrations/0010_credit_grant_dedupe.sql +14 -0
- package/dist/server/migrations/0011_remove_credit_ledger.sql +23 -0
- package/dist/server/migrations/0012_smart_deploys_and_git_rollback.sql +81 -0
- package/dist/server/migrations/0013_fix_check_run_rollup_unique.sql +38 -0
- package/dist/server/migrations/0014_default_rollback_git.sql +9 -0
- package/dist/server/migrations/0015_billing_idempotency_grants.sql +41 -0
- package/dist/server/migrations/0016_github_auth_high_findings.sql +30 -0
- package/dist/server/migrations/0017_spooky_rumiko_fujikawa.sql +6 -0
- package/dist/server/migrations/0018_calm_shatterstar.sql +1 -0
- package/dist/server/migrations/0019_rename_workspace_install_to_prepare.sql +1 -0
- package/dist/server/migrations/0020_uneven_the_renegades.sql +13 -0
- package/dist/server/migrations/0021_shiny_firestar.sql +2 -0
- package/dist/server/migrations/0022_version_on_success_backfill.sql +6 -0
- package/dist/server/migrations/0023_productive_gorilla_man.sql +17 -0
- package/dist/server/migrations/0024_sleepy_peter_quill.sql +2 -0
- package/dist/server/migrations/0025_smooth_blue_shield.sql +1 -0
- package/dist/server/migrations/0026_mail_backup_source.sql +11 -0
- package/dist/server/migrations/0027_opposite_anthem.sql +6 -0
- package/dist/server/migrations/0028_stale_rogue.sql +18 -0
- package/dist/server/migrations/0029_bouncy_loners.sql +16 -0
- package/dist/server/migrations/0030_bright_darkstar.sql +6 -0
- package/dist/server/migrations/0031_conscious_catseye.sql +13 -0
- package/dist/server/migrations/0032_wet_mimic.sql +51 -0
- package/dist/server/migrations/0033_eminent_molly_hayes.sql +2 -0
- package/dist/server/migrations/meta/0000_snapshot.json +5110 -0
- package/dist/server/migrations/meta/0001_snapshot.json +5257 -0
- package/dist/server/migrations/meta/0002_snapshot.json +5279 -0
- package/dist/server/migrations/meta/0003_snapshot.json +5286 -0
- package/dist/server/migrations/meta/0004_snapshot.json +5286 -0
- package/dist/server/migrations/meta/0005_snapshot.json +5305 -0
- package/dist/server/migrations/meta/0006_snapshot.json +5311 -0
- package/dist/server/migrations/meta/0007_snapshot.json +5323 -0
- package/dist/server/migrations/meta/0016_snapshot.json +6345 -0
- package/dist/server/migrations/meta/0017_snapshot.json +6383 -0
- package/dist/server/migrations/meta/0018_snapshot.json +6390 -0
- package/dist/server/migrations/meta/0019_snapshot.json +6390 -0
- package/dist/server/migrations/meta/0020_snapshot.json +6497 -0
- package/dist/server/migrations/meta/0021_snapshot.json +6509 -0
- package/dist/server/migrations/meta/0022_snapshot.json +6509 -0
- package/dist/server/migrations/meta/0023_snapshot.json +6629 -0
- package/dist/server/migrations/meta/0024_snapshot.json +6641 -0
- package/dist/server/migrations/meta/0025_snapshot.json +6648 -0
- package/dist/server/migrations/meta/0026_snapshot.json +6750 -0
- package/dist/server/migrations/meta/0027_snapshot.json +6757 -0
- package/dist/server/migrations/meta/0028_snapshot.json +6895 -0
- package/dist/server/migrations/meta/0029_snapshot.json +7028 -0
- package/dist/server/migrations/meta/0030_snapshot.json +7066 -0
- package/dist/server/migrations/meta/0031_snapshot.json +7181 -0
- package/dist/server/migrations/meta/0032_snapshot.json +7570 -0
- package/dist/server/migrations/meta/0033_snapshot.json +7597 -0
- package/dist/server/migrations/meta/_journal.json +244 -0
- package/dist/server/pglite/pglite.data +0 -0
- package/dist/server/pglite/pglite.wasm +0 -0
- package/package.json +31 -33
- package/.env.example +0 -38
- package/.nvmrc +0 -1
- package/.prettierrc +0 -7
- package/CONTRIBUTING.md +0 -90
- package/LICENSE +0 -661
- package/README.md +0 -360
- package/apps/api/.env.example +0 -30
- package/apps/api/Dockerfile +0 -22
- package/apps/api/package.json +0 -41
- package/apps/api/src/app.ts +0 -69
- package/apps/api/src/config/env.ts +0 -113
- package/apps/api/src/config/index.ts +0 -1
- package/apps/api/src/index.ts +0 -8
- package/apps/api/src/lib/auth-mode.ts +0 -42
- package/apps/api/src/lib/auth.ts +0 -105
- package/apps/api/src/lib/cache.ts +0 -128
- package/apps/api/src/lib/cloud-auth-proxy.ts +0 -310
- package/apps/api/src/lib/cloud-client.ts +0 -103
- package/apps/api/src/lib/compose-parser.ts +0 -138
- package/apps/api/src/lib/controller-helpers.ts +0 -90
- package/apps/api/src/lib/email-templates.ts +0 -94
- package/apps/api/src/lib/encryption.ts +0 -102
- package/apps/api/src/lib/local-user.ts +0 -65
- package/apps/api/src/lib/mail.ts +0 -48
- package/apps/api/src/lib/notifications.ts +0 -195
- package/apps/api/src/lib/openship-cloud.ts +0 -101
- package/apps/api/src/lib/resources.ts +0 -96
- package/apps/api/src/lib/screenshots.ts +0 -189
- package/apps/api/src/lib/ssh-manager.ts +0 -369
- package/apps/api/src/lib/ssl-scheduler.ts +0 -109
- package/apps/api/src/lib/stack-detector.ts +0 -708
- package/apps/api/src/lib/system-debug.ts +0 -10
- package/apps/api/src/middleware/auth.ts +0 -60
- package/apps/api/src/middleware/error-handler.ts +0 -41
- package/apps/api/src/middleware/index.ts +0 -5
- package/apps/api/src/middleware/internal-auth.ts +0 -40
- package/apps/api/src/middleware/local-only.ts +0 -20
- package/apps/api/src/middleware/rate-limiter.ts +0 -35
- package/apps/api/src/modules/analytics/analytics.controller.ts +0 -111
- package/apps/api/src/modules/analytics/analytics.routes.ts +0 -29
- package/apps/api/src/modules/analytics/analytics.schema.ts +0 -37
- package/apps/api/src/modules/analytics/analytics.service.ts +0 -264
- package/apps/api/src/modules/auth/auth.routes.ts +0 -237
- package/apps/api/src/modules/billing/billing.controller.ts +0 -60
- package/apps/api/src/modules/billing/billing.routes.ts +0 -34
- package/apps/api/src/modules/billing/billing.schema.ts +0 -9
- package/apps/api/src/modules/billing/billing.service.ts +0 -33
- package/apps/api/src/modules/cloud/cloud.controller.ts +0 -225
- package/apps/api/src/modules/cloud/cloud.routes.ts +0 -40
- package/apps/api/src/modules/deployments/build.service.ts +0 -791
- package/apps/api/src/modules/deployments/deployment-lifecycle.ts +0 -138
- package/apps/api/src/modules/deployments/deployment.controller.ts +0 -343
- package/apps/api/src/modules/deployments/deployment.routes.ts +0 -37
- package/apps/api/src/modules/deployments/deployment.schema.ts +0 -39
- package/apps/api/src/modules/deployments/deployment.service.ts +0 -190
- package/apps/api/src/modules/deployments/preflight.ts +0 -280
- package/apps/api/src/modules/deployments/prepare.service.ts +0 -252
- package/apps/api/src/modules/deployments/session-manager.ts +0 -283
- package/apps/api/src/modules/deployments/ssl.service.ts +0 -73
- package/apps/api/src/modules/domains/domain.controller.ts +0 -73
- package/apps/api/src/modules/domains/domain.routes.ts +0 -24
- package/apps/api/src/modules/domains/domain.schema.ts +0 -35
- package/apps/api/src/modules/domains/domain.service.ts +0 -385
- package/apps/api/src/modules/github/github.auth.ts +0 -397
- package/apps/api/src/modules/github/github.controller.ts +0 -387
- package/apps/api/src/modules/github/github.local-auth.ts +0 -251
- package/apps/api/src/modules/github/github.routes.ts +0 -50
- package/apps/api/src/modules/github/github.schema.ts +0 -52
- package/apps/api/src/modules/github/github.service.ts +0 -592
- package/apps/api/src/modules/github/github.types.ts +0 -158
- package/apps/api/src/modules/github/github.webhook.ts +0 -186
- package/apps/api/src/modules/github/index.ts +0 -16
- package/apps/api/src/modules/health/health.routes.ts +0 -45
- package/apps/api/src/modules/projects/project.controller.ts +0 -498
- package/apps/api/src/modules/projects/project.routes.ts +0 -67
- package/apps/api/src/modules/projects/project.schema.ts +0 -107
- package/apps/api/src/modules/projects/project.service.ts +0 -514
- package/apps/api/src/modules/settings/settings.controller.ts +0 -55
- package/apps/api/src/modules/settings/settings.routes.ts +0 -25
- package/apps/api/src/modules/settings/settings.service.ts +0 -49
- package/apps/api/src/modules/system/filesystem.controller.ts +0 -66
- package/apps/api/src/modules/system/index.ts +0 -1
- package/apps/api/src/modules/system/server-check.controller.ts +0 -475
- package/apps/api/src/modules/system/setup-session.ts +0 -255
- package/apps/api/src/modules/system/setup.controller.ts +0 -128
- package/apps/api/src/modules/system/system.routes.ts +0 -42
- package/apps/api/src/modules/webhooks/webhook.controller.ts +0 -64
- package/apps/api/src/modules/webhooks/webhook.routes.ts +0 -15
- package/apps/api/src/modules/webhooks/webhook.service.ts +0 -52
- package/apps/api/src/modules/webhooks/webhook.types.ts +0 -35
- package/apps/api/tsconfig.json +0 -14
- package/apps/cli/package.json +0 -26
- package/apps/cli/src/commands/deploy.ts +0 -11
- package/apps/cli/src/commands/init.ts +0 -8
- package/apps/cli/src/commands/login.ts +0 -8
- package/apps/cli/src/commands/logs.ts +0 -9
- package/apps/cli/src/index.ts +0 -21
- package/apps/cli/src/lib/api-client.ts +0 -35
- package/apps/cli/tsconfig.json +0 -13
- package/apps/dashboard/Dockerfile +0 -22
- package/apps/dashboard/components.json +0 -20
- package/apps/dashboard/next-env.d.ts +0 -6
- package/apps/dashboard/next.config.mjs +0 -16
- package/apps/dashboard/package.json +0 -40
- package/apps/dashboard/postcss.config.mjs +0 -5
- package/apps/dashboard/public/android-chrome-192x192.png +0 -0
- package/apps/dashboard/public/android-chrome-512x512.png +0 -0
- package/apps/dashboard/public/apple-touch-icon.png +0 -0
- package/apps/dashboard/public/favicon-16x16.png +0 -0
- package/apps/dashboard/public/favicon-32x32.png +0 -0
- package/apps/dashboard/public/favicon.ico +0 -0
- package/apps/dashboard/public/site.webmanifest +0 -19
- package/apps/dashboard/src/app/(auth)/forgot-password/page.tsx +0 -114
- package/apps/dashboard/src/app/(auth)/layout.tsx +0 -21
- package/apps/dashboard/src/app/(auth)/login/page.tsx +0 -220
- package/apps/dashboard/src/app/(auth)/providers.tsx +0 -34
- package/apps/dashboard/src/app/(auth)/register/page.tsx +0 -176
- package/apps/dashboard/src/app/(auth)/reset-password/page.tsx +0 -172
- package/apps/dashboard/src/app/(auth)/verify-email/page.tsx +0 -190
- package/apps/dashboard/src/app/(dashboard)/(deployment)/build/[id]/page.tsx +0 -162
- package/apps/dashboard/src/app/(dashboard)/(deployment)/deploy/[slug]/components/BuildSummary.tsx +0 -166
- package/apps/dashboard/src/app/(dashboard)/(deployment)/deploy/[slug]/components/DnsConfiguration.tsx +0 -119
- package/apps/dashboard/src/app/(dashboard)/(deployment)/deploy/[slug]/components/DomainSettings.tsx +0 -291
- package/apps/dashboard/src/app/(dashboard)/(deployment)/deploy/[slug]/components/Header.tsx +0 -71
- package/apps/dashboard/src/app/(dashboard)/(deployment)/deploy/[slug]/components/Sidebar.tsx +0 -270
- package/apps/dashboard/src/app/(dashboard)/(deployment)/deploy/[slug]/components/SkeletonLoader.tsx +0 -87
- package/apps/dashboard/src/app/(dashboard)/(deployment)/deploy/[slug]/page.tsx +0 -169
- package/apps/dashboard/src/app/(dashboard)/(deployment)/layout.tsx +0 -7
- package/apps/dashboard/src/app/(dashboard)/billing/page.tsx +0 -3
- package/apps/dashboard/src/app/(dashboard)/deployments/components/CommitDetailsModal.tsx +0 -240
- package/apps/dashboard/src/app/(dashboard)/deployments/components/DeploymentCard.tsx +0 -121
- package/apps/dashboard/src/app/(dashboard)/deployments/components/DeploymentHeader.tsx +0 -89
- package/apps/dashboard/src/app/(dashboard)/deployments/components/DeploymentMenu.tsx +0 -182
- package/apps/dashboard/src/app/(dashboard)/deployments/components/DeploymentsContent.tsx +0 -324
- package/apps/dashboard/src/app/(dashboard)/deployments/components/DeploymentsFilters.tsx +0 -99
- package/apps/dashboard/src/app/(dashboard)/deployments/components/DeploymentsList.tsx +0 -31
- package/apps/dashboard/src/app/(dashboard)/deployments/components/EmptyState.tsx +0 -101
- package/apps/dashboard/src/app/(dashboard)/deployments/components/LoadingSkeleton.tsx +0 -57
- package/apps/dashboard/src/app/(dashboard)/deployments/components/ProjectFilter.tsx +0 -109
- package/apps/dashboard/src/app/(dashboard)/deployments/components/index.ts +0 -9
- package/apps/dashboard/src/app/(dashboard)/deployments/page.tsx +0 -14
- package/apps/dashboard/src/app/(dashboard)/deployments/types.ts +0 -44
- package/apps/dashboard/src/app/(dashboard)/deployments/utils.ts +0 -176
- package/apps/dashboard/src/app/(dashboard)/domains/page.tsx +0 -3
- package/apps/dashboard/src/app/(dashboard)/integrations/page.tsx +0 -321
- package/apps/dashboard/src/app/(dashboard)/layout.tsx +0 -27
- package/apps/dashboard/src/app/(dashboard)/library/components/ConnectPrompt.tsx +0 -187
- package/apps/dashboard/src/app/(dashboard)/library/components/LibrarySidebar.tsx +0 -147
- package/apps/dashboard/src/app/(dashboard)/library/components/LoadingSkeleton.tsx +0 -39
- package/apps/dashboard/src/app/(dashboard)/library/components/LocalProjects.tsx +0 -548
- package/apps/dashboard/src/app/(dashboard)/library/components/RepositoryList.tsx +0 -292
- package/apps/dashboard/src/app/(dashboard)/library/components/TemplateGrid.tsx +0 -36
- package/apps/dashboard/src/app/(dashboard)/library/components/UrlImport.tsx +0 -74
- package/apps/dashboard/src/app/(dashboard)/library/page.tsx +0 -121
- package/apps/dashboard/src/app/(dashboard)/library/types.ts +0 -26
- package/apps/dashboard/src/app/(dashboard)/monitoring/page.tsx +0 -3
- package/apps/dashboard/src/app/(dashboard)/page.tsx +0 -485
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/[[...slug]]/layout.tsx +0 -22
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/[[...slug]]/page.tsx +0 -286
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/AdvancedSettings.tsx +0 -235
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/BuildSettings.tsx +0 -174
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/DeleteConfirmationDialog.tsx +0 -45
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/DeletionModal.tsx +0 -95
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/Deployments.tsx +0 -11
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/DomainSettings.tsx +0 -523
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/EnvironmentSettings.tsx +0 -246
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/GeneralSettings.tsx +0 -93
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/GitInfo.tsx +0 -261
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/GitSettings.tsx +0 -391
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/LogsSettings.tsx +0 -133
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/ProjectNotFound.tsx +0 -95
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/ProjectsBottomNavigation.tsx +0 -62
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/ResourceSettings.tsx +0 -333
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/SettingSection.tsx +0 -66
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/SettingsNavigation.tsx +0 -27
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/SleepModeSettings.tsx +0 -134
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/ProductionUrl.tsx +0 -25
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/ProjectIdentity.tsx +0 -159
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/ProjectInfo.tsx +0 -58
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/SkeletonLoader.tsx +0 -170
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/StatsCards.tsx +0 -33
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/TopPaths.tsx +0 -56
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/TrafficChart.tsx +0 -157
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/index.ts +0 -14
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/logs/LogsActions.tsx +0 -52
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/logs/ServerLogs.tsx +0 -249
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/logs/TerminalLogs.tsx +0 -682
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/logs/logs.css +0 -127
- package/apps/dashboard/src/app/(dashboard)/projects/components/DeploymentCard.tsx +0 -73
- package/apps/dashboard/src/app/(dashboard)/projects/components/ProjectCard.tsx +0 -330
- package/apps/dashboard/src/app/(dashboard)/projects/page.tsx +0 -330
- package/apps/dashboard/src/app/(dashboard)/providers.tsx +0 -23
- package/apps/dashboard/src/app/(dashboard)/servers/[serverId]/_components/components-tab.tsx +0 -329
- package/apps/dashboard/src/app/(dashboard)/servers/[serverId]/_components/overview-tab.tsx +0 -229
- package/apps/dashboard/src/app/(dashboard)/servers/[serverId]/_components/terminal-tab.tsx +0 -38
- package/apps/dashboard/src/app/(dashboard)/servers/[serverId]/page.tsx +0 -437
- package/apps/dashboard/src/app/(dashboard)/servers/new/_components/checking-state.tsx +0 -15
- package/apps/dashboard/src/app/(dashboard)/servers/new/_components/choose-mode.tsx +0 -54
- package/apps/dashboard/src/app/(dashboard)/servers/new/_components/component-row.tsx +0 -65
- package/apps/dashboard/src/app/(dashboard)/servers/new/_components/error-banner.tsx +0 -13
- package/apps/dashboard/src/app/(dashboard)/servers/new/_components/installing-panel.tsx +0 -227
- package/apps/dashboard/src/app/(dashboard)/servers/new/_components/results-panel.tsx +0 -90
- package/apps/dashboard/src/app/(dashboard)/servers/new/_components/setup-header.tsx +0 -56
- package/apps/dashboard/src/app/(dashboard)/servers/new/_components/types.ts +0 -13
- package/apps/dashboard/src/app/(dashboard)/servers/new/page.tsx +0 -666
- package/apps/dashboard/src/app/(dashboard)/servers/page.tsx +0 -283
- package/apps/dashboard/src/app/(dashboard)/settings/_components/BuildPreferences.tsx +0 -110
- package/apps/dashboard/src/app/(dashboard)/settings/_components/CloudConnection.tsx +0 -147
- package/apps/dashboard/src/app/(dashboard)/settings/_components/InstanceInfo.tsx +0 -54
- package/apps/dashboard/src/app/(dashboard)/settings/_components/ServerConnection.tsx +0 -407
- package/apps/dashboard/src/app/(dashboard)/settings/_components/SettingsSection.tsx +0 -32
- package/apps/dashboard/src/app/(dashboard)/settings/page.tsx +0 -67
- package/apps/dashboard/src/app/auth/callback/close/page.tsx +0 -23
- package/apps/dashboard/src/app/auth/callback/install/page.tsx +0 -40
- package/apps/dashboard/src/app/authorize/page.tsx +0 -137
- package/apps/dashboard/src/app/globals.css +0 -57
- package/apps/dashboard/src/app/layout.tsx +0 -55
- package/apps/dashboard/src/components/auth-shell.tsx +0 -66
- package/apps/dashboard/src/components/deployments/types.ts +0 -44
- package/apps/dashboard/src/components/global-deployments/index.ts +0 -17
- package/apps/dashboard/src/components/i18n-provider.tsx +0 -100
- package/apps/dashboard/src/components/import-project/BuildSettings.tsx +0 -376
- package/apps/dashboard/src/components/import-project/BuildSkeleton.tsx +0 -161
- package/apps/dashboard/src/components/import-project/BuildTerminal.tsx +0 -358
- package/apps/dashboard/src/components/import-project/ComposeServices.tsx +0 -455
- package/apps/dashboard/src/components/import-project/DeploymentProcessing.tsx +0 -510
- package/apps/dashboard/src/components/import-project/DockerSettings.tsx +0 -64
- package/apps/dashboard/src/components/import-project/EnvironmentVariables.tsx +0 -481
- package/apps/dashboard/src/components/import-project/Frameworks.tsx +0 -90
- package/apps/dashboard/src/components/import-project/ProjectSettings.tsx +0 -160
- package/apps/dashboard/src/components/import-project/types.ts +0 -82
- package/apps/dashboard/src/components/integrations/GithubPermissionModal.tsx +0 -173
- package/apps/dashboard/src/components/language-switcher.tsx +0 -36
- package/apps/dashboard/src/components/logo.tsx +0 -13
- package/apps/dashboard/src/components/network-error-handler.tsx +0 -27
- package/apps/dashboard/src/components/oauth-buttons.tsx +0 -81
- package/apps/dashboard/src/components/overview/ActivityChart.tsx +0 -247
- package/apps/dashboard/src/components/overview/ApiRequestsCard.tsx +0 -111
- package/apps/dashboard/src/components/overview/CreditsCard.tsx +0 -137
- package/apps/dashboard/src/components/overview/DeploymentsChart.tsx +0 -195
- package/apps/dashboard/src/components/overview/EmptyState.tsx +0 -126
- package/apps/dashboard/src/components/overview/LoadingSkeleton.tsx +0 -92
- package/apps/dashboard/src/components/overview/OverviewHeader.tsx +0 -74
- package/apps/dashboard/src/components/overview/OverviewHeroChart.tsx +0 -344
- package/apps/dashboard/src/components/overview/ProjectsCard.tsx +0 -134
- package/apps/dashboard/src/components/overview/QuickLinks.tsx +0 -119
- package/apps/dashboard/src/components/overview/SandboxesCard.tsx +0 -150
- package/apps/dashboard/src/components/overview/StatsGrid.tsx +0 -166
- package/apps/dashboard/src/components/overview/TokenUsageChart.tsx +0 -206
- package/apps/dashboard/src/components/overview/UsageStats.tsx +0 -79
- package/apps/dashboard/src/components/overview/index.ts +0 -30
- package/apps/dashboard/src/components/overview/types.ts +0 -116
- package/apps/dashboard/src/components/page-header.tsx +0 -25
- package/apps/dashboard/src/components/project-settings/ServerSideSwitch.jsx +0 -60
- package/apps/dashboard/src/components/shared/AlertBox.tsx +0 -39
- package/apps/dashboard/src/components/shared/CTASection.tsx +0 -45
- package/apps/dashboard/src/components/shared/ErrorState.tsx +0 -176
- package/apps/dashboard/src/components/shared/FeatureCard.tsx +0 -20
- package/apps/dashboard/src/components/shared/MDXComponents.tsx +0 -24
- package/apps/dashboard/src/components/shared/MachineSettingsModal.tsx +0 -286
- package/apps/dashboard/src/components/shared/Modal.tsx +0 -39
- package/apps/dashboard/src/components/shared/OTPInput.tsx +0 -122
- package/apps/dashboard/src/components/shared/PageHero.tsx +0 -21
- package/apps/dashboard/src/components/shared/PlatformFeatureCard.tsx +0 -27
- package/apps/dashboard/src/components/shared/StatCard.tsx +0 -14
- package/apps/dashboard/src/components/shared/ValueCard.tsx +0 -20
- package/apps/dashboard/src/components/shared/index.ts +0 -8
- package/apps/dashboard/src/components/sidebar.tsx +0 -282
- package/apps/dashboard/src/components/theme-provider.tsx +0 -96
- package/apps/dashboard/src/components/toast.tsx +0 -106
- package/apps/dashboard/src/components/ui/CustomCursor.tsx +0 -107
- package/apps/dashboard/src/components/ui/CustomSelect.tsx +0 -126
- package/apps/dashboard/src/components/ui/DropdownMenu.tsx +0 -174
- package/apps/dashboard/src/components/ui/FileIcon.jsx +0 -59
- package/apps/dashboard/src/components/ui/IconPickerModal.tsx +0 -273
- package/apps/dashboard/src/components/ui/InfoBanner.jsx +0 -39
- package/apps/dashboard/src/components/ui/Logo.tsx +0 -14
- package/apps/dashboard/src/components/ui/Modal.tsx +0 -117
- package/apps/dashboard/src/components/ui/PageContainer.tsx +0 -12
- package/apps/dashboard/src/components/ui/SectionContainer.jsx +0 -7
- package/apps/dashboard/src/components/ui/SlidingToggle.tsx +0 -128
- package/apps/dashboard/src/components/ui/Toast.tsx +0 -29
- package/apps/dashboard/src/components/ui/button.tsx +0 -58
- package/apps/dashboard/src/components/ui/card.tsx +0 -60
- package/apps/dashboard/src/components/ui/input.tsx +0 -20
- package/apps/dashboard/src/components/ui/label.tsx +0 -19
- package/apps/dashboard/src/components/ui/select.tsx +0 -10
- package/apps/dashboard/src/components/ui/textarea.tsx +0 -9
- package/apps/dashboard/src/constants/lang-colors.ts +0 -25
- package/apps/dashboard/src/constants/mock.ts +0 -38
- package/apps/dashboard/src/context/AuthContext.tsx +0 -91
- package/apps/dashboard/src/context/CloudContext.tsx +0 -275
- package/apps/dashboard/src/context/DeploymentContext.tsx +0 -71
- package/apps/dashboard/src/context/GitHubContext.tsx +0 -288
- package/apps/dashboard/src/context/ModalContext.tsx +0 -300
- package/apps/dashboard/src/context/NetworkContext.tsx +0 -32
- package/apps/dashboard/src/context/ProjectSettingsContext.tsx +0 -727
- package/apps/dashboard/src/context/ToastContext.tsx +0 -129
- package/apps/dashboard/src/context/deployment/index.ts +0 -3
- package/apps/dashboard/src/context/deployment/types.ts +0 -183
- package/apps/dashboard/src/context/deployment/useDeploymentBuild.ts +0 -547
- package/apps/dashboard/src/context/deployment/useDeploymentConfig.ts +0 -176
- package/apps/dashboard/src/hooks/useBuildConnection.ts +0 -334
- package/apps/dashboard/src/hooks/useMonitorStream.ts +0 -146
- package/apps/dashboard/src/hooks/useProjectData.ts +0 -110
- package/apps/dashboard/src/hooks/useSSEConnection.ts +0 -465
- package/apps/dashboard/src/hooks/useSSEStream.ts +0 -309
- package/apps/dashboard/src/hooks/useSessions.ts +0 -104
- package/apps/dashboard/src/hooks/useSetupStream.ts +0 -223
- package/apps/dashboard/src/i18n/dictionaries/ar.json +0 -218
- package/apps/dashboard/src/i18n/dictionaries/en.json +0 -218
- package/apps/dashboard/src/i18n/index.ts +0 -16
- package/apps/dashboard/src/lib/api/ai.ts +0 -22
- package/apps/dashboard/src/lib/api/auth.ts +0 -13
- package/apps/dashboard/src/lib/api/client.ts +0 -199
- package/apps/dashboard/src/lib/api/cloud.ts +0 -15
- package/apps/dashboard/src/lib/api/deploy.ts +0 -58
- package/apps/dashboard/src/lib/api/domains.ts +0 -13
- package/apps/dashboard/src/lib/api/endpoints.ts +0 -129
- package/apps/dashboard/src/lib/api/github.ts +0 -31
- package/apps/dashboard/src/lib/api/icons.ts +0 -12
- package/apps/dashboard/src/lib/api/index.ts +0 -41
- package/apps/dashboard/src/lib/api/projects.ts +0 -153
- package/apps/dashboard/src/lib/api/sandbox.ts +0 -14
- package/apps/dashboard/src/lib/api/settings.ts +0 -21
- package/apps/dashboard/src/lib/api/system.ts +0 -159
- package/apps/dashboard/src/lib/auth-client.ts +0 -54
- package/apps/dashboard/src/lib/country.ts +0 -25
- package/apps/dashboard/src/lib/server/api.ts +0 -140
- package/apps/dashboard/src/lib/server/session.ts +0 -103
- package/apps/dashboard/src/lib/sseClient.ts +0 -241
- package/apps/dashboard/src/lib/sseMessageProcessors.ts +0 -323
- package/apps/dashboard/src/lib/utils.ts +0 -6
- package/apps/dashboard/src/proxy.ts +0 -46
- package/apps/dashboard/src/styles/Toast.module.css +0 -92
- package/apps/dashboard/src/styles/fonts.css +0 -93
- package/apps/dashboard/src/styles/theme.css +0 -336
- package/apps/dashboard/src/types/research.ts +0 -42
- package/apps/dashboard/src/utils/SSEParser.js +0 -150
- package/apps/dashboard/src/utils/authWindow.ts +0 -143
- package/apps/dashboard/src/utils/codeTheme.ts +0 -127
- package/apps/dashboard/src/utils/colors.json +0 -2810
- package/apps/dashboard/src/utils/date.ts +0 -121
- package/apps/dashboard/src/utils/deployment.ts +0 -128
- package/apps/dashboard/src/utils/deploymentPhaseDetector.ts +0 -232
- package/apps/dashboard/src/utils/extToLang.js +0 -103
- package/apps/dashboard/src/utils/github.ts +0 -62
- package/apps/dashboard/src/utils/icons.js +0 -46
- package/apps/dashboard/src/utils/repoSlug.ts +0 -110
- package/apps/dashboard/src/utils/research-api.ts +0 -163
- package/apps/dashboard/src/utils/suggestions.ts +0 -84
- package/apps/dashboard/src/utils/theme.js +0 -1
- package/apps/dashboard/src/utils/ui-helpers.tsx +0 -30
- package/apps/dashboard/src/utils/upload.js +0 -12
- package/apps/dashboard/tsconfig.json +0 -33
- package/apps/desktop/forge.config.json +0 -36
- package/apps/desktop/package.json +0 -26
- package/apps/desktop/scripts/dev.mjs +0 -58
- package/apps/desktop/src/main/index.ts +0 -675
- package/apps/desktop/src/main/types/desktop.d.ts +0 -33
- package/apps/desktop/src/preload/index.ts +0 -88
- package/apps/desktop/src/renderer/index.html +0 -462
- package/apps/desktop/src/renderer/onboarding.js +0 -511
- package/apps/desktop/src/renderer/styles.css +0 -1139
- package/apps/desktop/tsconfig.json +0 -17
- package/apps/web/.source/browser.ts +0 -13
- package/apps/web/.source/dynamic.ts +0 -8
- package/apps/web/.source/server.ts +0 -22
- package/apps/web/.source/source.config.mjs +0 -20
- package/apps/web/Dockerfile +0 -22
- package/apps/web/content/blog/how-ai-builds-work.mdx +0 -55
- package/apps/web/content/blog/introducing-openship.mdx +0 -46
- package/apps/web/content/blog/self-hosting-cost-breakdown.mdx +0 -59
- package/apps/web/content/docs/_meta.json +0 -14
- package/apps/web/content/docs/api.mdx +0 -98
- package/apps/web/content/docs/cli.mdx +0 -80
- package/apps/web/content/docs/first-deployment.mdx +0 -56
- package/apps/web/content/docs/index.mdx +0 -27
- package/apps/web/content/docs/installation.mdx +0 -65
- package/apps/web/content/docs/quickstart.mdx +0 -45
- package/apps/web/next-env.d.ts +0 -6
- package/apps/web/next.config.mjs +0 -20
- package/apps/web/package.json +0 -33
- package/apps/web/postcss.config.mjs +0 -5
- package/apps/web/public/android-chrome-192x192.png +0 -0
- package/apps/web/public/android-chrome-512x512.png +0 -0
- package/apps/web/public/apple-touch-icon.png +0 -0
- package/apps/web/public/favicon-16x16.png +0 -0
- package/apps/web/public/favicon-32x32.png +0 -0
- package/apps/web/public/favicon.ico +0 -0
- package/apps/web/public/site.webmanifest +0 -1
- package/apps/web/source.config.ts +0 -17
- package/apps/web/src/app/(marketing)/layout.tsx +0 -9
- package/apps/web/src/app/(marketing)/page.tsx +0 -2
- package/apps/web/src/app/(marketing)/pricing/page.tsx +0 -10
- package/apps/web/src/app/blog/[...slug]/page.tsx +0 -247
- package/apps/web/src/app/blog/blog.css +0 -575
- package/apps/web/src/app/blog/layout.tsx +0 -50
- package/apps/web/src/app/blog/page.tsx +0 -235
- package/apps/web/src/app/docs/[[...slug]]/page.tsx +0 -67
- package/apps/web/src/app/docs/layout.tsx +0 -62
- package/apps/web/src/app/docs/toc-theme.css +0 -71
- package/apps/web/src/app/download/page.tsx +0 -396
- package/apps/web/src/app/globals.css +0 -20
- package/apps/web/src/app/layout.tsx +0 -70
- package/apps/web/src/app/page.tsx +0 -51
- package/apps/web/src/app/robots.ts +0 -15
- package/apps/web/src/app/sitemap.ts +0 -35
- package/apps/web/src/components/blog/share-sidebar.tsx +0 -81
- package/apps/web/src/components/blog/writer-sidebar.tsx +0 -81
- package/apps/web/src/components/landing/ai-native.tsx +0 -169
- package/apps/web/src/components/landing/backups.tsx +0 -139
- package/apps/web/src/components/landing/cdn.tsx +0 -109
- package/apps/web/src/components/landing/coming-soon.tsx +0 -180
- package/apps/web/src/components/landing/dark-section.tsx +0 -166
- package/apps/web/src/components/landing/dashboard.tsx +0 -407
- package/apps/web/src/components/landing/developer-experience.tsx +0 -224
- package/apps/web/src/components/landing/dns-domains.tsx +0 -146
- package/apps/web/src/components/landing/download-button.tsx +0 -151
- package/apps/web/src/components/landing/features/ai-visual.tsx +0 -48
- package/apps/web/src/components/landing/features/cloud-visual.tsx +0 -44
- package/apps/web/src/components/landing/features/git-visual.tsx +0 -61
- package/apps/web/src/components/landing/features/index.tsx +0 -642
- package/apps/web/src/components/landing/features/infra-visual.tsx +0 -69
- package/apps/web/src/components/landing/features/rollback-visual.tsx +0 -42
- package/apps/web/src/components/landing/features/ssl-visual.tsx +0 -41
- package/apps/web/src/components/landing/features/stacks-visual.tsx +0 -54
- package/apps/web/src/components/landing/final-cta.tsx +0 -116
- package/apps/web/src/components/landing/footer.tsx +0 -145
- package/apps/web/src/components/landing/hero.tsx +0 -110
- package/apps/web/src/components/landing/how-it-works.tsx +0 -210
- package/apps/web/src/components/landing/index.ts +0 -21
- package/apps/web/src/components/landing/mail-server.tsx +0 -122
- package/apps/web/src/components/landing/navbar.tsx +0 -199
- package/apps/web/src/components/landing/no-lockin.tsx +0 -185
- package/apps/web/src/components/landing/open-source-cta.tsx +0 -151
- package/apps/web/src/components/landing/portability.tsx +0 -190
- package/apps/web/src/components/landing/pricing.tsx +0 -263
- package/apps/web/src/components/landing/scaling.tsx +0 -209
- package/apps/web/src/components/landing/why-openship.tsx +0 -291
- package/apps/web/src/hooks/use-gsap-scroll.ts +0 -158
- package/apps/web/src/hooks/use-platform.ts +0 -86
- package/apps/web/src/lib/source.ts +0 -12
- package/apps/web/src/styles/fonts.css +0 -84
- package/apps/web/src/styles/landing.css +0 -951
- package/apps/web/src/styles/theme.css +0 -227
- package/apps/web/tsconfig.json +0 -16
- package/bun.lock +0 -3260
- package/docker-compose.yml +0 -90
- package/docs/screenshots/.gitkeep +0 -0
- package/docs/screenshots/screen.png +0 -0
- package/openship.code-workspace +0 -7
- package/packages/adapters/docs/ARCHITECTURE.md +0 -160
- package/packages/adapters/docs/BUILD-PIPELINE.md +0 -171
- package/packages/adapters/docs/CLOUD.md +0 -239
- package/packages/adapters/docs/EXECUTOR.md +0 -174
- package/packages/adapters/docs/LOG-STREAMING.md +0 -175
- package/packages/adapters/docs/SYSTEM.md +0 -191
- package/packages/adapters/package.json +0 -32
- package/packages/adapters/src/index.ts +0 -144
- package/packages/adapters/src/infra/cloud.ts +0 -42
- package/packages/adapters/src/infra/index.ts +0 -9
- package/packages/adapters/src/infra/noop.ts +0 -27
- package/packages/adapters/src/infra/traefik.ts +0 -297
- package/packages/adapters/src/infra/types.ts +0 -36
- package/packages/adapters/src/platform.ts +0 -255
- package/packages/adapters/src/runtime/bare.ts +0 -567
- package/packages/adapters/src/runtime/build-pipeline.ts +0 -237
- package/packages/adapters/src/runtime/cloud.ts +0 -791
- package/packages/adapters/src/runtime/deploy-pipeline.ts +0 -146
- package/packages/adapters/src/runtime/docker.ts +0 -443
- package/packages/adapters/src/runtime/index.ts +0 -69
- package/packages/adapters/src/runtime/local-build.ts +0 -112
- package/packages/adapters/src/runtime/transfer.ts +0 -82
- package/packages/adapters/src/runtime/types.ts +0 -138
- package/packages/adapters/src/system/catalog.ts +0 -188
- package/packages/adapters/src/system/checks.ts +0 -228
- package/packages/adapters/src/system/components.ts +0 -45
- package/packages/adapters/src/system/debug.ts +0 -18
- package/packages/adapters/src/system/environment.ts +0 -168
- package/packages/adapters/src/system/errors.ts +0 -34
- package/packages/adapters/src/system/executor.ts +0 -600
- package/packages/adapters/src/system/index.ts +0 -58
- package/packages/adapters/src/system/installer.ts +0 -310
- package/packages/adapters/src/system/setup.ts +0 -442
- package/packages/adapters/src/system/state.ts +0 -96
- package/packages/adapters/src/system/types.ts +0 -116
- package/packages/adapters/src/toolchain/catalog.ts +0 -439
- package/packages/adapters/src/toolchain/checks.ts +0 -181
- package/packages/adapters/src/toolchain/index.ts +0 -38
- package/packages/adapters/src/toolchain/installer.ts +0 -189
- package/packages/adapters/src/toolchain/types.ts +0 -84
- package/packages/adapters/src/types.ts +0 -277
- package/packages/adapters/tsconfig.json +0 -11
- package/packages/core/package.json +0 -27
- package/packages/core/src/constants.ts +0 -71
- package/packages/core/src/errors.ts +0 -49
- package/packages/core/src/index.ts +0 -6
- package/packages/core/src/stacks.ts +0 -778
- package/packages/core/src/system.ts +0 -111
- package/packages/core/src/types.ts +0 -68
- package/packages/core/src/utils.ts +0 -43
- package/packages/core/tsconfig.json +0 -11
- package/packages/db/drizzle/0000_init.sql +0 -231
- package/packages/db/drizzle/0001_add_server_name.sql +0 -1
- package/packages/db/drizzle/meta/_journal.json +0 -20
- package/packages/db/drizzle.config.ts +0 -10
- package/packages/db/package.json +0 -44
- package/packages/db/src/client.ts +0 -119
- package/packages/db/src/index.ts +0 -60
- package/packages/db/src/repos/account.repo.ts +0 -92
- package/packages/db/src/repos/deployment.repo.ts +0 -168
- package/packages/db/src/repos/domain.repo.ts +0 -102
- package/packages/db/src/repos/git-installation.repo.ts +0 -95
- package/packages/db/src/repos/index.ts +0 -43
- package/packages/db/src/repos/instance-settings.repo.ts +0 -43
- package/packages/db/src/repos/project.repo.ts +0 -159
- package/packages/db/src/repos/session.repo.ts +0 -82
- package/packages/db/src/repos/settings.repo.ts +0 -51
- package/packages/db/src/repos/user.repo.ts +0 -94
- package/packages/db/src/schema/auth.ts +0 -56
- package/packages/db/src/schema/deployment.ts +0 -87
- package/packages/db/src/schema/domain.ts +0 -46
- package/packages/db/src/schema/github.ts +0 -24
- package/packages/db/src/schema/index.ts +0 -6
- package/packages/db/src/schema/project.ts +0 -117
- package/packages/db/src/schema/settings.ts +0 -103
- package/packages/db/tsconfig.json +0 -11
- package/packages/ui/package.json +0 -38
- package/packages/ui/src/components/badge.tsx +0 -29
- package/packages/ui/src/components/button.tsx +0 -44
- package/packages/ui/src/components/card.tsx +0 -26
- package/packages/ui/src/components/status-dot.tsx +0 -25
- package/packages/ui/src/globals.css +0 -18
- package/packages/ui/src/index.tsx +0 -8
- package/packages/ui/src/lib/cn.ts +0 -7
- package/packages/ui/tsconfig.json +0 -14
- package/pnpm-workspace.yaml +0 -3
- package/tsconfig.base.json +0 -18
- package/turbo.json +0 -36
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { env } from "../config/env";
|
|
2
|
-
|
|
3
|
-
export function systemDebug(scope: string, message: string): void {
|
|
4
|
-
if (!env.SYSTEM_DEBUG_LOGS) return;
|
|
5
|
-
console.log(`[system-debug][${scope}] ${new Date().toISOString()} ${message}`);
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export function formatDuration(startMs: number): string {
|
|
9
|
-
return `${Date.now() - startMs}ms`;
|
|
10
|
-
}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import type { Context, Next } from "hono";
|
|
2
|
-
import { auth } from "../lib/auth";
|
|
3
|
-
import { env } from "../config/env";
|
|
4
|
-
import { ensureLocalUser } from "../lib/local-user";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Session authentication middleware.
|
|
8
|
-
*
|
|
9
|
-
* - Desktop: try real Better Auth session first (cloud-authenticated users),
|
|
10
|
-
* fall back to zero-auth local admin if no session exists.
|
|
11
|
-
* - Self-hosted: validates Better Auth session (email/password registration).
|
|
12
|
-
* - SaaS (CLOUD_MODE): validates Better Auth session (standard flow).
|
|
13
|
-
*
|
|
14
|
-
* Supports both cookie-based sessions (dashboard) and Bearer tokens (CLI/API).
|
|
15
|
-
*
|
|
16
|
-
* Usage:
|
|
17
|
-
* app.get("/api/projects", authMiddleware, handler);
|
|
18
|
-
*/
|
|
19
|
-
export async function authMiddleware(c: Context, next: Next) {
|
|
20
|
-
/* Desktop mode: try real session first, fall back to zero-auth */
|
|
21
|
-
if (env.DEPLOY_MODE === "desktop") {
|
|
22
|
-
try {
|
|
23
|
-
const session = await auth.api.getSession({
|
|
24
|
-
headers: c.req.raw.headers,
|
|
25
|
-
});
|
|
26
|
-
if (session) {
|
|
27
|
-
c.set("user", session.user);
|
|
28
|
-
c.set("session", session.session);
|
|
29
|
-
return next();
|
|
30
|
-
}
|
|
31
|
-
} catch {
|
|
32
|
-
// No valid session — fall through
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// Zero-auth fallback — only when authMode is "none" (self-hosted desktop).
|
|
36
|
-
// Cloud-auth users must re-authenticate via Openship Cloud.
|
|
37
|
-
const { getAuthMode } = await import("../lib/auth-mode");
|
|
38
|
-
const authMode = await getAuthMode();
|
|
39
|
-
if (authMode !== "none") {
|
|
40
|
-
return c.json({ error: "Unauthorized" }, 401);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const user = await ensureLocalUser();
|
|
44
|
-
c.set("user", user);
|
|
45
|
-
c.set("session", { id: "desktop", userId: user.id });
|
|
46
|
-
return next();
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const session = await auth.api.getSession({
|
|
50
|
-
headers: c.req.raw.headers,
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
if (!session) {
|
|
54
|
-
return c.json({ error: "Unauthorized" }, 401);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
c.set("user", session.user);
|
|
58
|
-
c.set("session", session.session);
|
|
59
|
-
await next();
|
|
60
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import type { Context, Next } from "hono";
|
|
2
|
-
import { ZodError } from "zod";
|
|
3
|
-
import { AppError } from "@repo/core";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Global error handler middleware.
|
|
7
|
-
* Catches errors thrown anywhere in the request chain and returns
|
|
8
|
-
* a consistent JSON response.
|
|
9
|
-
*
|
|
10
|
-
* Order of precedence:
|
|
11
|
-
* 1. ZodError → 400 with field-level details
|
|
12
|
-
* 2. AppError subclass → statusCode + message + code
|
|
13
|
-
* 3. Unknown → 500
|
|
14
|
-
*/
|
|
15
|
-
export async function errorHandler(c: Context, next: Next) {
|
|
16
|
-
try {
|
|
17
|
-
await next();
|
|
18
|
-
} catch (err: unknown) {
|
|
19
|
-
if (err instanceof ZodError) {
|
|
20
|
-
return c.json(
|
|
21
|
-
{
|
|
22
|
-
error: "Validation error",
|
|
23
|
-
code: "VALIDATION_ERROR",
|
|
24
|
-
details: err.flatten().fieldErrors,
|
|
25
|
-
},
|
|
26
|
-
400,
|
|
27
|
-
);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
if (err instanceof AppError) {
|
|
31
|
-
const { message, code, statusCode } = err;
|
|
32
|
-
return c.json(
|
|
33
|
-
{ error: message, code },
|
|
34
|
-
statusCode as 400 | 401 | 403 | 404 | 409 | 500,
|
|
35
|
-
);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
console.error("[UNHANDLED ERROR]", err);
|
|
39
|
-
return c.json({ error: "Internal server error" }, 500);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { timingSafeEqual } from "node:crypto";
|
|
2
|
-
import type { Context, Next } from "hono";
|
|
3
|
-
import { env } from "../config";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Middleware that validates the internal token for Electron → API calls.
|
|
7
|
-
*
|
|
8
|
-
* The desktop app generates a shared secret on first run and passes it
|
|
9
|
-
* to the API via the INTERNAL_TOKEN env var. This allows Electron to push
|
|
10
|
-
* system settings (SSH, tunnel, build mode) directly without user auth.
|
|
11
|
-
*
|
|
12
|
-
* Uses timing-safe comparison to prevent side-channel leakage.
|
|
13
|
-
*
|
|
14
|
-
* Expects: `X-Internal-Token: <token>` header.
|
|
15
|
-
*/
|
|
16
|
-
export async function internalAuth(c: Context, next: Next) {
|
|
17
|
-
// If no internal token is configured, allow the request.
|
|
18
|
-
// localOnly middleware (applied before this) already blocks cloud mode.
|
|
19
|
-
// Self-hosted users control their own machine — localhost trust is standard.
|
|
20
|
-
if (!env.INTERNAL_TOKEN) {
|
|
21
|
-
await next();
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const token = c.req.header("X-Internal-Token");
|
|
26
|
-
|
|
27
|
-
if (!token) {
|
|
28
|
-
return c.json({ error: "Unauthorized" }, 401);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// Timing-safe comparison — prevents response-time side-channel attacks
|
|
32
|
-
const expected = Buffer.from(env.INTERNAL_TOKEN, "utf-8");
|
|
33
|
-
const received = Buffer.from(token, "utf-8");
|
|
34
|
-
|
|
35
|
-
if (expected.length !== received.length || !timingSafeEqual(expected, received)) {
|
|
36
|
-
return c.json({ error: "Unauthorized" }, 401);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
await next();
|
|
40
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { Context, Next } from "hono";
|
|
2
|
-
import { env } from "../config";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Middleware that restricts a route to self-hosted instances only.
|
|
6
|
-
*
|
|
7
|
-
* Returns 404 when CLOUD_MODE=true (i.e. the managed openship.com SaaS).
|
|
8
|
-
* Self-hosted deployments (docker, bare, desktop) — even those using
|
|
9
|
-
* GitHub App auth or OAuth — retain full local filesystem access.
|
|
10
|
-
*
|
|
11
|
-
* This prevents RCE via local path endpoints on the public SaaS site
|
|
12
|
-
* while keeping the feature available for all self-hosted setups.
|
|
13
|
-
*/
|
|
14
|
-
export async function localOnly(c: Context, next: Next) {
|
|
15
|
-
if (env.CLOUD_MODE) {
|
|
16
|
-
return c.notFound();
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
await next();
|
|
20
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import type { Context, Next } from "hono";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Rate-limiting middleware.
|
|
5
|
-
* Uses a simple in-memory store (swap for Redis in production).
|
|
6
|
-
*/
|
|
7
|
-
const requestCounts = new Map<string, { count: number; resetAt: number }>();
|
|
8
|
-
|
|
9
|
-
export async function rateLimiter(c: Context, next: Next) {
|
|
10
|
-
const path = c.req.path;
|
|
11
|
-
|
|
12
|
-
// Skip rate limiting for get-session - it's a safe read-only endpoint
|
|
13
|
-
// that gets called frequently on page navigations
|
|
14
|
-
if (path === "/api/auth/get-session") {
|
|
15
|
-
await next();
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const ip = c.req.header("x-forwarded-for") || "unknown";
|
|
20
|
-
const now = Date.now();
|
|
21
|
-
const window = 60_000; // 1 minute
|
|
22
|
-
const maxRequests = 100;
|
|
23
|
-
|
|
24
|
-
const entry = requestCounts.get(ip);
|
|
25
|
-
|
|
26
|
-
if (!entry || now > entry.resetAt) {
|
|
27
|
-
requestCounts.set(ip, { count: 1, resetAt: now + window });
|
|
28
|
-
} else if (entry.count >= maxRequests) {
|
|
29
|
-
return c.json({ error: "Too many requests" }, 429);
|
|
30
|
-
} else {
|
|
31
|
-
entry.count++;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
await next();
|
|
35
|
-
}
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Analytics controller — handlers for analytics + usage + stats endpoints.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import type { Context } from "hono";
|
|
6
|
-
import { streamSSE } from "hono/streaming";
|
|
7
|
-
import { getUserId, platform } from "../../lib/controller-helpers";
|
|
8
|
-
import { repos } from "@repo/db";
|
|
9
|
-
import * as analyticsService from "./analytics.service";
|
|
10
|
-
import type { TAnalyticsQuery, TUsageQuery, TUsageStreamQuery } from "./analytics.schema";
|
|
11
|
-
|
|
12
|
-
// ─── Request analytics ───────────────────────────────────────────────────────
|
|
13
|
-
|
|
14
|
-
/** GET /analytics — cumulative summary */
|
|
15
|
-
export async function summary(c: Context) {
|
|
16
|
-
const userId = getUserId(c);
|
|
17
|
-
const { projectId } = c.req.query() as unknown as TAnalyticsQuery;
|
|
18
|
-
const data = await analyticsService.getAnalyticsSummary(projectId, userId);
|
|
19
|
-
return c.json({ data });
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/** GET /analytics/periods — time-series periods */
|
|
23
|
-
export async function periods(c: Context) {
|
|
24
|
-
const userId = getUserId(c);
|
|
25
|
-
const { projectId, from, to } = c.req.query() as unknown as TAnalyticsQuery;
|
|
26
|
-
const data = await analyticsService.getAnalyticsPeriods(projectId, userId, from, to);
|
|
27
|
-
return c.json({ data });
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// ─── Deployment stats ────────────────────────────────────────────────────────
|
|
31
|
-
|
|
32
|
-
/** GET /analytics/deployments — deployment success/fail/avg build stats */
|
|
33
|
-
export async function deploymentStats(c: Context) {
|
|
34
|
-
const userId = getUserId(c);
|
|
35
|
-
const { projectId } = c.req.query() as unknown as TAnalyticsQuery;
|
|
36
|
-
const data = await analyticsService.getDeploymentStats(projectId, userId);
|
|
37
|
-
return c.json({ data });
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// ─── Resource usage ──────────────────────────────────────────────────────────
|
|
41
|
-
|
|
42
|
-
/** GET /analytics/usage — current container resource usage */
|
|
43
|
-
export async function usage(c: Context) {
|
|
44
|
-
const userId = getUserId(c);
|
|
45
|
-
const { projectId } = c.req.query() as unknown as TUsageQuery;
|
|
46
|
-
const data = await analyticsService.getContainerUsage(projectId, userId);
|
|
47
|
-
return c.json({ data });
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/** GET /analytics/container — container info (status, IP, uptime) */
|
|
51
|
-
export async function containerInfo(c: Context) {
|
|
52
|
-
const userId = getUserId(c);
|
|
53
|
-
const { projectId } = c.req.query() as unknown as TUsageQuery;
|
|
54
|
-
const data = await analyticsService.getContainerInfo(projectId, userId);
|
|
55
|
-
return c.json({ data });
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/** GET /analytics/usage/stream — SSE stream of real-time resource usage */
|
|
59
|
-
export async function usageStream(c: Context) {
|
|
60
|
-
const userId = getUserId(c);
|
|
61
|
-
const { projectId } = c.req.query() as unknown as TUsageStreamQuery;
|
|
62
|
-
|
|
63
|
-
// Verify project access
|
|
64
|
-
const project = await repos.project.findById(projectId);
|
|
65
|
-
if (!project || project.userId !== userId) {
|
|
66
|
-
return c.json({ error: "Project not found" }, 404);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
if (!project.activeDeploymentId) {
|
|
70
|
-
return c.json({ error: "No active deployment" }, 404);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
const dep = await repos.deployment.findById(project.activeDeploymentId);
|
|
74
|
-
if (!dep?.containerId) {
|
|
75
|
-
return c.json({ error: "No active container" }, 404);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
const { runtime } = platform();
|
|
79
|
-
|
|
80
|
-
return streamSSE(c, async (sseStream) => {
|
|
81
|
-
const intervalMs = 5_000; // 5 seconds
|
|
82
|
-
let running = true;
|
|
83
|
-
|
|
84
|
-
sseStream.onAbort(() => { running = false; });
|
|
85
|
-
|
|
86
|
-
while (running) {
|
|
87
|
-
try {
|
|
88
|
-
const stats = await runtime.getUsage(dep.containerId!);
|
|
89
|
-
await sseStream.writeSSE({
|
|
90
|
-
event: "usage",
|
|
91
|
-
data: JSON.stringify({ timestamp: new Date().toISOString(), ...stats }),
|
|
92
|
-
});
|
|
93
|
-
} catch {
|
|
94
|
-
await sseStream.writeSSE({
|
|
95
|
-
event: "error",
|
|
96
|
-
data: JSON.stringify({ error: "Failed to fetch usage" }),
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
await new Promise((r) => setTimeout(r, intervalMs));
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// ─── Dashboard ───────────────────────────────────────────────────────────────
|
|
105
|
-
|
|
106
|
-
/** GET /analytics/dashboard — overview stats for user's dashboard home */
|
|
107
|
-
export async function dashboard(c: Context) {
|
|
108
|
-
const userId = getUserId(c);
|
|
109
|
-
const data = await analyticsService.getDashboardStats(userId);
|
|
110
|
-
return c.json({ data });
|
|
111
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Analytics routes — mounted at /api/analytics in app.ts.
|
|
3
|
-
*
|
|
4
|
-
* All routes require authentication.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { Hono } from "hono";
|
|
8
|
-
import { authMiddleware } from "../../middleware";
|
|
9
|
-
import * as ctrl from "./analytics.controller";
|
|
10
|
-
|
|
11
|
-
export const analyticsRoutes = new Hono();
|
|
12
|
-
|
|
13
|
-
/* All analytics routes require authentication */
|
|
14
|
-
analyticsRoutes.use("*", authMiddleware);
|
|
15
|
-
|
|
16
|
-
/* ─── Request analytics ────────────────────────────────────────────────── */
|
|
17
|
-
analyticsRoutes.get("/", ctrl.summary);
|
|
18
|
-
analyticsRoutes.get("/periods", ctrl.periods);
|
|
19
|
-
|
|
20
|
-
/* ─── Deployment stats ─────────────────────────────────────────────────── */
|
|
21
|
-
analyticsRoutes.get("/deployments", ctrl.deploymentStats);
|
|
22
|
-
|
|
23
|
-
/* ─── Resource usage ───────────────────────────────────────────────────── */
|
|
24
|
-
analyticsRoutes.get("/usage", ctrl.usage);
|
|
25
|
-
analyticsRoutes.get("/usage/stream", ctrl.usageStream);
|
|
26
|
-
analyticsRoutes.get("/container", ctrl.containerInfo);
|
|
27
|
-
|
|
28
|
-
/* ─── Dashboard ────────────────────────────────────────────────────────── */
|
|
29
|
-
analyticsRoutes.get("/dashboard", ctrl.dashboard);
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Analytics schemas — TypeBox validation for analytics endpoints.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { Type, type Static } from "@sinclair/typebox";
|
|
6
|
-
|
|
7
|
-
// ─── Query params ────────────────────────────────────────────────────────────
|
|
8
|
-
|
|
9
|
-
export const AnalyticsQuery = Type.Object({
|
|
10
|
-
projectId: Type.String({ minLength: 1 }),
|
|
11
|
-
/** ISO date string — start of range */
|
|
12
|
-
from: Type.Optional(Type.String()),
|
|
13
|
-
/** ISO date string — end of range */
|
|
14
|
-
to: Type.Optional(Type.String()),
|
|
15
|
-
/** Include live (real-time) data from the running container */
|
|
16
|
-
live: Type.Optional(Type.Boolean({ default: false })),
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
export const UsageQuery = Type.Object({
|
|
20
|
-
projectId: Type.String({ minLength: 1 }),
|
|
21
|
-
/** ISO date string — start of range */
|
|
22
|
-
from: Type.Optional(Type.String()),
|
|
23
|
-
/** ISO date string — end of range */
|
|
24
|
-
to: Type.Optional(Type.String()),
|
|
25
|
-
/** Bucket size in minutes for time-series data (min 10) */
|
|
26
|
-
bucketMinutes: Type.Optional(Type.Number({ minimum: 10, default: 60 })),
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
export const UsageStreamQuery = Type.Object({
|
|
30
|
-
projectId: Type.String({ minLength: 1 }),
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
// ─── Inferred types ──────────────────────────────────────────────────────────
|
|
34
|
-
|
|
35
|
-
export type TAnalyticsQuery = Static<typeof AnalyticsQuery>;
|
|
36
|
-
export type TUsageQuery = Static<typeof UsageQuery>;
|
|
37
|
-
export type TUsageStreamQuery = Static<typeof UsageStreamQuery>;
|
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Analytics service — request analytics, resource usage, and deployment stats.
|
|
3
|
-
*
|
|
4
|
-
* Data sources:
|
|
5
|
-
* - DB: Historical aggregated periods, cumulative counters
|
|
6
|
-
* - Redis: Live request logs + counters (populated by the reverse-proxy)
|
|
7
|
-
* - Adapter: Real-time container resource usage (CPU, memory, network)
|
|
8
|
-
*
|
|
9
|
-
* The runtime integration is behind the Platform interface, so this
|
|
10
|
-
* service works identically with Docker (self-hosted) and Oblien (cloud).
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import { repos } from "@repo/db";
|
|
14
|
-
import { NotFoundError } from "@repo/core";
|
|
15
|
-
import { platform } from "../../lib/controller-helpers";
|
|
16
|
-
import type { ResourceUsage } from "@repo/adapters";
|
|
17
|
-
|
|
18
|
-
// ─── Types ───────────────────────────────────────────────────────────────────
|
|
19
|
-
|
|
20
|
-
export interface AnalyticsSummary {
|
|
21
|
-
/** Total requests (all time) */
|
|
22
|
-
totalRequests: number;
|
|
23
|
-
/** Total unique visitors */
|
|
24
|
-
uniqueVisitors: number;
|
|
25
|
-
/** Bandwidth in bytes */
|
|
26
|
-
bandwidthIn: number;
|
|
27
|
-
bandwidthOut: number;
|
|
28
|
-
/** Average response time in ms */
|
|
29
|
-
avgResponseTimeMs: number;
|
|
30
|
-
/** Last flush timestamp */
|
|
31
|
-
lastUpdated: string | null;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export interface AnalyticsPeriod {
|
|
35
|
-
/** Period start */
|
|
36
|
-
from: string;
|
|
37
|
-
/** Period end */
|
|
38
|
-
to: string;
|
|
39
|
-
requests: number;
|
|
40
|
-
uniqueVisitors: number;
|
|
41
|
-
bandwidthIn: number;
|
|
42
|
-
bandwidthOut: number;
|
|
43
|
-
avgResponseTimeMs: number;
|
|
44
|
-
topPaths: { path: string; count: number }[];
|
|
45
|
-
trafficByHour: Record<string, number>;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export interface DeploymentStats {
|
|
49
|
-
totalDeployments: number;
|
|
50
|
-
successfulDeployments: number;
|
|
51
|
-
failedDeployments: number;
|
|
52
|
-
avgBuildDurationMs: number;
|
|
53
|
-
/** Deployments per day for the last N days */
|
|
54
|
-
dailyCounts: { date: string; total: number; success: number; failed: number }[];
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
export interface ContainerUsageSnapshot {
|
|
58
|
-
timestamp: string;
|
|
59
|
-
cpuPercent: number;
|
|
60
|
-
memoryMb: number;
|
|
61
|
-
diskMb: number;
|
|
62
|
-
networkRxBytes: number;
|
|
63
|
-
networkTxBytes: number;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// ─── Analytics summary ───────────────────────────────────────────────────────
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Get cumulative analytics summary for a project.
|
|
70
|
-
* Returns totals from DB + optional live increment from Redis.
|
|
71
|
-
*/
|
|
72
|
-
export async function getAnalyticsSummary(
|
|
73
|
-
projectId: string,
|
|
74
|
-
userId: string,
|
|
75
|
-
): Promise<AnalyticsSummary> {
|
|
76
|
-
const project = await repos.project.findById(projectId);
|
|
77
|
-
if (!project || project.userId !== userId) {
|
|
78
|
-
throw new NotFoundError("Project", projectId);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// TODO: Fetch from analytics_summary table once analytics flush is wired
|
|
82
|
-
// For now, return zero-state
|
|
83
|
-
return {
|
|
84
|
-
totalRequests: 0,
|
|
85
|
-
uniqueVisitors: 0,
|
|
86
|
-
bandwidthIn: 0,
|
|
87
|
-
bandwidthOut: 0,
|
|
88
|
-
avgResponseTimeMs: 0,
|
|
89
|
-
lastUpdated: null,
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// ─── Analytics periods ───────────────────────────────────────────────────────
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Get aggregated analytics periods for a date range.
|
|
97
|
-
* Used for charts and detailed reports.
|
|
98
|
-
*/
|
|
99
|
-
export async function getAnalyticsPeriods(
|
|
100
|
-
projectId: string,
|
|
101
|
-
userId: string,
|
|
102
|
-
from?: string,
|
|
103
|
-
to?: string,
|
|
104
|
-
): Promise<AnalyticsPeriod[]> {
|
|
105
|
-
const project = await repos.project.findById(projectId);
|
|
106
|
-
if (!project || project.userId !== userId) {
|
|
107
|
-
throw new NotFoundError("Project", projectId);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// TODO: Fetch from analytics_period table once analytics flush is wired
|
|
111
|
-
return [];
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// ─── Deployment stats ────────────────────────────────────────────────────────
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Get deployment statistics for a project:
|
|
118
|
-
* - Total / success / failed counts
|
|
119
|
-
* - Average build duration
|
|
120
|
-
* - Daily deployments for the last 30 days
|
|
121
|
-
*/
|
|
122
|
-
export async function getDeploymentStats(
|
|
123
|
-
projectId: string,
|
|
124
|
-
userId: string,
|
|
125
|
-
days = 30,
|
|
126
|
-
): Promise<DeploymentStats> {
|
|
127
|
-
const project = await repos.project.findById(projectId);
|
|
128
|
-
if (!project || project.userId !== userId) {
|
|
129
|
-
throw new NotFoundError("Project", projectId);
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// Fetch all deployments for counting
|
|
133
|
-
const { rows: deployments } = await repos.deployment.listByProject(projectId, {
|
|
134
|
-
page: 1,
|
|
135
|
-
perPage: 10_000, // Get all for stats
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
const total = deployments.length;
|
|
139
|
-
const success = deployments.filter((d) => d.status === "ready").length;
|
|
140
|
-
const failed = deployments.filter((d) => d.status === "failed").length;
|
|
141
|
-
|
|
142
|
-
// Average build duration of successful deployments
|
|
143
|
-
const successDeps = deployments.filter(
|
|
144
|
-
(d) => d.status === "ready" && d.buildDurationMs,
|
|
145
|
-
);
|
|
146
|
-
const avgBuild =
|
|
147
|
-
successDeps.length > 0
|
|
148
|
-
? Math.round(
|
|
149
|
-
successDeps.reduce((sum, d) => sum + (d.buildDurationMs ?? 0), 0) /
|
|
150
|
-
successDeps.length,
|
|
151
|
-
)
|
|
152
|
-
: 0;
|
|
153
|
-
|
|
154
|
-
// Daily counts for the last N days
|
|
155
|
-
const now = new Date();
|
|
156
|
-
const dailyCounts: DeploymentStats["dailyCounts"] = [];
|
|
157
|
-
for (let i = days - 1; i >= 0; i--) {
|
|
158
|
-
const date = new Date(now);
|
|
159
|
-
date.setDate(date.getDate() - i);
|
|
160
|
-
const dateStr = date.toISOString().split("T")[0]!;
|
|
161
|
-
|
|
162
|
-
const dayDeps = deployments.filter((d) => {
|
|
163
|
-
const depDate = new Date(d.createdAt).toISOString().split("T")[0];
|
|
164
|
-
return depDate === dateStr;
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
dailyCounts.push({
|
|
168
|
-
date: dateStr,
|
|
169
|
-
total: dayDeps.length,
|
|
170
|
-
success: dayDeps.filter((d) => d.status === "ready").length,
|
|
171
|
-
failed: dayDeps.filter((d) => d.status === "failed").length,
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
return {
|
|
176
|
-
totalDeployments: total,
|
|
177
|
-
successfulDeployments: success,
|
|
178
|
-
failedDeployments: failed,
|
|
179
|
-
avgBuildDurationMs: avgBuild,
|
|
180
|
-
dailyCounts,
|
|
181
|
-
};
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
// ─── Resource usage (live) ───────────────────────────────────────────────────
|
|
185
|
-
|
|
186
|
-
/**
|
|
187
|
-
* Get current resource usage for a project's active container.
|
|
188
|
-
* Returns null if no active deployment.
|
|
189
|
-
*/
|
|
190
|
-
export async function getContainerUsage(
|
|
191
|
-
projectId: string,
|
|
192
|
-
userId: string,
|
|
193
|
-
): Promise<ResourceUsage | null> {
|
|
194
|
-
const project = await repos.project.findById(projectId);
|
|
195
|
-
if (!project || project.userId !== userId) {
|
|
196
|
-
throw new NotFoundError("Project", projectId);
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
if (!project.activeDeploymentId) return null;
|
|
200
|
-
|
|
201
|
-
const dep = await repos.deployment.findById(project.activeDeploymentId);
|
|
202
|
-
if (!dep?.containerId) return null;
|
|
203
|
-
|
|
204
|
-
const { runtime } = platform();
|
|
205
|
-
return runtime.getUsage(dep.containerId);
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
/**
|
|
209
|
-
* Get container info (status, IP, uptime, current usage).
|
|
210
|
-
*/
|
|
211
|
-
export async function getContainerInfo(
|
|
212
|
-
projectId: string,
|
|
213
|
-
userId: string,
|
|
214
|
-
) {
|
|
215
|
-
const project = await repos.project.findById(projectId);
|
|
216
|
-
if (!project || project.userId !== userId) {
|
|
217
|
-
throw new NotFoundError("Project", projectId);
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
if (!project.activeDeploymentId) return null;
|
|
221
|
-
|
|
222
|
-
const dep = await repos.deployment.findById(project.activeDeploymentId);
|
|
223
|
-
if (!dep?.containerId) return null;
|
|
224
|
-
|
|
225
|
-
const { runtime } = platform();
|
|
226
|
-
return runtime.getContainerInfo(dep.containerId);
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
// ─── Dashboard home stats ────────────────────────────────────────────────────
|
|
230
|
-
|
|
231
|
-
/**
|
|
232
|
-
* Get overview stats for the user's dashboard home.
|
|
233
|
-
*/
|
|
234
|
-
export async function getDashboardStats(userId: string) {
|
|
235
|
-
const { rows: projects, total: totalProjects } = await repos.project.listByUser(
|
|
236
|
-
userId,
|
|
237
|
-
{ page: 1, perPage: 10_000 },
|
|
238
|
-
);
|
|
239
|
-
|
|
240
|
-
const activeProjects = projects.filter((p) => p.activeDeploymentId).length;
|
|
241
|
-
|
|
242
|
-
// Aggregate deployment counts across all projects
|
|
243
|
-
let totalDeployments = 0;
|
|
244
|
-
let failedDeployments = 0;
|
|
245
|
-
let successDeployments = 0;
|
|
246
|
-
|
|
247
|
-
for (const p of projects.slice(0, 50)) {
|
|
248
|
-
// Limit to 50 projects for perf
|
|
249
|
-
const { rows } = await repos.deployment.listByProject(p.id, { page: 1, perPage: 100 });
|
|
250
|
-
totalDeployments += rows.length;
|
|
251
|
-
failedDeployments += rows.filter((d) => d.status === "failed").length;
|
|
252
|
-
successDeployments += rows.filter((d) => d.status === "ready").length;
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
return {
|
|
256
|
-
projects: { total: totalProjects, active: activeProjects },
|
|
257
|
-
deployments: {
|
|
258
|
-
total: totalDeployments,
|
|
259
|
-
success: successDeployments,
|
|
260
|
-
failed: failedDeployments,
|
|
261
|
-
pending: totalDeployments - successDeployments - failedDeployments,
|
|
262
|
-
},
|
|
263
|
-
};
|
|
264
|
-
}
|