package Ġcom . pres l avr ache v . iv iew scheduler . business Ċ Ċ import Ġcom . pres l avr ache v . iv iew scheduler . business . model . Availability Day Ċ import Ġcom . pres l avr ache v . iv iew scheduler . business . model . Time Range Ċ import Ġcom . pres l avr ache v . iv iew scheduler . business . model . Time Slot Ċ import Ġcom . pres l avr ache v . iv iew scheduler . persistence . entity . Availability Day Entity Ċ import Ġcom . pres l avr ache v . iv iew scheduler . persistence . repository . Appointment Day Entity Repository Ċ import Ġcom . pres l avr ache v . iv iew scheduler . persistence . repository . UserRepository Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġorg . springframework . transaction . annotation . Transactional Ċ import Ġjava . time . LocalDate Ċ import Ġjava . time . Local Time Ċ Ċ @ Service Ċ class ĠAvailability Service ( val Ġuser Repository : ĠUser Repository , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġappointment Day Entity Repository : ĠAppointment Day Entity Repository ) Ġ{ ĊĊĠĠĠ Ġ@ Transactional ĊĠĠĠ Ġfun Ġadd New Appointment ( userId : ĠString , Ġtime Slots : ĠList < Time Slot >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġuser Repository . findById ( userId ). orElse Throw Ġ{ ĠIllegalArgumentException (" User Ġnot Ġfound !") Ġ} ĊĊĠĠĠĠĠĠĠ Ġtime Slots . forEach Ġ{ Ġtime Slot Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠChecks , Ġwhether Ġthere Ġis Ġan Ġexisting Ġappointment Ġin Ġthe ĠDB Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Range Ġ= ĠTime Range ( time Slot . start . hour , Ġtime Slot . end . hour ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġappointment Day Entity Ġ= Ġappointment Day Entity Repository . findOne By Day And User ( time Slot . day , Ġuser ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġthis ?. add Time Range ( time Range ) Ġ} Ġ?: ĠAvailability Day Entity ( time Slot . day , Ġuser , Ġtime Range ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġappointment Day Entity Repository . save ( appointment Day Entity ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBy Ġpassing Ġa Ġlist Ġof Ġuser ĠIDs , Ġa Ġlist Ġof Ġtime Ġslots Ġis Ġreturned , Ġwhen Ġall Ġparties Ġcan Ġbe Ġpresent ĊĠĠĠĠ Ġ* ĠFilters Ġout Ġmultiple Ġinter viewer Ġavailability Ġdays , Ġand Ġgroups Ġthem Ġby Ġday ĊĠĠĠĠ Ġ* ĠNOTE : ĠOnly Ġdays , Ġwhen Ġall Ġinter view ers Ġcan Ġbe Ġpresent Ġare Ġincluded . ĠThe Ġrest Ġwill Ġbe Ġfiltered Ġout ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġreturn Open Time Slots ( user Ids : ĠList < String >): ĠList < Time Slot > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġusers Ġ= Ġuser Repository . findAll ById ( user Ids ). toList () ĊĠĠĠĠĠĠĠ Ġval Ġappointment Days Ġ= Ġappointment Day Entity Repository . findAll ByUser In ( users ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġappointment Days ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . as Appointment Day () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. groupBy Ġ{ Ġit . day Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . value . size Ġ== Ġusers . size Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( day , Ġuser Avail abilities ) Ġ-> Ġmerge Availability Bits On Given Day ( user Avail abilities , Ġday ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . as Time Slot List () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠA Ġnice Ġmulti - field Ġsorting Ġtrick Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted With ( compare By ({ Ġit . day Ġ}, Ġ{ Ġit . start Ġ}, Ġ{ Ġit . end Ġ})) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmerge Availability Bits On Given Day ( user Avail abilities : ĠList < Availability Day >, Ġday : ĠLocalDate ): ĠAvailability Day Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmerged Bits Ġ= Ġuser Avail abilities . first (). availability Bits . copy () ĊĠĠĠĠĠĠĠ Ġuser Avail abilities . forEach Ġ{ Ġiv Day Ġ-> Ġmerged Bits . and ( iv Day . availability Bits ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠAvailability Day ( day , Ġmerged Bits ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġhelper Ġextension Ġmethod ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠAvailability Day Entity . as Appointment Day (): ĠAvailability Day Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠAvailability Day ( day , Ġavailability Bits ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġhelper Ġextension Ġmethod ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠAvailability Day . as Time Slot List (): ĠList < Time Slot > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtime Slot List Ġ= Ġmutable ListOf < Time Slot >() ĊĠĠĠĠĠĠĠ Ġavailability Bits . forEach Bit Ġ{ Ġtime Slot List . add ( Time Slot ( day , ĠLocal Time . of ( it , Ġ 0 ), ĠLocal Time . of ( it Ġ+ Ġ 1 , Ġ 0 ))) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtime Slot List ĊĠĠĠ Ġ} Ċ } Ċ