Google Calendar

This I have written as part of my LLD Practice. Please let me know further imporvements that can be done.

Also tell current design is Strong/Average/Lean Hire ?

Other Design Problems

/*

User can schedule a meeting, with other users only when their calendar is free.

Flow->
Domain ===> Repository(DB) ==> Service (Buisness Logic) ==> Controller (Client Code)

======= Domain =======
User
Calendar
Meeting

======= Repository (DB Logic) =======
UserRepository
MeetingRepository

======= Service (Buisness Logic) =======
MeetingService

======= Controller (Client Interaction) =======

MeetingController (Client Interaction)

Client Code

Constructor/Getter/Setter I have avoided

*/
/* ======== Domain ======== */

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;

class User{
    String userid;
    String userName;
    String email;
    Calendar calendar;
}

class Meeting{
    String meetingId;
    String meetingTitle;
    LocalDateTime startTime;
    LocalDateTime endTime;
    String hostId;
    List<String> participantIds;
}

class Calendar{
    String ownerId;
    MeetingRepository meetingRepository;
    List<String> meetingIds;

    boolean canSchedule(LocalDateTime startTime, LocalDateTime endTime){
        for(String id:meetingIds){
            Meeting meeting= meetingRepository.getMeetingById(id);
            LocalDateTime meetStart=meeting.startTime;
            LocalDateTime meetEnd=meeting.endTime;

            if(startTime.isBefore(meetEnd) && meetStart.isBefore(endTime)){
                return false;
            }
        }
        return true;
    }

    void addMeeting(String meetingId){
        meetingIds.add(meetingId);
    }

    void removeMeeting(String meetingId){
        meetingIds.remove(meetingId);
    }
}

/* ======== Repository ======== */

class UserRepository{
    Map<String,User> userDb;

    boolean addUser(User user){
        userDb.put(user.userid, user);
        return true;
    }

    User getUserById(String userId){
        return userDb.get(userId);
    }
}

class MeetingRepository{
    Map<String,Meeting> meetingDb;

    boolean addMeeting(Meeting meeting){
        meetingDb.put(meeting.meetingId, meeting);
        return true;
    }

    Meeting getMeetingById(String meetingId){
        return meetingDb.get(meetingId);
    }

    boolean removeMeeting(String meetingId){
        meetingDb.remove(meetingId);
        return true;
    }
}

/* ======== Service ======== */

class MeetingService{
    UserRepository userRepository;
    MeetingRepository meetingRepository;

    Meeting scheduleMeeting(String meetingTitle, LocalDateTime start, LocalDateTime end, List<String> participantIds, User host){
        if(!host.calendar.canSchedule(start,end)){
            throw new IllegalArgumentException("Host Calendar not free");
        }
        List<String> canParticipate=new ArrayList<>();
        for(String participantId:participantIds){
            User user=userRepository.getUserById(participantId);
            if(user.calendar.canSchedule(start,end)){
                canParticipate.add(participantId);
            }
        }

        Meeting meeting=new Meeting();
        meeting.meetingId= UUID.randomUUID().toString();
        meeting.meetingTitle=meetingTitle;
        meeting.startTime=start;
        meeting.endTime=end;
        meeting.participantIds=canParticipate;
        meetingRepository.addMeeting(meeting);

        for(String id:canParticipate){
            User user=userRepository.getUserById(id);
            user.calendar.addMeeting(meeting.meetingId);
        }
        host.calendar.addMeeting(meeting.meetingId);
        return meeting;
    }

    boolean cancelMeeting(String userId, String meetingId){
        Meeting meeting=meetingRepository.getMeetingById(meetingId);
        if(meeting==null) return false;

        if(!meeting.hostId.equals(userId)){
            throw new IllegalStateException("Only host can cancel meeting");
        }

        for(String id:meeting.participantIds){
            User user=userRepository.getUserById(id);
            if(user!=null) user.calendar.removeMeeting(meetingId);
        }
        userRepository.getUserById(userId).calendar.removeMeeting(meetingId);
        return meetingRepository.removeMeeting(meetingId);
    }
}

/* ======== Controller ======== */

class MeetingController{
    MeetingService meetingService;

    Meeting scheduleMeeting(String meetingTitle, LocalDateTime start, LocalDateTime end, List<String> participantIds, User host){
        return meetingService.scheduleMeeting(meetingTitle,start,end,participantIds,host);
    }

    boolean cancelMeeting(String userId, String meetingId){
        return meetingService.cancelMeeting(userId,meetingId);
    }

/* ======== Client Code ======== */


public class GoogleCalendar1 {
    public static void main(String[] args) {
        User u1=new User();
        User u2=new User();
        MeetingController controller=new MeetingController();
        Meeting m1=controller.scheduleMeeting("Project Discussion",
                LocalDateTime.of(2025,9,29,14,00),
                LocalDateTime.of(2025,9,29,15,00),
                Arrays.asList(u2.userid),u1);

        controller.cancelMeeting(u1.userid,m1.meetingId);
    }
}
Comments (4)