86 lines
2.6 KiB
TypeScript
86 lines
2.6 KiB
TypeScript
import type { CompanyProfileDto, CompanyProfileInput } from "@mrp/shared";
|
|
|
|
import { logAuditEvent } from "../../lib/audit.js";
|
|
import { prisma } from "../../lib/prisma.js";
|
|
|
|
type CompanyProfileRecord = Awaited<ReturnType<typeof prisma.companyProfile.findFirstOrThrow>>;
|
|
|
|
function mapCompanyProfile(profile: CompanyProfileRecord): CompanyProfileDto {
|
|
return {
|
|
id: profile.id,
|
|
companyName: profile.companyName,
|
|
legalName: profile.legalName,
|
|
email: profile.email,
|
|
phone: profile.phone,
|
|
website: profile.website,
|
|
taxId: profile.taxId,
|
|
addressLine1: profile.addressLine1,
|
|
addressLine2: profile.addressLine2,
|
|
city: profile.city,
|
|
state: profile.state,
|
|
postalCode: profile.postalCode,
|
|
country: profile.country,
|
|
theme: {
|
|
primaryColor: profile.primaryColor,
|
|
accentColor: profile.accentColor,
|
|
surfaceColor: profile.surfaceColor,
|
|
fontFamily: profile.fontFamily,
|
|
logoFileId: profile.logoFileId,
|
|
},
|
|
logoUrl: profile.logoFileId ? `/api/v1/files/${profile.logoFileId}/content` : null,
|
|
updatedAt: profile.updatedAt.toISOString(),
|
|
};
|
|
}
|
|
|
|
export async function getActiveCompanyProfile() {
|
|
return mapCompanyProfile(
|
|
await prisma.companyProfile.findFirstOrThrow({
|
|
where: { isActive: true },
|
|
})
|
|
);
|
|
}
|
|
|
|
export async function updateActiveCompanyProfile(payload: CompanyProfileInput, actorId?: string | null) {
|
|
const current = await prisma.companyProfile.findFirstOrThrow({
|
|
where: { isActive: true },
|
|
});
|
|
|
|
const profile = await prisma.companyProfile.update({
|
|
where: { id: current.id },
|
|
data: {
|
|
companyName: payload.companyName,
|
|
legalName: payload.legalName,
|
|
email: payload.email,
|
|
phone: payload.phone,
|
|
website: payload.website,
|
|
taxId: payload.taxId,
|
|
addressLine1: payload.addressLine1,
|
|
addressLine2: payload.addressLine2,
|
|
city: payload.city,
|
|
state: payload.state,
|
|
postalCode: payload.postalCode,
|
|
country: payload.country,
|
|
primaryColor: payload.theme.primaryColor,
|
|
accentColor: payload.theme.accentColor,
|
|
surfaceColor: payload.theme.surfaceColor,
|
|
fontFamily: payload.theme.fontFamily,
|
|
logoFileId: payload.theme.logoFileId,
|
|
},
|
|
});
|
|
|
|
await logAuditEvent({
|
|
actorId,
|
|
entityType: "company-profile",
|
|
entityId: profile.id,
|
|
action: "updated",
|
|
summary: `Updated company profile for ${profile.companyName}.`,
|
|
metadata: {
|
|
companyName: profile.companyName,
|
|
legalName: profile.legalName,
|
|
logoFileId: profile.logoFileId,
|
|
},
|
|
});
|
|
|
|
return mapCompanyProfile(profile);
|
|
}
|