mirror of
https://github.com/hanzoai/calendar.git
synced 2026-10-30 14:46:43 +00:00
* refactor: apply biome formatting to packages/features (batch 1 - small subdirs) Format small subdirectories in packages/features: di, flags, holidays, oauth, settings, users, assignment-reason, selectedCalendar, hashedLink, host, form, form-builder, availability, data-table, pbac, schedules, troubleshooter, eventtypes, calendar-subscription, and root-level files. Also includes straggler apps/web BookEventForm.tsx. Co-Authored-By: Claude Opus 4.6 <[email protected]> * refactor: apply biome formatting to packages/features (batch 2 - medium subdirs) Format medium subdirectories in packages/features: auth, credentials, calendars, routing-forms, routing-trace, attributes, watchlist, calAIPhone, tasker, and webhooks. Co-Authored-By: Claude Opus 4.6 <[email protected]> * refactor: apply biome formatting to packages/features (batch 3 - bookings + insights) Format bookings and insights subdirectories in packages/features. Co-Authored-By: Claude Opus 4.6 <[email protected]> * refactor: apply biome formatting to packages/features (batch 4 - ee) Format packages/features/ee subdirectory covering billing, workflows, organizations, teams, managed-event-types, round-robin, dsync, integration-attribute-sync, and payments. Co-Authored-By: Claude Opus 4.6 <[email protected]> * refactor: apply biome formatting to packages/features (batch 5 - booking-audit part 1) Format booking-audit di, actions, common, dto, repository, and types subdirectories in packages/features/booking-audit. Co-Authored-By: Claude Opus 4.6 <[email protected]> * refactor: apply biome formatting to packages/features (batch 6 - booking-audit part 2) Format booking-audit service subdirectory in packages/features/booking-audit. Co-Authored-By: Claude Opus 4.6 <[email protected]> --------- Co-authored-by: Claude Opus 4.6 <[email protected]>
98 lines
3.1 KiB
TypeScript
98 lines
3.1 KiB
TypeScript
import type { AuditActorType } from "../repository/IAuditActorRepository";
|
|
import type { BookingAuditWithActor } from "../repository/IBookingAuditRepository";
|
|
import { getAppNameFromSlug } from "../getAppNameFromSlug";
|
|
import type { DataRequirements, EnrichmentDataStore } from "./EnrichmentDataStore";
|
|
|
|
type ActorEnrichmentResult = {
|
|
displayName: string;
|
|
displayEmail: string | null;
|
|
displayAvatar: string | null;
|
|
};
|
|
|
|
type Actor = BookingAuditWithActor["actor"];
|
|
|
|
type ActorStrategy = {
|
|
getRequirements: (actor: Actor) => DataRequirements;
|
|
enrich: (actor: Actor, dbStore: EnrichmentDataStore) => ActorEnrichmentResult;
|
|
};
|
|
|
|
export const ACTOR_STRATEGIES: Record<AuditActorType, ActorStrategy> = {
|
|
USER: {
|
|
getRequirements: (actor) => ({ userUuids: actor.userUuid ? [actor.userUuid] : [] }),
|
|
enrich: (actor, dbStore) => {
|
|
if (!actor.userUuid) {
|
|
throw new Error("User UUID is required for USER actor");
|
|
}
|
|
const user = dbStore.getUserByUuid(actor.userUuid);
|
|
if (user) {
|
|
return {
|
|
displayName: user.name || user.email,
|
|
displayEmail: user.email,
|
|
displayAvatar: user.avatarUrl || null,
|
|
};
|
|
}
|
|
return {
|
|
displayName: "Deleted User",
|
|
displayEmail: null,
|
|
displayAvatar: null,
|
|
};
|
|
},
|
|
},
|
|
ATTENDEE: {
|
|
getRequirements: (actor) => ({ attendeeIds: actor.attendeeId ? [actor.attendeeId] : [] }),
|
|
enrich: (actor, dbStore) => {
|
|
if (!actor.attendeeId) {
|
|
throw new Error("Attendee ID is required for ATTENDEE actor");
|
|
}
|
|
const attendee = dbStore.getAttendeeById(actor.attendeeId);
|
|
if (attendee) {
|
|
return {
|
|
displayName: attendee.name || attendee.email,
|
|
displayEmail: attendee.email,
|
|
displayAvatar: null,
|
|
};
|
|
}
|
|
return {
|
|
displayName: "Deleted Attendee",
|
|
displayEmail: null,
|
|
displayAvatar: null,
|
|
};
|
|
},
|
|
},
|
|
APP: {
|
|
getRequirements: (actor) => ({ credentialIds: actor.credentialId ? [actor.credentialId] : [] }),
|
|
enrich: (actor, dbStore) => {
|
|
const credential = actor.credentialId ? dbStore.getCredentialById(actor.credentialId) : null;
|
|
return {
|
|
displayName: credential
|
|
? getAppNameFromSlug({ appSlug: credential.appId })
|
|
: (actor.name ?? "Deleted App"),
|
|
displayEmail: null,
|
|
displayAvatar: null,
|
|
};
|
|
},
|
|
},
|
|
SYSTEM: {
|
|
getRequirements: () => ({}),
|
|
enrich: () => ({ displayName: "Cal.com", displayEmail: null, displayAvatar: null }),
|
|
},
|
|
GUEST: {
|
|
getRequirements: () => ({}),
|
|
enrich: (actor) => ({ displayName: actor.name || "Guest", displayEmail: null, displayAvatar: null }),
|
|
},
|
|
};
|
|
|
|
/**
|
|
* Get data requirements for actor enrichment using the strategy pattern
|
|
*/
|
|
export function getActorDataRequirements(actor: Actor): DataRequirements {
|
|
return ACTOR_STRATEGIES[actor.type].getRequirements(actor);
|
|
}
|
|
|
|
/**
|
|
* Enrich actor information using the strategy pattern
|
|
*/
|
|
export function enrichActor(actor: Actor, dbStore: EnrichmentDataStore): ActorEnrichmentResult {
|
|
return ACTOR_STRATEGIES[actor.type].enrich(actor, dbStore);
|
|
}
|