feat: initial commit
This commit is contained in:
@@ -0,0 +1,162 @@
|
||||
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,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user