Files
neta/server/repositories/files.ts
T

39 lines
1.5 KiB
TypeScript

import { and, desc, eq, or } from "drizzle-orm";
import { instanceBranding } from "../db/schema/storage";
import { files } from "../db/schema/storage";
import type { OwnerScope } from "../domain/actor";
import type { DomainDatabase } from "../domain/database";
export function createFileRepository(db: DomainDatabase) {
return {
get: (id: string) => db.select().from(files).where(eq(files.id, id)).get(),
getOwned: (scope: OwnerScope, id: string) =>
db.select().from(files).where(and(eq(files.id, id), eq(files.ownerUserId, scope.ownerUserId))).get(),
listOwned: (scope: OwnerScope) =>
db.select().from(files).where(eq(files.ownerUserId, scope.ownerUserId)).orderBy(desc(files.createdAt)).all(),
create: (value: typeof files.$inferInsert) => db.insert(files).values(value).returning().get(),
remove: (id: string) => db.delete(files).where(eq(files.id, id)).returning().get(),
getPublicBrandingAsset: (id: string) =>
db
.select({ file: files })
.from(files)
.innerJoin(
instanceBranding,
or(
eq(instanceBranding.lightLogoFileId, files.id),
eq(instanceBranding.darkLogoFileId, files.id),
eq(instanceBranding.iconFileId, files.id),
),
)
.where(
and(
eq(files.id, id),
eq(files.visibility, "public_branding"),
),
)
.get()?.file,
};
}
export type FileRepository = ReturnType<typeof createFileRepository>;