package Ġcom . k il ch ich ak ov . five letters . service Ċ Ċ import Ġcom . k il ch ich ak ov . five letters . LOG Ċ import Ġcom . k il ch ich ak ov . five letters . exception . Database Exception Ċ import Ġcom . k il ch ich ak ov . five letters . model . Day Ċ import Ġcom . k il ch ich ak ov . five letters . model . Letter Ċ import Ġcom . k il ch ich ak ov . five letters . model . Page Ċ import Ġcom . k il ch ich ak ov . five letters . model . Se aled Letter En velop Ċ import Ġcom . k il ch ich ak ov . five letters . model . Time Period Ċ import Ġcom . k il ch ich ak ov . five letters . model . dto . Page Request Ċ import Ġcom . k il ch ich ak ov . five letters . repository . Letter Repository Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġjava . time . Zone Id Ċ import Ġjava . util . Calendar Ċ import Ġjava . util . Date Ċ import Ġjava . util . TimeZone Ċ Ċ @ Service Ċ class ĠLetter Service Ġ{ ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġlateinit Ġvar Ġletter Repository : ĠLetter Repository ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġlateinit Ġvar Ġtime Period Service : ĠTime Period Service ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġlateinit Ġvar Ġletter Stat DataService : ĠLetter Stat DataService ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġlateinit Ġvar ĠuserService : ĠUserService ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġlateinit Ġvar Ġtransaction Wrapper : ĠTransaction Wrapper ĊĊĠĠĠ Ġfun Ġsend Letter ( login : ĠString , Ġmessage : ĠString , Ġperiod Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtimezone Ġ= ĠuserService . load UserData ( login ). time Zone ĊĠĠĠĠĠĠĠ Ġval Ġperiod Ġ= Ġtime Period Service . getTime Period ( period Name ) ĊĠĠĠĠĠĠĠ Ġval Ġcalendar Ġ= ĠCalendar . getInstance ( TimeZone . getTime Zone ( timezone )) ĊĠĠĠĠĠĠĠ Ġval Ġletter Ġ= ĠLetter ( null , Ġlogin , Ġmessage , Ġfalse , ĠCalendar . getInstance (). time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalc Open Date ( period , Ġcalendar )) ĊĠĠĠĠĠĠĠ Ġdo Send ( letter , Ġtimezone ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend Letter ( login : ĠString , Ġmessage : ĠString , Ġopen Date : ĠDay ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtimezone Ġ= ĠuserService . load UserData ( login ). time Zone ĊĠĠĠĠĠĠĠ Ġval Ġletter Ġ= ĠLetter ( null , Ġlogin , Ġmessage , Ġfalse , ĠCalendar . getInstance (). time , Ġopen Date . toDate ( timezone )) ĊĠĠĠĠĠĠĠ Ġdo Send ( letter , Ġtimezone ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget New Letters ( login : ĠString ): ĠList < Letter > Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . info Ġ{ Ġ" getting Ġnew Ġletters Ġfor Ġuser Ġ$ login " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġletter Repository . getNew Letters ( login ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Inbox Page ( login : ĠString , Ġpage Request : ĠPage Request ): ĠPage < Letter > Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . info Ġ{ Ġ" request Ġin box Ġpage Ġwith Ġ$ page Request Ġfor Ġuser Ġ$ login " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġletter Repository . inbox ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogin Ġ= Ġlogin , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskip Ġ= Ġpage Request . pageSize Ġ* Ġ( page Request . pageNumber Ġ- Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= Ġpage Request . pageSize , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinclude Read Ġ= Ġpage Request . include Read , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinclude M ailed Ġ= Ġpage Request . include M ailed , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinclude Arch ived Ġ= Ġpage Request . include Arch ived , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsortBy Ġ= Ġpage Request . sortBy ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Letters For Mail ing (): ĠList < Letter > Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . info Ġ{ Ġ" getting Ġnew Ġletters Ġfor Ġmail Ġsending " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġletter Repository . get Letters For Mail ing () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Future Letters ( login : ĠString ): ĠList < Se aled Letter En velop > Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . info Ġ{ Ġ" getting Ġfuture Ġletters Ġfor Ġuser Ġ$ login , Ġlimit Ġ 5 0 0 0 " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġletter Repository . get Future Letters ( login , Ġ 5 0 0 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Letters Dates Sequence ( login : ĠString ): ĠSequence < Se aled Letter En velop > Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . info Ġ{ Ġ" getting Ġsequence Ġof Ġall Ġletters Ġfor Ġuser =$ login " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġletter Repository . iterate Letters Dates ( login ). iterator (). as Sequence () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmark Letter As Read ( login : ĠString , Ġletter Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . info Ġ{ Ġ" mark ing Ġletter Ġ$ letter Id Ġof Ġuser Ġ$ login Ġas Ġread " Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! letter Repository . mark Letter As Read ( login , Ġletter Id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDatabase Exception (" Unexpected Ġupdate Ġresult Ġduring Ġmark Letter As Read () ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmark Letters As M ailed ( letter Ids : ĠList < String >) Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . info Ġ{ Ġ" mark ing Ġletters Ġwith Ġids Ġ$ letter Ids Ġas Ġmail Ġsent " Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! letter Repository . mark Letters As M ailed ( letter Ids )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDatabase Exception (" Unexpected Ġupdate Ġresult Ġduring Ġmark Letters As M ailed () ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġcalc Open Date ( period : ĠTime Period , Ġcalendar : ĠCalendar ): ĠDate Ġ{ ĊĠĠĠĠĠĠĠ Ġ// calendar . time Ġ= ĠSimpleDateFormat (" YYYY - MM - dd "). parse (" 2 0 1 8 - 1 2 - 3 1 ") ĊĠĠĠĠĠĠĠ Ġwith ( period ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . add ( Calendar . DAY _ OF _ YEAR , Ġdays ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . add ( Calendar . WEEK _ OF _ YEAR , Ġweeks ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . add ( Calendar . MONTH , Ġmonths ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . add ( Calendar . YEAR , Ġyears ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠSetting Ġto Ġmid night ĊĠĠĠĠĠĠĠ Ġcalendar . set ( Calendar . HOUR _ OF _ DAY , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġcalendar . set ( Calendar . MINUTE , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġcalendar . set ( Calendar . SECOND , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġcalendar . set ( Calendar . MILLI SECOND , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcalendar . time ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdo Send ( letter : ĠLetter , Ġtimezone : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . info Ġ{ Ġ" sending Ġletter Ġ$ letter " Ġ} ĊĠĠĠĠĠĠĠ Ġtransaction Wrapper . execute In Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġletter Repository . save New Letter ( letter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġletter Stat DataService . add Letter Stats ( letter , Ġtimezone ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠLOG . info Ġ{ Ġ" sent " Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠDay . toDate ( timezone : ĠString ): ĠDate Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcalendar Ġ= ĠCalendar . getInstance ( TimeZone . getTime Zone ( timezone )) ĊĠĠĠĠĠĠĠ Ġcalendar . set ( Calendar . YEAR , Ġyear . toInt ()) ĊĠĠĠĠĠĠĠ Ġcalendar . set ( Calendar . MONTH , Ġmonth . toInt () Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġcalendar . set ( Calendar . DAY _ OF _ MONTH , Ġday . toInt ()) ĊĠĠĠĠĠĠĠ Ġcalendar . set ( Calendar . HOUR _ OF _ DAY , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġcalendar . set ( Calendar . MINUTE , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġcalendar . set ( Calendar . SECOND , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġcalendar . set ( Calendar . MILLI SECOND , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcalendar . time ĊĠĠĠ Ġ} Ċ }