Skip to content

Commit 9821e43

Browse files
committed
extract star logic into util
1 parent fe55f0f commit 9821e43

3 files changed

Lines changed: 55 additions & 89 deletions

File tree

server/api/github/star.delete.ts

Lines changed: 3 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,5 @@
1-
import { createError, readBody } from 'h3'
2-
import * as v from 'valibot'
3-
import { GitHubStarBodySchema } from '#shared/schemas/github'
4-
import { useServerSession } from '#server/utils/server-session'
5-
import { handleApiError } from '#server/utils/error-handler'
1+
import { toggleGitHubStar } from '#server/utils/github'
62

7-
export default defineEventHandler(async event => {
8-
const session = await useServerSession(event)
9-
const github = session.data.github
10-
11-
if (!github?.accessToken) {
12-
throw createError({
13-
statusCode: 401,
14-
message: 'GitHub account not connected.',
15-
})
16-
}
17-
18-
const { owner, repo } = v.parse(GitHubStarBodySchema, await readBody(event))
19-
20-
if (!owner || !repo) {
21-
throw createError({
22-
statusCode: 400,
23-
message: 'Missing owner or repo in request body.',
24-
})
25-
}
26-
27-
try {
28-
await $fetch(`https://api.github.com/user/starred/${owner}/${repo}`, {
29-
method: 'DELETE',
30-
headers: {
31-
'Authorization': `Bearer ${github.accessToken}`,
32-
'Accept': 'application/vnd.github+json',
33-
'User-Agent': 'npmx',
34-
'X-GitHub-Api-Version': '2022-11-28',
35-
},
36-
})
37-
38-
return { starred: false }
39-
} catch (error) {
40-
return handleApiError(error, {
41-
statusCode: 500,
42-
statusMessage: 'Internal Server Error',
43-
message: 'Failed to unstar repository.',
44-
})
45-
}
3+
export default defineEventHandler(event => {
4+
return toggleGitHubStar(event, 'DELETE')
465
})

server/api/github/star.put.ts

Lines changed: 3 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,5 @@
1-
import { createError, readBody } from 'h3'
2-
import * as v from 'valibot'
3-
import { GitHubStarBodySchema } from '#shared/schemas/github'
4-
import { useServerSession } from '#server/utils/server-session'
5-
import { handleApiError } from '#server/utils/error-handler'
1+
import { toggleGitHubStar } from '#server/utils/github'
62

7-
export default defineEventHandler(async event => {
8-
const session = await useServerSession(event)
9-
const github = session.data.github
10-
11-
if (!github?.accessToken) {
12-
throw createError({
13-
statusCode: 401,
14-
message: 'GitHub account not connected.',
15-
})
16-
}
17-
18-
const { owner, repo } = v.parse(GitHubStarBodySchema, await readBody(event))
19-
20-
if (!owner || !repo) {
21-
throw createError({
22-
statusCode: 400,
23-
message: 'Missing owner or repo in request body.',
24-
})
25-
}
26-
27-
try {
28-
await $fetch(`https://api.github.com/user/starred/${owner}/${repo}`, {
29-
method: 'PUT',
30-
headers: {
31-
'Authorization': `Bearer ${github.accessToken}`,
32-
'Accept': 'application/vnd.github+json',
33-
'User-Agent': 'npmx',
34-
'X-GitHub-Api-Version': '2022-11-28',
35-
'Content-Length': '0',
36-
},
37-
})
38-
39-
return { starred: true }
40-
} catch (error) {
41-
return handleApiError(error, {
42-
statusCode: 500,
43-
statusMessage: 'Internal Server Error',
44-
message: 'Failed to star repository.',
45-
})
46-
}
3+
export default defineEventHandler(event => {
4+
return toggleGitHubStar(event, 'PUT')
475
})

server/utils/github.ts

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import type { H3Event } from 'h3'
2+
import { createError, readBody } from 'h3'
3+
import * as v from 'valibot'
4+
import { GitHubStarBodySchema } from '#shared/schemas/github'
5+
import { useServerSession } from '#server/utils/server-session'
6+
import { handleApiError } from '#server/utils/error-handler'
7+
8+
export async function toggleGitHubStar(event: H3Event, method: 'PUT' | 'DELETE') {
9+
const session = await useServerSession(event)
10+
const github = session.data.github
11+
12+
if (!github) {
13+
throw createError({
14+
statusCode: 401,
15+
message: 'GitHub account not connected.',
16+
})
17+
}
18+
19+
const { owner, repo } = v.parse(GitHubStarBodySchema, await readBody(event))
20+
21+
if (!owner || !repo) {
22+
throw createError({
23+
statusCode: 400,
24+
message: 'Missing owner or repo in request body.',
25+
})
26+
}
27+
28+
const isPut = method === 'PUT'
29+
30+
try {
31+
await $fetch(`https://api.github.com/user/starred/${owner}/${repo}`, {
32+
method,
33+
headers: {
34+
'Authorization': `Bearer ${github.accessToken}`,
35+
'Accept': 'application/vnd.github+json',
36+
'User-Agent': 'npmx',
37+
'X-GitHub-Api-Version': '2022-11-28',
38+
},
39+
})
40+
41+
return { starred: isPut }
42+
} catch (error) {
43+
return handleApiError(error, {
44+
statusCode: 500,
45+
statusMessage: 'Internal Server Error',
46+
message: `Failed to ${isPut ? 'star' : 'unstar'} repository.`,
47+
})
48+
}
49+
}

0 commit comments

Comments
 (0)