phase-8:server code enhancements.

This commit is contained in:
Kazuma
2026-06-05 22:44:04 -04:00
committed by Kazuma
parent 7cb1b03fd5
commit 7f2108129a
15 changed files with 781 additions and 94 deletions
+18 -12
View File
@@ -3,29 +3,35 @@ import { randomUUID } from 'crypto';
import type { MarketCall, CreateCallInput, StoreData } from '../types';
export class MarketCallRepository {
private static readonly STORE_PATH = './market-calls.json';
private static readonly DEFAULT_PATH = './market-calls.json';
private _load(): StoreData {
if (!existsSync(MarketCallRepository.STORE_PATH)) return { calls: [] };
private readonly storePath: string;
constructor(storePath?: string) {
this.storePath = storePath ?? MarketCallRepository.DEFAULT_PATH;
}
private load(): StoreData {
if (!existsSync(this.storePath)) return { calls: [] };
try {
return JSON.parse(readFileSync(MarketCallRepository.STORE_PATH, 'utf8')) as StoreData;
return JSON.parse(readFileSync(this.storePath, 'utf8')) as StoreData;
} catch {
return { calls: [] };
}
}
private _save(data: StoreData): void {
writeFileSync(MarketCallRepository.STORE_PATH, JSON.stringify(data, null, 2), 'utf8');
private save(data: StoreData): void {
writeFileSync(this.storePath, JSON.stringify(data, null, 2), 'utf8');
}
list(): (MarketCall & { createdAt: string })[] {
return this._load().calls.sort(
return this.load().calls.sort(
(a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(),
);
}
get(id: string): (MarketCall & { createdAt: string }) | null {
return this._load().calls.find((c) => c.id === id) ?? null;
return this.load().calls.find((c) => c.id === id) ?? null;
}
create({
@@ -36,7 +42,7 @@ export class MarketCallRepository {
tickers,
snapshot,
}: CreateCallInput): MarketCall & { createdAt: string } {
const data = this._load();
const data = this.load();
const call = {
id: randomUUID(),
title,
@@ -48,16 +54,16 @@ export class MarketCallRepository {
createdAt: new Date().toISOString(),
};
data.calls.push(call);
this._save(data);
this.save(data);
return call;
}
delete(id: string): boolean {
const data = this._load();
const data = this.load();
const before = data.calls.length;
data.calls = data.calls.filter((c) => c.id !== id);
if (data.calls.length === before) return false;
this._save(data);
this.save(data);
return true;
}
}