/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 . Ġfan poll ĠAll Ġrights Ġreserved . Ċ Ġ*/ Ċ Ċ @ file : Opt In ( Experimental Serialization Api :: class , ĠInternal Serialization Api :: class ) Ċ Ċ package Ġfan poll . infra . base . response Ċ Ċ import Ġfan poll . infra . base . exception . Internal Server Exception Ċ import Ġfan poll . infra . base . form . Form Ċ import Ġfan poll . infra . base . json . json Ċ import Ġfan poll . infra . base . query . Dynamic Query Ċ import Ġfan poll . infra . base . util . Ident ifiable Object Ċ import Ġio . ktor . application . Application Call Ċ import Ġio . ktor . response . respond Ċ import Ġkotlinx . serialization .* Ċ import Ġkotlinx . serialization . json . JsonArray Ċ import Ġkotlinx . serialization . json . Json Element Ċ import Ġkotlinx . serialization . json . JsonObject Ċ import Ġkotlinx . serialization . json . Json Primitive Ċ import Ġjava . util .* Ċ Ċ suspend Ġfun ĠApplication Call . respond ( response DTO : ĠResponse DTO ) Ġ{ ĊĠĠĠ Ġrespond ( response DTO . code . http StatusCode , Ġresponse DTO ) Ċ } Ċ Ċ @ Serializable Ċ sealed Ġclass ĠResponse DTO Ġ{ ĊĊĠĠĠ Ġabstract Ġval Ġcode : ĠResponse Code ĊĠĠĠ Ġabstract Ġval Ġmessage : ĠString ? ĊĠĠĠ Ġabstract Ġval Ġdata : ĠJson Element ? Ċ } Ċ Ċ @ Serializable Ċ @ Serial Name (" code ") Ċ class ĠCode Response DTO ( override Ġval Ġcode : ĠResponse Code ) Ġ: ĠResponse DTO () Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġmessage : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġoverride Ġval Ġdata : ĠJson Element ? Ġ= Ġnull ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠOK Ġ= ĠCode Response DTO ( Inf ra Response Code . OK ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Serializable Ċ @ Serial Name (" data ") Ċ class ĠData Response DTO ( ĊĠĠĠ Ġoverride Ġval Ġcode : ĠResponse Code , ĊĠĠĠ Ġoverride Ġval Ġmessage : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġoverride Ġval Ġdata : ĠJson Element Ċ ) Ġ: ĠResponse DTO () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġinline Ġoperator Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġinvoke ( data : ĠT , Ġmessage : ĠString ? Ġ= Ġnull ): ĠData Response DTO Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData Response DTO ( Inf ra Response Code . OK , Ġmessage , Ġjson . encode ToJson Element ( T :: class . serializer (), Ġdata )) ĊĊĠĠĠĠĠĠĠ Ġinline Ġoperator Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġinvoke ( data : ĠList < T >, Ġmessage : ĠString ? Ġ= Ġnull ): ĠData Response DTO Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData Response DTO ( Inf ra Response Code . OK , Ġmessage , ĠJson Array ( data . map Ġ{ Ġjson . encode ToJson Element ( T :: class . serializer (), Ġit ) Ġ})) ĊĊĠĠĠĠĠĠĠ Ġfun Ġlong Id ( id : ĠLong ): ĠData Response DTO Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData Response DTO ( Inf ra Response Code . OK , Ġdata Ġ= ĠJsonObject ( map Of (" id " Ġto ĠJson Primitive ( id )))) ĊĊĠĠĠĠĠĠĠ Ġfun Ġstring Id ( id : ĠString ): ĠData Response DTO Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData Response DTO ( Inf ra Response Code . OK , Ġdata Ġ= ĠJsonObject ( map Of (" id " Ġto ĠJson Primitive ( id )))) ĊĊĠĠĠĠĠĠĠ Ġfun Ġuuid ( id : ĠUUID ): ĠData Response DTO Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData Response DTO ( Inf ra Response Code . OK , Ġdata Ġ= ĠJsonObject ( map Of (" id " Ġto ĠJson Primitive ( id . toString ())) )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Serializable Ċ @ Serial Name (" paging ") Ċ class ĠP aging Data Response DTO ( ĊĠĠĠ Ġoverride Ġval Ġcode : ĠResponse Code , ĊĠĠĠ Ġoverride Ġval Ġmessage : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġoverride Ġval Ġdata : ĠJson Element Ċ ) Ġ: ĠResponse DTO () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġd toList ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Limit : ĠDynamic Query . Offset Limit , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal : ĠLong , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitems : ĠList < T >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ): ĠP aging Data Response DTO Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġjson Array ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Limit , Ġtotal , ĠJson Array ( items . map Ġ{ Ġjson . encode ToJson Element ( T :: class . serializer (), Ġit ) Ġ}), Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġjson Array ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Limit : ĠDynamic Query . Offset Limit , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal : ĠLong , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitems : ĠJson Array , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ): ĠP aging Data Response DTO Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Pages Ġ= Ġ( total Ġ/ Ġoffset Limit . items PerPage ) Ġ+ Ġ( if Ġ( total Ġ% Ġoffset Limit . items PerPage Ġ== Ġ 0 L ) Ġ 0 Ġelse Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal Items Ġ= Ġif Ġ( total Ġ!= Ġitems . size . to Long ()) Ġitems Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠstartIndex : ĠInt Ġ= Ġ( offset Limit . items PerPage Ġ* Ġ( offset Limit . page Index Ġ- Ġ 1 )). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( startIndex Ġ>= Ġitems . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJson Array ( emptyList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġend Index : ĠInt Ġ= Ġ( startIndex Ġ+ Ġoffset Limit . items PerPage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( end Index Ġ> Ġitems . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Index Ġ= Ġitems . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJson Array ( items . sub List ( startIndex , Ġend Index )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠP aging Data Response DTO ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInf ra Response Code . OK , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġjson . encode ToJson Element ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP aging Data . serializer (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP aging Data ( total , Ġtotal Pages , Ġoffset Limit . items PerPage , Ġoffset Limit . page Index , Ġfinal Items ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Serializable ĊĠĠĠ Ġclass ĠP aging Data ( ĊĠĠĠĠĠĠĠ Ġval Ġtotal : ĠLong , Ġval Ġtotal Pages : ĠLong , ĊĠĠĠĠĠĠĠ Ġval Ġitems PerPage : ĠInt , Ġval Ġpage Index : ĠLong , ĊĠĠĠĠĠĠĠ Ġval Ġitems : ĠJson Array ĊĠĠĠ Ġ) Ċ } Ċ Ċ @ Serializable Ċ @ Serial Name (" error ") Ċ class ĠError Response DTO ( ĊĠĠĠ Ġoverride Ġval Ġcode : ĠResponse Code , ĊĠĠĠ Ġoverride Ġval Ġmessage : ĠString , ĊĠĠĠ Ġval Ġdetail : ĠString , ĊĠĠĠ Ġval Ġreq Id : ĠString , ĊĠĠĠ Ġoverride Ġval Ġdata : ĠJsonObject ? Ġ= Ġnull , ĊĠĠĠ Ġval Ġerrors : ĠMutable List < ErrorResponse Detail Error >? Ġ= Ġnull Ċ ) Ġ: ĠResponse DTO () Ċ Ċ @ Serializable Ċ class ĠError Response Detail Error ( ĊĠĠĠ Ġval Ġcode : ĠResponse Code , ĊĠĠĠ Ġval Ġdetail : ĠString , ĊĠĠĠ Ġval Ġdata : ĠJsonObject ? Ġ= Ġnull Ċ ) Ċ Ċ @ Serializable Ċ @ Serial Name (" batch ") Ċ class ĠBatch Response DTO ( ĊĠĠĠ Ġoverride Ġval Ġcode : ĠResponse Code , ĊĠĠĠ Ġoverride Ġval Ġmessage : ĠString , ĊĠĠĠ Ġoverride Ġval Ġdata : ĠJsonObject Ċ ) Ġ: ĠResponse DTO () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġinvoke ( code : ĠResponse Code , Ġargs : ĠMap < String , ĠAny >? Ġ= Ġnull , Ġcall : ĠApplication Call ): ĠBatch Response DTO Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEN H ANCE MENT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInternal Server Exception ( Inf ra Response Code . NOT _ IMPLEMENTED _ ERROR ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Serializable Ċ class ĠBatch Result ( val Ġsuc cesses : ĠMutable List < Success Result >, Ġval Ġfailures : ĠMutable List < Failure Result >) Ċ Ċ @ Serializable Ċ class ĠSuccess Result ( override Ġval Ġid : ĠString , Ġval Ġdata : ĠJson Element ? Ġ= ĠJsonObject ( map Of ())) Ġ: ĊĠĠĠ ĠIdent ifiable Object < String >() Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġinline Ġoperator Ġfun Ġ< re ified ĠT Ġ: ĠForm <* >> Ġinvoke ( id : ĠString , Ġdata : ĠT ): ĠSuccess Result Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSuccess Result ( id , Ġjson . encode ToJson Element ( T :: class . serializer (), Ġdata )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinline Ġoperator Ġfun Ġ< re ified ĠT Ġ: ĠForm <* >> Ġinvoke ( id : ĠString , Ġdata : ĠList < T >): ĠSuccess Result Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSuccess Result ( id , ĠJson Array ( data . map Ġ{ Ġjson . encode ToJson Element ( T :: class . serializer (), Ġit ) Ġ})) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Serializable Ċ class ĠFailure Result ( override Ġval Ġid : ĠString , Ġval Ġerrors : ĠMutable List < ErrorResponse Detail Error >) Ġ: ĠIdent ifiable Object < String >()