package Ġcom . code _ label er . plugins Ċ Ċ import Ġcom . code _ label er .* Ċ import Ġcom . code _ label er . DB . isNew User Ċ import Ġcom . code _ label er . DB . is Owner Ċ import Ġcom . code _ label er . authentication . Jwt Config Ċ import Ġcom . code _ label er . authentication . Login Body Ċ import Ġcom . code _ label er . jwt Config Ċ import Ġio . ktor . routing .* Ċ import Ġio . ktor . routing . post Ċ import Ġio . ktor . http .* Ċ import Ġio . ktor . application .* Ċ import Ġio . ktor . auth .* Ċ import Ġio . ktor . response .* Ċ import Ġio . ktor . http . content .* Ċ import Ġio . ktor . request .* Ċ import Ġkotlinx . serialization .* Ċ import Ġkotlinx . serialization . json .* Ċ import Ġcom . code _ label er . authentication . User DB Ċ import Ġjava . io . File Ċ import Ġjava . util .* Ċ Ċ fun ĠRoute . signup () Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandles Ġuser Ġregistration , Ġreceives ĠLogin Body ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpost ("/ signup ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlogin Body Ġ= Ġcall . receive < Login Body >() ĊĠĠĠĠĠĠĠ Ġif Ġ( isNew User ( login Body . username )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDB . add User ( login Body . username , Ġencrypt ( login Body . password )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . OK , Ġ" User Ġregistered Ġsuccessfully ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . Conflict , Ġ" User Ġalready Ġexists ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠRoute . login () Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandles Ġuser Ġauthentication , Ġreceives ĠLogin Body , Ġsends ĠJWT ĠToken ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpost ("/ login ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlogin Body Ġ= Ġcall . receive < Login Body >() ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠUser DB . find User ( login Body ) ĊĠĠĠĠĠĠĠ Ġif Ġ( user Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . Unauthorized , Ġ" Invalid Ġcredentials !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ post ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġjwt Config . generate Token ( Jwt Config . User ( user . id . value , Ġuser . username )) ĊĠĠĠĠĠĠĠ Ġcall . respond ( token ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠRoute . file Upload () Ġ{ ĊĠĠĠ Ġvar Ġuuid Ġ= Ġ"" ĊĠĠĠ Ġauthenticate Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠUp loads Ġa Ġfile Ġto Ġthe Ġserver , Ġgets Ġthe Ġfile Ġitself Ġand Ġthe Ġowner Ġtoken ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġpost ("/ upload ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġcall . authentication . principal Ġas ĠJwt Config . User ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmultipart Data Ġ= Ġcall . receive Multipart () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmultipart Data . forEach Part Ġ{ Ġpart Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( part ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPart Data . File Item Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstring Ġ= ĠJson . encode ToString ( parse Csv String ( String ( part . stream Provider (). read Bytes ()))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuuid Ġ= ĠUUID . randomUUID (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDB . add File ( uuid , Ġpart . original FileName Ġ?: Ġ" file . csv ", Ġuser . userId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCloud Storage (). upload Json ( uuid , Ġstring ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond Text (" File Ġuploaded Ġsuccessfully Ġto Ġfiles /$ uuid ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠRoute . file Download () Ġ{ ĊĠĠĠ Ġauthenticate Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSends Ġa Ġfile Ġto Ġthe Ġuser , Ġgets Ġthe Ġuuid Ġof Ġa Ġfile Ġand Ġthe Ġtoken Ġof Ġthe Ġuser Ġwho Ġhas Ġaccess Ġto Ġthis Ġfile ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġget ("/ files /{ id }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġcall . authentication . principal Ġas ĠJwt Config . User ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Uuid Ġ= Ġcall . parameters [" id "] Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( DB . exists ( file Uuid )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( DB . is User Allowed ( user . userId , Ġfile Uuid )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Name Ġ= ĠDB . get Original Name ( file Uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson String Ġ= ĠCloud Storage (). download Json ( file Uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemporary File Ġ= ĠFile ( original Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠlistOf Snippets : ĠList < Code With Label > Ġ= ĠJson . decode FromString ( json String ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmarshal Csv File ( listOf Snippets , Ġtemporary File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . response . header ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttp Headers . Content Disposition , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContent Disposition . Attachment . with Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContent Disposition . Parameters . FileName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond File ( temporary File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemporary File . delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . Forbidden , Ġ" User Ġdoesn 't Ġhave Ġaccess Ġto Ġthis Ġfile ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . NotFound , Ġ" Such Ġfile Ġdoes Ġnot Ġexist ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠRoute . add User () Ġ{ ĊĠĠĠ Ġauthenticate Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠG ives Ġthe Ġuser Ġaccess Ġto Ġthe Ġfile . ĊĠĠĠĠĠĠĠĠ Ġ* ĠFor Ġthis Ġhe Ġgets Ġthe Ġuuid Ġof Ġthe Ġfile , ĊĠĠĠĠĠĠĠĠ Ġ* Ġthe Ġtoken Ġof Ġthe Ġowner Ġand Ġthe Ġname Ġof Ġthe Ġuser Ġwho Ġneeds Ġto Ġbe Ġgiven Ġaccess ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġput (" files /{ id }/ add ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser ToAdd Ġ= Ġcall . receive < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġowner Ġ= Ġcall . authentication . principal Ġas ĠJwt Config . User ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Uuid Ġ= Ġcall . parameters [" id "] Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( DB . exists ( file Uuid )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Owner ( file Uuid , Ġowner . userId )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDB . allow User ( file Uuid , ĠDB . getId ( user ToAdd )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . OK , Ġ" User Ġadded Ġsuccessfully ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . Forbidden , Ġ" User Ġdoesn 't Ġhave Ġaccess Ġto Ġthis Ġfile ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . NotFound , Ġ" Such Ġfile Ġdoes Ġnot Ġexist ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠRoute . remove User () Ġ{ ĊĠĠĠ Ġauthenticate Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠTakes Ġaway Ġaccess Ġto Ġthe Ġfile Ġfrom Ġthe Ġuser . ĊĠĠĠĠĠĠĠĠ Ġ* ĠTo Ġdo Ġthis , Ġit Ġreceives Ġthe Ġuuid Ġof Ġthe Ġfile , ĊĠĠĠĠĠĠĠĠ Ġ* Ġthe Ġtoken Ġof Ġthe Ġowner Ġ Ġand Ġthe Ġusername Ġfrom Ġwhich Ġaccess Ġshould Ġbe Ġtaken Ġaway ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġput (" files /{ id }/ remove ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser ToRemove Ġ= Ġcall . receive < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġowner Ġ= Ġcall . authentication . principal Ġas ĠJwt Config . User ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Uuid Ġ= Ġcall . parameters [" id "] Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( DB . exists ( file Uuid )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Owner ( file Uuid , Ġowner . userId )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDB . deny User ( file Uuid , ĠDB . getId ( user ToRemove )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . OK , Ġ" User Ġremoved Ġsuccessfully ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . Forbidden , Ġ" User Ġdoesn 't Ġhave Ġaccess Ġto Ġthis Ġfile ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . NotFound , Ġ" Such Ġfile Ġdoes Ġnot Ġexist ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠRoute . delete File () Ġ{ ĊĠĠĠ Ġauthenticate Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠDeletes Ġthe Ġfile , Ġfor Ġthis Ġit Ġgets Ġthe Ġuuid Ġof Ġthe Ġfile Ġand Ġthe Ġtoken Ġof Ġthe Ġowner ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġdelete (" files /{ id }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġcall . authentication . principal Ġas ĠJwt Config . User ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġcall . parameters [" id "] Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( DB . exists ( id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Owner ( id , Ġuser . userId )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCloud Storage (). delete File ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDB . remove File ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . OK , Ġ" OK ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . Forbidden , Ġ" User Ġdoesn 't Ġhave Ġaccess Ġto Ġthis Ġfile ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . NotFound , Ġ" Such Ġfile Ġdoes Ġnot Ġexist ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠRoute . modify File () Ġ{ ĊĠĠĠ Ġauthenticate Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠMod ifies Ġthe Ġfile , Ġfor Ġthis Ġit Ġgets Ġthe Ġuuid Ġof Ġthe Ġfile , ĊĠĠĠĠĠĠĠĠ Ġ* Ġthe Ġtoken Ġof Ġthe Ġuser Ġwith Ġaccess Ġto Ġthe Ġfile Ġand Ġjson Ġwith Ġchanges ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġput (" files /{ id }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġcall . authentication . principal Ġas ĠJwt Config . User ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġcall . parameters [" id "] Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Label Ġ= Ġcall . receive < New Label >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( DB . exists ( id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( DB . is User Allowed ( user . userId , Ġid )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstorage Ġ= ĠCloud Storage () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson String Ġ= Ġstorage . download Json ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstorage . upload Json ( id , Ġchange Label ( json String , Ġnew Label )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . OK , Ġ" OK ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . Forbidden , Ġ" User Ġdoesn 't Ġhave Ġaccess Ġto Ġthis Ġfile ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . NotFound , Ġ" Such Ġfile Ġdoes Ġnot Ġexist ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠApplication . configure Routing () Ġ{ ĊĠĠĠ Ġrouting Ġ{ ĊĠĠĠĠĠĠĠ Ġsignup () ĊĠĠĠĠĠĠĠ Ġlogin () ĊĠĠĠĠĠĠĠ Ġfile Upload () ĊĠĠĠĠĠĠĠ Ġfile Download () ĊĠĠĠĠĠĠĠ Ġadd User () ĊĠĠĠĠĠĠĠ Ġremove User () ĊĠĠĠĠĠĠĠ Ġdelete File () ĊĠĠĠĠĠĠĠ Ġmodify File () ĊĠĠĠ Ġ} Ċ } Ċ