Book Appointment LLD Question
- Manbodh ratre
- May 25, 2024
- 2 min read
Question is to design a booking service for appointment
there is bank and this bank is doing video kyc from (10am-12am)
the meeting duration is 15 minute each for example 10:00 to 10:15, 10:15 to 10:30
only 5 agents are available to take meeting
System should support these features
1. List of slots on a selected date.
2. Book the slot
we have to create to schema
1 slot
2 slotDate
package Test;
import java.time.LocalTime;
public class Slot {
private LocalTime startTime;
private LocalTime endTime;
private Integer availableSlot;
private Integer bookedSlotNumber;
public LocalTime getStartTime() {
return startTime;
}
public void setStartTime(LocalTime startTime) {
this.startTime = startTime;
}
public LocalTime getEndTime() {
return endTime;
}
public void setEndTime(LocalTime endTime) {
this.endTime = endTime;
}
public Integer getAvailableSlot() {
return availableSlot;
}
public void setAvailableSlot(Integer availableSlot) {
this.availableSlot = availableSlot;
}
public Integer getBookedSlotNumber() {
return bookedSlotNumber;
}
public void setBookedSlotNumber(Integer bookedSlotNumber) {
this.bookedSlotNumber = bookedSlotNumber;
}
public Slot(LocalTime startTime, LocalTime endTime) {
this.startTime = startTime;
this.endTime = endTime;
this.availableSlot = 5;
this.bookedSlotNumber = 0;
}
}
package Test;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
public class Day {
private LocalDate date;
private List<Slot> slots;
public LocalDate getDate() {
return date;
}
public void setDate(LocalDate date) {
this.date = date;
}
public List<Slot> getSlots() {
return slots;
}
public void setSlots(List<Slot> slots) {
this.slots = slots;
}
public List<Slot> getSlotsByDay(LocalDate currentDay) {
if (currentDay.isEqual(date))
return slots;
return new ArrayList<Slot>();
}
public Day(LocalDate date, List<Slot> slots) {
this.slots = slots;
this.date = date;
}
}
package Test;
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;
public class BookingService {
private final List<Day> days;
public BookingService() {
days = new ArrayList<Day>();
Day day_18 = new Day(LocalDate.of(2024, 5, 26), new ArrayList<>());
Day day_19 = new Day(LocalDate.of(2024, 5, 27), new ArrayList<>());
Day day_20 = new Day(LocalDate.of(2024, 5, 28), new ArrayList<>());
createAndAddSlots(day_18);
createAndAddSlots(day_19);
createAndAddSlots(day_20);
days.add(day_18);
days.add(day_19);
days.add(day_20);
}
private void createAndAddSlots(Day day18) {
Slot slot1 = new Slot(LocalTime.of(10, 0), LocalTime.of(10, 15));
Slot slot2 = new Slot(LocalTime.of(10, 15), LocalTime.of(10, 30));
Slot slot3 = new Slot(LocalTime.of(10, 30), LocalTime.of(10, 45));
Slot slot4 = new Slot(LocalTime.of(10, 45), LocalTime.of(11, 0));
Slot slot5 = new Slot(LocalTime.of(11, 0), LocalTime.of(10, 15));
Slot slot6 = new Slot(LocalTime.of(10, 15), LocalTime.of(10, 30));
Slot slot7 = new Slot(LocalTime.of(10, 30), LocalTime.of(10, 45));
Slot slot8 = new Slot(LocalTime.of(10, 45), LocalTime.of(12, 0));
List<Slot> slots = new ArrayList<Slot>();
slots.add(slot1);
slots.add(slot2);
slots.add(slot3);
slots.add(slot4);
slots.add(slot5);
slots.add(slot6);
slots.add(slot7);
slots.add(slot8);
day18.setSlots(slots);
}
public List<Slot> showSlots(LocalDate date) {
for (Day day : days) {
if (day.getDate().isEqual(date)) {
return day.getSlotsByDay(date);
}
}
return new ArrayList<Slot>();
}
public String bookSlot(LocalDate date, LocalTime startTime, LocalTime endTime) {
List<Slot> slots = showSlots(date);
for (Slot slot : slots) {
if (slot.getStartTime().equals(startTime) && slot.getEndTime().equals(endTime)) {
int availableSlots = slot.getAvailableSlot();
if (availableSlots > 0) {
slot.setAvailableSlot(availableSlots - 1);
System.out.println("slot booked for date and time from: {} to: {}" + date + startTime + endTime);
} else {
System.out.println("Slot not available");
throw new RuntimeException("Slot not available");
}
}
}
return "Success";
}
}
package Test;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.List;
public class Test {
public static void main(String[] args) {
BookingService bookingService = new BookingService();
List<Slot> slotList = bookingService.showSlots(LocalDate.of(2024, 5, 26));
for (Slot slot : slotList) {
System.out.println(slot.getStartTime().toString() + " " + slot.getEndTime().toString());
}
for (int i = 0; i < 6; i++)
System.out.println(
bookingService.bookSlot(LocalDate.of(2024, 5, 26), LocalTime.of(10, 0), LocalTime.of(10, 15)));
}
}
please comment thread safety approach here