* refactor: replace FeaturesRepository with DI-based feature repositories Migrate from the legacy FeaturesRepository pattern to separate DI-based repositories: - Add checkIfFeatureIsEnabledGlobally to IFeatureRepository - Add getTeamsWithFeatureEnabled to ITeamFeatureRepository - Update CalendarSubscriptionService to use featureRepository, teamFeatureRepository, and userFeatureRepository - Update SelectedCalendarRepository.findNextSubscriptionBatch to filter by teamIds instead of featureIds - Update OnboardingPathService to use DI via getFeatureRepository() - Remove prisma parameter from OnboardingPathService callsites Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test: update tests to use new DI-based feature repositories Update CalendarSubscriptionService and SelectedCalendarRepository tests to use the new separate repository interfaces: - featureRepository for global feature checks - teamFeatureRepository for team-level feature checks - userFeatureRepository for user-level feature checks Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: update API routes to use DI-based feature repositories Update cron and webhook routes to use the new separate repository interfaces instead of the combined FeaturesRepository. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: remove prisma arg from getGettingStartedPathWithParams call The OnboardingPathService method no longer requires a prisma argument as it now uses DI containers internally. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test: update route tests to expect new DI-based feature repositories Update service instantiation tests to expect featureRepository, teamFeatureRepository, and userFeatureRepository instead of the old featuresRepository. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: optimize global feature check and add guard in checkForNewSubscriptions - Use targeted select for only `enabled` field in checkIfFeatureIsEnabledGlobally - Add global feature flag guard in checkForNewSubscriptions to avoid unnecessary DB queries and API calls when the cache feature is globally disabled Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * remove redundant comment --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
74 lines
2.0 KiB
TypeScript
74 lines
2.0 KiB
TypeScript
import type { Prisma, SelectedCalendar } from "@calcom/prisma/client";
|
|
|
|
export interface ISelectedCalendarRepository {
|
|
/**
|
|
* Find selected calendar by id
|
|
*
|
|
* @param id
|
|
*/
|
|
findById(id: string): Promise<SelectedCalendar | null>;
|
|
|
|
/**
|
|
* Find selected calendar by channel id
|
|
*
|
|
* @param channelId
|
|
*/
|
|
findByChannelId(channelId: string): Promise<SelectedCalendar | null>;
|
|
|
|
/**
|
|
* Find next batch of selected calendars
|
|
* Will check if syncSubscribedAt is null or channelExpiration is greater than current date
|
|
* Calendars with recent subscription errors (last 24h) are skipped
|
|
* Calendars with 3+ subscription errors are skipped entirely
|
|
* Joins with Membership to filter users belonging to teams with the specified team IDs
|
|
*
|
|
* @param take the number of calendars to take
|
|
* @param teamIds the team IDs to filter by (users in these teams will be included)
|
|
* @param integrations the list of integrations
|
|
* @param genericCalendarSuffixes the list of generic calendar suffixes to exclude
|
|
*/
|
|
findNextSubscriptionBatch({
|
|
take,
|
|
teamIds,
|
|
integrations,
|
|
genericCalendarSuffixes,
|
|
}: {
|
|
take: number;
|
|
teamIds: number[];
|
|
integrations: string[];
|
|
genericCalendarSuffixes?: string[];
|
|
}): Promise<SelectedCalendar[]>;
|
|
|
|
/**
|
|
* Update status of sync for selected calendar
|
|
*
|
|
* @param id
|
|
* @param data
|
|
*/
|
|
updateSyncStatus(
|
|
id: string,
|
|
data: Pick<
|
|
Prisma.SelectedCalendarUpdateInput,
|
|
"syncToken" | "syncedAt" | "syncErrorAt" | "syncErrorCount"
|
|
>
|
|
): Promise<SelectedCalendar>;
|
|
|
|
/**
|
|
* Update subscription status for selected calendar
|
|
*/
|
|
updateSubscription(
|
|
id: string,
|
|
data: Pick<
|
|
Prisma.SelectedCalendarUpdateInput,
|
|
| "channelId"
|
|
| "channelResourceId"
|
|
| "channelResourceUri"
|
|
| "channelKind"
|
|
| "channelExpiration"
|
|
| "syncSubscribedAt"
|
|
| "syncSubscribedErrorAt"
|
|
| "syncSubscribedErrorCount"
|
|
>
|
|
): Promise<SelectedCalendar>;
|
|
}
|