A social knowledge tool for researchers built on ATProto
1import { BaseClient } from './BaseClient';
2import {
3 LoginWithAppPasswordRequest,
4 InitiateOAuthSignInRequest,
5 CompleteOAuthSignInRequest,
6 RefreshAccessTokenRequest,
7 GenerateExtensionTokensRequest,
8 LoginWithAppPasswordResponse,
9 InitiateOAuthSignInResponse,
10 CompleteOAuthSignInResponse,
11 RefreshAccessTokenResponse,
12 GenerateExtensionTokensResponse,
13} from '../types';
14
15export class UserClient extends BaseClient {
16 async loginWithAppPassword(
17 request: LoginWithAppPasswordRequest,
18 ): Promise<LoginWithAppPasswordResponse> {
19 return this.request<LoginWithAppPasswordResponse>(
20 'POST',
21 '/api/users/login/app-password',
22 request,
23 );
24 }
25
26 async initiateOAuthSignIn(
27 request?: InitiateOAuthSignInRequest,
28 ): Promise<InitiateOAuthSignInResponse> {
29 const params = new URLSearchParams();
30 if (request?.handle) {
31 params.set('handle', request.handle);
32 }
33 const queryString = params.toString();
34 const endpoint = queryString
35 ? `/api/users/login?${queryString}`
36 : '/api/users/login';
37 return this.request<InitiateOAuthSignInResponse>('GET', endpoint);
38 }
39
40 async completeOAuthSignIn(
41 request: CompleteOAuthSignInRequest,
42 ): Promise<CompleteOAuthSignInResponse> {
43 const params = new URLSearchParams({
44 code: request.code,
45 state: request.state,
46 iss: request.iss,
47 });
48 return this.request<CompleteOAuthSignInResponse>(
49 'GET',
50 `/api/users/oauth/callback?${params}`,
51 );
52 }
53
54 async refreshAccessToken(
55 request: RefreshAccessTokenRequest,
56 ): Promise<RefreshAccessTokenResponse> {
57 return this.request<RefreshAccessTokenResponse>(
58 'POST',
59 '/api/users/oauth/refresh',
60 request,
61 );
62 }
63
64 async generateExtensionTokens(
65 request?: GenerateExtensionTokensRequest,
66 ): Promise<GenerateExtensionTokensResponse> {
67 return this.request<GenerateExtensionTokensResponse>(
68 'GET',
69 '/api/users/extension/tokens',
70 );
71 }
72
73 async logout(): Promise<{ success: boolean; message: string }> {
74 if (!this.tokenManager) {
75 throw new Error('TokenManager is required for logout');
76 }
77 const refreshToken = await this.tokenManager.getRefreshToken();
78 return this.request<{ success: boolean; message: string }>(
79 'POST',
80 '/api/users/logout',
81 { refreshToken },
82 );
83 }
84}