package Ġapi . logic Ċ Ċ import Ġapi . misc . json .* Ċ import Ġcom . auth 0 . jwt . JWT Ċ import Ġcom . auth 0 . jwt . algorithms . Algorithm Ċ import Ġinterfaces . I Index Manager Ċ import Ġinterfaces . IM odule Ċ import Ġio . ktor . application .* Ċ import Ġio . ktor . auth .* Ċ import Ġio . ktor . auth . jwt .* Ċ import Ġio . ktor . request .* Ċ import Ġio . ktor . util .* Ċ import Ġkotlinx . coroutines . sync . Mutex Ċ import Ġkotlinx . coroutines . sync . with Lock Ċ import Ġkotlinx . serialization . Experimental Serialization Api Ċ import Ġkotlinx . serialization . decode FromString Ċ import Ġkotlinx . serialization . encode ToString Ċ import Ġkotlinx . serialization . json . Json Ċ import Ġmodules . m 2 . Contact Ċ import Ġmodules . m 3 . Invoice Ċ import Ġmodules . m 3 . Invoice Position Ċ import Ġmodules . m 3 . logic . Invoice CLI Controller Ċ import Ġmodules . m 4 . Item Ċ import Ġmodules . m 4 . Item Price Category Ċ import Ġmodules . m 4 . logic . Item Price Manager Ċ import Ġmodules . m 4 storage . logic . Item Storage Manager Ċ import Ġmodules . mx .* Ċ import Ġmodules . mx . logic .* Ċ import Ġjava . io . File Ċ import Ġjava . time . LocalDate Ċ import Ġjava . time . format . DateTime Formatter Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . set Ċ Ċ @ Experimental Serialization Api Ċ class ĠServer Controller Ġ{ ĊĠ Ġ@ Internal API ĊĠ Ġ@ Experimental Serialization Api ĊĠ Ġcompanion Ġobject ĠServer Ġ: ĠI Module Ġ{ ĊĠĠĠ Ġoverride Ġval ĠmoduleName Long Ġ= Ġ" Server Controller " ĊĠĠĠ Ġoverride Ġval Ġmodule Ġ= Ġ" MX " ĊĠĠĠ Ġoverride Ġfun Ġget Index Manager (): ĠI Index Manager ? Ġ{ ĊĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmutex Ġ= ĠMutex () ĊĊĠĠĠ Ġsuspend Ġfun Ġsave Entry ( entry : ĠByteArray , Ġindex Manager : ĠI Index Manager , Ġusername : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠ Ġval Ġu ID : ĠInt ĊĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠ Ġlog ( ĊĠĠĠĠĠĠĠĠĠ Ġlog Type Ġ= ĠLog . Log Type . COM , ĊĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġ" API Ġ${ index Manager . module } Ġentry Ġsave ", ĊĠĠĠĠĠĠĠĠĠ Ġapi Endpoint Ġ= Ġ"/ api /${ index Manager . module }/ save ", ĊĠĠĠĠĠĠĠĠĠ Ġmodule Alt Ġ= Ġindex Manager . module ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġu ID Ġ= Ġindex Manager . save ( ĊĠĠĠĠĠĠĠĠĠ Ġentry Ġ= Ġindex Manager . decode ( entry ), ĊĠĠĠĠĠĠĠĠĠ ĠuserName Ġ= Ġusername ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġu ID ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Entry ( app Call : ĠApplication Call , Ġindex Manager : ĠI Index Manager ): ĠAny Ġ{ ĊĠĠĠĠĠ Ġval Ġroute Par Ġ= Ġapp Call . parameters [" search String "] ĊĠĠĠĠĠ Ġif Ġ( route Par Ġ!= Ġnull Ġ&& Ġroute Par . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( app Call . request . query Parameters [" type "]) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ" uid " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdo Lock Ġ= Ġwhen Ġ( app Call . request . query Parameters [" lock "]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" true " Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( app Call . request . query Parameters [" format "] Ġ== Ġ" json ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= Ġindex Manager . decode ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Manager . getBytes ( u ID Ġ= Ġroute Par . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry . initialize () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Manager . encode ToJson String ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry Ġ= Ġentry , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpretty Print Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Manager . getBytes ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu ID Ġ= Ġroute Par . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock Ġ= Ġdo Lock , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserName Ġ= Ġapp Call . principal < JWT Principal >() !!. payload . get Claim (" username "). asString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ" name " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Index Ġ= Ġapp Call . request . query Parameters [" index "] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġix Nr : ĠInt Ġ= Ġ( request Index ?. toInt ()) Ġ?: Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexact Search Ġ= Ġrequest Index Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( app Call . request . query Parameters [" format "] Ġ== Ġ" json ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Manager . getEntry List Json ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Text Ġ= Ġroute Par , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġix Nr , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexact Search Ġ= Ġexact Search ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Manager . getEntry Bytes List Json ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Text Ġ= Ġroute Par , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġix Nr , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexact Search Ġ= Ġexact Search ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Entry Lock ( app Call : ĠApplication Call , Ġindex Manager : ĠI Index Manager ): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġval Ġroute Par Ġ= Ġapp Call . parameters [" search String "] ĊĠĠĠĠĠ Ġif Ġ( route Par Ġ!= Ġnull Ġ&& Ġroute Par . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġindex Manager . getEntry Lock ( ĊĠĠĠĠĠĠĠĠĠ Ġu ID Ġ= Ġroute Par . toInt (), ĊĠĠĠĠĠĠĠĠĠ ĠuserName Ġ= Ġapp Call . principal < JWT Principal >() !!. payload . get Claim (" username "). asString () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġset Entry Lock ( app Call : ĠApplication Call , Ġindex Manager : ĠI Index Manager ): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġval Ġroute Par Ġ= Ġapp Call . parameters [" search String "] ĊĠĠĠĠĠ Ġval Ġquery Par Ġ= Ġapp Call . request . query Parameters [" type "] ĊĠĠĠĠĠ Ġval Ġsuccess : ĠBoolean Ġ= Ġif Ġ( route Par Ġ!= Ġnull Ġ&& Ġroute Par . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġindex Manager . set Entry Lock ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġu ID Ġ= Ġroute Par . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Lock Ġ= Ġquery Par . to Boolean (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserName Ġ= Ġapp Call . principal < JWT Principal >() !!. payload . get Claim (" username "). asString () ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġelse Ġfalse ĊĠĠĠĠĠ Ġreturn Ġsuccess ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Internal API ĊĠĠĠ Ġfun Ġgenerate Login Response ( user : ĠUser ): ĠValidation Container Json Ġ{ ĊĠĠĠĠĠ Ġval Ġini Val Ġ= ĠJson . decode FromString < Ini >( get Ini File (). read Text ()) ĊĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠH ours ĊĠĠĠĠĠ Ġval Ġexpires In Ms Ġ= Ġ( 1 Ġ* Ġ 6 0 Ġ* Ġ 6 0 Ġ* Ġ 1 0 0 0 ) ĊĠĠĠĠĠ Ġval Ġexpires At Ġ= ĠDate ( System . currentTimeMillis () Ġ+ Ġexpires In Ms ) ĊĠĠĠĠĠ Ġval Ġtoken Ġ= ĠJWT . create () ĊĠĠĠĠĠĠĠ Ġ. with Audience (" http ://${ ini Val . server IPAddress }/ ") ĊĠĠĠĠĠĠĠ Ġ. with Issuer (" http ://${ ini Val . server IPAddress }/ ") ĊĠĠĠĠĠĠĠ Ġ. with Claim (" username ", Ġuser . username ) ĊĠĠĠĠĠĠĠ Ġ. with Expires At ( expires At ) ĊĠĠĠĠĠĠĠ Ġ. sign ( Algorithm . HMAC 2 5 6 ( ini Val . token )) ĊĠĠĠĠĠ Ġlog ( Log . Log Type . COM , Ġ" Token Ġgenerated Ġfor Ġ${ user . username }", Ġ"/ login ") ĊĠĠĠĠĠ Ġval Ġlogin Response Ġ= ĠJson . encode ToString ( ĊĠĠĠĠĠĠĠ ĠLogin Response Json ( ĊĠĠĠĠĠĠĠĠĠ Ġhttp Code Ġ= Ġ 2 0 0 , ĊĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġtoken , ĊĠĠĠĠĠĠĠĠĠ Ġexpires In Ms Ġ= Ġexpires In Ms , ĊĠĠĠĠĠĠĠĠĠ Ġaccess M 1 Ġ= Ġuser . can Access Dis co graphy , ĊĠĠĠĠĠĠĠĠĠ Ġaccess M 2 Ġ= Ġuser . can Access Contacts , ĊĠĠĠĠĠĠĠĠĠ Ġaccess M 3 Ġ= Ġuser . can Access In voices , ĊĠĠĠĠĠĠĠĠĠ Ġaccess M 4 Ġ= Ġuser . can Access Inventory ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġreturn ĠValidation Container Json ( ĊĠĠĠĠĠĠĠ Ġcontent Json Ġ= Ġlogin Response , ĊĠĠĠĠĠĠĠ Ġhash Ġ= Ġencrypt K ecc ak ( ĊĠĠĠĠĠĠĠĠĠ Ġinput Ġ= Ġlogin Response , ĊĠĠĠĠĠĠĠĠĠ Ġsalt Ġ= Ġencrypt K ecc ak ( user . username ), ĊĠĠĠĠĠĠĠĠĠ Ġpep per Ġ= Ġencrypt K ecc ak (" C WO _ ER P ĠLogin Validation ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Internal API ĊĠĠĠ Ġfun Ġupdate Price Categories ( category Json : ĠList Delta Json ): ĠBoolean Ġ{ ĊĠĠĠĠĠ ĠItem Price Manager (). update Category ( ĊĠĠĠĠĠĠĠ Ġcategory New Ġ= ĠJson . decode FromString ( category Json . list Entry New ), ĊĠĠĠĠĠĠĠ Ġcategory Old Ġ= ĠJson . decode FromString ( category Json . list Entry Old ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Internal API ĊĠĠĠ Ġfun Ġdelete Price Category ( category Json : ĠList Delta Json ): ĠBoolean Ġ{ ĊĠĠĠĠĠ ĠItem Price Manager (). delete Category ( ĊĠĠĠĠĠĠĠ Ġcategory Ġ= ĠJson . decode FromString ( category Json . list Entry New ), ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Internal API ĊĠĠĠ Ġfun Ġupdate Storage s ( category Json : ĠList Delta Json ): ĠBoolean Ġ{ ĊĠĠĠĠĠ ĠItem Storage Manager (). fun Update Storage ( ĊĠĠĠĠĠĠĠ Ġstorage New Ġ= ĠJson . decode FromString ( category Json . list Entry New ), ĊĠĠĠĠĠĠĠ Ġstorage Old Ġ= ĠJson . decode FromString ( category Json . list Entry Old ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Internal API ĊĠĠĠ Ġfun Ġdelete Storage ( category Json : ĠList Delta Json ): ĠBoolean Ġ{ ĊĠĠĠĠĠ ĠItem Storage Manager (). delete Storage ( ĊĠĠĠĠĠĠĠ Ġstorage Ġ= ĠJson . decode FromString ( category Json . list Entry New ), ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġplace Web shop Order ( app Call : ĠApplication Call ): ĠInt Ġ{ ĊĠĠĠĠĠ Ġval Ġm 3 Ini Val Ġ= ĠInvoice CLI Controller (). get Ini () ĊĊĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠ Ġ* ĠThe Ġweb shop Ġorder ĊĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠ Ġval Ġorder Ġ= ĠInvoice (- 1 ) ĊĊĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠ Ġ* ĠThe Ġordered Ġitem 's ĠUID ĊĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠ Ġval Ġbody Ġ= Ġapp Call . receive < Web shop Order >() ĊĠĠĠĠĠ Ġif Ġ( body . cart . isEmpty ()) Ġreturn Ġ- 1 ĊĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġbody . cart . size ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġitem Index Manager !!. get ( body . cart [ i ]. u ID ) Ġas ĠItem ĊĠĠĠĠĠĠĠ Ġif Ġ( item . u ID Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠ Ġ* ĠItem Ġposition ĊĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġitem Position Ġ= ĠInvoice Position ( item . u ID , Ġitem . description ) ĊĠĠĠĠĠĠĠĠĠ Ġitem Position . g ross Price Ġ= ĠJson . decode FromString < Item Price Category >( item . prices [ 0 ] !! ). g ross Price ĊĠĠĠĠĠĠĠĠĠ Ġitem Position . amount Ġ= Ġbody . cart [ i ]. amount . toDouble () ĊĠĠĠĠĠĠĠĠĠ Ġorder . items [ i ] Ġ= ĠJson . encode ToString ( item Position ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġorder . customer Note Ġ= Ġbody . customer Note ĊĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠ Ġ* ĠFinal ize Ġthe Ġorder Ġand Ġsave Ġit ĊĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠ Ġval ĠuserName Ġ= Ġapp Call . principal < JWT Principal >() !!. payload . get Claim (" username "). asString () ĊĠĠĠĠĠ ĠInvoice CLI Controller (). calculate ( order ) ĊĠĠĠĠĠ Ġorder . date Ġ= ĠLocalDate . now (). format ( DateTime Formatter . of Pattern (" dd . MM . yyyy ")) ĊĠĠĠĠĠ Ġorder . text Ġ= Ġ" Web ĠOrder " ĊĠĠĠĠĠ Ġorder . buyer Ġ= ĠuserName ĊĠĠĠĠĠ Ġorder . status Ġ= Ġif Ġ( m 3 Ini Val . auto Com mission ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠ Ġorder . status Text Ġ= ĠInvoice CLI Controller (). getStatus Text ( order . status ) ĊĠĠĠĠĠ Ġ// Check Ġif Ġthe Ġcustomer Ġis Ġan Ġexisting Ġcontact , Ġif Ġnot , Ġcreate Ġit ĊĠĠĠĠĠ Ġval Ġcontacts Matched Ġ= Ġcontact Index Manager !!. getEntry Bytes List Json ( ĊĠĠĠĠĠĠĠ Ġsearch Text Ġ= ĠuserName , ĊĠĠĠĠĠĠĠ Ġix Nr Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠ Ġexact Search Ġ= Ġfalse ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġif Ġ( contacts Matched . results List . isEmpty () Ġ&& Ġm 3 Ini Val . auto Create Contacts ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontact Ġ= ĠContact (- 1 , ĠuserName ) ĊĠĠĠĠĠĠĠ Ġcontact . email Ġ= ĠuserName ĊĠĠĠĠĠĠĠ Ġcontact . money Sent Ġ= Ġorder . net Total ĊĠĠĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġorder . buyer UID Ġ= Ġcontact Index Manager !!. save ( contact ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontact Ġ= Ġcontact Index Manager !!. decode ( contacts Matched . results List [ 0 ]) Ġas ĠContact ĊĠĠĠĠĠĠĠ Ġorder . buyer UID Ġ= Ġcontact . u ID ĊĠĠĠĠĠĠĠ Ġif Ġ( contact . email . isEmpty () Ġ|| Ġcontact . email Ġ== Ġ"? ") Ġcontact . email Ġ= ĠuserName ĊĠĠĠĠĠĠĠ Ġcontact . money Sent Ġ= Ġorder . net Total ĊĠĠĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcontact Index Manager !!. save ( contact ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġorder . seller Ġ= Ġ"< Self >" ĊĠĠĠĠĠ Ġif Ġ( m 3 Ini Val . auto Send Email Confirmation ) Ġorder . email Confirmation Sent Ġ= Ġtrue ĊĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠ Ġinvoice Index Manager !!. save ( entry Ġ= Ġorder , ĠuserName Ġ= ĠuserName ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠ Ġlog ( ĊĠĠĠĠĠĠĠĠĠ Ġlog Type Ġ= ĠLog . Log Type . COM , ĊĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġ" web Ġshop Ġorder Ġ# ${ order . u ID } Ġfrom Ġ${ order . buyer }", ĊĠĠĠĠĠĠĠĠĠ Ġapi Endpoint Ġ= Ġapp Call . request . uri , ĊĠĠĠĠĠĠĠĠĠ Ġmodule Alt Ġ= Ġinvoice Index Manager !!. module ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ( m 3 Ini Val . auto Send Email Confirmation ) Ġ{ ĊĠĠĠĠĠĠĠ ĠEmail er (). send Email ( ĊĠĠĠĠĠĠĠĠĠ Ġsubject Ġ= Ġ" Web ĠShop ĠOrder Ġ# ${ order . u ID }", ĊĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġ" H ey , Ġwe 're Ġconfirm ing Ġyour Ġorder Ġover Ġ${ order . g ross Total } ĠE uro .\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Order ĠNumber : Ġ# ${ order . u ID }\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Date : Ġ${ order . date }", ĊĠĠĠĠĠĠĠĠĠ Ġrecipient Ġ= Ġorder . buyer ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġorder . u ID ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġregister User ( app Call : ĠApplication Call ): ĠRegistration Response Ġ{ ĊĠĠĠĠĠ Ġval Ġregistration Payload Ġ= Ġapp Call . receive < Registration Payload >() ĊĠĠĠĠĠ Ġval Ġuser Manager Ġ= ĠUser Manager () ĊĠĠĠĠĠ Ġvar Ġexists Ġ= Ġfalse ĊĠĠĠĠĠ Ġvar Ġsuccess Ġ= Ġtrue ĊĠĠĠĠĠ Ġvar Ġmessage Ġ= Ġ"" ĊĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcredentials Ġ= Ġuser Manager . get Credentials () ĊĠĠĠĠĠĠĠ Ġfor Ġ( user Ġin Ġcredentials . credentials ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( user . value . username . uppercase () Ġ== Ġregistration Payload . username . uppercase ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexists Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( exists ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġsuccess Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" User Ġalready Ġexists " ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠUser ( registration Payload . username , Ġencrypt AES ( registration Payload . password )) ĊĠĠĠĠĠĠĠĠĠ Ġuser Manager . update User ( user , Ġuser , Ġcredentials ) ĊĠĠĠĠĠĠĠĠĠ Ġlog ( Log . Log Type . COM , Ġ" User Ġ${ registration Payload . username } Ġregistered .", Ġapp Call . request . uri ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn ĠRegistration Response ( success , Ġmessage ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetItem Image (): ĠString Ġ{ ĊĠĠĠĠĠ Ġval Ġsample Img Ġ= ĠFile ("$ data Path \\ data \\ img \\ oro chi _ logo _ red _ 5 0 0 x 5 0 0 . png ") ĊĠĠĠĠĠ Ġreturn ĠBase 6 4 . get Encoder (). encode ToString ( sample Img . read Bytes ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget JWT Username ( app Call : ĠApplication Call ): ĠString Ġ{ ĊĠĠĠĠĠ Ġreturn Ġapp Call . principal < JWT Principal >() !!. payload . get Claim (" username "). asString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Own In voices ( app Call : ĠApplication Call ): ĠAny Ġ{ ĊĠĠĠĠĠ Ġreturn Ġinvoice Index Manager !!. getEntry List Json ( ĊĠĠĠĠĠĠĠ Ġsearch Text Ġ= Ġget JWT Username ( app Call ), ĊĠĠĠĠĠĠĠ Ġix Nr Ġ= Ġ 2 , ĊĠĠĠĠĠĠĠ Ġexact Search Ġ= Ġtrue ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ