Highest:
Medium:
Lowest:
List non-functional requirements for the system...
Estimate the scale of the system you are going to design...
Here's a structured API design for the meeting scheduling system, covering the core functionalities.
Endpoint: POST /api/meetings
json
{
"title": "Project Kickoff",
"description": "Initial project discussion",
"date": "2024-11-10",
"time": "10:00 AM",
"duration": 60,
"participants": ["user_id1", "user_id2", "user_id3"],
"agenda": "Discuss project scope, deliverables, and timeline."
}
json
{
"meeting_id": "meeting12345",
"message": "Meeting created successfully"
}
Endpoint: GET /api/meetings/{meeting_id}
json
{
"meeting_id": "meeting12345",
"title": "Project Kickoff",
"description": "Initial project discussion",
"date": "2024-11-10",
"time": "10:00 AM",
"duration": 60,
"participants": ["user_id1", "user_id2", "user_id3"],
"agenda": "Discuss project scope, deliverables, and timeline."
}
PUT /api/meetings/{meeting_id}json
{
"title": "Updated Project Kickoff",
"time": "11:00 AM",
"participants": ["user_id1", "user_id4"]
}
json
{
"message": "Meeting updated successfully"
}
Endpoint: DELETE /api/meetings/{meeting_id}
Description: Deletes an existing meeting.
json
Copy code
{
"message": "Meeting deleted successfully"
}
Endpoint: POST /api/recurring-meetings
Description: Creates a recurring meeting series.
json
{
"title": "Weekly Team Sync",
"description": "Weekly sync-up meeting",
"start_date": "2024-11-12",
"time": "10:00 AM",
"duration": 30,
"participants": ["user_id1", "user_id2"],
"agenda": "Weekly project updates and discussions",
"recurrence": {
"frequency": "weekly",
"interval": 1,
"end_date": "2025-03-01"
}
}
json
{
"recurring_meeting_id": "recurring123",
"message": "Recurring meeting created successfully"
}
Endpoint: POST /api/notifications
Description: Schedules notifications for a specific meeting.
json
{
"meeting_id": "meeting12345",
"reminder_times": ["2024-11-10T09:00:00Z", "2024-11-10T09:45:00Z"],
"notification_type": "email"
}
json
{
"message": "Notifications scheduled successfully"
}
Endpoint: GET /api/meetings
Description: Searches and filters meetings based on criteria.
date: Date of the meeting (e.g., 2024-11-10).participant: Participant ID to filter meetings by participant.keyword: Keyword in the title or agenda./api/meetings?date=2024-11-10&participant=user_id1json
Copy code
[
{
"meeting_id": "meeting12345",
"title": "Project Kickoff",
"date": "2024-11-10",
"time": "10:00 AM",
"participants": ["user_id1", "user_id2"]
},
{
"meeting_id": "meeting67890",
"title": "Sprint Review",
"date": "2024-11-10",
"time": "2:00 PM",
"participants": ["user_id1", "user_id3"]
}
]
Endpoint: POST /api/availability
Description: Checks availability of participants for a new meeting.
json
{
"date": "2024-11-10",
"time": "10:00 AM",
"duration": 60,
"participants": ["user_id1", "user_id2"]
}
json
{
"conflicts": [
{
"user_id": "user_id1",
"conflict_with_meeting_id": "meeting67890",
"conflict_time": "2024-11-10T10:00:00Z"
}
],
"suggestions": [
{
"time": "2024-11-10T11:00:00Z",
"available": true
},
{
"time": "2024-11-10T03:00:00Z",
"available": true
}
]
}
Stores information about users (meeting participants).
| ColumnData TypeDescription | ||
user_id | VARCHAR(36) | Unique identifier for each user (UUID). |
name | VARCHAR(100) | Full name of the user. |
email | VARCHAR(100) | Email address for notifications. |
phone | VARCHAR(15) | Phone number for SMS notifications. |
created_at | TIMESTAMP | Date and time when the user was created. |
user_idStores details of individual meetings.
| ColumnData TypeDescription | ||
meeting_id | VARCHAR(36) | Unique identifier for each meeting (UUID). |
title | VARCHAR(255) | Title of the meeting. |
description | TEXT | Detailed description or agenda of the meeting. |
date | DATE | Scheduled date of the meeting. |
time | TIME | Scheduled start time of the meeting. |
duration | INT | Duration of the meeting in minutes. |
created_by | VARCHAR(36) | ID of the user who created the meeting. |
created_at | TIMESTAMP | Date and time when the meeting was created. |
meeting_idcreated_by references Users(user_id)Stores participant information for each meeting, allowing a many-to-many relationship between meetings and users.
| ColumnData TypeDescription | ||
meeting_id | VARCHAR(36) | ID of the meeting. |
user_id | VARCHAR(36) | ID of the participant. |
status | ENUM('accepted', 'declined', 'pending') | RSVP status of the participant. |
response_at | TIMESTAMP | Date and time of participant's response. |
meeting_id, user_id)meeting_id references Meetings(meeting_id)user_id references Users(user_id)Stores details for recurring meetings.
| ColumnData TypeDescription | ||
recurring_id | VARCHAR(36) | Unique identifier for the recurring meeting series (UUID). |
meeting_id | VARCHAR(36) | ID of the initial meeting in the series. |
frequency | ENUM('daily', 'weekly', 'monthly') | Recurrence frequency. |
interval | INT | Interval of recurrence (e.g., every 2 weeks). |
end_date | DATE | Date when the recurrence ends. |
created_at | TIMESTAMP | Date and time of series creation. |
recurring_idmeeting_id references Meetings(meeting_id)Stores information on scheduled notifications for meetings.
| ColumnData TypeDescription | ||
notification_id | VARCHAR(36) | Unique identifier for the notification (UUID). |
meeting_id | VARCHAR(36) | ID of the meeting for which notification is set. |
user_id | VARCHAR(36) | ID of the user receiving the notification. |
notification_type | ENUM('email', 'sms') | Type of notification. |
send_at | TIMESTAMP | Scheduled time to send the notification. |
status | ENUM('scheduled', 'sent', 'failed') | Status of the notification. |
created_at | TIMESTAMP | Creation timestamp of the notification. |
notification_idmeeting_id references Meetings(meeting_id)user_id references Users(user_id)Stores participant availability data to check for scheduling conflicts.
| ColumnData TypeDescription | ||
user_id | VARCHAR(36) | ID of the participant. |
busy_start | TIMESTAMP | Start time of a busy period. |
busy_end | TIMESTAMP | End time of a busy period. |
source | ENUM('internal', 'external') | Source of availability data (e.g., synced from external calendar). |
user_id, busy_start, busy_end)user_id references Users(user_id)Users to Meetings: One-to-many via created_by.Meetings to Participants: Many-to-many via Participants table.Meetings to Notifications: One-to-many, as each meeting can have multiple notifications.date and time in Meetings for fast retrieval based on meeting time.user_id in Participants to quickly find all meetings a participant is involved in.send_at in Notifications to efficiently retrieve upcoming notifications.user_id, busy_start, busy_end in Availability to optimize availability checking.User Interface (UI)
API Gateway
Backend Services (Microservices)
Meeting Creation Workflow
Notification Workflow
Recurring Meetings Workflow
Availability Checking Workflow
Search and Filter Workflow
POST /meetings: Create a new meeting, validate details, and save.PUT /meetings/{id}: Update meeting details.DELETE /meetings/{id}: Delete a meeting and associated data like notifications.POST /notifications: Schedule a notification for a meeting.DELETE /notifications/{id}: Cancel scheduled notifications for canceled or rescheduled meetings.notification_id, meeting_id, user_id, send_at, status.user_id, name, email, phone, and roles in a relational database.Participants table for efficient lookups.user_id, busy_start, and busy_end.GET /availability/check: Check availability for specified users within a time range.In a detailed design for a meeting scheduling system, we break down each core functionality, describe the technical components involved, and evaluate tradeoffs for scalability, maintainability, and complexity. Below, I’ll cover each core service, how it works, and some design choices with tradeoffs.
POST /meetings: Create a new meeting, validate details, and save.PUT /meetings/{id}: Update meeting details.DELETE /meetings/{id}: Delete a meeting and associated data like notifications.POST /notifications: Schedule a notification for a meeting.DELETE /notifications/{id}: Cancel scheduled notifications for canceled or rescheduled meetings.notification_id, meeting_id, user_id, send_at, status.user_id, name, email, phone, and roles in a relational database.Participants table for efficient lookups.user_id, busy_start, and busy_end.GET /availability/check: Check availability for specified users within a time range.GET /meetings/search: Search by title, participant, date, etc.Try to discuss as many failure scenarios/bottlenecks as possible.
What are some future improvements you would make? How would you mitigate the failure scenario(s) you described above?