Rewrote storage to support more entities

This commit is contained in:
olaven 2024-08-13 18:22:13 +02:00
parent 94335f04b7
commit b3ff744f4d
3 changed files with 36 additions and 19 deletions

View File

@ -10,7 +10,7 @@ async function initialFetch(options: { id: string }): Promise<Series | null> {
if (!series) { if (!series) {
return null; return null;
} }
const stored = storage.write(series); const stored = storage.writeSeries(series);
if (!stored) { if (!stored) {
console.error(`Failed to store series ${options.id}`); console.error(`Failed to store series ${options.id}`);
return null; return null;
@ -50,7 +50,7 @@ async function updateFetch(existingSeries: Series): Promise<UpdatedSeries | Seri
episodes: episodesSortedDescending, episodes: episodesSortedDescending,
}; };
const updateSuccessful = await storage.write(updated); const updateSuccessful = await storage.writeSeries(updated);
if (!updateSuccessful) { if (!updateSuccessful) {
console.log(`Failed to update series ${existingSeries.id}`); console.log(`Failed to update series ${existingSeries.id}`);
return null; return null;
@ -76,7 +76,7 @@ function isSeriesFromStorageNew(
} }
async function getSeries(options: { id: string }): Promise<Series | null> { async function getSeries(options: { id: string }): Promise<Series | null> {
const seriesFromStorage = await storage.read(options); const seriesFromStorage = await storage.readSeries(options);
/** /**
* We don't have the feed in storage, * We don't have the feed in storage,

View File

@ -4,18 +4,18 @@ import { testUtils } from "./test-utils.ts";
Deno.test("can store a series", async () => { Deno.test("can store a series", async () => {
const series = testUtils.generateSeries(); const series = testUtils.generateSeries();
await storage.write(series); await storage.writeSeries(series);
const readSeries = await storage.read(series); const readSeries = await storage.readSeries(series);
assertEquals(readSeries, series); assertEquals(readSeries, series);
}); });
Deno.test("can retrieve a series", async () => { Deno.test("can retrieve a series", async () => {
const series = testUtils.generateSeries(); const series = testUtils.generateSeries();
await storage.write(series); await storage.writeSeries(series);
const readSeries = await storage.read(series); const readSeries = await storage.readSeries(series);
assertEquals(readSeries, series); assertEquals(readSeries, series);
}); });

View File

@ -18,26 +18,43 @@ export type Series = {
episodes: Episode[]; episodes: Episode[];
}; };
export type VippsAgreement = {
id: string;
agreementId: string;
userEmail: string;
createdAt: Date;
revokedAt: Date | null;
};
const kv = await Deno.openKv(); const kv = await Deno.openKv();
function seriesKey(series: { id: string }) { type Identifiable = { id: string };
return ["series", series.id]; type Collection = "series" | "vipps-agreements";
function read<T extends Identifiable>(collection: Collection) {
return async function (series: Identifiable) {
const key = [collection, series.id];
const read = await kv.get(key);
return read.value as T | null;
};
} }
async function readSeries(options: { id: string }): Promise<Series | null> { function write<T extends Identifiable>(collection: Collection) {
const { id } = options; return async function (entity: T) {
const key = seriesKey({ id }); const key = [collection, entity.id];
const read = await kv.get<Series>(key); const stored = await kv.set(key, entity);
return read.value; return stored.ok;
};
} }
async function writeSeries(series: Series): Promise<boolean> { const readSeries = read<Series>("series");
const key = seriesKey(series); const writeSeries = write<Series>("series");
const stored = await kv.set(key, series); const readVippsAgreement = read<VippsAgreement>("vipps-agreements");
return stored.ok; const writeVippsAgreement = write<VippsAgreement>("vipps-agreements");
}
export const storage = { export const storage = {
readSeries, readSeries,
writeSeries, writeSeries,
readVippsAgreement,
writeVippsAgreement,
}; };