Files
Benny JooGitHubDevin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
ab21c7f805 refactor: Cal.diy (#28903)
* feat: Cal.diy — community-driven MIT-licensed fork of Cal.com

This squashed commit contains all Cal.diy changes applied on top of calcom/cal.com main:

- Rebrand Cal.com to Cal.diy across the entire codebase
- Remove Enterprise Edition (EE) features, license checks, and AGPL restrictions
- Switch license from AGPL-3.0 to MIT
- Remove docs/ directory (migrated to Nextra at cal.diy)
- Remove dead code: org tests, EE tips, platform nav, premium username, SAML/SSO, etc.
- Clean up .env.example for self-hosted Cal.diy
- Update Docker image references to calcom/cal.diy
- Update README, CONTRIBUTING.md, and issue templates for Cal.diy community fork
- Add PR welcome bot for Cal.diy contributors
- Fix API v2 breaking changes oasdiff ignore entries
- Replace Blacksmith CI runners with default GitHub Actions

3893 files changed, 20789 insertions(+), 411020 deletions(-)

Co-Authored-By: [email protected] <[email protected]>

* refactor: remove org-specific /organizations/:orgId endpoints from API v2 atoms controllers (#1701)

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* fix: revert Cal.diy Inc to Cal.com, Inc. in license files, copyright notices, and package metadata (#1702)

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* rip out org related comments in api v2

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-04-15 09:52:36 -03:00

79 lines
2.7 KiB
TypeScript

import { createModule } from "../di";
import { DI_TOKENS } from "../tokens";
type Host = {
isFixed: boolean;
user: Record<string, unknown>;
groupId?: string | null;
};
type User = Record<string, unknown>;
type QualifiedHost = { user: Record<string, unknown>; isFixed?: boolean; groupId?: string | null };
export const qualifiedHostsModule = createModule();
qualifiedHostsModule.bind(DI_TOKENS.QUALIFIED_HOSTS_SERVICE).toValue({
findQualifiedHostsWithDelegationCredentials: async (...args: unknown[]) => {
const input = (args[0] ?? {}) as Record<string, unknown>;
const eventType = (input.eventType ?? {}) as Record<string, unknown>;
const contactOwnerEmail = input.contactOwnerEmail as string | null | undefined;
const routedTeamMemberIds = (input.routedTeamMemberIds ?? []) as number[];
const hosts = (eventType.hosts ?? []) as Host[];
const users = (eventType.users ?? []) as User[];
const schedulingType = eventType.schedulingType as string | null | undefined;
// For team events with hosts array
if (hosts.length > 0) {
const fixedHosts: QualifiedHost[] = [];
const allRRHosts: QualifiedHost[] = [];
for (const host of hosts) {
const qualifiedHost: QualifiedHost = {
user: host.user,
isFixed: host.isFixed,
groupId: host.groupId ?? null,
};
if (host.isFixed || schedulingType !== "ROUND_ROBIN") {
fixedHosts.push(qualifiedHost);
} else {
allRRHosts.push(qualifiedHost);
}
}
// Filter qualifiedRRHosts based on contactOwnerEmail or routedTeamMemberIds
let qualifiedRRHosts = allRRHosts;
if (contactOwnerEmail) {
const contactOwnerHost = allRRHosts.filter(
(h) => (h.user as { email?: string }).email === contactOwnerEmail
);
if (contactOwnerHost.length > 0) {
qualifiedRRHosts = contactOwnerHost;
}
} else if (routedTeamMemberIds.length > 0) {
const routedMemberIdSet = new Set(routedTeamMemberIds);
const routedHosts = allRRHosts.filter((h) => routedMemberIdSet.has((h.user as { id: number }).id));
if (routedHosts.length > 0) {
qualifiedRRHosts = routedHosts;
}
}
return { qualifiedRRHosts, allFallbackRRHosts: allRRHosts, fixedHosts };
}
// For user events (no hosts, just users array)
if (users.length > 0) {
const fixedHosts = users.map((user) => ({
user,
isFixed: true as const,
groupId: null,
}));
return { qualifiedRRHosts: [], allFallbackRRHosts: [], fixedHosts };
}
return { qualifiedRRHosts: [], allFallbackRRHosts: [], fixedHosts: [] };
},
});