insforge 0.3.1
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/.dockerignore +58 -0
- package/.env.example +49 -0
- package/.github/ISSUE_TEMPLATE/bug_report.yml +83 -0
- package/.github/ISSUE_TEMPLATE/config.yml +11 -0
- package/.github/ISSUE_TEMPLATE/feature_request.yml +79 -0
- package/.github/copilot-instructions.md +147 -0
- package/.github/workflows/build-image.yml +65 -0
- package/.github/workflows/ci-premerge-check.yml +24 -0
- package/.github/workflows/deploy-aws.yml +130 -0
- package/.github/workflows/lint-and-format.yml +33 -0
- package/.prettierignore +65 -0
- package/.prettierrc +9 -0
- package/CHANGELOG.md +3 -0
- package/CONTRIBUTING.md +126 -0
- package/Dockerfile +27 -0
- package/GITHUB_OAUTH_SETUP.md +49 -0
- package/GOOGLE_OAUTH_SETUP.md +148 -0
- package/LICENSE +201 -0
- package/README.md +134 -0
- package/assets/Dark.svg +23 -0
- package/assets/archDiagram.png +0 -0
- package/assets/banner.png +0 -0
- package/assets/mcpInstallv2.png +0 -0
- package/assets/sampleResponse.png +0 -0
- package/assets/signin.png +0 -0
- package/assets/userflow.png +0 -0
- package/backend/migrations/000_create-base-tables.sql +142 -0
- package/backend/migrations/001_create-helper-functions.sql +41 -0
- package/backend/migrations/002_rename-auth-tables.sql +30 -0
- package/backend/migrations/003_create-users-table.sql +56 -0
- package/backend/migrations/004_add-reload-postgrest-func.sql +24 -0
- package/backend/migrations/005_enable-project-admin-modify-users.sql +30 -0
- package/backend/migrations/006_modify-ai-usage-table.sql +25 -0
- package/backend/migrations/007_drop-metadata-table.sql +2 -0
- package/backend/migrations/008_add-system-tables.sql +77 -0
- package/backend/migrations/009_add-function-secrets.sql +24 -0
- package/backend/migrations/010_modify-ai-config-modalities.sql +93 -0
- package/backend/migrations/011_refactor-secrets-table.sql +15 -0
- package/backend/migrations/012_add-storage-uploaded-by.sql +8 -0
- package/backend/package.json +75 -0
- package/backend/src/api/middleware/auth.ts +240 -0
- package/backend/src/api/middleware/error.ts +231 -0
- package/backend/src/api/middleware/upload.ts +59 -0
- package/backend/src/api/routes/agent.ts +29 -0
- package/backend/src/api/routes/ai.ts +472 -0
- package/backend/src/api/routes/auth.oauth.ts +482 -0
- package/backend/src/api/routes/auth.ts +386 -0
- package/backend/src/api/routes/database.advance.ts +275 -0
- package/backend/src/api/routes/database.records.ts +246 -0
- package/backend/src/api/routes/database.tables.ts +161 -0
- package/backend/src/api/routes/docs.ts +66 -0
- package/backend/src/api/routes/functions.ts +183 -0
- package/backend/src/api/routes/logs.ts +150 -0
- package/backend/src/api/routes/metadata.ts +160 -0
- package/backend/src/api/routes/openapi.ts +82 -0
- package/backend/src/api/routes/secrets.ts +199 -0
- package/backend/src/api/routes/storage.ts +547 -0
- package/backend/src/api/routes/usage.ts +96 -0
- package/backend/src/core/ai/chat.ts +207 -0
- package/backend/src/core/ai/client.ts +242 -0
- package/backend/src/core/ai/config.ts +187 -0
- package/backend/src/core/ai/image.ts +156 -0
- package/backend/src/core/ai/model.ts +117 -0
- package/backend/src/core/ai/usage.ts +290 -0
- package/backend/src/core/auth/auth.ts +781 -0
- package/backend/src/core/auth/oauth.ts +398 -0
- package/backend/src/core/database/advance.ts +1074 -0
- package/backend/src/core/database/manager.ts +178 -0
- package/backend/src/core/database/table.ts +772 -0
- package/backend/src/core/documentation/agent.ts +689 -0
- package/backend/src/core/documentation/openapi.ts +856 -0
- package/backend/src/core/functions/functions.ts +310 -0
- package/backend/src/core/logs/analytics.ts +76 -0
- package/backend/src/core/logs/audit.ts +255 -0
- package/backend/src/core/logs/providers/base.provider.ts +83 -0
- package/backend/src/core/logs/providers/cloudwatch.provider.ts +510 -0
- package/backend/src/core/logs/providers/localdb.provider.ts +246 -0
- package/backend/src/core/secrets/encryption.ts +58 -0
- package/backend/src/core/secrets/secrets.ts +410 -0
- package/backend/src/core/socket/socket.ts +388 -0
- package/backend/src/core/socket/types.ts +79 -0
- package/backend/src/core/storage/storage.ts +923 -0
- package/backend/src/server.ts +288 -0
- package/backend/src/types/ai.ts +46 -0
- package/backend/src/types/auth.ts +90 -0
- package/backend/src/types/database.ts +136 -0
- package/backend/src/types/error-constants.ts +86 -0
- package/backend/src/types/logs.ts +47 -0
- package/backend/src/types/profile.ts +55 -0
- package/backend/src/types/storage.ts +23 -0
- package/backend/src/utils/cloud-token.ts +39 -0
- package/backend/src/utils/constants.ts +1 -0
- package/backend/src/utils/environment.ts +35 -0
- package/backend/src/utils/helpers.ts +49 -0
- package/backend/src/utils/logger.ts +13 -0
- package/backend/src/utils/response.ts +62 -0
- package/backend/src/utils/seed.ts +205 -0
- package/backend/src/utils/sql-parser.ts +63 -0
- package/backend/src/utils/uuid.ts +9 -0
- package/backend/src/utils/validations.ts +129 -0
- package/backend/tests/README.md +134 -0
- package/backend/tests/cleanup-all-test-data.sh +231 -0
- package/backend/tests/cloud/test-s3-multitenant.sh +132 -0
- package/backend/tests/local/comprehensive-curl-tests.sh +156 -0
- package/backend/tests/local/test-auth-router.sh +144 -0
- package/backend/tests/local/test-database-router.sh +222 -0
- package/backend/tests/local/test-e2e.sh +241 -0
- package/backend/tests/local/test-fk-errors.sh +97 -0
- package/backend/tests/local/test-id-field.sh +201 -0
- package/backend/tests/local/test-public-bucket.sh +265 -0
- package/backend/tests/local/test-secrets.sh +248 -0
- package/backend/tests/local/test-serverless-functions.sh.disabled +325 -0
- package/backend/tests/local/test-traditional-rest.sh +209 -0
- package/backend/tests/manual/README.md +51 -0
- package/backend/tests/manual/create-large-table-simple.sql +11 -0
- package/backend/tests/manual/seed-large-table.sql +101 -0
- package/backend/tests/manual/setup-large-table-extras.sql +34 -0
- package/backend/tests/manual/test-better-auth.sh +303 -0
- package/backend/tests/manual/test-bulk-upsert.sh +410 -0
- package/backend/tests/manual/test-database-advance.sh +297 -0
- package/backend/tests/manual/test-postgrest-stability.sh +192 -0
- package/backend/tests/manual/test-rawsql-export-import.sh +412 -0
- package/backend/tests/manual/test-universal-storage.sh +264 -0
- package/backend/tests/manual/test-users.sql +18 -0
- package/backend/tests/run-all-tests.sh +140 -0
- package/backend/tests/setup.ts +22 -0
- package/backend/tests/test-config.sh +303 -0
- package/backend/tsconfig.json +23 -0
- package/backend/tsup.config.ts +18 -0
- package/backend/vitest.config.ts +22 -0
- package/docker-compose.prod.yml +145 -0
- package/docker-compose.yml +167 -0
- package/docker-init/db/db-init.sql +125 -0
- package/docker-init/db/jwt.sql +5 -0
- package/docker-init/db/logs.sql +9 -0
- package/docker-init/db/postgresql.conf +17 -0
- package/docs/deprecated/insforge-auth-api.md +215 -0
- package/docs/deprecated/insforge-auth-sdk.md +100 -0
- package/docs/deprecated/insforge-db-api.md +359 -0
- package/docs/deprecated/insforge-db-sdk.md +140 -0
- package/docs/deprecated/insforge-debug-sdk.md +157 -0
- package/docs/deprecated/insforge-debug.md +65 -0
- package/docs/deprecated/insforge-instructions.md +124 -0
- package/docs/deprecated/insforge-project.md +118 -0
- package/docs/deprecated/insforge-storage-api.md +279 -0
- package/docs/deprecated/insforge-storage-sdk.md +159 -0
- package/docs/insforge-instructions-sdk.md +407 -0
- package/eslint.config.js +317 -0
- package/examples/oauth/frontend-oauth-example.html +251 -0
- package/examples/response-examples.md +444 -0
- package/frontend/README.md +112 -0
- package/frontend/components.json +17 -0
- package/frontend/index.html +13 -0
- package/frontend/package.json +63 -0
- package/frontend/public/favicon.ico +0 -0
- package/frontend/src/App.tsx +106 -0
- package/frontend/src/assets/icons/checkbox_checked.svg +6 -0
- package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -0
- package/frontend/src/assets/icons/checked.svg +3 -0
- package/frontend/src/assets/icons/error.svg +3 -0
- package/frontend/src/assets/icons/pencil.svg +4 -0
- package/frontend/src/assets/icons/refresh.svg +4 -0
- package/frontend/src/assets/icons/step_active.svg +3 -0
- package/frontend/src/assets/icons/step_inactive.svg +11 -0
- package/frontend/src/assets/icons/warning.svg +3 -0
- package/frontend/src/assets/logos/amazon.svg +1 -0
- package/frontend/src/assets/logos/claude_code.svg +3 -0
- package/frontend/src/assets/logos/cline.svg +6 -0
- package/frontend/src/assets/logos/cursor.svg +20 -0
- package/frontend/src/assets/logos/discord.svg +9 -0
- package/frontend/src/assets/logos/gemini.svg +19 -0
- package/frontend/src/assets/logos/github.svg +5 -0
- package/frontend/src/assets/logos/google.svg +13 -0
- package/frontend/src/assets/logos/grok.svg +10 -0
- package/frontend/src/assets/logos/insforge_dark.svg +15 -0
- package/frontend/src/assets/logos/insforge_light.svg +15 -0
- package/frontend/src/assets/logos/openai.svg +10 -0
- package/frontend/src/assets/logos/roo_code.svg +9 -0
- package/frontend/src/assets/logos/trae.svg +3 -0
- package/frontend/src/assets/logos/windsurf.svg +10 -0
- package/frontend/src/components/ButtonWithLoading.tsx +27 -0
- package/frontend/src/components/Checkbox.tsx +61 -0
- package/frontend/src/components/CodeBlock.tsx +32 -0
- package/frontend/src/components/ConfirmDialog.tsx +96 -0
- package/frontend/src/components/CopyButton.tsx +69 -0
- package/frontend/src/components/DeleteActionButton.tsx +42 -0
- package/frontend/src/components/EmptyState.tsx +41 -0
- package/frontend/src/components/ErrorState.tsx +35 -0
- package/frontend/src/components/FeatureSidebar.tsx +126 -0
- package/frontend/src/components/FeatureSidebarItem.tsx +101 -0
- package/frontend/src/components/JsonHighlight.tsx +61 -0
- package/frontend/src/components/LoadingState.tsx +16 -0
- package/frontend/src/components/PaginationControls.tsx +54 -0
- package/frontend/src/components/PromptDialog.tsx +68 -0
- package/frontend/src/components/SearchInput.tsx +90 -0
- package/frontend/src/components/SelectionClearButton.tsx +26 -0
- package/frontend/src/components/Stepper.tsx +139 -0
- package/frontend/src/components/ThemeToggle.tsx +58 -0
- package/frontend/src/components/TypeBadge.tsx +20 -0
- package/frontend/src/components/datagrid/DataGrid.tsx +264 -0
- package/frontend/src/components/datagrid/DefaultCellRenderer.tsx +114 -0
- package/frontend/src/components/datagrid/IdCell.tsx +44 -0
- package/frontend/src/components/datagrid/SortableHeader.tsx +74 -0
- package/frontend/src/components/datagrid/cell-editors/BooleanCellEditor.tsx +54 -0
- package/frontend/src/components/datagrid/cell-editors/DateCellEditor.tsx +483 -0
- package/frontend/src/components/datagrid/cell-editors/JsonCellEditor.tsx +362 -0
- package/frontend/src/components/datagrid/cell-editors/TextCellEditor.tsx +38 -0
- package/frontend/src/components/datagrid/cell-editors/index.ts +14 -0
- package/frontend/src/components/datagrid/cell-editors/types.ts +43 -0
- package/frontend/src/components/datagrid/datagridTypes.tsx +72 -0
- package/frontend/src/components/datagrid/index.tsx +20 -0
- package/frontend/src/components/index.ts +39 -0
- package/frontend/src/components/layout/AppHeader.tsx +146 -0
- package/frontend/src/components/layout/AppSidebar.tsx +190 -0
- package/frontend/src/components/layout/CloudLayout.tsx +95 -0
- package/frontend/src/components/layout/Layout.tsx +43 -0
- package/frontend/src/components/radix/Alert.tsx +45 -0
- package/frontend/src/components/radix/AlertDialog.tsx +115 -0
- package/frontend/src/components/radix/Avatar.tsx +45 -0
- package/frontend/src/components/radix/Badge.tsx +33 -0
- package/frontend/src/components/radix/Button.tsx +50 -0
- package/frontend/src/components/radix/Card.tsx +58 -0
- package/frontend/src/components/radix/Dialog.tsx +98 -0
- package/frontend/src/components/radix/DropdownMenu.tsx +185 -0
- package/frontend/src/components/radix/Form.tsx +167 -0
- package/frontend/src/components/radix/Input.tsx +22 -0
- package/frontend/src/components/radix/Label.tsx +19 -0
- package/frontend/src/components/radix/Popover.tsx +29 -0
- package/frontend/src/components/radix/ScrollArea.tsx +44 -0
- package/frontend/src/components/radix/Select.tsx +151 -0
- package/frontend/src/components/radix/Separator.tsx +26 -0
- package/frontend/src/components/radix/Sheet.tsx +119 -0
- package/frontend/src/components/radix/Skeleton.tsx +7 -0
- package/frontend/src/components/radix/Switch.tsx +29 -0
- package/frontend/src/components/radix/Tabs.tsx +50 -0
- package/frontend/src/components/radix/Textarea.tsx +21 -0
- package/frontend/src/components/radix/Tooltip.tsx +28 -0
- package/frontend/src/features/ai/components/AIConfigCard.tsx +154 -0
- package/frontend/src/features/ai/components/AIConfigDialog.tsx +76 -0
- package/frontend/src/features/ai/components/AIConfigForm.tsx +222 -0
- package/frontend/src/features/ai/components/AIEmptyState.tsx +18 -0
- package/frontend/src/features/ai/components/fields/ModalityField.tsx +87 -0
- package/frontend/src/features/ai/components/fields/ModelSelectionField.tsx +134 -0
- package/frontend/src/features/ai/components/fields/SystemPromptField.tsx +33 -0
- package/frontend/src/features/ai/helpers.ts +155 -0
- package/frontend/src/features/ai/hooks/useAIConfigs.ts +221 -0
- package/frontend/src/features/ai/hooks/useAIUsage.ts +77 -0
- package/frontend/src/features/ai/page/AIPage.tsx +178 -0
- package/frontend/src/features/ai/services/ai.service.ts +148 -0
- package/frontend/src/features/auth/components/AddOAuthDialog.tsx +106 -0
- package/frontend/src/features/auth/components/AuthMethodTab.tsx +238 -0
- package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +303 -0
- package/frontend/src/features/auth/components/OAuthEmptyState.tsx +15 -0
- package/frontend/src/features/auth/components/UserFormDialog.tsx +248 -0
- package/frontend/src/features/auth/components/UsersDataGrid.tsx +183 -0
- package/frontend/src/features/auth/components/UsersTab.tsx +114 -0
- package/frontend/src/features/auth/hooks/useOAuthConfig.ts +129 -0
- package/frontend/src/features/auth/hooks/useUsers.ts +57 -0
- package/frontend/src/features/auth/index.ts +9 -0
- package/frontend/src/features/auth/page/AuthenticationPage.tsx +169 -0
- package/frontend/src/features/auth/services/auth.service.ts +112 -0
- package/frontend/src/features/auth/services/oauth.service.ts +49 -0
- package/frontend/src/features/dashboard/page/DashboardPage.tsx +194 -0
- package/frontend/src/features/database/components/ColumnTypeSelect.tsx +64 -0
- package/frontend/src/features/database/components/DatabaseDataGrid.tsx +282 -0
- package/frontend/src/features/database/components/ForeignKeyCell.tsx +187 -0
- package/frontend/src/features/database/components/ForeignKeyPopover.tsx +378 -0
- package/frontend/src/features/database/components/LinkRecordModal.tsx +288 -0
- package/frontend/src/features/database/components/RecordFormDialog.tsx +164 -0
- package/frontend/src/features/database/components/RecordFormField.tsx +568 -0
- package/frontend/src/features/database/components/TableEmptyState.tsx +21 -0
- package/frontend/src/features/database/components/TableForm.tsx +656 -0
- package/frontend/src/features/database/components/TableFormColumn.tsx +137 -0
- package/frontend/src/features/database/components/TableListSkeleton.tsx +9 -0
- package/frontend/src/features/database/components/TableSidebar.tsx +47 -0
- package/frontend/src/features/database/constants.ts +26 -0
- package/frontend/src/features/database/helpers.ts +125 -0
- package/frontend/src/features/database/hooks/UseLinkModal.tsx +78 -0
- package/frontend/src/features/database/index.ts +12 -0
- package/frontend/src/features/database/page/DatabasePage.tsx +626 -0
- package/frontend/src/features/database/schema.ts +25 -0
- package/frontend/src/features/database/services/database.service.ts +216 -0
- package/frontend/src/features/functions/components/FunctionEmptyState.tsx +15 -0
- package/frontend/src/features/functions/components/FunctionRow.tsx +71 -0
- package/frontend/src/features/functions/components/FunctionViewer.tsx +46 -0
- package/frontend/src/features/functions/components/FunctionsContent.tsx +88 -0
- package/frontend/src/features/functions/components/FunctionsSidebar.tsx +56 -0
- package/frontend/src/features/functions/components/SecretEmptyState.tsx +23 -0
- package/frontend/src/features/functions/components/SecretRow.tsx +68 -0
- package/frontend/src/features/functions/components/SecretsContent.tsx +120 -0
- package/frontend/src/features/functions/hooks/useFunctions.ts +106 -0
- package/frontend/src/features/functions/page/FunctionsPage.tsx +28 -0
- package/frontend/src/features/functions/services/functions.service.ts +48 -0
- package/frontend/src/features/login/components/AuthErrorBoundary.tsx +87 -0
- package/frontend/src/features/login/components/PrivateRoute.tsx +24 -0
- package/frontend/src/features/login/page/CloudLoginPage.tsx +93 -0
- package/frontend/src/features/login/page/LoginPage.tsx +174 -0
- package/frontend/src/features/logs/components/AnalyticsLogsTable.tsx +313 -0
- package/frontend/src/features/logs/components/LogsTable.tsx +199 -0
- package/frontend/src/features/logs/hooks/useAuditLogs.ts +39 -0
- package/frontend/src/features/logs/index.ts +5 -0
- package/frontend/src/features/logs/page/AnalyticsLogsPage.tsx +530 -0
- package/frontend/src/features/logs/page/AuditsPage.tsx +192 -0
- package/frontend/src/features/logs/services/log.service.ts +171 -0
- package/frontend/src/features/metadata/hooks/useMetadata.ts +53 -0
- package/frontend/src/features/metadata/index.ts +0 -0
- package/frontend/src/features/metadata/page/MetadataPage.tsx +136 -0
- package/frontend/src/features/metadata/services/metadata.service.ts +17 -0
- package/frontend/src/features/onboard/components/CompletionCard.tsx +41 -0
- package/frontend/src/features/onboard/components/OnboardButton.tsx +84 -0
- package/frontend/src/features/onboard/components/StepContent.tsx +91 -0
- package/frontend/src/features/onboard/components/TestConnectionStep.tsx +53 -0
- package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +35 -0
- package/frontend/src/features/onboard/components/mcp/McpInstallation.tsx +144 -0
- package/frontend/src/features/onboard/components/mcp/index.ts +4 -0
- package/frontend/src/features/onboard/components/mcp/mcp-helper.tsx +98 -0
- package/frontend/src/features/onboard/index.ts +3 -0
- package/frontend/src/features/onboard/page/OnBoardPage.tsx +104 -0
- package/frontend/src/features/onboard/types.ts +8 -0
- package/frontend/src/features/secrets/hooks/useSecrets.ts +139 -0
- package/frontend/src/features/secrets/services/secrets.service.ts +57 -0
- package/frontend/src/features/storage/components/BucketEmptyState.tsx +19 -0
- package/frontend/src/features/storage/components/BucketFormDialog.tsx +194 -0
- package/frontend/src/features/storage/components/BucketListSkeleton.tsx +17 -0
- package/frontend/src/features/storage/components/FilePreviewDialog.tsx +287 -0
- package/frontend/src/features/storage/components/StorageDataGrid.tsx +239 -0
- package/frontend/src/features/storage/components/StorageManager.tsx +236 -0
- package/frontend/src/features/storage/components/StorageSidebar.tsx +44 -0
- package/frontend/src/features/storage/components/UploadToast.tsx +46 -0
- package/frontend/src/features/storage/index.ts +3 -0
- package/frontend/src/features/storage/page/StoragePage.tsx +553 -0
- package/frontend/src/features/storage/services/storage.service.ts +144 -0
- package/frontend/src/features/visualizer/components/AuthNode.tsx +107 -0
- package/frontend/src/features/visualizer/components/BucketNode.tsx +34 -0
- package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +359 -0
- package/frontend/src/features/visualizer/components/TableNode.tsx +152 -0
- package/frontend/src/features/visualizer/components/VisualizerSkeleton.tsx +24 -0
- package/frontend/src/features/visualizer/components/index.ts +5 -0
- package/frontend/src/features/visualizer/page/VisualizerPage.tsx +127 -0
- package/frontend/src/index.css +248 -0
- package/frontend/src/lib/api/client.ts +163 -0
- package/frontend/src/lib/contexts/AuthContext.tsx +157 -0
- package/frontend/src/lib/contexts/OnboardStepContext.tsx +68 -0
- package/frontend/src/lib/contexts/SocketContext.tsx +303 -0
- package/frontend/src/lib/contexts/ThemeContext.tsx +125 -0
- package/frontend/src/lib/hooks/useAuth.ts +4 -0
- package/frontend/src/lib/hooks/useConfirm.ts +55 -0
- package/frontend/src/lib/hooks/useInterval.ts +27 -0
- package/frontend/src/lib/hooks/useMediaQuery.ts +59 -0
- package/frontend/src/lib/hooks/useOnboardingCompletion.ts +29 -0
- package/frontend/src/lib/hooks/usePagination.ts +27 -0
- package/frontend/src/lib/hooks/useTimeout.ts +27 -0
- package/frontend/src/lib/hooks/useToast.tsx +229 -0
- package/frontend/src/lib/utils/constants.ts +38 -0
- package/frontend/src/lib/utils/utils.ts +165 -0
- package/frontend/src/lib/utils/validation-schemas.ts +126 -0
- package/frontend/src/main.tsx +16 -0
- package/frontend/src/rdg.css +194 -0
- package/frontend/src/vite-env.d.ts +12 -0
- package/frontend/tailwind.config.js +97 -0
- package/frontend/tsconfig.json +26 -0
- package/frontend/tsconfig.node.json +10 -0
- package/frontend/vite.config.ts +37 -0
- package/frontend/vitest.config.ts +36 -0
- package/functions/deno.json +25 -0
- package/functions/server.ts +290 -0
- package/functions/worker-template.js +126 -0
- package/openapi/ai.yaml +689 -0
- package/openapi/auth.yaml +563 -0
- package/openapi/functions.yaml +476 -0
- package/openapi/health.yaml +30 -0
- package/openapi/logs.yaml +224 -0
- package/openapi/metadata.yaml +178 -0
- package/openapi/records.yaml +382 -0
- package/openapi/secrets.yaml +371 -0
- package/openapi/storage.yaml +876 -0
- package/openapi/tables.yaml +464 -0
- package/package.json +88 -0
- package/shared-schemas/package.json +31 -0
- package/shared-schemas/src/ai-api.schema.ts +167 -0
- package/shared-schemas/src/ai.schema.ts +54 -0
- package/shared-schemas/src/auth-api.schema.ts +193 -0
- package/shared-schemas/src/auth.schema.ts +94 -0
- package/shared-schemas/src/database-api.schema.ts +259 -0
- package/shared-schemas/src/database.schema.ts +69 -0
- package/shared-schemas/src/functions-api.schema.ts +25 -0
- package/shared-schemas/src/functions.schema.ts +16 -0
- package/shared-schemas/src/index.ts +13 -0
- package/shared-schemas/src/logs-api.schema.ts +49 -0
- package/shared-schemas/src/logs.schema.ts +14 -0
- package/shared-schemas/src/metadata.schema.ts +56 -0
- package/shared-schemas/src/storage-api.schema.ts +65 -0
- package/shared-schemas/src/storage.schema.ts +19 -0
- package/shared-schemas/tsconfig.json +21 -0
- package/tsconfig.json +8 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
-- init.sql
|
|
2
|
+
-- Create role for anonymous user
|
|
3
|
+
CREATE ROLE anon NOLOGIN;
|
|
4
|
+
|
|
5
|
+
-- Create role for authenticator
|
|
6
|
+
CREATE ROLE authenticated NOLOGIN;
|
|
7
|
+
|
|
8
|
+
-- Create project admin role for admin users
|
|
9
|
+
CREATE ROLE project_admin NOLOGIN;
|
|
10
|
+
|
|
11
|
+
GRANT USAGE ON SCHEMA public TO anon;
|
|
12
|
+
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO anon;
|
|
13
|
+
GRANT USAGE ON SCHEMA public TO authenticated;
|
|
14
|
+
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO authenticated;
|
|
15
|
+
GRANT USAGE ON SCHEMA public TO project_admin;
|
|
16
|
+
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO project_admin;
|
|
17
|
+
|
|
18
|
+
-- Grant permissions to roles
|
|
19
|
+
-- NOTICE: The anon role is intended for unauthenticated users, so it should only have read access.
|
|
20
|
+
GRANT SELECT ON ALL TABLES IN SCHEMA public TO anon;
|
|
21
|
+
ALTER DEFAULT PRIVILEGES IN SCHEMA public
|
|
22
|
+
GRANT SELECT ON TABLES TO anon;
|
|
23
|
+
|
|
24
|
+
GRANT SELECT ON ALL TABLES IN SCHEMA public TO authenticated;
|
|
25
|
+
ALTER DEFAULT PRIVILEGES IN SCHEMA public
|
|
26
|
+
GRANT SELECT ON TABLES TO authenticated;
|
|
27
|
+
|
|
28
|
+
GRANT INSERT ON ALL TABLES IN SCHEMA public TO authenticated;
|
|
29
|
+
ALTER DEFAULT PRIVILEGES IN SCHEMA public
|
|
30
|
+
GRANT INSERT ON TABLES TO authenticated;
|
|
31
|
+
|
|
32
|
+
GRANT UPDATE ON ALL TABLES IN SCHEMA public TO authenticated;
|
|
33
|
+
ALTER DEFAULT PRIVILEGES IN SCHEMA public
|
|
34
|
+
GRANT UPDATE ON TABLES TO authenticated;
|
|
35
|
+
|
|
36
|
+
GRANT DELETE ON ALL TABLES IN SCHEMA public TO authenticated;
|
|
37
|
+
ALTER DEFAULT PRIVILEGES IN SCHEMA public
|
|
38
|
+
GRANT DELETE ON TABLES TO authenticated;
|
|
39
|
+
|
|
40
|
+
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO project_admin;
|
|
41
|
+
ALTER DEFAULT PRIVILEGES IN SCHEMA public
|
|
42
|
+
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO project_admin;
|
|
43
|
+
|
|
44
|
+
-- Create function to automatically create RLS policies for new tables
|
|
45
|
+
CREATE OR REPLACE FUNCTION public.create_default_policies()
|
|
46
|
+
RETURNS event_trigger AS $$
|
|
47
|
+
DECLARE
|
|
48
|
+
obj record;
|
|
49
|
+
table_schema text;
|
|
50
|
+
table_name text;
|
|
51
|
+
has_rls boolean;
|
|
52
|
+
BEGIN
|
|
53
|
+
FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands() WHERE command_tag = 'CREATE TABLE'
|
|
54
|
+
LOOP
|
|
55
|
+
-- Extract schema and table name from object_identity
|
|
56
|
+
-- Handle quoted identifiers by removing quotes
|
|
57
|
+
SELECT INTO table_schema, table_name
|
|
58
|
+
split_part(obj.object_identity, '.', 1),
|
|
59
|
+
trim(both '"' from split_part(obj.object_identity, '.', 2));
|
|
60
|
+
-- Check if RLS is enabled on the table
|
|
61
|
+
SELECT INTO has_rls
|
|
62
|
+
rowsecurity
|
|
63
|
+
FROM pg_tables
|
|
64
|
+
WHERE schemaname = table_schema
|
|
65
|
+
AND tablename = table_name;
|
|
66
|
+
-- Only create policies if RLS is enabled
|
|
67
|
+
IF has_rls THEN
|
|
68
|
+
-- Create policies for each role
|
|
69
|
+
-- anon: read-only access
|
|
70
|
+
EXECUTE format('CREATE POLICY "anon_policy" ON %s FOR SELECT TO anon USING (true)', obj.object_identity);
|
|
71
|
+
-- authenticated: full access
|
|
72
|
+
EXECUTE format('CREATE POLICY "authenticated_policy" ON %s FOR ALL TO authenticated USING (true) WITH CHECK (true)', obj.object_identity);
|
|
73
|
+
-- project_admin: full access
|
|
74
|
+
EXECUTE format('CREATE POLICY "project_admin_policy" ON %s FOR ALL TO project_admin USING (true) WITH CHECK (true)', obj.object_identity);
|
|
75
|
+
END IF;
|
|
76
|
+
END LOOP;
|
|
77
|
+
END;
|
|
78
|
+
$$ LANGUAGE plpgsql;
|
|
79
|
+
|
|
80
|
+
-- Create event trigger to run the function when new tables are created
|
|
81
|
+
CREATE EVENT TRIGGER create_policies_on_table_create
|
|
82
|
+
ON ddl_command_end
|
|
83
|
+
WHEN TAG IN ('CREATE TABLE')
|
|
84
|
+
EXECUTE FUNCTION public.create_default_policies();
|
|
85
|
+
|
|
86
|
+
-- Create function to handle RLS enablement
|
|
87
|
+
CREATE OR REPLACE FUNCTION public.create_policies_after_rls()
|
|
88
|
+
RETURNS event_trigger AS $$
|
|
89
|
+
DECLARE
|
|
90
|
+
obj record;
|
|
91
|
+
table_schema text;
|
|
92
|
+
table_name text;
|
|
93
|
+
BEGIN
|
|
94
|
+
FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands() WHERE command_tag = 'ALTER TABLE'
|
|
95
|
+
LOOP
|
|
96
|
+
-- Extract schema and table name
|
|
97
|
+
-- Handle quoted identifiers by removing quotes
|
|
98
|
+
SELECT INTO table_schema, table_name
|
|
99
|
+
split_part(obj.object_identity, '.', 1),
|
|
100
|
+
trim(both '"' from split_part(obj.object_identity, '.', 2));
|
|
101
|
+
-- Check if table has RLS enabled and no policies yet
|
|
102
|
+
IF EXISTS (
|
|
103
|
+
SELECT 1 FROM pg_tables
|
|
104
|
+
WHERE schemaname = table_schema
|
|
105
|
+
AND tablename = table_name
|
|
106
|
+
AND rowsecurity = true
|
|
107
|
+
) AND NOT EXISTS (
|
|
108
|
+
SELECT 1 FROM pg_policies
|
|
109
|
+
WHERE schemaname = table_schema
|
|
110
|
+
AND tablename = table_name
|
|
111
|
+
) THEN
|
|
112
|
+
-- Create default policies
|
|
113
|
+
EXECUTE format('CREATE POLICY "anon_policy" ON %s FOR SELECT TO anon USING (true)', obj.object_identity);
|
|
114
|
+
EXECUTE format('CREATE POLICY "authenticated_policy" ON %s FOR ALL TO authenticated USING (true) WITH CHECK (true)', obj.object_identity);
|
|
115
|
+
EXECUTE format('CREATE POLICY "project_admin_policy" ON %s FOR ALL TO project_admin USING (true) WITH CHECK (true)', obj.object_identity);
|
|
116
|
+
END IF;
|
|
117
|
+
END LOOP;
|
|
118
|
+
END;
|
|
119
|
+
$$ LANGUAGE plpgsql;
|
|
120
|
+
|
|
121
|
+
-- Create event trigger for ALTER TABLE commands
|
|
122
|
+
CREATE EVENT TRIGGER create_policies_on_rls_enable
|
|
123
|
+
ON ddl_command_end
|
|
124
|
+
WHEN TAG IN ('ALTER TABLE')
|
|
125
|
+
EXECUTE FUNCTION public.create_policies_after_rls();
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# PostgreSQL configuration for InsForge
|
|
2
|
+
# Enable logical replication for Logflare
|
|
3
|
+
|
|
4
|
+
# Listen on all interfaces to allow container connections
|
|
5
|
+
listen_addresses = '*'
|
|
6
|
+
|
|
7
|
+
# Set WAL level to logical for Logflare replication
|
|
8
|
+
wal_level = logical
|
|
9
|
+
|
|
10
|
+
# Set max replication slots (needed for logical replication)
|
|
11
|
+
max_replication_slots = 10
|
|
12
|
+
|
|
13
|
+
# Set max WAL senders
|
|
14
|
+
max_wal_senders = 10
|
|
15
|
+
|
|
16
|
+
# Shared preload libraries (if needed)
|
|
17
|
+
# shared_preload_libraries = 'pg_stat_statements'
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
# Insforge OSS Authentication API Documentation
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Insforge uses JWT tokens and API keys for authentication. Store tokens in localStorage after login.
|
|
6
|
+
**All requests**: Use `Authorization: Bearer <token>` header (for both JWT tokens and API keys)
|
|
7
|
+
|
|
8
|
+
## Base URL
|
|
9
|
+
`http://localhost:7130`
|
|
10
|
+
|
|
11
|
+
## User Authentication
|
|
12
|
+
|
|
13
|
+
### Register New User
|
|
14
|
+
**POST** `/api/auth/users`
|
|
15
|
+
|
|
16
|
+
Body: `{"email": "user@example.com", "password": "password", "name": "User Name"}`
|
|
17
|
+
|
|
18
|
+
Returns: `{"accessToken": "...", "user": {"id": "...", "email": "...", "name": "...", "emailVerified": false, "createdAt": "...", "updatedAt": "..."}}`
|
|
19
|
+
|
|
20
|
+
**Note:** This creates an entry in the `users` table with the same `id` for profile data
|
|
21
|
+
|
|
22
|
+
### Login User
|
|
23
|
+
**POST** `/api/auth/sessions`
|
|
24
|
+
|
|
25
|
+
Body: `{"email": "user@example.com", "password": "password"}`
|
|
26
|
+
|
|
27
|
+
Returns: `{"accessToken": "...", "user": {"id": "...", "email": "...", "name": "...", "emailVerified": false, "createdAt": "...", "updatedAt": "..."}}`
|
|
28
|
+
|
|
29
|
+
### Get Current User
|
|
30
|
+
**GET** `/api/auth/sessions/current`
|
|
31
|
+
|
|
32
|
+
Headers: `Authorization: Bearer <accessToken>`
|
|
33
|
+
|
|
34
|
+
Returns: `{"user": {"id": "...", "email": "...", "role": "authenticated"}}`
|
|
35
|
+
|
|
36
|
+
**Note**: Returns LIMITED fields (id, email, role). For user profile data (nickname, avatar, bio, etc.), query `/api/database/records/users?id=eq.<user_id>`
|
|
37
|
+
|
|
38
|
+
**Common errors:**
|
|
39
|
+
- `401` with `"code": "MISSING_AUTHORIZATION_HEADER"` → No token provided
|
|
40
|
+
- `401` with `"code": "INVALID_TOKEN"` → Token expired or invalid
|
|
41
|
+
|
|
42
|
+
## Admin Authentication
|
|
43
|
+
|
|
44
|
+
### Admin Login
|
|
45
|
+
**POST** `/api/auth/admin/sessions`
|
|
46
|
+
|
|
47
|
+
Request:
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"email": "admin@example.com",
|
|
51
|
+
"password": "change-this-password"
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Response:
|
|
56
|
+
```json
|
|
57
|
+
{
|
|
58
|
+
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
|
59
|
+
"user": {
|
|
60
|
+
"id": "admin-id",
|
|
61
|
+
"email": "admin@example.com",
|
|
62
|
+
"name": "Administrator",
|
|
63
|
+
"role": "project_admin"
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
# Mac/Linux
|
|
70
|
+
curl -X POST http://localhost:7130/api/auth/admin/sessions \
|
|
71
|
+
-H 'Content-Type: application/json' \
|
|
72
|
+
-d '{"email":"admin@example.com","password":"change-this-password"}'
|
|
73
|
+
|
|
74
|
+
# Windows PowerShell (use curl.exe)
|
|
75
|
+
curl.exe -X POST http://localhost:7130/api/auth/admin/sessions \
|
|
76
|
+
-H "Content-Type: application/json" \
|
|
77
|
+
-d '{\"email\":\"admin@example.com\",\"password\":\"change-this-password\"}'
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Error Response Format
|
|
81
|
+
|
|
82
|
+
All error responses follow this format:
|
|
83
|
+
```json
|
|
84
|
+
{
|
|
85
|
+
"code": "ERROR_CODE",
|
|
86
|
+
"message": "Human-readable error message"
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Example error:
|
|
91
|
+
```json
|
|
92
|
+
{
|
|
93
|
+
"code": "INVALID_EMAIL",
|
|
94
|
+
"message": "Please provide a valid email"
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## OAuth Support
|
|
99
|
+
|
|
100
|
+
Insforge supports Google and GitHub OAuth when configured with environment variables.
|
|
101
|
+
|
|
102
|
+
OAuth workflow:
|
|
103
|
+
1. End user initiates OAuth login and receives authorization URL from backend
|
|
104
|
+
2. After successful user authorization, Google/GitHub redirects to backend callback
|
|
105
|
+
3. Backend generates JWT token and redirects to the application page
|
|
106
|
+
|
|
107
|
+
Prerequisites:
|
|
108
|
+
1. Create Google or GitHub OAuth Application and obtain Client ID and Client Secret
|
|
109
|
+
2. Configure each platform's Client ID/Client Secret in InsForge backend (via Environment Variables)
|
|
110
|
+
|
|
111
|
+
### OAuth Endpoints
|
|
112
|
+
|
|
113
|
+
#### Get OAuth URL (Google/GitHub)
|
|
114
|
+
**GET** `/api/auth/oauth/:provider`
|
|
115
|
+
|
|
116
|
+
Parameters:
|
|
117
|
+
- `provider`: "google" or "github" in the URL path
|
|
118
|
+
- Query params: `?redirect_uri=http://localhost:3000/dashboard`
|
|
119
|
+
|
|
120
|
+
Returns: `{"authUrl": "https://accounts.google.com/..."}` - URL to redirect user to provider's OAuth page.
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
# Mac/Linux
|
|
124
|
+
curl -X GET "http://localhost:7130/api/auth/oauth/google?redirect_uri=http://localhost:3000/dashboard"
|
|
125
|
+
|
|
126
|
+
# Windows PowerShell (use curl.exe)
|
|
127
|
+
curl.exe -X GET "http://localhost:7130/api/auth/oauth/google?redirect_uri=http://localhost:3000/dashboard"
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Example response:
|
|
131
|
+
```json
|
|
132
|
+
{
|
|
133
|
+
"authUrl": "https://accounts.google.com/o/oauth2/v2/auth?client_id=..."
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
#### OAuth Callback
|
|
138
|
+
The OAuth provider will redirect to:
|
|
139
|
+
- Google: `http://localhost:7130/api/auth/oauth/google/callback`
|
|
140
|
+
- GitHub: `http://localhost:7130/api/auth/oauth/github/callback`
|
|
141
|
+
|
|
142
|
+
After processing, backend redirects to your specified `redirect_uri` with JWT token in URL parameters:
|
|
143
|
+
- `access_token` - JWT authentication token
|
|
144
|
+
- `user_id` - User's unique ID
|
|
145
|
+
- `email` - User's email address
|
|
146
|
+
- `name` - User's display name
|
|
147
|
+
|
|
148
|
+
## User Profile Table
|
|
149
|
+
|
|
150
|
+
### Users Table
|
|
151
|
+
The `users` table stores **user profile data**:
|
|
152
|
+
- **✅ READ** via: `GET /api/database/records/users`
|
|
153
|
+
- **✅ WRITE** via: `PATCH /api/database/records/users?id=eq.<user_id>`
|
|
154
|
+
- **✅ Foreign keys allowed** - reference `users.id`
|
|
155
|
+
- **IMPORTANT**: Add columns to this table for profile data instead of creating separate profile tables
|
|
156
|
+
|
|
157
|
+
**Schema:**
|
|
158
|
+
- `id` - User ID (UUID, primary key)
|
|
159
|
+
- `nickname` - Display name (text, nullable)
|
|
160
|
+
- `avatar_url` - Profile picture URL (text, nullable)
|
|
161
|
+
- `bio` - User biography (text, nullable)
|
|
162
|
+
- `birthday` - Birth date (date, nullable)
|
|
163
|
+
- `created_at` - Account creation timestamp
|
|
164
|
+
- `updated_at` - Last update timestamp
|
|
165
|
+
|
|
166
|
+
**Note:** Email and name from auth are returned by Auth API, not stored in users table
|
|
167
|
+
|
|
168
|
+
Example - Create table with user reference:
|
|
169
|
+
```json
|
|
170
|
+
{
|
|
171
|
+
"table_name": "posts",
|
|
172
|
+
"columns": [
|
|
173
|
+
{
|
|
174
|
+
"name": "title",
|
|
175
|
+
"type": "string",
|
|
176
|
+
"nullable": false,
|
|
177
|
+
"is_unique": false
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
"name": "user_id",
|
|
181
|
+
"type": "string",
|
|
182
|
+
"nullable": false,
|
|
183
|
+
"is_unique": false,
|
|
184
|
+
"foreign_key": {
|
|
185
|
+
"reference_table": "users",
|
|
186
|
+
"reference_column": "id",
|
|
187
|
+
"on_delete": "CASCADE",
|
|
188
|
+
"on_update": "CASCADE"
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
]
|
|
192
|
+
}
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### Available Tables
|
|
196
|
+
- **users** - User profile data (read/write access)
|
|
197
|
+
- Use this table for foreign key references
|
|
198
|
+
- Update profiles with PATCH requests
|
|
199
|
+
|
|
200
|
+
## Headers Summary
|
|
201
|
+
|
|
202
|
+
| API Type | Header Required |
|
|
203
|
+
|----------|----------------|
|
|
204
|
+
| Auth endpoints | None |
|
|
205
|
+
| Database/Storage | `Authorization: Bearer <accessToken>` |
|
|
206
|
+
| MCP testing only | `x-api-key: <key>` |
|
|
207
|
+
|
|
208
|
+
## Critical Notes
|
|
209
|
+
|
|
210
|
+
1. `/api/auth/sessions/current` returns `{"user": {...}}` - nested, not root level
|
|
211
|
+
2. `/api/auth/sessions/current` only has: id, email, role (limited fields)
|
|
212
|
+
3. Full user profile: `GET /api/database/records/users?id=eq.<id>`
|
|
213
|
+
4. POST to database requires `[{...}]` array format always
|
|
214
|
+
5. Auth endpoints (register/login): no headers needed
|
|
215
|
+
6. Protected endpoints: `Authorization: Bearer <accessToken>`
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# InsForge Auth SDK
|
|
2
|
+
|
|
3
|
+
## Setup
|
|
4
|
+
```javascript
|
|
5
|
+
import { createClient } from '@insforge/sdk';
|
|
6
|
+
const client = createClient({ baseUrl: 'http://localhost:7130' });
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## Methods
|
|
10
|
+
|
|
11
|
+
### signUp
|
|
12
|
+
```javascript
|
|
13
|
+
await client.auth.signUp({ email, password, name? })
|
|
14
|
+
// Returns: { data: { accessToken, user }, error }
|
|
15
|
+
// user: { id, email, name, emailVerified, createdAt, updatedAt }
|
|
16
|
+
// Token auto-stored
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### signInWithPassword
|
|
20
|
+
```javascript
|
|
21
|
+
await client.auth.signInWithPassword({ email, password })
|
|
22
|
+
// Returns: { data: { accessToken, user }, error }
|
|
23
|
+
// Token auto-stored
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### signInWithOAuth
|
|
27
|
+
```javascript
|
|
28
|
+
const { data, error } = await client.auth.signInWithOAuth({
|
|
29
|
+
provider: 'google'|'github',
|
|
30
|
+
redirectTo: window.location.origin,
|
|
31
|
+
skipBrowserRedirect: true
|
|
32
|
+
})
|
|
33
|
+
// Returns: { data: { url, provider }, error }
|
|
34
|
+
|
|
35
|
+
// Manual redirect required
|
|
36
|
+
if (data?.url) {
|
|
37
|
+
window.location.href = data.url
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// ⚠️ IMPORTANT: No callback handling needed!
|
|
41
|
+
// After OAuth, user returns to redirectTo URL already authenticated
|
|
42
|
+
// The SDK automatically:
|
|
43
|
+
// - Handles the OAuth callback
|
|
44
|
+
// - Stores the JWT token
|
|
45
|
+
// - Makes user available via getCurrentUser()
|
|
46
|
+
|
|
47
|
+
// ❌ DON'T DO THIS (not needed):
|
|
48
|
+
// const accessToken = urlParams.get('access_token')
|
|
49
|
+
// const userId = urlParams.get('user_id')
|
|
50
|
+
|
|
51
|
+
// ✅ DO THIS INSTEAD (after redirect back):
|
|
52
|
+
const { data: userData } = await client.auth.getCurrentUser()
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### getCurrentUser
|
|
56
|
+
```javascript
|
|
57
|
+
await client.auth.getCurrentUser()
|
|
58
|
+
// Returns: { data: { user: { id, email, role }, profile: {...} }, error }
|
|
59
|
+
// Makes API call to validate token and fetch profile
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### getCurrentSession
|
|
63
|
+
```javascript
|
|
64
|
+
await client.auth.getCurrentSession()
|
|
65
|
+
// Returns: { data: { session: { accessToken, user } }, error }
|
|
66
|
+
// From localStorage, no API call
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### getProfile
|
|
70
|
+
```javascript
|
|
71
|
+
await client.auth.getProfile(userId)
|
|
72
|
+
// Returns: { data: { id, nickname, bio, ... }, error }
|
|
73
|
+
// Returns single object, not array!
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### setProfile
|
|
77
|
+
```javascript
|
|
78
|
+
await client.auth.setProfile({ nickname, bio, avatar_url })
|
|
79
|
+
// Returns: { data: { id, nickname, bio, ... }, error }
|
|
80
|
+
// Returns single object, not array!
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### signOut
|
|
84
|
+
```javascript
|
|
85
|
+
await client.auth.signOut()
|
|
86
|
+
// Returns: { error }
|
|
87
|
+
// Clears token from storage
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Error Codes
|
|
91
|
+
- `INVALID_EMAIL`
|
|
92
|
+
- `WEAK_PASSWORD`
|
|
93
|
+
- `USER_ALREADY_EXISTS`
|
|
94
|
+
- `INVALID_CREDENTIALS`
|
|
95
|
+
- `INVALID_TOKEN`
|
|
96
|
+
|
|
97
|
+
## Notes
|
|
98
|
+
- Tokens stored in localStorage (browser) or memory (Node.js)
|
|
99
|
+
- All requests after login automatically include token
|
|
100
|
+
- User profile data in `users` table, not auth
|