110 lines
3.5 KiB
TypeScript
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 };
|
|
}
|