Files
HiveGrid-Wireframes/03 Quellen und Referenzen/hivegrid-cloud/apps/web/app/services/admin/admin-booking-settings.server.ts
T

110 lines
3.5 KiB
TypeScript

import type { AdminPermissionName } from "@hivegrid/db/admin-permissions";
import { adminHasPermission } from "@hivegrid/db/admin-rbac.server";
import {
createAdminBookingSettingsService,
createPrismaAdminBookingSettingsRepository,
} from "@hivegrid/db/admin-booking-settings.server";
import { runAsAdminIdentity } from "~/services/admin/admin-identity.server";
import {
extractWebActorIp,
extractWebActorUserAgent,
extractWebRequestId,
} from "~/utils/audit/withAuditContext";
import { db } from "~/utils/db.server";
import { NOT_FOUND_ENVELOPE } from "~/utils/errors.server";
export async function runAsAdminBookingSettingsOperator<T>(
request: Request,
operation: (context: {
readonly adminUserId: string;
readonly settings: ReturnType<typeof createAdminBookingSettingsService>;
readonly actor: (reason: string) => {
readonly adminUserId: string;
readonly email: string;
readonly reason: string;
readonly requestId: string | null;
readonly ip: string | null;
readonly userAgent: string | null;
};
}) => Promise<T>
) {
return runAsAdminIdentity(
request,
"admin_sales.booking.manage",
async (session) => {
const admin = await db.adminUser.findFirst({
where: { id: session.adminUserId, status: "active" },
select: { id: true, email: true },
});
if (!admin) {
throw Response.json(NOT_FOUND_ENVELOPE, { status: 404 });
}
const authorize = async (permission: AdminPermissionName) => {
if (!(await adminHasPermission(admin.id, permission, db))) {
throw Response.json(NOT_FOUND_ENVELOPE, { status: 404 });
}
};
const actorBase = {
adminUserId: admin.id,
email: admin.email,
requestId: extractWebRequestId(request),
ip: extractWebActorIp(request),
userAgent: extractWebActorUserAgent(request),
};
return operation({
adminUserId: admin.id,
settings: createAdminBookingSettingsService({
repository: createPrismaAdminBookingSettingsRepository(db),
authorize,
}),
actor: (reason) => ({ ...actorBase, reason }),
});
}
);
}
export async function readAdminBookingSettings(adminUserId: string) {
const [meetingTypes, pages, rules, overrides, hosts] =
await Promise.all([
db.adminMeetingType.findMany({
where: { archivedAt: null },
orderBy: [{ name: "asc" }, { id: "asc" }],
}),
db.adminBookingPage.findMany({
where: { archivedAt: null },
orderBy: [{ title: "asc" }, { id: "asc" }],
}),
db.adminAvailabilityRule.findMany({
where: { adminUserId, archivedAt: null },
orderBy: [{ dayOfWeek: "asc" }, { startMinutes: "asc" }],
}),
db.adminAvailabilityOverride.findMany({
where: { adminUserId, archivedAt: null },
orderBy: [{ date: "asc" }, { startMinutes: "asc" }],
}),
db.adminUser.findMany({
where: {
status: "active",
roles: {
some: {
role: {
active: true,
permissions: {
some: {
permission: {
name: "admin_sales.booking.manage",
},
},
},
},
},
},
},
orderBy: [{ firstName: "asc" }, { lastName: "asc" }, { email: "asc" }],
select: { id: true, firstName: true, lastName: true, email: true },
}),
]);
return { meetingTypes, pages, rules, overrides, hosts };
}