package Ġuk . gov . just ice . digital . h mp ps . send legal mailto pr is ons api . contact Ċ Ċ import Ġorg . springframework . dao . Data Integr ity Violation Exception Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġuk . gov . just ice . digital . h mp ps . send legal mailto pr is ons api . config . Duplicate Contact Exception Ċ import Ġjava . time . Clock Ċ import Ġjava . time . Instant Ċ Ċ @ Service Ċ class ĠContact Service ( private Ġval Ġcontact Repository : ĠContact Repository , Ġprivate Ġval Ġclock : ĠClock ) Ġ{ ĊĊĠ Ġfun Ġget Contact ( userId : ĠString , Ġcontact Id : ĠLong ): ĠContact Response ? Ġ= ĊĠĠĠ Ġcontact Repository . get Contact By Owner And Id ( owner Ġ= ĠuserId , Ġid Ġ= Ġcontact Id ) ĊĠĠĠĠĠ Ġ? . let Ġ{ Ġto Contact Response ( it ) Ġ} ĊĊĠ Ġfun Ġcreate Contact ( userId : ĠString , Ġcontact Request : ĠContact Request ): ĠContact Response Ġ{ ĊĠĠĠ Ġval Ġnow Ġ= ĠInstant . now ( clock ) ĊĠĠĠ Ġval Ġnew Contact Entity Ġ= ĠContact ( ĊĠĠĠĠĠ Ġowner Ġ= ĠuserId , ĊĠĠĠĠĠ Ġname Ġ= Ġcontact Request . pr isoner Name , ĊĠĠĠĠĠ Ġpr ison Code Ġ= Ġcontact Request . pr ison Id , ĊĠĠĠĠĠ Ġdo b Ġ= Ġcontact Request . dob , ĊĠĠĠĠĠ Ġpr ison Number Ġ= Ġcontact Request . pr ison Number , ĊĠĠĠĠĠ Ġcreated Ġ= Ġnow , ĊĠĠĠĠĠ Ġupdated Ġ= Ġnow ĊĠĠĠ Ġ) ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġreturn Ġto Contact Response ( contact Repository . save ( new Contact Entity )) ĊĠĠĠ Ġ} Ġcatch Ġ( data Integr ity Violation Exception : ĠData Integr ity Violation Exception ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠDuplicate Contact Exception ( userId , Ġcontact Request . pr ison Number !! ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġupdate Contact ( userId : ĠString , Ġcontact Id : ĠLong , Ġcontact Request : ĠContact Request ): ĠContact Response ? Ġ= ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġcontact Repository . get Contact By Owner And Id ( userId , Ġcontact Id ) ĊĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġexisting Contact Ġ-> Ġto Contact ( contact Request , Ġexisting Contact ) Ġ} ĊĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġnew Contact Ġ-> Ġcontact Repository . save ( new Contact ) Ġ} ĊĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġsaved Contact Ġ-> Ġto Contact Response ( saved Contact ) Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( ex : ĠData Integr ity Violation Exception ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠDuplicate Contact Exception ( userId , Ġcontact Request . pr ison Number !! ) ĊĠĠĠ Ġ} ĊĊĠ Ġfun Ġsearch Contacts ByName ( userId : ĠString , Ġname : ĠString ): ĠCollection < Contact Response > Ġ= ĊĠĠĠ Ġ// ĠWe Ġhave Ġto Ġuppercase Ġthe Ġname Ġdue Ġto Ġa Ġdef iciency Ġin Ġjp ql Ġ- Ġsee Ġthe ĠContact Repository Ġfor Ġmore Ġdetails ĊĠĠĠ Ġcontact Repository . find Contact By Owner And Name Containing IgnoreCase ( userId , Ġname . uppercase ()) ĊĠĠĠĠĠ Ġ. map Ġ{ Ġto Contact Response ( it ) Ġ} ĊĊĠ Ġfun Ġget Contact By Pr ison Number ( userId : ĠString , Ġpr ison Number : ĠString ): ĠContact Response ? Ġ= ĊĠĠĠ Ġcontact Repository . get Contact By Owner And Pr ison Number ( userId , Ġpr ison Number ) ĊĠĠĠĠĠ Ġ? . let Ġ{ Ġto Contact Response ( it ) Ġ} ĊĊĠ Ġprivate Ġfun Ġto Contact ( contact Request : ĠContact Request , Ġcontact : ĠContact ) Ġ= ĊĠĠĠ Ġwith ( contact Request ) Ġ{ ĊĠĠĠĠĠ Ġcontact . copy ( ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġpr isoner Name , ĊĠĠĠĠĠĠĠ Ġpr ison Code Ġ= Ġpr ison Id , ĊĠĠĠĠĠĠĠ Ġdo b Ġ= Ġdo b , ĊĠĠĠĠĠĠĠ Ġpr ison Number Ġ= Ġpr ison Number , ĊĠĠĠĠĠĠĠ Ġupdated Ġ= ĠInstant . now ( clock ), ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġto Contact Response ( contact : ĠContact ): ĠContact Response Ġ= ĊĠĠĠ ĠContact Response ( ĊĠĠĠĠĠ Ġid Ġ= Ġcontact . id !! , ĊĠĠĠĠĠ Ġpr isoner Name Ġ= Ġcontact . name , ĊĠĠĠĠĠ Ġpr ison Id Ġ= Ġcontact . pr ison Code , ĊĠĠĠĠĠ Ġdo b Ġ= Ġcontact . dob , ĊĠĠĠĠĠ Ġpr ison Number Ġ= Ġcontact . pr ison Number ĊĠĠĠ Ġ) Ċ } Ċ