Files
abode/src/db/sqlite/cast.ts
T
2026-06-29 23:07:14 +00:00

163 lines
4.5 KiB
TypeScript

import type { Abode } from "../types/Abode.js";
import type { ApikeyPermissions, ClientApikey } from "../types/Apikey.js";
import type { Resident, ResidentFlags } from "../types/Resident.js";
import type { ClientUser, PartialUser, UserFlags } from "../types/User.js";
export function dateToSqlite(date: string) {
return new Date(date).getTime() / 1000;
}
export function sqliteToDate(date: string) {
return new Date(date.replace(" ", "T") + "Z").toISOString();
}
export function uuidToSqlite(uuid: string) {
return Buffer.from(uuid.replaceAll("-", ""), "hex");
}
export function sqliteToUuid(uuid: Buffer | Uint8Array) {
const hex = (uuid instanceof Buffer ? uuid : Buffer.from(uuid)).toString(
"hex"
);
return [
hex.slice(0, 8),
hex.slice(8, 12),
hex.slice(12, 16),
hex.slice(16, 20),
hex.slice(20),
].join("-");
}
const defaultUserFlags: UserFlags = {};
export function sqliteToUserFlags(flags: string): UserFlags {
const parsed = JSON.parse(flags);
const out = { ...defaultUserFlags };
if (typeof parsed !== "object" || !parsed || Array.isArray(parsed))
return out;
if (parsed.admin === true) out.admin = true;
return out;
}
export function sqliteToPartialUser(user: {
uid: Buffer | Uint8Array;
name: string;
flags: string;
created_at: string;
updated_at: string;
}): PartialUser {
return {
uid: sqliteToUuid(user.uid),
name: user.name,
flags: sqliteToUserFlags(user.flags),
created_at: sqliteToDate(user.created_at),
updated_at: sqliteToDate(user.updated_at),
};
}
export function sqliteToClientUser(user: {
uid: Buffer | Uint8Array;
email: string;
name: string;
flags: string;
created_at: string;
updated_at: string;
}): ClientUser {
return {
...sqliteToPartialUser(user),
email: user.email,
};
}
export function sqliteToAbode(abode: {
aid: Buffer | Uint8Array;
name: string;
created_at: string;
created_by: Buffer | Uint8Array | null;
updated_at: string;
updated_by: Buffer | Uint8Array | null;
}): Abode {
return {
aid: sqliteToUuid(abode.aid),
name: abode.name,
created_at: sqliteToDate(abode.created_at),
created_by: abode.created_by && sqliteToUuid(abode.created_by),
updated_at: sqliteToDate(abode.updated_at),
updated_by: abode.updated_by && sqliteToUuid(abode.updated_by),
};
}
const defaultResidentFlags: ResidentFlags = {};
export function sqliteToResidentFlags(flags: string): ResidentFlags {
const parsed = JSON.parse(flags);
const out = { ...defaultResidentFlags };
if (typeof parsed !== "object" || !parsed || Array.isArray(parsed))
return out;
if (parsed.admin === true) out.admin = true;
return out;
}
export function sqliteToResident(resident: {
uid: Buffer | Uint8Array;
aid: Buffer | Uint8Array;
flags: string;
created_at: string;
created_by: Buffer | Uint8Array | null;
updated_at: string;
updated_by: Buffer | Uint8Array | null;
}): Resident {
return {
uid: sqliteToUuid(resident.uid),
aid: sqliteToUuid(resident.aid),
flags: sqliteToResidentFlags(resident.flags),
created_at: sqliteToDate(resident.created_at),
created_by: resident.created_by && sqliteToUuid(resident.created_by),
updated_at: sqliteToDate(resident.updated_at),
updated_by: resident.updated_by && sqliteToUuid(resident.updated_by),
};
}
const defaultApikeyPermissions: ApikeyPermissions = {};
export function sqliteToApikeyPermissions(
permissions: string
): ApikeyPermissions {
const parsed = JSON.parse(permissions);
const out = { ...defaultApikeyPermissions };
if (typeof parsed !== "object" || !parsed || Array.isArray(parsed))
return out;
if (parsed.admin === true) out.admin = true;
if (parsed.all === true) out.all = true;
for (const key of ["users", "residents", "abodes"] as const) {
if (parsed[key] === "r" || parsed[key] === "rw") out[key] = parsed[key];
}
for (const key of ["restrict_users", "restrict_abodes"] as const) {
if (
Array.isArray(parsed[key]) &&
parsed[key].every((x) => typeof x === "string")
) {
out[key] = parsed[key];
}
}
return out;
}
export function sqliteToClientApikey(apikey: {
uid: Buffer | Uint8Array;
kid: Buffer | Uint8Array;
name: string;
permissions: string;
created_at: string;
expires_at: string | null;
}): ClientApikey {
return {
uid: sqliteToUuid(apikey.uid),
kid: sqliteToUuid(apikey.kid),
name: apikey.name,
permissions: sqliteToApikeyPermissions(apikey.permissions),
created_at: sqliteToDate(apikey.created_at),
expires_at: apikey.expires_at ? sqliteToDate(apikey.expires_at) : null,
};
}