@smartsamurai/krapi-sdk
Version:
KRAPI TypeScript SDK - Easy-to-use client SDK for connecting to self-hosted KRAPI servers (like Appwrite SDK)
279 lines (246 loc) • 6.75 kB
text/typescript
/**
* Auth HTTP Client for KRAPI SDK
*
* HTTP-based authentication methods for frontend applications.
* Provides admin and project user authentication, session management, and password operations.
*
* @module http-clients/auth-http-client
* @example
* const client = new AuthHttpClient({ baseUrl: 'https://api.example.com' });
* const response = await client.adminLogin({ username: 'admin', password: 'pass' });
*/
import {
Session,
LoginResponse,
ApiKeyAuthRequest,
ApiKeyAuthResponse,
PasswordChangeRequest,
PasswordResetRequest,
} from "../auth-service";
import { ApiResponse } from "../core";
import { BaseHttpClient } from "./base-http-client";
/**
* Auth HTTP Client
*
* HTTP client for authentication operations.
*
* @class AuthHttpClient
* @extends {BaseHttpClient}
* @example
* const client = new AuthHttpClient({ baseUrl: 'https://api.example.com' });
* const session = await client.adminLogin({ username: 'admin', password: 'pass' });
*/
export class AuthHttpClient extends BaseHttpClient {
// Constructor inherited from BaseHttpClient
async register(registerData: {
username: string;
email: string;
password: string;
role?: string;
access_level?: string;
permissions?: string[];
}): Promise<
ApiResponse<{ success: boolean; user: Record<string, unknown> }>
> {
return await this.post<{ success: boolean; user: Record<string, unknown> }>(
"/auth/register",
registerData
);
}
async logout(sessionId?: string): Promise<ApiResponse<{ success: boolean }>> {
return await this.post<{ success: boolean }>(
"/auth/logout",
sessionId ? { session_id: sessionId } : {}
);
}
// Admin Authentication
async adminLogin(credentials: {
username: string;
password: string;
remember_me?: boolean;
}): Promise<ApiResponse<LoginResponse>> {
const response = await this.post<LoginResponse>(
"/auth/admin/login",
credentials
);
// Auto-set session token if provided
if (response.data?.token) {
this.setSessionToken(response.data.token);
}
return response;
}
async adminApiLogin(
request: ApiKeyAuthRequest
): Promise<ApiResponse<ApiKeyAuthResponse>> {
const response = await this.post<ApiKeyAuthResponse>(
"/auth/admin/api-login",
request
);
// Auto-set session token if provided
if (response.data?.token) {
this.setSessionToken(response.data.token);
}
return response;
}
// Project User Authentication
async projectLogin(
projectId: string,
credentials: {
email: string;
password: string;
remember_me?: boolean;
}
): Promise<ApiResponse<LoginResponse>> {
const response = await this.post<LoginResponse>(
`/auth/projects/${projectId}/login`,
credentials
);
// Auto-set session token if provided
if (response.data?.token) {
this.setSessionToken(response.data.token);
}
return response;
}
async projectApiLogin(
projectId: string,
request: ApiKeyAuthRequest
): Promise<ApiResponse<ApiKeyAuthResponse>> {
const response = await this.post<ApiKeyAuthResponse>(
`/auth/projects/${projectId}/api-login`,
request
);
// Auto-set session token if provided
if (response.data?.token) {
this.setSessionToken(response.data.token);
}
return response;
}
// Session Management
async getCurrentSession(): Promise<ApiResponse<Session>> {
return this.get<Session>("/auth/me");
}
async refreshSession(): Promise<
ApiResponse<{ session_token: string; expires_at: string }>
> {
const response = await this.post<{
session_token: string;
expires_at: string;
}>("/auth/refresh");
// Auto-set new session token
if (response.data?.session_token) {
this.setSessionToken(response.data.session_token);
}
return response;
}
async createSession(apiKey: string): Promise<
ApiResponse<{
session_token: string;
expires_at: string;
user_type: "admin" | "project";
scopes: string[];
}>
> {
return this.post<{
session_token: string;
expires_at: string;
user_type: "admin" | "project";
scopes: string[];
}>("/auth/sessions", {
api_key: apiKey,
});
}
async revokeSession(
sessionId: string
): Promise<ApiResponse<{ success: boolean }>> {
return this.delete<{ success: boolean }>(`/auth/sessions/${sessionId}`);
}
async revokeAllSessions(): Promise<
ApiResponse<{ success: boolean; revoked_count: number }>
> {
return this.post<{ success: boolean; revoked_count: number }>(
"/auth/revoke-all"
);
}
// Password Management
async changePassword(
userId: string,
userType: "admin" | "project",
passwordData: PasswordChangeRequest
): Promise<ApiResponse<{ success: boolean }>> {
const endpoint =
userType === "admin"
? `/auth/change-password`
: `/auth/users/${userId}/change-password`;
return this.post<{ success: boolean }>(endpoint, passwordData);
}
async resetPassword(resetData: PasswordResetRequest): Promise<
ApiResponse<{
success: boolean;
reset_token?: string;
}>
> {
return this.post<{ success: boolean; reset_token?: string }>(
"/auth/reset-password",
resetData
);
}
// Session Queries
async getUserSessions(
userId: string,
userType: "admin" | "project"
): Promise<ApiResponse<Session[]>> {
const endpoint =
userType === "admin"
? `/auth/admin/sessions`
: `/auth/users/${userId}/sessions`;
return this.get<Session[]>(endpoint);
}
// Validation Methods
async validateSession(sessionToken: string): Promise<
ApiResponse<{
valid: boolean;
session?: Session;
}>
> {
return this.post<{ valid: boolean; session?: Session }>(
"/auth/session/validate",
{
token: sessionToken,
}
);
}
async validateApiKey(apiKey: string): Promise<
ApiResponse<{
valid: boolean;
key_info?: {
id: string;
name: string;
type: string;
scopes: string[];
};
}>
> {
return this.post<{
valid: boolean;
key_info?: {
id: string;
name: string;
type: string;
scopes: string[];
};
}>("/auth/validate-key", {
api_key: apiKey,
});
}
async regenerateApiKey(
req: unknown
): Promise<
ApiResponse<{ success: boolean; data?: { apiKey: string }; error?: string }>
> {
return this.post<{
success: boolean;
data?: { apiKey: string };
error?: string;
}>("/auth/regenerate-api-key", req);
}
}