* 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 <noreply@anthropic.com> * 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 <noreply@anthropic.com> * 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 <noreply@anthropic.com> * 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 <noreply@anthropic.com> * 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 <noreply@anthropic.com> * 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 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
65 lines
2.0 KiB
TypeScript
65 lines
2.0 KiB
TypeScript
import type { AdditionalInformation, AppsStatus } from "@calcom/types/Calendar";
|
|
import type { EventResult } from "@calcom/types/EventManager";
|
|
|
|
import type { Booking } from "./createBooking";
|
|
import type { ReqAppsStatus } from "./getBookingData";
|
|
|
|
export function handleAppsStatus(
|
|
results: EventResult<AdditionalInformation>[],
|
|
booking: (Booking & { appsStatus?: AppsStatus[] }) | null,
|
|
reqAppsStatus: ReqAppsStatus
|
|
): AppsStatus[] {
|
|
const resultStatus = mapResultsToAppsStatus(results);
|
|
|
|
if (reqAppsStatus === undefined) {
|
|
return updateBookingWithStatus(booking, resultStatus);
|
|
}
|
|
|
|
return calculateAggregatedAppsStatus(reqAppsStatus, resultStatus);
|
|
}
|
|
|
|
function mapResultsToAppsStatus(results: EventResult<AdditionalInformation>[]): AppsStatus[] {
|
|
return results.map((app) => ({
|
|
appName: app.appName,
|
|
type: app.type,
|
|
success: app.success ? 1 : 0,
|
|
failures: !app.success ? 1 : 0,
|
|
errors: app.calError ? [app.calError] : [],
|
|
warnings: app.calWarnings,
|
|
}));
|
|
}
|
|
|
|
function updateBookingWithStatus(
|
|
booking: (Booking & { appsStatus?: AppsStatus[] }) | null,
|
|
resultStatus: AppsStatus[]
|
|
): AppsStatus[] {
|
|
if (booking !== null) {
|
|
booking.appsStatus = resultStatus;
|
|
}
|
|
return resultStatus;
|
|
}
|
|
|
|
function calculateAggregatedAppsStatus(
|
|
reqAppsStatus: NonNullable<ReqAppsStatus>,
|
|
resultStatus: AppsStatus[]
|
|
): AppsStatus[] {
|
|
// From down here we can assume reqAppsStatus is not undefined anymore
|
|
// Other status exist, so this is the last booking of a series,
|
|
// proceeding to prepare the info for the event
|
|
const aggregatedStatus = reqAppsStatus.concat(resultStatus).reduce(
|
|
(acc, curr) => {
|
|
if (acc[curr.type]) {
|
|
acc[curr.type].success += curr.success;
|
|
acc[curr.type].errors = acc[curr.type].errors.concat(curr.errors);
|
|
acc[curr.type].warnings = acc[curr.type].warnings?.concat(curr.warnings || []);
|
|
} else {
|
|
acc[curr.type] = curr;
|
|
}
|
|
return acc;
|
|
},
|
|
{} as { [key: string]: AppsStatus }
|
|
);
|
|
|
|
return Object.values(aggregatedStatus);
|
|
}
|