Files
calendar/packages/lib/service/attribute/utils.ts
T
Benny JooandGitHub 7bf5d9cf64 perf: import enums from @calcom/prisma/enums (#23582)
* wip

* fix imports in the rest

* rest

* fix mistake
2025-09-04 11:44:54 +00:00

88 lines
2.3 KiB
TypeScript

/**
* Utility functions for attribute service. Shared across server and client.
*/
import slugify from "@calcom/lib/slugify";
import { AttributeType } from "@calcom/prisma/enums";
import type { AttributeOptionAssignment, BulkAttributeAssigner } from "./types";
/**
* What is a pool?
* There can be two pools:
* 1. SCIM Pool - All assignments in this pool are created/updated by SCIM.
* 2. Cal.com User Pool - All assignments in this pool are created/updated by Cal.com Users.
*/
export const isAssignmentForTheSamePool = ({
assignment,
updater,
}: {
assignment: Pick<
AttributeOptionAssignment,
"createdByDSyncId" | "updatedByDSyncId" | "createdById" | "updatedById"
>;
updater: BulkAttributeAssigner;
}) => {
if ("dsyncId" in updater) {
// Cal.com user updated an assignment created by SCIM. It no longer belongs to the SCIM pool.
if (assignment.updatedById) {
return false;
}
// Either SCIM created the assignment or updated it
return !!assignment.updatedByDSyncId || !!assignment.createdByDSyncId;
}
// SCIM neither created nor updated the assignment, it has to belong to the only left pool(i.e. Cal.com User Pool)
return !assignment.createdByDSyncId && !assignment.updatedByDSyncId;
};
export const isAssignmentForLockedAttribute = ({
assignment,
}: {
assignment: {
attributeOption: {
attribute: {
isLocked: boolean;
};
};
};
}) => {
return assignment.attributeOption.attribute.isLocked;
};
export const isAssignmentSame = ({
existingAssignment,
newOption,
}: {
existingAssignment: { attributeOption: { label: string } };
newOption: { label: string };
}) => {
return existingAssignment.attributeOption.label.toLowerCase() === newOption.label.toLowerCase();
};
export const doesSupportMultipleValues = ({ attribute }: { attribute: { type: AttributeType } }) => {
return attribute.type === AttributeType.MULTI_SELECT;
};
export const buildSlugFromValue = ({ value }: { value: string }) => {
return slugify(value);
};
export const hasOptions = ({
attribute,
}: {
attribute: {
type: AttributeType;
};
}) => {
return attribute.type === AttributeType.MULTI_SELECT || attribute.type === AttributeType.SINGLE_SELECT;
};
export const canSetValueBeyondOptions = ({
attribute,
}: {
attribute: {
type: AttributeType;
};
}) => {
return !hasOptions({ attribute });
};