Vasili's Blog

bookingservice

erDiagram
    Bookings {
        BookingId booking_id PK
        EventId event_id FK
        string full_name
        string email
        datetime booking_date
        number duration "Minutes"
        enum status
    }

    Availability {
        AvailabilityId availability_id PK
        string name
        string time_zone
    }

    AvailabilitySlots {
        AvailabilitySlotId availability_slot_id PK
        AvailabilityId availability_id FK
        number weekday "0 for Monday, 6 for Sunday"
        number start_time
        number end_time
    }

    Overrides {
        OverrideId override_id PK
        AvailabilityId availability_id FK
        bool all_day
    }

    OverrideSlots {
        OverrideSlotId override_slot_id
        OverrideId override_id
        number weekday "0 for Monday, 6 for Sunday"
        number start_time
        number end_time
    }

    Events {
        EventId event_id PK
        AvailabilityId availability_id FK
        bool enabled "Is visible in UI"
        string title
        string description "Markdown"
        string slug "Public URL portion"
        number min_duration "Minutes"
        number max_duration "Minutes"
        number increment "Minutes"
        number daily_frequency_limit "Times"
        number weekly_frequency_limit "Times"
        number monthly_frequency_limit "Times"
        number yearly_frequency_limit "Times"
        number daily_duration_limit "Minutes"
        number weekly_duration_limit "Minutes"
        number monthly_duration_limit "Minutes"
        number yearly_duration_limit "Minutes"
        number days_into_future_limit
        number minimum_notice_limit
        enum minimum_notice_limit_unit "days/hours/minutes"
        number before_event_buffer "Minutes"
        number after_event_buffer "Minutes"
        number fixed_fee "Dollars"
        number rate "Dollars per minute"
    }

    IntakeQuestions {
        IntakeQuestionId intake_question_id PK
        EventId event_id FK
        number ordinal
        bool required
        enum kind
        string identifier
        string label
        string description "Markdown"
        string placeholder
        json default_value
        bool locked
    }

    IntakeQuestionOptions {
        IntakeQuestionOptionId intake_question_option_id PK
        IntakeQuestionId intake_question_id FK
        string identifier
        string label
    }

    IntakeQuestionAnswers {
        IntakeQuestionAnswerId intake_question_answer_id PK
        BookingId booking_id FK
        number ordinal
        enum kind
        string identifier
        string label
        string description
        json answer
    }

    Availability ||--|{ AvailabilitySlots : has
    Availability ||--o{ Overrides : has
    Events ||--|| Availability : "scheduled during"
    Bookings }o--|| Events : has
    Bookings ||--o{ IntakeQuestionAnswers : has
    Overrides ||--o{ OverrideSlots : has
    Events ||--|{ IntakeQuestions : has
    IntakeQuestions ||--o{ IntakeQuestionOptions : has

#bookingservice

After the cal.com fiasco I think I'll try to roll out something simple, without too many dependencies, that can just run quickly...

Some Notes on the architecture, which I'll be updating.

#bookingservice