import type { ProviderProps, ProviderType } from "./providers"; export const SCHEDULE_FREQUENCY = { DAILY: "DAILY", INTERVAL: "INTERVAL", WEEKLY: "WEEKLY", MONTHLY: "MONTHLY", } as const; export type ScheduleFrequency = (typeof SCHEDULE_FREQUENCY)[keyof typeof SCHEDULE_FREQUENCY]; /** Weekday names indexed by cron convention (0=Sunday). */ export const SCHEDULE_WEEKDAY_LABELS = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", ] as const; /** * Scan-schedule capability modes. In Prowler OSS this is resolved purely from * the runtime environment (Cloud vs non-Cloud); the prowler-cloud overlay * computes a billing-aware capability and injects it via the `capability` prop. * * - `ADVANCED`: full scheduling through the new schedules API — * `/schedules/{providerId}` for a single provider, `/schedules/bulk` for the * organization flow (Prowler Cloud, subscribed/paid). * - `DAILY_LEGACY`: Prowler OSS / non-Cloud. Only the legacy `Daily` schedule * (`/schedules/daily`) plus optional on-demand scans are allowed. * - `MANUAL_ONLY`: Prowler Cloud trial/onboarding. No schedules at all, only a * manual on-demand scan subject to the account quota. * - `BLOCKED`: Prowler Cloud account over the scan limit. No scan or schedule * action is available. */ export const SCAN_SCHEDULE_CAPABILITY = { ADVANCED: "ADVANCED", DAILY_LEGACY: "DAILY_LEGACY", MANUAL_ONLY: "MANUAL_ONLY", BLOCKED: "BLOCKED", } as const; export type ScanScheduleCapability = (typeof SCAN_SCHEDULE_CAPABILITY)[keyof typeof SCAN_SCHEDULE_CAPABILITY]; export interface ScheduleAttributes { scan_enabled: boolean; scan_frequency: ScheduleFrequency; scan_hour: number | null; scan_timezone: string; scan_interval_hours: number | null; scan_day_of_week: number | null; scan_day_of_month: number | null; /** Read-only, server-computed next fire time; null when paused/unconfigured. */ next_scan_at?: string | null; /** Read-only, completed_at of the provider's last completed scan. */ last_scan_at?: string | null; } export interface ScheduleRelationships { provider: { data: { type: "providers"; id: string; }; }; } export interface ScheduleProps { type: "schedules"; id: string; attributes: ScheduleAttributes; relationships: ScheduleRelationships; } export interface ScheduleApiResponse { data: ScheduleProps; included?: ProviderProps[]; } export interface ScheduleUpdatePayload { scan_enabled: boolean; scan_frequency: ScheduleFrequency; scan_hour: number; scan_timezone: string; scan_interval_hours: number | null; scan_day_of_week: number | null; scan_day_of_month: number | null; } /** Per-provider failure, as returned by `/schedules/bulk`: `{ id, error }`. */ export interface SchedulesBulkFailure { id: string; error: string; } export interface SchedulesBulkLists { /** Provider ids whose schedule was committed (already excludes failures). */ updated?: string[]; failed?: SchedulesBulkFailure[]; } /** * `/schedules/bulk` answers with a plain dict that the JSON:API renderer wraps in * `data`, so the lists sit directly on it: no `attributes` level and no `type`, * despite what the endpoint's documented response schema says. */ export interface SchedulesBulkData extends SchedulesBulkLists { type?: "schedules-bulk"; id?: string; /** Tolerated only in case the endpoint is ever rendered through its serializer. */ attributes?: SchedulesBulkLists; } export interface SchedulesBulkResponse { data?: SchedulesBulkData; /** `handleApiResponse` returns `{ success: true }` for an empty or 204 body. */ success?: boolean; error?: unknown; errors?: unknown; status?: number; } /** Minimal provider identity needed to render and target schedule actions. */ export interface ScanScheduleProvider { providerId: string; providerType: ProviderType; providerUid: string; providerAlias: string | null; } export interface ScheduleFormValues { frequency: ScheduleFrequency; hour: number; dayOfWeek: number; dayOfMonth: number; intervalHours: number; launchInitialScan: boolean; }