-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathget-user.ts
More file actions
83 lines (72 loc) · 1.77 KB
/
get-user.ts
File metadata and controls
83 lines (72 loc) · 1.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
export interface UserRequest {
accessToken: string;
userAgent: string;
}
export type UserResponse =
| ({ success: true } & UserSuccess)
| ({ success: false } & UserFailure);
export interface UserSuccess {
userId: number;
object: object;
status: number;
}
export interface UserFailure {
fetchError?: unknown;
jsonError?: unknown;
status?: number;
object?: object;
}
/**
* https://docs.github.com/en/rest/users/users?apiVersion=2022-11-28#get-the-authenticated-user
*/
export function userRequest(x: UserRequest): Request {
const headers = new Headers();
headers.set("Authorization", `Bearer ${x.accessToken}`);
headers.set("Accept", "application/vnd.github+json");
headers.set("X-GitHub-Api-Version", "2022-11-28");
// https://docs.github.com/en/rest/using-the-rest-api/troubleshooting-the-rest-api?apiVersion=2022-11-28#user-agent-required
headers.set("User-Agent", x.userAgent);
return new Request("https://api.github.com/user", { headers });
}
export async function getUser(x: UserRequest): Promise<UserResponse> {
const request = userRequest(x);
let response: Response | undefined;
let fetchError: unknown;
try {
response = await fetch(request);
} catch (e) {
fetchError = e;
}
let object: object | undefined;
let jsonError: unknown;
try {
const value = await response?.json();
if (typeof value === 'object' && value !== null) {
object = value
} else {
jsonError = 'JSON response body is not an object'
}
} catch (e) {
jsonError = e;
}
if (
response?.ok &&
object !== undefined &&
"id" in object &&
typeof object.id === "number"
)
return {
success: true,
userId: object.id,
status: response.status,
object,
};
else
return {
success: false,
status: response?.status,
object,
fetchError,
jsonError,
};
}