package Ġcom . oct aw izard . repository . transaction Ċ Ċ import Ġcom . mongodb . Read Concern Ċ import Ġcom . mongodb . Read Preference Ċ import Ġcom . mongodb . Transaction Options Ċ import Ġcom . mongodb . Write Concern Ċ import Ġcom . mongodb . client . Mongo Collection Ċ import Ġcom . mongodb . client . Transaction Body Ċ import Ġcom . oct aw izard . domain . model . Club Reservation Info Ċ import Ġcom . oct aw izard . domain . model . Field Ċ import Ġcom . oct aw izard . domain . model . Field Availability Ċ import Ġcom . oct aw izard . domain . model . Match Ċ import Ġcom . oct aw izard . domain . model . Payment Status Ċ import Ġcom . oct aw izard . domain . model . Reservation Ċ import Ġcom . oct aw izard . domain . model . Reservation Status Ċ import Ġcom . oct aw izard . domain . model . Time Slot Ċ import Ġcom . oct aw izard . domain . model . User Ċ import Ġcom . oct aw izard . repository . Mongo Session Provider Ċ import Ġcom . oct aw izard . repository . club . model . Availability DTO Ċ import Ġcom . oct aw izard . repository . club . model . Club DTO Ċ import Ġcom . oct aw izard . repository . club . model . Date Formatter Ċ import Ġcom . oct aw izard . repository . reservation . model . Reservation DTO Ċ import Ġcom . oct aw izard . repository . reservation . model . to Club Reservation Info DTO Ċ import Ġcom . oct aw izard . repository . reservation . model . toMatch DTO Ċ import Ġcom . oct aw izard . repository . reservation . model . to Reservation Ċ import Ġmu . Kotlin Logging Ċ import Ġorg . bson . conversions . B son Ċ import Ġorg . lit ote . km ongo . and Ċ import Ġorg . lit ote . km ongo . div Ċ import Ġorg . lit ote . km ongo . eq Ċ import Ġorg . lit ote . km ongo . findOne ById Ċ import Ġorg . lit ote . km ongo . key Projection Ċ import Ġorg . lit ote . km ongo . property . K Property Path Ċ import Ġorg . lit ote . km ongo . pull By Filter Ċ import Ġorg . lit ote . km ongo . save Ċ import Ġorg . lit ote . km ongo . unset Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . util .* ĊĊ Ċ class ĠDocument Transaction Repository ( ĊĠĠĠ Ġprivate Ġval Ġclub s : ĠMongo Collection < Club DTO >, ĊĠĠĠ Ġprivate Ġval Ġre servations : ĠMongo Collection < Reservation DTO >, ĊĠĠĠ Ġprivate Ġval Ġsession Provider : ĠMongo Session Provider , Ċ ) Ġ: ĠTransaction Repository Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Reservation ( ĊĠĠĠĠĠĠĠ Ġreservation Owner : ĠUser , ĊĠĠĠĠĠĠĠ Ġclub Reservation Info : ĠClub Reservation Info , ĊĠĠĠĠĠĠĠ ĠstartTime : ĠLocalDateTime , ĊĠĠĠĠĠĠĠ ĠendTime : ĠLocalDateTime , ĊĠĠĠĠĠĠĠ Ġprice : ĠBigDecimal , ĊĠĠĠĠĠĠĠ Ġmatch : ĠMatch , ĊĠĠĠ Ġ): ĠReser vation Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclient Session Ġ= Ġsession Provider . start Client Session () ĊĊĠĠĠĠĠĠĠ Ġval Ġtxn Options : ĠTransaction Options Ġ= ĠTransaction Options . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. read Preference ( Read Preference . primary ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. read Concern ( Read Concern . LOCAL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. write Concern ( Write Concern . MA J ORITY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġ/* ĠImport ant :: Ġmandatory Ġto Ġpass Ġthe Ġsession Ġto Ġall Ġthe Ġoperations . Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġtxn Body : ĠTransaction Body < Reservation > Ġ= ĠTransaction Body Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠstartTime String Ġ= ĠstartTime . to LocalDate (). format ( Date Formatter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġavailability By Day Property : ĠK Property Path < out ĠAny ?, ĠList < Field Availability > ?> Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Club DTO :: availability Ġ/ ĠAvailability DTO :: by Date ). key Projection ( startTime String ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Result Ġ= Ġclub s . update One ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient Session , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClub DTO :: id Ġeq Ġclub Reservation Info . club Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpull By Filter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailability By Day Property , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠField Availability :: time Slot Ġ/ ĠTime Slot :: start DateTime Ġeq ĠstartTime , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠField Availability :: time Slot Ġ/ ĠTime Slot :: end DateTime Ġeq ĠendTime , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Field Availability :: field Ġ/ ĠField :: id ) Ġeq Ġclub Reservation Info . field . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( update Result . modified Count Ġ== Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġreserve : Ġfield =${ club Reservation Info . field . id } Ġfrom =$ startTime Ġto =$ endTime " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġremove Ġentry ( s ) Ġfor Ġday Ġavailability Ġin Ġcase Ġthe Ġlist Ġof ĠField Availability Ġis Ġnull Ġor Ġempty Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclub Ġ= Ġclub s . findOne ById ( client Session , Ġclub Reservation Info . club Id ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeys To Unset Ġ= Ġclub . availability . by Date . filter Values Ġ{ Ġit . isNull OrEmpty () Ġ}. keys ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( keys To Unset . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġun sets : ĠList < B son > Ġ= Ġkeys To Unset . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunset (( Club DTO :: availability Ġ/ ĠAvailability DTO :: by Date ). key Projection ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclub s . update Many ( client Session , ĠClub DTO :: id Ġeq Ġclub Reservation Info . club Id , Ġand ( un sets )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreservation Ġ= ĠReser vation DTO ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUUID . randomUUID (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatch . toMatch DTO (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclub Reservation Info . to Club Reservation Info DTO (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartTime , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠendTime , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreservation Owner , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprice , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReser vation Status . Pending , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPayment Status . Pending Payment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre servations . save ( client Session , Ġreservation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreservation . to Reservation () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġclient Session . with Transaction ( txn Body , Ġtxn Options ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠRuntimeException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Failed Ġto Ġcreate Ġreservation : Ġ${ e . message }", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Session . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ