package Ġdev . g ler oy . iv an ache ss . api Ċ Ċ import Ġdev . g ler oy . iv an ache ss . core .* Ċ import Ġdev . g ler oy . iv an ache ss . game . Game Ċ import Ġdev . g ler oy . iv an ache ss . game . Move Ċ import Ġdev . g ler oy . iv an ache ss . game . Piece Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġorg . springframework . transaction . annotation . Transactional Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠDefault Ġimplementation Ġof Ġgame Ġservice . Ċ Ġ* Ċ Ġ* Ġ@ param Ġrepository ĠGame Ġrepository . Ċ Ġ*/ Ċ @ Service Ċ class ĠDefault Game Service ( ĊĠĠĠ Ġoverride Ġval Ġrepository : ĠGame Repository Ċ ) Ġ: ĠAbstract Entity Service < Game Entity >(), ĠGame Service Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcreate ( white Player : ĠUser , Ġblack Player : ĠUser ): ĠMatch Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( white Player . id Ġ== Ġblack Player . id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠP layers Are Same User Exception (). apply Ġ{ Ġlogger . debug ( message ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġgame Entity Ġ= Ġrepository . save ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentity Ġ= ĠGame Entity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhite Player Ġ= Ġwhite Player , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblack Player Ġ= Ġblack Player ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġlogger . info (" New Ġgame Ġ'${ white Player . pseudo }' Ġvs . Ġ'${ black Player . pseudo }' Ġ(${ game Entity . id }) Ġcreated ") ĊĠĠĠĠĠĠĠ Ġreturn ĠMatch ( game Entity ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Game ById ( id : ĠUUID ): ĠGame Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! repository . exists With Id ( id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEntity NotFoundException (" Entity Ġ$ id Ġdoes Ġnot Ġexist "). apply Ġ{ Ġlogger . debug ( message ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠGame ( repository . fetch Moves ( id )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Transactional ĊĠĠĠ Ġoverride Ġfun Ġplay ( id : ĠUUID , Ġuser : ĠUser , Ġmove : ĠMove ): ĠMatch Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgame Entity Ġ= Ġget ById ( id ) ĊĠĠĠĠĠĠĠ Ġif Ġ( user Ġ!= Ġgame Entity . white Player Ġ&& Ġuser Ġ!= Ġgame Entity . black Player ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNot Allowed Player Exception ( id , Ġuser ). apply Ġ{ Ġlogger . debug ( message ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġplayer T ries To Ste al Turn Ġ= Ġgame Entity . white Player Ġ== Ġuser Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame Entity . turn Color Ġ!= ĠPiece . Color . White Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame Entity . black Player Ġ== Ġuser Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame Entity . turn Color Ġ!= ĠPiece . Color . Black ĊĠĠĠĠĠĠĠ Ġif Ġ( player T ries To Ste al Turn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Player Exception ( game Entity . id , Ġuser ). apply Ġ{ Ġlogger . debug ( message ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġgame Ġ= ĠGame ( repository . fetch Moves ( game Entity . id )) ĊĠĠĠĠĠĠĠ Ġif Ġ( game . board . piece At ( move . from )?. color Ġ!= Ġgame Entity . turn Color ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Move Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġgame Entity . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Ġ= Ġuser , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove Ġ= Ġmove ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ Ġlogger . debug ( message ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdated Game Ġ= Ġgame . play ( move ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdated Game Entity Ġ= Ġrepository . save ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity Ġ= Ġgame Entity . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġturn Color Ġ= Ġupdated Game . turn Color , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġupdated Game . state , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwinner Color Ġ= Ġupdated Game . winner Color ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . save Moves ( updated Game Entity . id , Ġupdated Game . moves ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Player Ġ'${ user . pseudo }' Ġ(${ user . id }) Ġplays Ġ$ move Ġin Ġgame Ġ${ updated Game Entity . id }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMatch ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity Ġ= Ġupdated Game Entity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame Ġ= Ġupdated Game ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : Ġdev . g ler oy . iv an ache ss . game . Invalid Move Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug ( exception . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Move Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġgame Entity . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Ġ= Ġuser , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove Ġ= Ġmove ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ Ġlogger . debug ( message ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ