Files
i-want-to-heal-mmo/src/frontend/accountRepository.ts
T
2026-07-12 23:20:15 -04:00

41 lines
1.8 KiB
TypeScript

import { OnlineApiError, OnlineRepository, onlineRepository } from "./onlineRepository";
export type AccountResult =
| { ok: true; username: string }
| { ok: false; reason: "missing-credentials" | "account-exists" | "invalid-password" | "server-unavailable" | "invalid-request"; message?: string };
function failure(error: unknown): Extract<AccountResult, { ok: false }> {
if (!(error instanceof OnlineApiError)) return { ok: false, reason: "server-unavailable" };
if (error.status === 0 || error.status >= 500) return { ok: false, reason: "server-unavailable", message: error.message };
if (error.status === 409) return { ok: false, reason: "account-exists", message: error.message };
if (error.status === 401) return { ok: false, reason: "invalid-password", message: error.message };
return { ok: false, reason: "invalid-request", message: error.message };
}
export class AccountRepository {
constructor(private readonly online: OnlineRepository = onlineRepository) {}
async create(username: string, password: string): Promise<AccountResult> {
if (!username.trim() || !password) return { ok: false, reason: "missing-credentials" };
try {
const account = await this.online.register(username, password);
return { ok: true, username: account.username };
} catch (error) {
return failure(error);
}
}
async authenticate(username: string, password: string): Promise<AccountResult> {
if (!username.trim() || !password) return { ok: false, reason: "missing-credentials" };
try {
const account = await this.online.login(username, password);
return { ok: true, username: account.username };
} catch (error) {
return failure(error);
}
}
session() { return this.online.session(); }
logout() { return this.online.logout(); }
}