insforge 1.3.0 → 1.4.8
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/CHANGELOG.md +2 -0
- package/auth/package.json +5 -3
- package/auth/src/lib/broadcastService.ts +115 -117
- package/auth/src/lib/insforge.ts +8 -0
- package/auth/src/main.tsx +2 -4
- package/auth/src/pages/SignInPage.tsx +60 -60
- package/auth/src/pages/SignUpPage.tsx +60 -60
- package/auth/src/pages/VerifyEmailPage.tsx +18 -0
- package/auth/tsconfig.json +2 -1
- package/backend/package.json +10 -6
- package/backend/src/api/middlewares/rate-limiters.ts +127 -127
- package/backend/src/api/routes/ai/index.routes.ts +475 -468
- package/backend/src/api/routes/auth/index.routes.ts +85 -32
- package/backend/src/api/routes/auth/oauth.routes.ts +11 -6
- package/backend/src/api/routes/database/index.routes.ts +2 -0
- package/backend/src/api/routes/database/records.routes.ts +39 -175
- package/backend/src/api/routes/database/rpc.routes.ts +69 -0
- package/backend/src/api/routes/deployments/index.routes.ts +192 -0
- package/backend/src/api/routes/docs/index.routes.ts +3 -2
- package/backend/src/api/routes/email/index.routes.ts +35 -35
- package/backend/src/api/routes/functions/index.routes.ts +3 -3
- package/backend/src/api/routes/metadata/index.routes.ts +26 -0
- package/backend/src/api/routes/webhooks/index.routes.ts +109 -0
- package/backend/src/infra/database/database.manager.ts +0 -10
- package/backend/src/infra/database/migrations/018_schema-rework.sql +441 -0
- package/backend/src/infra/database/migrations/019_create-deployments-table.sql +36 -0
- package/backend/src/infra/database/migrations/020_add-audio-modality.sql +11 -0
- package/backend/src/infra/database/migrations/bootstrap/bootstrap-migrations.js +103 -0
- package/backend/src/infra/security/token.manager.ts +1 -4
- package/backend/src/providers/ai/openrouter.provider.ts +12 -3
- package/backend/src/providers/database/base.provider.ts +39 -0
- package/backend/src/providers/database/cloud.provider.ts +159 -0
- package/backend/src/providers/deployments/vercel.provider.ts +516 -0
- package/backend/src/server.ts +19 -7
- package/backend/src/services/ai/ai-config.service.ts +6 -6
- package/backend/src/services/ai/ai-model.service.ts +60 -60
- package/backend/src/services/ai/ai-usage.service.ts +7 -7
- package/backend/src/services/ai/chat-completion.service.ts +415 -220
- package/backend/src/services/ai/helpers.ts +64 -64
- package/backend/src/services/ai/index.ts +13 -13
- package/backend/src/services/auth/auth-config.service.ts +4 -4
- package/backend/src/services/auth/auth-otp.service.ts +6 -6
- package/backend/src/services/auth/auth.service.ts +134 -74
- package/backend/src/services/auth/index.ts +4 -4
- package/backend/src/services/auth/oauth-config.service.ts +12 -12
- package/backend/src/services/database/database-advance.service.ts +19 -55
- package/backend/src/services/database/database-table.service.ts +38 -85
- package/backend/src/services/database/postgrest-proxy.service.ts +165 -0
- package/backend/src/services/deployments/deployment.service.ts +693 -0
- package/backend/src/services/functions/function.service.ts +61 -41
- package/backend/src/services/logs/audit.service.ts +10 -10
- package/backend/src/services/secrets/secret.service.ts +101 -27
- package/backend/src/services/storage/storage.service.ts +30 -30
- package/backend/src/services/usage/usage.service.ts +6 -6
- package/backend/src/types/ai.ts +8 -0
- package/backend/src/types/auth.ts +5 -1
- package/backend/src/types/database.ts +2 -0
- package/backend/src/types/deployments.ts +33 -0
- package/backend/src/types/storage.ts +1 -1
- package/backend/src/types/webhooks.ts +45 -0
- package/backend/src/utils/cookies.ts +34 -35
- package/backend/src/utils/environment.ts +0 -14
- package/backend/src/utils/s3-config-loader.ts +64 -64
- package/backend/src/utils/seed.ts +334 -301
- package/backend/src/utils/sql-parser.ts +126 -0
- package/backend/src/utils/utils.ts +114 -114
- package/backend/src/utils/validations.ts +10 -10
- package/backend/tests/local/test-rpc.sh +141 -0
- package/backend/tests/local/test-secrets.sh +1 -1
- package/backend/tests/manual/test-ai-model-plugins.sh +258 -0
- package/backend/tests/manual/test-rawsql-modes.sh +24 -24
- package/backend/tests/unit/database-advance.test.ts +326 -0
- package/backend/tests/unit/helpers.test.ts +2 -2
- package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +13 -10
- package/docker-compose.prod.yml +1 -1
- package/docker-compose.yml +1 -1
- package/docs/agent-docs/deployment.md +79 -0
- package/docs/changelog.mdx +165 -72
- package/docs/core-concepts/ai/architecture.mdx +1 -23
- package/docs/core-concepts/ai/sdk.mdx +26 -1
- package/docs/core-concepts/authentication/architecture.mdx +6 -8
- package/docs/core-concepts/authentication/sdk.mdx +387 -91
- package/docs/core-concepts/authentication/ui-components/customization.mdx +460 -256
- package/docs/core-concepts/authentication/ui-components/nextjs.mdx +50 -24
- package/docs/core-concepts/authentication/ui-components/react-router.mdx +18 -19
- package/docs/core-concepts/authentication/ui-components/react.mdx +26 -19
- package/docs/core-concepts/database/architecture.mdx +58 -21
- package/docs/core-concepts/database/pgvector.mdx +138 -0
- package/docs/core-concepts/database/sdk.mdx +17 -17
- package/docs/core-concepts/deployments/architecture.mdx +152 -0
- package/docs/core-concepts/email/architecture.mdx +4 -2
- package/docs/core-concepts/functions/architecture.mdx +1 -1
- package/docs/core-concepts/functions/sdk.mdx +0 -1
- package/docs/core-concepts/realtime/architecture.mdx +1 -1
- package/docs/core-concepts/storage/architecture.mdx +1 -1
- package/docs/core-concepts/storage/sdk.mdx +25 -25
- package/docs/docs.json +14 -6
- package/docs/favicon.png +0 -0
- package/docs/favicon.svg +3 -18
- package/docs/images/changelog/dec-2025/apple-oauth.mp4 +0 -0
- package/docs/images/changelog/dec-2025/moreModels.png +0 -0
- package/docs/images/changelog/dec-2025/multi-region.webp +0 -0
- package/docs/images/changelog/dec-2025/postgres-connection.webp +0 -0
- package/docs/images/changelog/dec-2025/realtime2.png +0 -0
- package/docs/images/mcp-setup/CC-MCP-1.mp4 +0 -0
- package/docs/images/mcp-setup/CC-MCP-2.mp4 +0 -0
- package/docs/images/mcp-setup/Cursor-MCP-1.mp4 +0 -0
- package/docs/images/mcp-setup/Cursor-MCP-2.mp4 +0 -0
- package/docs/images/mcp-setup/Cursor-MCP-3.mp4 +0 -0
- package/docs/images/mcp-setup/claude-code-connect.png +0 -0
- package/docs/images/mcp-setup/cline-1.png +0 -0
- package/docs/images/mcp-setup/cline-2.png +0 -0
- package/docs/images/mcp-setup/cline-3.png +0 -0
- package/docs/images/mcp-setup/connect-project.png +0 -0
- package/docs/images/mcp-setup/copilot-1.png +0 -0
- package/docs/images/mcp-setup/copilot-2.png +0 -0
- package/docs/images/mcp-setup/copilot-3.png +0 -0
- package/docs/images/mcp-setup/mcp-json-1.png +0 -0
- package/docs/images/mcp-setup/mcp-json-2.png +0 -0
- package/docs/images/mcp-setup/qoder-1.png +0 -0
- package/docs/images/mcp-setup/qoder-2.png +0 -0
- package/docs/images/mcp-setup/roocode-1.png +0 -0
- package/docs/images/mcp-setup/roocode-2.png +0 -0
- package/docs/images/mcp-setup/trae-1.png +0 -0
- package/docs/images/mcp-setup/trae-2.png +0 -0
- package/docs/images/mcp-setup/trae-3.png +0 -0
- package/docs/images/mcp-setup/trae-4.png +0 -0
- package/docs/images/mcp-setup/trae-5.png +0 -0
- package/docs/images/mcp-setup/windsurf-1.png +0 -0
- package/docs/images/mcp-setup/windsurf-2.png +0 -0
- package/docs/insforge-instructions-sdk.md +7 -3
- package/docs/introduction.mdx +9 -8
- package/docs/mcp-setup.mdx +332 -0
- package/docs/oauth-server.mdx +563 -0
- package/docs/partnership.mdx +79 -10
- package/docs/quickstart.mdx +1 -1
- package/docs/vscode-extension.mdx +74 -0
- package/eslint.config.js +1 -0
- package/examples/response-examples.md +1 -1
- package/frontend/package.json +1 -1
- package/frontend/src/App.tsx +8 -3
- package/frontend/src/assets/logos/antigravity.svg +1 -0
- package/frontend/src/assets/logos/copilot.svg +10 -0
- package/frontend/src/assets/logos/deepseek.svg +139 -0
- package/frontend/src/assets/logos/kiro.svg +9 -0
- package/frontend/src/assets/logos/qoder.svg +4 -0
- package/frontend/src/assets/logos/qwen.svg +15 -0
- package/frontend/src/components/CodeBlock.tsx +2 -2
- package/frontend/src/components/ConnectCTA.tsx +3 -2
- package/frontend/src/components/datagrid/DataGrid.tsx +90 -62
- package/frontend/src/components/datagrid/datagridTypes.tsx +2 -1
- package/frontend/src/components/datagrid/index.ts +1 -1
- package/frontend/src/components/index.ts +0 -1
- package/frontend/src/components/layout/AppHeader.tsx +4 -27
- package/frontend/src/components/layout/AppSidebar.tsx +85 -100
- package/frontend/src/components/layout/Layout.tsx +34 -32
- package/frontend/src/components/layout/PrimaryMenu.tsx +12 -4
- package/frontend/src/components/radix/Select.tsx +151 -151
- package/frontend/src/features/ai/components/AIConfigCard.tsx +200 -200
- package/frontend/src/features/ai/components/AIEmptyState.tsx +23 -23
- package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +102 -101
- package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -135
- package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -51
- package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -118
- package/frontend/src/features/ai/components/index.ts +6 -6
- package/frontend/src/features/ai/helpers.ts +147 -141
- package/frontend/src/features/ai/pages/AIPage.tsx +166 -166
- package/frontend/src/features/auth/components/AuthPreview.tsx +96 -96
- package/frontend/src/features/auth/components/UsersDataGrid.tsx +55 -31
- package/frontend/src/features/auth/components/index.ts +5 -5
- package/frontend/src/features/auth/pages/AuthMethodsPage.tsx +275 -275
- package/frontend/src/features/dashboard/pages/DashboardPage.tsx +1 -1
- package/frontend/src/features/database/components/DatabaseDataGrid.tsx +0 -2
- package/frontend/src/features/database/components/ForeignKeyCell.tsx +38 -11
- package/frontend/src/features/database/components/ForeignKeyPopover.tsx +18 -8
- package/frontend/src/features/database/components/LinkRecordModal.tsx +61 -13
- package/frontend/src/features/database/components/RecordFormField.tsx +1 -1
- package/frontend/src/features/database/components/TableSidebar.tsx +0 -3
- package/frontend/src/features/database/components/TablesEmptyState.tsx +1 -1
- package/frontend/src/features/database/components/TemplatePreview.tsx +1 -2
- package/frontend/src/features/database/constants.ts +16 -28
- package/frontend/src/features/database/hooks/useCSVImport.ts +3 -2
- package/frontend/src/features/database/hooks/useRawSQL.ts +3 -2
- package/frontend/src/features/database/hooks/useTables.ts +5 -7
- package/frontend/src/features/database/pages/FunctionsPage.tsx +0 -5
- package/frontend/src/features/database/pages/IndexesPage.tsx +0 -5
- package/frontend/src/features/database/pages/PoliciesPage.tsx +0 -5
- package/frontend/src/features/database/pages/SQLEditorPage.tsx +2 -2
- package/frontend/src/features/database/pages/TriggersPage.tsx +0 -5
- package/frontend/src/features/database/services/advance.service.ts +1 -15
- package/frontend/src/features/database/services/record.service.ts +4 -20
- package/frontend/src/features/database/services/table.service.ts +1 -4
- package/frontend/src/features/database/templates/ai-chatbot.ts +6 -6
- package/frontend/src/features/database/templates/ecommerce-platform.ts +2 -2
- package/frontend/src/features/database/templates/instagram-clone.ts +10 -10
- package/frontend/src/features/database/templates/notion-clone.ts +8 -8
- package/frontend/src/features/database/templates/reddit-clone.ts +10 -10
- package/frontend/src/features/deployments/components/DeploymentRow.tsx +93 -0
- package/frontend/src/features/deployments/components/DeploymentsEmptyState.tsx +15 -0
- package/frontend/src/features/deployments/hooks/useDeployments.ts +157 -0
- package/frontend/src/features/deployments/pages/DeploymentsPage.tsx +318 -0
- package/frontend/src/features/deployments/services/deployments.service.ts +63 -0
- package/frontend/src/features/functions/components/FunctionRow.tsx +72 -72
- package/frontend/src/features/functions/components/FunctionsSidebar.tsx +56 -56
- package/frontend/src/features/functions/components/SecretRow.tsx +3 -3
- package/frontend/src/features/functions/components/index.ts +5 -5
- package/frontend/src/features/functions/hooks/useFunctions.ts +5 -4
- package/frontend/src/features/functions/hooks/useSecrets.ts +6 -9
- package/frontend/src/features/functions/pages/SecretsPage.tsx +118 -118
- package/frontend/src/features/functions/services/function.service.ts +8 -25
- package/frontend/src/features/functions/services/secret.service.ts +23 -41
- package/frontend/src/features/login/pages/CloudLoginPage.tsx +125 -118
- package/frontend/src/features/logs/components/LogDetailPanel.tsx +41 -0
- package/frontend/src/features/logs/components/LogsDataGrid.tsx +32 -1
- package/frontend/src/features/logs/components/index.ts +1 -0
- package/frontend/src/features/logs/pages/LogsPage.tsx +36 -6
- package/frontend/src/features/onboard/components/ApiCredentialsSection.tsx +59 -0
- package/frontend/src/features/onboard/components/ConnectionStringSection.tsx +180 -0
- package/frontend/src/features/onboard/components/McpConnectionSection.tsx +159 -0
- package/frontend/src/features/onboard/components/OnboardingController.tsx +68 -0
- package/frontend/src/features/onboard/components/OnboardingModal.tsx +121 -267
- package/frontend/src/features/onboard/components/ShowPasswordButton.tsx +21 -0
- package/frontend/src/features/onboard/components/index.ts +9 -4
- package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +1 -1
- package/frontend/src/features/onboard/components/mcp/QoderDeeplinkGenerator.tsx +36 -0
- package/frontend/src/features/onboard/components/mcp/helpers.tsx +123 -98
- package/frontend/src/features/onboard/components/mcp/index.ts +4 -3
- package/frontend/src/features/onboard/index.ts +17 -13
- package/frontend/src/features/settings/pages/SettingsPage.tsx +349 -0
- package/frontend/src/features/visualizer/components/AuthNode.tsx +4 -4
- package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +21 -8
- package/frontend/src/features/visualizer/pages/VisualizerPage.tsx +10 -1
- package/frontend/src/index.css +249 -249
- package/frontend/src/lib/contexts/ModalContext.tsx +35 -0
- package/frontend/src/lib/hooks/useMetadata.ts +45 -1
- package/frontend/src/lib/hooks/useModal.tsx +2 -0
- package/frontend/src/lib/routing/AppRoutes.tsx +103 -99
- package/frontend/src/lib/services/metadata.service.ts +20 -3
- package/frontend/src/lib/utils/menuItems.ts +223 -207
- package/frontend/src/lib/utils/utils.ts +196 -196
- package/functions/server.ts +315 -315
- package/functions/worker-template.js +1 -1
- package/openapi/ai.yaml +115 -5
- package/openapi/auth.yaml +97 -17
- package/openapi/logs.yaml +0 -2
- package/openapi/metadata.yaml +0 -2
- package/openapi/records.yaml +21 -21
- package/openapi/tables.yaml +1 -2
- package/package.json +1 -1
- package/shared-schemas/package.json +1 -1
- package/shared-schemas/src/ai-api.schema.ts +251 -143
- package/shared-schemas/src/ai.schema.ts +63 -63
- package/shared-schemas/src/auth-api.schema.ts +34 -6
- package/shared-schemas/src/auth.schema.ts +17 -10
- package/shared-schemas/src/cloud-events.schema.ts +26 -0
- package/shared-schemas/src/deployments-api.schema.ts +55 -0
- package/shared-schemas/src/deployments.schema.ts +30 -0
- package/shared-schemas/src/docs.schema.ts +8 -2
- package/shared-schemas/src/email-api.schema.ts +30 -30
- package/shared-schemas/src/functions-api.schema.ts +13 -4
- package/shared-schemas/src/functions.schema.ts +1 -1
- package/shared-schemas/src/index.ts +22 -18
- package/shared-schemas/src/metadata.schema.ts +30 -4
- package/shared-schemas/src/secrets-api.schema.ts +44 -0
- package/shared-schemas/src/secrets.schema.ts +15 -0
- package/zeabur/README.md +13 -0
- package/zeabur/template.yml +20 -51
- package/backend/src/types/profile.ts +0 -55
- package/frontend/src/components/ProjectInfoModal.tsx +0 -128
|
@@ -1,23 +1,33 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Next.js
|
|
3
|
-
description:
|
|
3
|
+
description: Quick authentication setup for Next.js apps using hosted auth pages
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
The `@insforge/nextjs` package provides
|
|
6
|
+
The `@insforge/nextjs` package provides authentication for Next.js applications using **hosted auth pages**.
|
|
7
|
+
|
|
8
|
+
When users sign in, they're redirected to your InsForge backend's login page, then returned to your app after authentication—no UI code required.
|
|
9
|
+
|
|
10
|
+
<Tip>
|
|
11
|
+
Want to build custom login pages instead? See [Custom Auth
|
|
12
|
+
Pages](/core-concepts/authentication/ui-components/customization).
|
|
13
|
+
</Tip>
|
|
7
14
|
|
|
8
15
|
## Quick Start
|
|
9
16
|
|
|
10
|
-
### Step 1:
|
|
17
|
+
### Step 1: Create New Next.js Project (Required)
|
|
11
18
|
|
|
12
19
|
```bash
|
|
13
20
|
npm install @insforge/nextjs@latest
|
|
14
21
|
```
|
|
15
22
|
|
|
23
|
+
### Step 2: Set Environment Variables
|
|
24
|
+
|
|
16
25
|
```bash .env.local
|
|
17
26
|
NEXT_PUBLIC_INSFORGE_BASE_URL=https://your-app.region.insforge.app
|
|
27
|
+
NEXT_PUBLIC_INSFORGE_ANON_KEY=your-anon-key-here
|
|
18
28
|
```
|
|
19
29
|
|
|
20
|
-
### Step
|
|
30
|
+
### Step 3: Add Middleware
|
|
21
31
|
|
|
22
32
|
Create middleware to protect routes:
|
|
23
33
|
|
|
@@ -36,7 +46,7 @@ export const config = {
|
|
|
36
46
|
};
|
|
37
47
|
```
|
|
38
48
|
|
|
39
|
-
### Step
|
|
49
|
+
### Step 4: Create API Route
|
|
40
50
|
|
|
41
51
|
Create an API route to enable server-side rendering (SSR) and cookie-based authentication:
|
|
42
52
|
|
|
@@ -54,19 +64,36 @@ export const DELETE = handlers.DELETE;
|
|
|
54
64
|
|
|
55
65
|
<Info>**Why?** This route syncs auth tokens to HTTP-only cookies for server-side middleware.</Info>
|
|
56
66
|
|
|
57
|
-
### Step
|
|
67
|
+
### Step 5: Create InsforgeProvider Component
|
|
68
|
+
|
|
69
|
+
```tsx
|
|
70
|
+
// app/providers.tsx
|
|
71
|
+
'use client';
|
|
72
|
+
import { InsforgeBrowserProvider, type InitialAuthState } from '@insforge/nextjs';
|
|
73
|
+
import { insforge } from '@/lib/insforge';
|
|
74
|
+
|
|
75
|
+
export function InsforgeProvider({ children }: { children: React.ReactNode }) {
|
|
76
|
+
return (
|
|
77
|
+
<InsforgeBrowserProvider client={insforge} afterSignInUrl="/dashboard">
|
|
78
|
+
{children}
|
|
79
|
+
</InsforgeBrowserProvider>
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Step 6: Add InsforgeProvider to Root Layout
|
|
58
85
|
|
|
59
86
|
Wrap your application with the `InsforgeProvider` in your root layout:
|
|
60
87
|
|
|
61
88
|
```tsx app/layout.tsx
|
|
62
89
|
import {
|
|
63
|
-
InsforgeProvider,
|
|
64
90
|
SignedIn,
|
|
65
91
|
SignedOut,
|
|
66
92
|
SignInButton,
|
|
67
93
|
SignUpButton,
|
|
68
94
|
UserButton,
|
|
69
95
|
} from '@insforge/nextjs';
|
|
96
|
+
import { InsforgeProvider } from './providers';
|
|
70
97
|
|
|
71
98
|
export const metadata: Metadata = {
|
|
72
99
|
title: 'InsForge Next.js Quickstart',
|
|
@@ -77,11 +104,7 @@ export default function RootLayout({ children }: { children: React.ReactNode })
|
|
|
77
104
|
return (
|
|
78
105
|
<html lang="en">
|
|
79
106
|
<body>
|
|
80
|
-
<InsforgeProvider
|
|
81
|
-
baseUrl={
|
|
82
|
-
process.env.NEXT_PUBLIC_INSFORGE_BASE_URL || 'https://your-app.region.insforge.app' // Replace with your InsForge backend URL
|
|
83
|
-
}
|
|
84
|
-
>
|
|
107
|
+
<InsforgeProvider>
|
|
85
108
|
<nav>
|
|
86
109
|
<SignedOut>
|
|
87
110
|
<SignInButton />
|
|
@@ -152,8 +175,8 @@ function UserProfile() {
|
|
|
152
175
|
<div>
|
|
153
176
|
<p>Id: {user.id}</p>
|
|
154
177
|
<p>Email: {user.email}</p>
|
|
155
|
-
<p>Name: {user.name}</p>
|
|
156
|
-
<img src={user.
|
|
178
|
+
<p>Name: {user.profile.name}</p>
|
|
179
|
+
<img src={user.profile.avatar_url} alt="Avatar" />
|
|
157
180
|
</div>
|
|
158
181
|
);
|
|
159
182
|
}
|
|
@@ -161,7 +184,8 @@ function UserProfile() {
|
|
|
161
184
|
|
|
162
185
|
**Returns:**
|
|
163
186
|
|
|
164
|
-
- `user` - User object with id, email,
|
|
187
|
+
- `user` - User object with id, email, profile
|
|
188
|
+
- `user.profile` - User profile object with name, avatar_url, and other custom fields
|
|
165
189
|
- `isLoaded` - Boolean loading state
|
|
166
190
|
|
|
167
191
|
### Server side functions
|
|
@@ -177,15 +201,15 @@ import { createClient } from '@insforge/sdk';
|
|
|
177
201
|
export async function POST(request: NextRequest) {
|
|
178
202
|
try {
|
|
179
203
|
// Authenticate the request and get user info
|
|
180
|
-
const {
|
|
204
|
+
const { token } = await auth();
|
|
181
205
|
|
|
182
206
|
// Parse request body to get the prompt
|
|
183
207
|
const { prompt } = await request.json();
|
|
184
208
|
|
|
185
|
-
// Create InsForge SDK
|
|
209
|
+
// Create InsForge SDK client with user's token for authenticated access
|
|
186
210
|
const insforge = createClient({
|
|
187
|
-
baseUrl: process.env.NEXT_PUBLIC_INSFORGE_BASE_URL ||
|
|
188
|
-
|
|
211
|
+
baseUrl: process.env.NEXT_PUBLIC_INSFORGE_BASE_URL || 'https://your-app.region.insforge.app',
|
|
212
|
+
edgeFunctionToken: token,
|
|
189
213
|
});
|
|
190
214
|
|
|
191
215
|
// Request for AI response
|
|
@@ -209,13 +233,15 @@ export async function POST(request: NextRequest) {
|
|
|
209
233
|
},
|
|
210
234
|
{ status: 201 }
|
|
211
235
|
);
|
|
212
|
-
|
|
213
236
|
} catch (error) {
|
|
214
237
|
console.error(error);
|
|
215
|
-
return NextResponse.json(
|
|
216
|
-
{ error: 'Internal server error' },
|
|
217
|
-
{ status: 500 }
|
|
218
|
-
);
|
|
238
|
+
return NextResponse.json({ error: 'Internal server error' }, { status: 500 });
|
|
219
239
|
}
|
|
220
240
|
}
|
|
221
241
|
```
|
|
242
|
+
|
|
243
|
+
**Returns:**
|
|
244
|
+
|
|
245
|
+
- `user` - User object with id, email, profile
|
|
246
|
+
- `userId` - User ID
|
|
247
|
+
- `token` - User's access token
|
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: React
|
|
3
|
-
description:
|
|
2
|
+
title: React Router
|
|
3
|
+
description: Quick authentication setup for React+Vite+React Router apps using hosted auth pages
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
The `@insforge/react-router` package provides
|
|
6
|
+
The `@insforge/react-router` package provides authentication for React+Vite+React Router applications using **hosted auth pages**.
|
|
7
|
+
|
|
8
|
+
When users sign in, they're redirected to your InsForge backend's login page, then returned to your app after authentication—no UI code required.
|
|
9
|
+
|
|
10
|
+
<Tip>
|
|
11
|
+
Want to build custom login pages instead? See [Custom Auth
|
|
12
|
+
Pages](/core-concepts/authentication/ui-components/customization).
|
|
13
|
+
</Tip>
|
|
7
14
|
|
|
8
15
|
## Quick Start
|
|
9
16
|
|
|
10
17
|
### Step 1: Create New React Project (Required)
|
|
11
18
|
|
|
12
|
-
|
|
13
19
|
```bash
|
|
14
20
|
npm install react-router-dom @insforge/react-router@latest
|
|
15
21
|
```
|
|
@@ -30,14 +36,11 @@ import { StrictMode } from 'react';
|
|
|
30
36
|
import { createRoot } from 'react-dom/client';
|
|
31
37
|
import { InsforgeProvider } from '@insforge/react-router';
|
|
32
38
|
import App from './App';
|
|
39
|
+
import { insforge } from './lib/insforge';
|
|
33
40
|
|
|
34
41
|
createRoot(document.getElementById('root')!).render(
|
|
35
42
|
<StrictMode>
|
|
36
|
-
<InsforgeProvider
|
|
37
|
-
baseUrl={
|
|
38
|
-
import.meta.env.VITE_INSFORGE_BASE_URL || 'https://your-app.region.insforge.app' // Replace with your InsForge backend URL
|
|
39
|
-
}
|
|
40
|
-
>
|
|
43
|
+
<InsforgeProvider client={insforge}>
|
|
41
44
|
<App />
|
|
42
45
|
</InsforgeProvider>
|
|
43
46
|
</StrictMode>
|
|
@@ -137,14 +140,10 @@ import { useAuth } from '@insforge/react-router';
|
|
|
137
140
|
|
|
138
141
|
function LoginButton() {
|
|
139
142
|
const { isSignedIn, isLoaded } = useAuth();
|
|
140
|
-
|
|
143
|
+
|
|
141
144
|
if (!isLoaded) return <div>Loading...</div>;
|
|
142
145
|
|
|
143
|
-
return
|
|
144
|
-
<div>
|
|
145
|
-
{isSignedIn ? 'Welcome!' : 'Sign In'}
|
|
146
|
-
</div>
|
|
147
|
-
);
|
|
146
|
+
return <div>{isSignedIn ? 'Welcome!' : 'Sign In'}</div>;
|
|
148
147
|
}
|
|
149
148
|
```
|
|
150
149
|
|
|
@@ -166,13 +165,12 @@ function UserProfile() {
|
|
|
166
165
|
if (!isLoaded) return <div>Loading...</div>;
|
|
167
166
|
if (!user) return <div>Not signed in</div>;
|
|
168
167
|
|
|
169
|
-
|
|
170
168
|
return (
|
|
171
169
|
<div>
|
|
172
170
|
<p>Id: {user.id}</p>
|
|
173
171
|
<p>Email: {user.email}</p>
|
|
174
|
-
<p>Name: {user.name}</p>
|
|
175
|
-
<img src={user.
|
|
172
|
+
<p>Name: {user.profile.name}</p>
|
|
173
|
+
<img src={user.profile.avatar_url} alt="Avatar" />
|
|
176
174
|
</div>
|
|
177
175
|
);
|
|
178
176
|
}
|
|
@@ -180,5 +178,6 @@ function UserProfile() {
|
|
|
180
178
|
|
|
181
179
|
**Returns:**
|
|
182
180
|
|
|
183
|
-
- `user` - User object with id, email,
|
|
181
|
+
- `user` - User object with id, email, profile
|
|
182
|
+
- `user.profile` - User profile object with name, avatar_url, and other custom fields
|
|
184
183
|
- `isLoaded` - Boolean loading state
|
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: React
|
|
3
|
-
description:
|
|
3
|
+
description: Quick authentication setup for React+Vite apps using hosted auth pages
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
The `@insforge/react` package provides
|
|
6
|
+
The `@insforge/react` package provides authentication for React+Vite applications using **hosted auth pages**.
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
When users sign in, they're redirected to your InsForge backend's login page, then returned to your app after authentication—no UI code required.
|
|
9
|
+
|
|
10
|
+
<Tip>
|
|
11
|
+
Want to build custom login pages instead? See [Custom Auth
|
|
12
|
+
Pages](/core-concepts/authentication/ui-components/customization).
|
|
13
|
+
</Tip>
|
|
14
|
+
|
|
15
|
+
## Quick Start
|
|
9
16
|
|
|
10
17
|
### Step 1: Create New React Project (Required)
|
|
11
18
|
|
|
@@ -28,15 +35,12 @@ Wrap your app with `InsforgeProvider` in the root:
|
|
|
28
35
|
import { StrictMode } from 'react';
|
|
29
36
|
import { createRoot } from 'react-dom/client';
|
|
30
37
|
import { InsforgeProvider } from '@insforge/react';
|
|
38
|
+
import { insforge } from './lib/insforge';
|
|
31
39
|
import App from './App';
|
|
32
40
|
|
|
33
41
|
createRoot(document.getElementById('root')!).render(
|
|
34
42
|
<StrictMode>
|
|
35
|
-
<InsforgeProvider
|
|
36
|
-
baseUrl={
|
|
37
|
-
import.meta.env.VITE_INSFORGE_BASE_URL || 'https://your-app.region.insforge.app' // Replace with your InsForge backend URL
|
|
38
|
-
}
|
|
39
|
-
>
|
|
43
|
+
<InsforgeProvider client={insforge}>
|
|
40
44
|
<App />
|
|
41
45
|
</InsforgeProvider>
|
|
42
46
|
</StrictMode>
|
|
@@ -46,7 +50,14 @@ createRoot(document.getElementById('root')!).render(
|
|
|
46
50
|
### Step 4: Use Hooks & Components
|
|
47
51
|
|
|
48
52
|
```tsx src/pages/Home.tsx
|
|
49
|
-
import {
|
|
53
|
+
import {
|
|
54
|
+
SignInButton,
|
|
55
|
+
SignUpButton,
|
|
56
|
+
SignedIn,
|
|
57
|
+
SignedOut,
|
|
58
|
+
UserButton,
|
|
59
|
+
useUser,
|
|
60
|
+
} from '@insforge/react';
|
|
50
61
|
|
|
51
62
|
export default function Home() {
|
|
52
63
|
const { user } = useUser();
|
|
@@ -82,14 +93,10 @@ import { useAuth } from '@insforge/react';
|
|
|
82
93
|
|
|
83
94
|
function LoginButton() {
|
|
84
95
|
const { isSignedIn, isLoaded } = useAuth();
|
|
85
|
-
|
|
96
|
+
|
|
86
97
|
if (!isLoaded) return <div>Loading...</div>;
|
|
87
98
|
|
|
88
|
-
return
|
|
89
|
-
<div>
|
|
90
|
-
{isSignedIn ? 'Welcome!' : 'Sign In'}
|
|
91
|
-
</div>
|
|
92
|
-
);
|
|
99
|
+
return <div>{isSignedIn ? 'Welcome!' : 'Sign In'}</div>;
|
|
93
100
|
}
|
|
94
101
|
```
|
|
95
102
|
|
|
@@ -111,13 +118,12 @@ function UserProfile() {
|
|
|
111
118
|
if (!isLoaded) return <div>Loading...</div>;
|
|
112
119
|
if (!user) return <div>Not signed in</div>;
|
|
113
120
|
|
|
114
|
-
|
|
115
121
|
return (
|
|
116
122
|
<div>
|
|
117
123
|
<p>Id: {user.id}</p>
|
|
118
124
|
<p>Email: {user.email}</p>
|
|
119
|
-
<p>Name: {user.name}</p>
|
|
120
|
-
<img src={user.
|
|
125
|
+
<p>Name: {user.profile.name}</p>
|
|
126
|
+
<img src={user.profile.avatar_url} alt="Avatar" />
|
|
121
127
|
</div>
|
|
122
128
|
);
|
|
123
129
|
}
|
|
@@ -125,5 +131,6 @@ function UserProfile() {
|
|
|
125
131
|
|
|
126
132
|
**Returns:**
|
|
127
133
|
|
|
128
|
-
- `user` - User object with id, email,
|
|
134
|
+
- `user` - User object with id, email, profile
|
|
135
|
+
- `user.profile` - User profile object with name, avatar_url, and other custom fields
|
|
129
136
|
- `isLoaded` - Boolean loading state
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: Architecture
|
|
2
|
+
title: Database Architecture
|
|
3
3
|
description: PostgreSQL database with automatic REST APIs via PostgREST
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -113,32 +113,69 @@ AND category = 'electronics'
|
|
|
113
113
|
InsForge uses two PostgreSQL databases:
|
|
114
114
|
|
|
115
115
|
### Main Database (`insforge`)
|
|
116
|
-
|
|
116
|
+
Tables are organized into dedicated schemas for better organization and security:
|
|
117
117
|
|
|
118
|
-
|
|
|
119
|
-
|
|
120
|
-
| **
|
|
121
|
-
| **
|
|
118
|
+
| Schema | Purpose | Access |
|
|
119
|
+
|--------|---------|--------|
|
|
120
|
+
| **public** | User-created tables | PostgREST (auto-generated APIs) |
|
|
121
|
+
| **auth** | Authentication & user data | Internal APIs only |
|
|
122
|
+
| **storage** | File storage metadata | Internal APIs only |
|
|
123
|
+
| **ai** | AI configuration & usage | Internal APIs only |
|
|
124
|
+
| **functions** | Edge function definitions | Internal APIs only |
|
|
125
|
+
| **realtime** | Real-time pub/sub channels | Internal APIs only |
|
|
126
|
+
| **system** | Core system data | Internal APIs only |
|
|
122
127
|
|
|
123
|
-
###
|
|
124
|
-
Separate database for analytics with `_analytics` schema for Logflare integration.
|
|
128
|
+
### Schema Details
|
|
125
129
|
|
|
126
|
-
|
|
130
|
+
#### `auth` Schema (Authentication)
|
|
127
131
|
|
|
128
132
|
| Table | Purpose |
|
|
129
133
|
|-------|---------|
|
|
130
|
-
| `
|
|
131
|
-
| `
|
|
132
|
-
| `
|
|
133
|
-
| `
|
|
134
|
-
| `
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
|
139
|
-
|
|
140
|
-
| `
|
|
141
|
-
| `
|
|
134
|
+
| `users` | Core user records with metadata |
|
|
135
|
+
| `user_providers` | OAuth provider connections |
|
|
136
|
+
| `configs` | Authentication settings |
|
|
137
|
+
| `oauth_configs` | OAuth provider configurations |
|
|
138
|
+
| `email_otps` | Email verification codes |
|
|
139
|
+
|
|
140
|
+
#### `storage` Schema (File Storage)
|
|
141
|
+
|
|
142
|
+
| Table | Purpose |
|
|
143
|
+
|-------|---------|
|
|
144
|
+
| `buckets` | Storage bucket configuration |
|
|
145
|
+
| `objects` | File metadata and references |
|
|
146
|
+
|
|
147
|
+
#### `ai` Schema (AI Integration)
|
|
148
|
+
|
|
149
|
+
| Table | Purpose |
|
|
150
|
+
|-------|---------|
|
|
151
|
+
| `configs` | AI model configurations per project |
|
|
152
|
+
| `usage` | AI token usage tracking |
|
|
153
|
+
|
|
154
|
+
#### `functions` Schema (Edge Functions)
|
|
155
|
+
|
|
156
|
+
| Table | Purpose |
|
|
157
|
+
|-------|---------|
|
|
158
|
+
| `definitions` | Serverless function definitions |
|
|
159
|
+
|
|
160
|
+
#### `realtime` Schema (Real-time Pub/Sub)
|
|
161
|
+
|
|
162
|
+
| Table | Purpose |
|
|
163
|
+
|-------|---------|
|
|
164
|
+
| `channels` | Channel metadata and subscription configuration for real-time Pub/Sub |
|
|
165
|
+
| `messages` | Real-time message queue |
|
|
166
|
+
|
|
167
|
+
#### `system` Schema (Core System)
|
|
168
|
+
|
|
169
|
+
| Table | Purpose |
|
|
170
|
+
|-------|---------|
|
|
171
|
+
| `secrets` | Encrypted system secrets |
|
|
172
|
+
| `audit_logs` | Activity and audit logs |
|
|
173
|
+
| `mcp_usage` | MCP tool usage tracking |
|
|
174
|
+
| `migrations` | Database migration history |
|
|
175
|
+
|
|
176
|
+
<Note>
|
|
177
|
+
Only tables in the `public` schema are exposed via PostgREST auto-generated APIs. System schemas are accessible only through internal InsForge APIs.
|
|
178
|
+
</Note>
|
|
142
179
|
|
|
143
180
|
## Query Syntax
|
|
144
181
|
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: PGVector
|
|
3
|
+
description: Store embeddings and perform similarity search with pgvector
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## Overview
|
|
7
|
+
|
|
8
|
+
InsForge supports **pgvector**, a PostgreSQL extension for vector similarity search. Use it to build semantic search, recommendations, RAG pipelines, or anything that needs "find similar items" functionality.
|
|
9
|
+
|
|
10
|
+
## Enabling the Extension
|
|
11
|
+
|
|
12
|
+
Enable pgvector via SQL:
|
|
13
|
+
|
|
14
|
+
```sql
|
|
15
|
+
create extension if not exists vector;
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
<Note>
|
|
19
|
+
The extension is named `vector` in PostgreSQL, though the package is commonly called "pgvector".
|
|
20
|
+
</Note>
|
|
21
|
+
|
|
22
|
+
## Creating Vector Columns
|
|
23
|
+
|
|
24
|
+
Create a table with a vector column. The dimension must match your embedding model:
|
|
25
|
+
|
|
26
|
+
```sql
|
|
27
|
+
create table documents (
|
|
28
|
+
id bigserial primary key,
|
|
29
|
+
content text,
|
|
30
|
+
embedding vector(1536) -- matches OpenAI ada-002
|
|
31
|
+
);
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Common embedding dimensions:
|
|
35
|
+
|
|
36
|
+
| Model | Dimensions |
|
|
37
|
+
|-------|------------|
|
|
38
|
+
| OpenAI text-embedding-ada-002 | 1536 |
|
|
39
|
+
| OpenAI text-embedding-3-small | 1536 |
|
|
40
|
+
| OpenAI text-embedding-3-large | 3072 |
|
|
41
|
+
| Cohere embed-english-v3.0 | 1024 |
|
|
42
|
+
| all-MiniLM-L6-v2 | 384 |
|
|
43
|
+
|
|
44
|
+
## Storing Embeddings
|
|
45
|
+
|
|
46
|
+
Generate embeddings using any provider (OpenAI, Cohere, Hugging Face, etc.), then store them in InsForge.
|
|
47
|
+
|
|
48
|
+
Example using OpenAI:
|
|
49
|
+
|
|
50
|
+
```javascript
|
|
51
|
+
import OpenAI from 'openai';
|
|
52
|
+
import { insforge } from './lib/insforge';
|
|
53
|
+
|
|
54
|
+
const openai = new OpenAI();
|
|
55
|
+
|
|
56
|
+
async function storeDocument(content) {
|
|
57
|
+
const response = await openai.embeddings.create({
|
|
58
|
+
model: 'text-embedding-ada-002',
|
|
59
|
+
input: content
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
const { data, error } = await insforge.database
|
|
63
|
+
.from('documents')
|
|
64
|
+
.insert({
|
|
65
|
+
content,
|
|
66
|
+
embedding: response.data[0].embedding
|
|
67
|
+
})
|
|
68
|
+
.select();
|
|
69
|
+
|
|
70
|
+
return { data, error };
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Querying Vectors
|
|
75
|
+
|
|
76
|
+
Use distance operators to find similar vectors:
|
|
77
|
+
|
|
78
|
+
```sql
|
|
79
|
+
select * from documents
|
|
80
|
+
order by embedding <-> '[0.1, 0.2, ...]' -- your query embedding
|
|
81
|
+
limit 5;
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Distance Operators
|
|
85
|
+
|
|
86
|
+
| Operator | Description |
|
|
87
|
+
|----------|-------------|
|
|
88
|
+
| `<->` | L2 distance |
|
|
89
|
+
| `<#>` | Inner product (negative) |
|
|
90
|
+
| `<=>` | Cosine distance |
|
|
91
|
+
|
|
92
|
+
<Tip>
|
|
93
|
+
For normalized embeddings (like OpenAI's), use cosine distance `<=>`. Similarity = `1 - distance`.
|
|
94
|
+
</Tip>
|
|
95
|
+
|
|
96
|
+
## Indexing
|
|
97
|
+
|
|
98
|
+
Without an index, pgvector does exact nearest neighbor search - accurate but slow on large datasets. Add an index for faster approximate search.
|
|
99
|
+
|
|
100
|
+
### HNSW (Recommended)
|
|
101
|
+
|
|
102
|
+
Faster queries, uses more memory:
|
|
103
|
+
|
|
104
|
+
```sql
|
|
105
|
+
create index on documents
|
|
106
|
+
using hnsw (embedding vector_cosine_ops);
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### IVFFlat
|
|
110
|
+
|
|
111
|
+
Lower memory, but create it after inserting data:
|
|
112
|
+
|
|
113
|
+
```sql
|
|
114
|
+
create index on documents
|
|
115
|
+
using ivfflat (embedding vector_cosine_ops)
|
|
116
|
+
with (lists = 100);
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Operator Classes
|
|
120
|
+
|
|
121
|
+
Match your distance operator:
|
|
122
|
+
|
|
123
|
+
| Distance | Operator Class |
|
|
124
|
+
|----------|---------------|
|
|
125
|
+
| L2 | `vector_l2_ops` |
|
|
126
|
+
| Inner product | `vector_ip_ops` |
|
|
127
|
+
| Cosine | `vector_cosine_ops` |
|
|
128
|
+
|
|
129
|
+
<Warning>
|
|
130
|
+
Create indexes **after** inserting initial data. IVFFlat needs representative data to build effective clusters.
|
|
131
|
+
</Warning>
|
|
132
|
+
|
|
133
|
+
## Best Practices
|
|
134
|
+
|
|
135
|
+
- **Match dimensions** - Vector dimensions must match your embedding model
|
|
136
|
+
- **Normalize embeddings** - Use cosine distance for scores between 0 and 1
|
|
137
|
+
- **Index at scale** - Add indexes when you have ~10k+ vectors
|
|
138
|
+
- **Batch inserts** - Generate and insert embeddings in batches
|
|
@@ -35,17 +35,17 @@ Chain `.select()` after `.insert()` to return the inserted data
|
|
|
35
35
|
<CodeGroup>
|
|
36
36
|
```javascript Single insert
|
|
37
37
|
const { data, error } = await insforge.database
|
|
38
|
-
.from('
|
|
39
|
-
.insert({
|
|
38
|
+
.from('posts')
|
|
39
|
+
.insert({ title: 'Hello World', content: 'My first post!' })
|
|
40
40
|
.select()
|
|
41
41
|
```
|
|
42
42
|
|
|
43
43
|
```javascript Bulk insert
|
|
44
44
|
const { data, error } = await insforge.database
|
|
45
|
-
.from('
|
|
45
|
+
.from('posts')
|
|
46
46
|
.insert([
|
|
47
|
-
{
|
|
48
|
-
{
|
|
47
|
+
{ title: 'First Post', content: 'Hello everyone!' },
|
|
48
|
+
{ title: 'Second Post', content: 'Another update.' }
|
|
49
49
|
])
|
|
50
50
|
.select()
|
|
51
51
|
```
|
|
@@ -56,7 +56,7 @@ const { data, error } = await insforge.database
|
|
|
56
56
|
```json
|
|
57
57
|
{
|
|
58
58
|
"data": [
|
|
59
|
-
{ "id": "789", "
|
|
59
|
+
{ "id": "789", "title": "Hello World", "content": "My first post!", "created_at": "2024-01-15T10:30:00Z" }
|
|
60
60
|
],
|
|
61
61
|
"error": null
|
|
62
62
|
}
|
|
@@ -92,9 +92,9 @@ Always use filters like `.eq()` or `.in()` to specify which rows to update
|
|
|
92
92
|
<CodeGroup>
|
|
93
93
|
```javascript Update by ID
|
|
94
94
|
const { data, error } = await insforge.database
|
|
95
|
-
.from('
|
|
96
|
-
.update({
|
|
97
|
-
.eq('id',
|
|
95
|
+
.from('posts')
|
|
96
|
+
.update({ title: 'Updated Title' })
|
|
97
|
+
.eq('id', postId)
|
|
98
98
|
.select()
|
|
99
99
|
```
|
|
100
100
|
|
|
@@ -112,7 +112,7 @@ const { data, error } = await insforge.database
|
|
|
112
112
|
```json
|
|
113
113
|
{
|
|
114
114
|
"data": [
|
|
115
|
-
{ "id": "123", "
|
|
115
|
+
{ "id": "123", "title": "Updated Title", "content": "My first post!", "updated_at": "2024-01-15T11:00:00Z" }
|
|
116
116
|
],
|
|
117
117
|
"error": null
|
|
118
118
|
}
|
|
@@ -196,20 +196,20 @@ Query records from a table or view.
|
|
|
196
196
|
<CodeGroup>
|
|
197
197
|
```javascript Get all
|
|
198
198
|
const { data, error } = await insforge.database
|
|
199
|
-
.from('
|
|
199
|
+
.from('posts')
|
|
200
200
|
.select()
|
|
201
201
|
```
|
|
202
202
|
|
|
203
203
|
```javascript Specific columns
|
|
204
204
|
const { data, error } = await insforge.database
|
|
205
|
-
.from('
|
|
206
|
-
.select('id,
|
|
205
|
+
.from('posts')
|
|
206
|
+
.select('id, title, content')
|
|
207
207
|
```
|
|
208
208
|
|
|
209
209
|
```javascript With relationships
|
|
210
210
|
const { data, error } = await insforge.database
|
|
211
211
|
.from('posts')
|
|
212
|
-
.select('*,
|
|
212
|
+
.select('*, comments(id, content)')
|
|
213
213
|
```
|
|
214
214
|
</CodeGroup>
|
|
215
215
|
|
|
@@ -218,8 +218,8 @@ const { data, error } = await insforge.database
|
|
|
218
218
|
```json
|
|
219
219
|
{
|
|
220
220
|
"data": [
|
|
221
|
-
{ "id": "123", "
|
|
222
|
-
{ "id": "456", "
|
|
221
|
+
{ "id": "123", "title": "Hello World", "content": "My first post!" },
|
|
222
|
+
{ "id": "456", "title": "Second Post", "content": "Another update." }
|
|
223
223
|
],
|
|
224
224
|
"error": null
|
|
225
225
|
}
|
|
@@ -365,7 +365,7 @@ function MyProfile() {
|
|
|
365
365
|
|
|
366
366
|
return (
|
|
367
367
|
<div>
|
|
368
|
-
<h1>{user.name}</h1>
|
|
368
|
+
<h1>{user.profile?.name}</h1>
|
|
369
369
|
<p>{user.email}</p>
|
|
370
370
|
<h2>My Posts: {posts.length}</h2>
|
|
371
371
|
{posts.map(post => (
|