import {z} from 'zod' export type CreatePatientDietRestrictionRequest = {comment?: (string | null) | undefined, name: string}; export type PostPatchPatientFlags = {patient_app_extended_logging_types?: (string | null) | undefined, patient_glucose_units_mmol_l?: (boolean | null) | undefined, patient_show_cals?: (boolean | null) | undefined, patient_show_carbs?: (boolean | null) | undefined} | {[key: string]: unknown} | null; export type CreatePatientMotivationRequest = {comment?: (string | null) | undefined, name: string}; export type CreatePatientFromClinicianRequest = {clinic_id?: (number | string) | undefined, clinic_invitation_code?: (unknown | number | string) | undefined, diet_restrictions?: (Array | null) | undefined, email: string, first_name: string, first_report_date?: (string | null) | undefined, flags_raw?: PostPatchPatientFlags | undefined, hospital_patient_custom_fields?: (Record | null) | undefined, hospital_patient_external_id?: (string | null) | undefined, last_name: string, locale?: (string | null) | undefined, motivations?: (Array | null) | undefined, patient_type?: ('research' | 'collaboration' | 'wellness' | 'obesity' | 'diabetes' | 'metabolic syndrome' | 'weight loss' | 'migraine' | 'gastroesophageal reflux' | 'gi discomfort' | 'vertigo' | 'sleep apnea' | 'rxlife' | 'dexcom' | 'menopause' | 'insurance' | null) | undefined, phone_number?: (string | null) | undefined, signup_metadata_non_sensitive?: ({[key: string]: unknown} | null) | undefined, signup_metadata_sensitive?: ({[key: string]: unknown} | null) | undefined, subscription_expiration_date?: (string | null) | undefined, subscription_name?: ('none' | 'three-day' | 'five-day' | 'seven-day' | 'ten-day' | 'one-month' | 'cgm14' | '14-day' | '21-day' | '28-day' | 'custom' | null) | undefined, subscription_type?: ('single' | 'weekly' | 'monthly' | 'bi-weekly' | '4-weeks' | 'custom' | null) | undefined, tracking_start_date?: (string | null) | undefined}; export type CreateApiPatientsFromClinicianArgs = {body: CreatePatientFromClinicianRequest}; export type CreateApiPatientsFromClinicianOptions = {baseUrl: string, bearerAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const patientDietRestrictionResponse = z.object({comment: z.string().nullable().optional(), id: z.number().int(), name: z.string(), name_translations: z.object({}).nullable().optional()}); export const rxFeatureFlagsResponse = z.object({auditor_reviewer_is_external: z.boolean().optional(), clinic_admin_api_access: z.boolean().optional(), clinic_allow_cross_hospital_report_access: z.boolean().optional(), clinic_auto_log_photos_enabled: z.boolean().optional(), clinic_default_days_until_report_date: z.string().optional(), clinic_default_mark_patients_as_priority: z.boolean().optional(), clinic_default_patient_age: z.string().optional(), clinic_default_patient_sex: z.string().optional(), clinic_default_report_include_supplements_in_food_dump: z.boolean().optional(), clinic_default_report_include_supplements_in_rdi: z.boolean().optional(), clinic_default_sms_enabled: z.boolean().optional(), clinic_default_subscription_name: z.string().optional(), clinic_default_user_locale: z.string().optional(), clinic_enable_clinician_advisor_chat: z.boolean().optional(), clinic_invitation_email_cadence: z.string().optional(), clinic_maximum_meal_capture_period_in_days_before_subscription: z.string().optional(), clinic_report_autogenerate: z.boolean().optional(), clinic_report_full_automation: z.boolean().optional(), clinic_report_identity_mode: z.enum(["normal", "anonymous", "identifier_patient_id", "identifier_external_id", "identifier_both_ids"]).optional(), clinic_report_judge_confidence_min: z.string().nullable().optional(), clinic_require_patient_mfa: z.boolean().optional(), clinic_send_repeat_subscription_invitation_email: z.boolean().optional(), clinic_send_subscription_invitation_email: z.boolean().optional(), clinic_show_patient_report_secure_link: z.boolean().optional(), clinic_subscription_reminder_email_cadence: z.string().optional(), clinic_subscription_types: z.string().optional(), clinician_allow_meal_edit: z.boolean().optional(), clinician_autopilot_enabled: z.boolean().optional(), clinician_available_trial_lengths: z.string().optional(), clinician_can_delete_meals: z.boolean().optional(), clinician_can_generate_reports: z.boolean().optional(), clinician_can_view_clinic_invite_code: z.boolean().optional(), clinician_can_view_draft_reports: z.boolean().optional(), clinician_meal_planner_enabled: z.boolean().optional(), clinician_oversight_of_patient: z.enum(["clinician", "non-clinician"]).optional(), clinician_patient_allow_cal_carb_toggle: z.boolean().optional(), clinician_patient_allow_macro_card_toggle: z.boolean().optional(), clinician_patient_allow_mindful_eating_survey_toggle: z.boolean().optional(), clinician_patient_allow_patient_app_coaching_tab_toggle: z.boolean().optional(), clinician_prevent_new_patients_after_date: z.string().nullable().optional(), clinician_report_24h_turnaround: z.boolean().optional(), clinician_report_disable_early_generation: z.boolean().optional(), clinician_require_mfa: z.boolean().optional(), clinician_show_timeline: z.boolean().optional(), email_template_id_clinic_logging_completion: z.string().optional(), email_template_id_clinic_logging_starts_tomorrow: z.string().optional(), email_template_id_clinic_onboarding: z.string().optional(), email_template_id_clinic_registered_but_no_meals: z.string().optional(), email_template_id_clinic_reminder_to_continue_logging: z.string().optional(), email_template_id_clinic_report_available: z.string().optional(), email_template_id_clinic_thirty_day_subscription_inactive_logging_reminder: z.string().optional(), email_template_id_clinic_upcoming_subscription: z.string().optional(), email_template_id_returning_invitation: z.string().optional(), hospital_patient_custom_fields_json: z.string().optional(), hospital_patient_has_external_id: z.boolean().optional(), lifecycle_messaging_variant_patient_invited: z.string().optional(), lifecycle_messaging_variant_patient_logging_completed: z.string().optional(), lifecycle_messaging_variant_patient_report_available: z.string().optional(), lifecycle_messaging_variant_patient_subscription_notification: z.string().optional(), lifecycle_messaging_variant_patient_subscription_reminder: z.string().optional(), patient_app_care_team_experience: z.boolean().optional(), patient_app_coaching_tab: z.boolean().optional(), patient_app_extended_logging_types: z.string().nullable().optional(), patient_app_guided_health_program: z.boolean().optional(), patient_app_hide_meal_after_n_hours: z.string().nullable().optional(), patient_app_hide_nutrition_starplot: z.boolean().nullable().optional(), patient_app_key_nutrients: z.string().nullable().optional(), patient_app_mindful_eating_survey: z.boolean().optional(), patient_app_nutritional_insights: z.boolean().optional(), patient_app_nutritional_insights_sections_to_hide: z.string().nullable().optional(), patient_app_partner_branding: z.string().nullable().optional(), patient_app_partner_movano: z.boolean().optional(), patient_app_partner_oauth_provider: z.string().nullable().optional(), patient_app_pii_minimal_masking: z.boolean().nullable().optional(), patient_app_primary_macronutrient: z.string().nullable().optional(), patient_app_primary_macronutrient_can_edit: z.boolean().optional(), patient_app_show_dev_settings: z.boolean().optional(), patient_app_show_diet_score: z.boolean().optional(), patient_app_show_macro_nutrition_card: z.boolean().optional(), patient_app_show_nutrition_data_and_insights: z.boolean().optional(), patient_app_show_schedule_call_with_doctor: z.boolean().optional(), patient_app_use_care_team_version: z.boolean().optional(), patient_app_use_timeline: z.boolean().optional(), patient_app_use_v3_ui: z.boolean().optional(), patient_app_v2_care_team_ui: z.boolean().optional(), patient_can_view_pdf_reports: z.boolean().optional(), patient_default_measure_system: z.string().optional(), patient_enforce_subscription: z.boolean().optional(), patient_glucose_units_mmol_l: z.boolean().optional(), patient_goals_can_edit: z.boolean().optional(), patient_preferred_nutrition_source: z.string().optional(), patient_report_quality_judge: z.boolean().optional(), patient_send_meal_reminders: z.boolean().optional(), patient_show_cals: z.boolean().optional(), patient_show_carbs: z.boolean().optional(), patient_show_dexcom_oauth: z.boolean().optional(), patient_show_gender: z.boolean().optional(), patient_show_total_carbs: z.boolean().optional(), patient_use_exercise: z.boolean().optional(), patient_use_medication: z.boolean().optional(), patient_use_question: z.boolean().optional(), patient_use_sleep: z.boolean().optional(), user_require_password_strength: z.boolean().optional()}); export const patientHospitalAttributes = z.object({hospital_id: z.number().int(), patient_custom_fields: z.object({}), patient_external_id: z.string()}); export const patientMotivationResponse = z.object({comment: z.string().nullable().optional(), id: z.number().int(), name: z.string(), name_translations: z.object({}).nullable().optional()}); export const patientSubscriptionResponse = z.object({clinic_id: z.number().int().optional(), completion_time: z.string().optional(), created_by_user_id: z.number().int().nullable().optional(), created_time: z.string(), expiration_date: z.string(), hospital_id: z.number().int().optional(), id: z.number().int(), is_complete: z.boolean().optional(), is_logging_complete: z.boolean().optional(), logging_completion_time: z.string().optional(), name: z.enum(["three-day", "five-day", "seven-day", "ten-day", "one-month", "cgm14", "14-day", "21-day", "28-day", "custom"]), notified_of_logging_completion: z.boolean().optional(), notified_of_logging_completion_time: z.string().optional(), patient_id: z.number().int(), report_date: z.string().optional(), start_date: z.string(), subscription_length: z.number().int().nullable().optional(), type: z.enum(["single", "weekly", "monthly", "bi-weekly", "4-weeks", "custom"]), updated_time: z.string()}); export const patientUsageSummaryStatistics = z.object({date_since: z.string(), date_until: z.string(), number_of_days_prior_to_reference: z.number().int().optional(), number_of_inactive_days: z.number().int().optional(), number_of_meal_items_logged: z.number().int().optional(), number_of_meals_logged: z.number().int().optional(), number_of_tracked_days: z.number().int().optional(), tracking_reference_date: z.string().optional()}); export const patientUsageSummary = z.object({summary_statistics: patientUsageSummaryStatistics}); export const patientResponse = z.object({birthday: z.string().optional(), country_of_residence: z.string().nullable().optional(), created_time: z.string(), diagnosis_feeling: z.string().nullable().optional(), diet_restrictions: z.array(patientDietRestrictionResponse).optional(), email: z.string(), email_verified: z.boolean(), first_meal_time: z.string().nullable().optional(), first_name: z.string(), flags: rxFeatureFlagsResponse, flags_raw: z.record(z.string(), z.unknown()).optional(), hospital_attributes: patientHospitalAttributes.optional(), id: z.number().int(), is_active: z.boolean(), is_gender_enabled: z.boolean().nullable().optional(), is_priority: z.boolean().optional(), is_registered: z.boolean(), is_shown_carbs: z.boolean().optional(), last_name: z.string(), locale: z.string().nullable().optional(), meal_time_breakfast: z.string().nullable().optional(), meal_time_dinner: z.string().nullable().optional(), meal_time_lunch: z.string().nullable().optional(), motivations: z.array(patientMotivationResponse).optional(), patient_type: z.enum(["research", "collaboration", "wellness", "obesity", "diabetes", "metabolic syndrome", "weight loss", "migraine", "gastroesophageal reflux", "gi discomfort", "vertigo", "sleep apnea", "dexcom", "rxlife", "menopause", "insurance"]).nullable().optional(), phone_number: z.string().nullable().optional(), recent_meal_context: z.array(z.string()).optional(), sex: z.enum(["female", "male", "intersex", "mtf_female", "ftm_male"]).nullable().optional(), state: z.string().nullable().optional(), subscriptions: z.array(patientSubscriptionResponse).optional(), tracking_start_date: z.string(), updated_time: z.string(), usage_summary: patientUsageSummary.optional(), use_data_screen: z.boolean().nullable().optional(), use_exercise: z.boolean().nullable().optional(), use_fast_entry_audio: z.boolean().optional(), use_fast_entry_photo: z.boolean().optional(), use_fast_entry_text: z.boolean().optional(), use_local_photo: z.boolean().optional(), use_medication: z.boolean().nullable().optional(), use_question: z.boolean().nullable().optional(), use_search_by_photo: z.boolean().optional(), use_search_by_text: z.boolean().optional(), use_sleep: z.boolean().nullable().optional(), zipcode: z.string().nullable().optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Create a new patient, supposed to be used from a clinician * * POST /patients/from_clinician */ export const createApiPatientsFromClinician = async (args: CreateApiPatientsFromClinicianArgs, options: CreateApiPatientsFromClinicianOptions) => { const {baseUrl, fetch: fetchFn = fetch, bearerAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (bearerAuth !== undefined) headers.set('authorization', `Bearer ${bearerAuth}`) const url = `${baseUrl.replace(/\/+$/, '')}/patients/from_clinician${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(patientResponse, await res.json()) };