api: add protected CRUD routers and DNS check logic
This commit is contained in:
parent
c7edd90a7e
commit
5264cccb6c
11 changed files with 709 additions and 8 deletions
87
packages/api/src/routers/utils.ts
Normal file
87
packages/api/src/routers/utils.ts
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
import { TRPCError } from "@trpc/server";
|
||||
import { db } from "@minmon/db";
|
||||
import { domain, note, server, service } from "@minmon/db";
|
||||
import { and, eq } from "drizzle-orm";
|
||||
|
||||
export function createEntityId() {
|
||||
return crypto.randomUUID();
|
||||
}
|
||||
|
||||
export function stripUndefined<T extends Record<string, unknown>>(values: T) {
|
||||
return Object.fromEntries(
|
||||
Object.entries(values).filter(([, value]) => value !== undefined),
|
||||
) as Partial<T>;
|
||||
}
|
||||
|
||||
export function notFound(message: string): never {
|
||||
throw new TRPCError({
|
||||
code: "NOT_FOUND",
|
||||
message,
|
||||
});
|
||||
}
|
||||
|
||||
export function badRequest(message: string): never {
|
||||
throw new TRPCError({
|
||||
code: "BAD_REQUEST",
|
||||
message,
|
||||
});
|
||||
}
|
||||
|
||||
export async function requireServer(serverId: string) {
|
||||
const [item] = await db.select().from(server).where(eq(server.id, serverId)).limit(1);
|
||||
if (!item) {
|
||||
notFound("Server not found");
|
||||
}
|
||||
return item;
|
||||
}
|
||||
|
||||
export async function requireService(serviceId: string) {
|
||||
const [item] = await db.select().from(service).where(eq(service.id, serviceId)).limit(1);
|
||||
if (!item) {
|
||||
notFound("Service not found");
|
||||
}
|
||||
return item;
|
||||
}
|
||||
|
||||
export async function requireDomain(domainId: string) {
|
||||
const [item] = await db.select().from(domain).where(eq(domain.id, domainId)).limit(1);
|
||||
if (!item) {
|
||||
notFound("Domain not found");
|
||||
}
|
||||
return item;
|
||||
}
|
||||
|
||||
export async function requireNote(noteId: string) {
|
||||
const [item] = await db.select().from(note).where(eq(note.id, noteId)).limit(1);
|
||||
if (!item) {
|
||||
notFound("Note not found");
|
||||
}
|
||||
return item;
|
||||
}
|
||||
|
||||
export async function requireServiceWithServer(serviceId: string) {
|
||||
const item = await requireService(serviceId);
|
||||
const parentServer = await requireServer(item.serverId);
|
||||
return { service: item, server: parentServer };
|
||||
}
|
||||
|
||||
export async function requireDomainWithRelations(domainId: string) {
|
||||
const item = await requireDomain(domainId);
|
||||
const parentService = await requireService(item.serviceId);
|
||||
const parentServer = await requireServer(parentService.serverId);
|
||||
return { domain: item, service: parentService, server: parentServer };
|
||||
}
|
||||
|
||||
export async function ensureServiceBelongsToServer(serviceId: string, serverId: string) {
|
||||
const [item] = await db
|
||||
.select()
|
||||
.from(service)
|
||||
.where(and(eq(service.id, serviceId), eq(service.serverId, serverId)))
|
||||
.limit(1);
|
||||
|
||||
if (!item) {
|
||||
badRequest("Service does not belong to the selected server");
|
||||
}
|
||||
|
||||
return item;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue