66 lines
2.5 KiB
TypeScript
66 lines
2.5 KiB
TypeScript
import Dexie, { type EntityTable } from "dexie";
|
|
import type { LedgerEntry, SyncOperation } from "@cents/domain";
|
|
import type { LedgerRecord, UserPreference } from "./ledgers";
|
|
|
|
export type SyncMetadata = {
|
|
id: string;
|
|
cursor: string;
|
|
updatedAt: string;
|
|
};
|
|
|
|
export const db = new Dexie("cents") as Dexie & {
|
|
entries: EntityTable<LedgerEntry, "id">;
|
|
syncOperations: EntityTable<SyncOperation, "id">;
|
|
ledgers: EntityTable<LedgerRecord, "id">;
|
|
userPreferences: EntityTable<UserPreference, "id">;
|
|
syncMetadata: EntityTable<SyncMetadata, "id">;
|
|
};
|
|
|
|
db.version(1).stores({
|
|
entries: "id, ledgerId, occurredAt, updatedAt, deletedAt",
|
|
syncOperations: "id, ledgerId, createdAt, syncedAt",
|
|
});
|
|
|
|
db.version(2).stores({
|
|
entries: "id, ledgerId, occurredAt, updatedAt, deletedAt",
|
|
syncOperations: "id, ledgerId, createdAt, syncedAt",
|
|
ledgers: "id, updatedAt, archivedAt",
|
|
userPreferences: "id, userId, key, updatedAt",
|
|
});
|
|
|
|
db.version(3).stores({
|
|
entries: "id, ledgerId, occurredAt, updatedAt, deletedAt",
|
|
syncOperations: "id, ledgerId, createdAt, syncedAt",
|
|
ledgers: "id, updatedAt, archivedAt",
|
|
userPreferences: "id, userId, key, updatedAt",
|
|
syncMetadata: "id, updatedAt",
|
|
});
|
|
|
|
type LegacyEntry = LedgerEntry & { ledgerId?: string; ownerId?: string; ledgerIds?: string[] };
|
|
type LegacyOperation = SyncOperation & { ledgerId?: string; ledgerIds?: string[]; payload: LegacyEntry };
|
|
|
|
db.version(4).stores({
|
|
entries: "id, ownerId, *ledgerIds, occurredAt, updatedAt, deletedAt",
|
|
syncOperations: "id, *ledgerIds, createdAt, syncedAt",
|
|
ledgers: "id, updatedAt, archivedAt",
|
|
userPreferences: "id, userId, key, updatedAt",
|
|
syncMetadata: "id, updatedAt",
|
|
}).upgrade(async (transaction) => {
|
|
await transaction.table<LegacyEntry>("entries").toCollection().modify((entry) => {
|
|
entry.ownerId ??= entry.createdBy;
|
|
entry.ledgerIds = entry.ledgerIds?.length ? [...new Set(entry.ledgerIds)] : entry.ledgerId ? [entry.ledgerId] : [];
|
|
delete entry.ledgerId;
|
|
});
|
|
await transaction.table<LegacyOperation>("syncOperations").toCollection().modify((operation) => {
|
|
operation.payload.ownerId ??= operation.payload.createdBy;
|
|
operation.payload.ledgerIds = operation.payload.ledgerIds?.length
|
|
? [...new Set(operation.payload.ledgerIds)]
|
|
: operation.payload.ledgerId ? [operation.payload.ledgerId] : [];
|
|
operation.ledgerIds = operation.ledgerIds?.length
|
|
? [...new Set(operation.ledgerIds)]
|
|
: operation.ledgerId ? [operation.ledgerId] : operation.payload.ledgerIds;
|
|
delete operation.payload.ledgerId;
|
|
delete operation.ledgerId;
|
|
});
|
|
});
|