Skip to content

Commit bec70cf

Browse files
committed
cleanup: auth in query
1 parent 9dd470a commit bec70cf

File tree

5 files changed

+221
-75
lines changed

5 files changed

+221
-75
lines changed

apps/api/src/routes/query.ts

Lines changed: 64 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
import { auth } from '@databuddy/auth';
12
import { filterOptions } from '@databuddy/shared';
23
import { Elysia, t } from 'elysia';
4+
import { getApiKeyFromHeader, isApiKeyPresent } from '../lib/api-key';
35
import { getCachedWebsiteDomain, getWebsiteDomain } from '../lib/website-utils';
46
// import { createRateLimitMiddleware } from '../middleware/rate-limit';
57
import { websiteAuth } from '../middleware/website-auth';
@@ -22,36 +24,75 @@ interface QueryParams {
2224
timezone?: string;
2325
}
2426

27+
async function checkAuth(request: Request): Promise<Response | null> {
28+
const apiKeyPresent = isApiKeyPresent(request.headers);
29+
const apiKey = apiKeyPresent
30+
? await getApiKeyFromHeader(request.headers)
31+
: null;
32+
const session = await auth.api.getSession({ headers: request.headers });
33+
const sessionUser = session?.user ?? null;
34+
35+
if (sessionUser || apiKey) {
36+
return null; // Auth passed
37+
}
38+
39+
return new Response(
40+
JSON.stringify({
41+
success: false,
42+
error: 'Authentication required',
43+
code: 'AUTH_REQUIRED',
44+
}),
45+
{
46+
status: 401,
47+
headers: { 'Content-Type': 'application/json' },
48+
}
49+
);
50+
}
51+
2552
export const query = new Elysia({ prefix: '/v1/query' })
2653
// .use(createRateLimitMiddleware({ type: 'api' }))
2754
.use(websiteAuth())
28-
.get('/types', ({ query: params }: { query: { include_meta?: string } }) => {
29-
const includeMeta = params.include_meta === 'true';
55+
.get(
56+
'/types',
57+
async ({
58+
query: params,
59+
request,
60+
}: {
61+
query: { include_meta?: string };
62+
request: Request;
63+
}) => {
64+
const authResult = await checkAuth(request);
65+
if (authResult) {
66+
return authResult;
67+
}
3068

31-
const configs = Object.fromEntries(
32-
Object.entries(QueryBuilders).map(([key, config]) => {
33-
const baseConfig = {
34-
allowedFilters:
35-
config.allowedFilters ??
36-
filterOptions.map((filter) => filter.value),
37-
customizable: config.customizable,
38-
defaultLimit: config.limit,
39-
};
69+
const includeMeta = params.include_meta === 'true';
4070

41-
if (includeMeta) {
42-
return [key, { ...baseConfig, meta: config.meta }];
43-
}
71+
const configs = Object.fromEntries(
72+
Object.entries(QueryBuilders).map(([key, config]) => {
73+
const baseConfig = {
74+
allowedFilters:
75+
config.allowedFilters ??
76+
filterOptions.map((filter) => filter.value),
77+
customizable: config.customizable,
78+
defaultLimit: config.limit,
79+
};
4480

45-
return [key, baseConfig];
46-
})
47-
);
81+
if (includeMeta) {
82+
return [key, { ...baseConfig, meta: config.meta }];
83+
}
84+
85+
return [key, baseConfig];
86+
})
87+
);
4888

49-
return {
50-
success: true,
51-
types: Object.keys(QueryBuilders),
52-
configs,
53-
};
54-
})
89+
return {
90+
success: true,
91+
types: Object.keys(QueryBuilders),
92+
configs,
93+
};
94+
}
95+
)
5596

5697
.post(
5798
'/compile',

apps/dashboard/app/(main)/settings/integrations/vercel/_components/create-website-dialog.tsx

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,11 @@ import {
2020
SheetTitle,
2121
} from '@/components/ui/sheet';
2222
import type { Domain, Project } from './types';
23-
import { generateWebsiteName, inferTargetFromDomain } from './utils';
23+
import {
24+
generateWebsiteName,
25+
generateWebsitePlaceholder,
26+
inferTargetFromDomain,
27+
} from './utils';
2428

2529
interface WebsiteConfig {
2630
domain: Domain;
@@ -52,7 +56,7 @@ export function CreateWebsiteDialog({
5256
if (selectedDomains.length > 0) {
5357
const configs = selectedDomains.map((domain) => ({
5458
domain,
55-
name: generateWebsiteName(domain.name),
59+
name: '', // Start with empty name, will use placeholder
5660
target: isMultipleMode
5761
? inferTargetFromDomain(domain)
5862
: (['production', 'preview', 'development'] as string[]),
@@ -65,7 +69,14 @@ export function CreateWebsiteDialog({
6569
if (websiteConfigs.length === 0) {
6670
return;
6771
}
68-
await onSave(websiteConfigs);
72+
73+
// Use domain name as default if name is empty
74+
const configsWithDefaults = websiteConfigs.map((config) => ({
75+
...config,
76+
name: config.name.trim() || generateWebsiteName(config.domain.name),
77+
}));
78+
79+
await onSave(configsWithDefaults);
6980
};
7081

7182
const updateWebsiteConfig = useCallback(
@@ -87,7 +98,6 @@ export function CreateWebsiteDialog({
8798
const isFormValid = useMemo(() => {
8899
return (
89100
websiteConfigs.length > 0 &&
90-
websiteConfigs.every((config) => config.name.trim() !== '') &&
91101
websiteConfigs.every((config) => config.target.length > 0)
92102
);
93103
}, [websiteConfigs]);
@@ -110,13 +120,13 @@ export function CreateWebsiteDialog({
110120
<div>
111121
<SheetTitle className="font-semibold text-foreground text-xl">
112122
{isMultipleMode
113-
? `Create ${websiteConfigs.length} Websites`
114-
: 'Create Website'}
123+
? `Integrate ${websiteConfigs.length} Websites`
124+
: 'Integrate Website'}
115125
</SheetTitle>
116126
<SheetDescription className="mt-1 text-muted-foreground">
117127
{isMultipleMode
118-
? `Create websites for ${selectedProject?.name} and configure environment variables`
119-
: `Create website for ${websiteConfigs[0]?.domain.name} and configure environment variables`}
128+
? `Integrate websites for ${selectedProject?.name} and configure environment variables`
129+
: `Integrate website for ${websiteConfigs[0]?.domain.name} and configure environment variables`}
120130
</SheetDescription>
121131
</div>
122132
</div>
@@ -178,7 +188,7 @@ export function CreateWebsiteDialog({
178188
onChange={(e) =>
179189
updateWebsiteConfig(index, { name: e.target.value })
180190
}
181-
placeholder="Enter website name"
191+
placeholder={generateWebsitePlaceholder(config.domain.name)}
182192
value={config.name}
183193
/>
184194
</div>
@@ -268,7 +278,7 @@ export function CreateWebsiteDialog({
268278
<li className="flex items-center gap-2">
269279
<div className="h-1.5 w-1.5 rounded-full bg-primary/60" />
270280
<span>
271-
Create {websiteConfigs.length} website
281+
Integrate {websiteConfigs.length} website
272282
{websiteConfigs.length !== 1 ? 's' : ''} in Databuddy
273283
</span>
274284
</li>
@@ -306,11 +316,11 @@ export function CreateWebsiteDialog({
306316
)}
307317
<span className={isSaving ? 'ml-6' : ''}>
308318
{isSaving ? (
309-
'Creating...'
319+
'Integrating...'
310320
) : (
311321
<>
312322
<PlusIcon className="mr-2 h-4 w-4" />
313-
Create {websiteConfigs.length} Website
323+
Integrate {websiteConfigs.length} Website
314324
{websiteConfigs.length !== 1 ? 's' : ''}
315325
</>
316326
)}

0 commit comments

Comments
 (0)