Skip to content

Commit ddb9e4e

Browse files
committed
move meGet out of web/src/app
1 parent 3468364 commit ddb9e4e

File tree

3 files changed

+77
-73
lines changed

3 files changed

+77
-73
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { describe, test, expect } from 'bun:test'
22
import { NextRequest } from 'next/server'
33

4-
import { meGet } from '../../../app/api/v1/me/route'
54
import { VALID_USER_INFO_FIELDS } from '../../../db/user'
5+
import { meGet } from '../me'
66

77
import type {
88
GetUserInfoFromApiKeyFn,

web/src/api/v1/me.ts

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import { NextResponse } from 'next/server'
2+
3+
import type { GetUserInfoFromApiKeyFn } from '@codebuff/common/types/contracts/database'
4+
import type { NextRequest } from 'next/server'
5+
6+
import { VALID_USER_INFO_FIELDS } from '@/db/user'
7+
import { extractApiKeyFromHeader } from '@/util/auth'
8+
9+
type ValidField = (typeof VALID_USER_INFO_FIELDS)[number]
10+
11+
export async function meGet(params: {
12+
req: NextRequest
13+
getUserInfoFromApiKey: GetUserInfoFromApiKeyFn
14+
}) {
15+
const { req, getUserInfoFromApiKey } = params
16+
17+
const apiKey = extractApiKeyFromHeader(req)
18+
19+
if (!apiKey) {
20+
return NextResponse.json(
21+
{ error: 'Missing or invalid Authorization header' },
22+
{ status: 401 }
23+
)
24+
}
25+
26+
// Parse fields from query parameter
27+
const fieldsParam = req.nextUrl.searchParams.get('fields')
28+
let fields: ValidField[]
29+
if (fieldsParam !== null) {
30+
const requestedFields = fieldsParam
31+
.split(',')
32+
.map((f) => f.trim())
33+
.filter((f) => f.length > 0)
34+
35+
// Check if we have any fields after filtering
36+
if (requestedFields.length === 0) {
37+
return NextResponse.json(
38+
{
39+
error: `Invalid fields: empty. Valid fields are: ${VALID_USER_INFO_FIELDS.join(', ')}`,
40+
},
41+
{ status: 400 }
42+
)
43+
}
44+
45+
// Validate that all requested fields are valid
46+
const invalidFields = requestedFields.filter(
47+
(f) => !VALID_USER_INFO_FIELDS.includes(f as ValidField)
48+
)
49+
if (invalidFields.length > 0) {
50+
return NextResponse.json(
51+
{
52+
error: `Invalid fields: ${invalidFields.join(', ')}. Valid fields are: ${VALID_USER_INFO_FIELDS.join(', ')}`,
53+
},
54+
{ status: 400 }
55+
)
56+
}
57+
fields = requestedFields as ValidField[]
58+
} else {
59+
// Default to just 'id'
60+
fields = ['id']
61+
}
62+
63+
// Get user info
64+
const userInfo = await getUserInfoFromApiKey({ apiKey, fields })
65+
66+
if (!userInfo) {
67+
return NextResponse.json(
68+
{ error: 'Invalid API key or user not found' },
69+
{ status: 404 }
70+
)
71+
}
72+
73+
return NextResponse.json(userInfo)
74+
}

web/src/app/api/v1/me/route.ts

Lines changed: 2 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,77 +1,7 @@
1-
import { NextResponse } from 'next/server'
2-
3-
import type { GetUserInfoFromApiKeyFn } from '@codebuff/common/types/contracts/database'
41
import type { NextRequest } from 'next/server'
52

6-
import { getUserInfoFromApiKey, VALID_USER_INFO_FIELDS } from '@/db/user'
7-
import { extractApiKeyFromHeader } from '@/util/auth'
8-
9-
type ValidField = (typeof VALID_USER_INFO_FIELDS)[number]
10-
11-
export async function meGet(params: {
12-
req: NextRequest
13-
getUserInfoFromApiKey: GetUserInfoFromApiKeyFn
14-
}) {
15-
const { req, getUserInfoFromApiKey } = params
16-
17-
const apiKey = extractApiKeyFromHeader(req)
18-
19-
if (!apiKey) {
20-
return NextResponse.json(
21-
{ error: 'Missing or invalid Authorization header' },
22-
{ status: 401 }
23-
)
24-
}
25-
26-
// Parse fields from query parameter
27-
const fieldsParam = req.nextUrl.searchParams.get('fields')
28-
let fields: ValidField[]
29-
if (fieldsParam !== null) {
30-
const requestedFields = fieldsParam
31-
.split(',')
32-
.map((f) => f.trim())
33-
.filter((f) => f.length > 0)
34-
35-
// Check if we have any fields after filtering
36-
if (requestedFields.length === 0) {
37-
return NextResponse.json(
38-
{
39-
error: `Invalid fields: empty. Valid fields are: ${VALID_USER_INFO_FIELDS.join(', ')}`,
40-
},
41-
{ status: 400 }
42-
)
43-
}
44-
45-
// Validate that all requested fields are valid
46-
const invalidFields = requestedFields.filter(
47-
(f) => !VALID_USER_INFO_FIELDS.includes(f as ValidField)
48-
)
49-
if (invalidFields.length > 0) {
50-
return NextResponse.json(
51-
{
52-
error: `Invalid fields: ${invalidFields.join(', ')}. Valid fields are: ${VALID_USER_INFO_FIELDS.join(', ')}`,
53-
},
54-
{ status: 400 }
55-
)
56-
}
57-
fields = requestedFields as ValidField[]
58-
} else {
59-
// Default to just 'id'
60-
fields = ['id']
61-
}
62-
63-
// Get user info
64-
const userInfo = await getUserInfoFromApiKey({ apiKey, fields })
65-
66-
if (!userInfo) {
67-
return NextResponse.json(
68-
{ error: 'Invalid API key or user not found' },
69-
{ status: 404 }
70-
)
71-
}
72-
73-
return NextResponse.json(userInfo)
74-
}
3+
import { meGet } from '@/api/v1/me'
4+
import { getUserInfoFromApiKey } from '@/db/user'
755

766
export async function GET(req: NextRequest) {
777
return meGet({ req, getUserInfoFromApiKey })

0 commit comments

Comments
 (0)