package Ġcom . arp adf od or . st olen vehicle detector . data Ċ Ċ import Ġcom . arp adf od or . st olen vehicle detector . communication . StatusCode s Ċ import Ġcom . arp adf od or . st olen vehicle detector . data . dat acl asses . User Ċ import Ġcom . google . gson . reflect . Type Token Ċ import Ġcom . arp adf od or . st olen vehicle detector . data . dat acl asses . Permission Type Ċ Ċ private Ġval Ġtype Token Ġ= Ġobject Ġ: ĠType Token < Mutable List < User >>() Ġ{} . type Ċ Ċ class ĠUsers Repository ( name : ĠString , Ġmeta DAO : ĠMeta DAO ) Ġ: ĠDat aclass DAO < User >( name , Ġtype Token , Ġmeta DAO ){ ĊĊĠĠĠ Ġoverride Ġfun Ġread () Ġ: ĠMutable List < User > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdisplayed Users Ġ= Ġmutable ListOf < User >() ĊĠĠĠĠĠĠĠ Ġfor ( user Ġin Ġrecords ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdisplay User Ġ= ĠUser ( user . email , Ġ" ****** ", Ġuser . name , Ġ" ****** ", Ġuser . active , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser . num Reports , Ġuser . permissions , Ġuser . key , Ġuser . version , Ġuser . valid From UTC , Ġuser . valid To UTC ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisplayed Users . add ( display User ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdisplayed Users ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd ( items : ĠList < User >) Ġ: ĠInt { ĊĊĠĠĠĠĠĠĠ Ġfor ( item Ġin Ġitems ){ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (! item . email . contains ("@ ") Ġ|| Ġ! item . email . contains (". ")){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠStatus Codes . BAD _ REQUEST ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( item . password Ġ== Ġ""){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠStatus Codes . BAD _ REQUEST ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (! item . active Ġ|| Ġitem . permissions . isEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠStatus Codes . BAD _ REQUEST ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( record Ġin Ġrecords ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( record . email Ġ== Ġitem . email ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠStatus Codes . CONF LI CT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . add ( items ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete Self ( key : ĠString , ĠcurrentTime UTC : ĠString ) Ġ: ĠInt { ĊĠĠĠĠĠĠĠ Ġfor ( user Ġin Ġrecords ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( user . email Ġ!= Ġkey ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif ĠUser Ġhas Ġbeen Ġde activated , Ġit Ġcannot Ġdelete Ġitself ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (! user . active ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdelete ( key , ĠcurrentTime UTC ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠStatus Codes . NOT _ MODI FIED ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate User ( items : ĠList < User >): ĠInt Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġare Same Items : Ġ( User , ĠUser ) Ġ-> ĠBoolean Ġ= Ġ{ record , Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( record . email Ġ== Ġitem . email ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġis Update Needed : Ġ( User , ĠUser ) Ġ-> ĠBoolean Ġ= Ġ{ record , Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġupdate Record Based On Item : Ġ( User , ĠUser ) Ġ-> ĠUnit Ġ= Ġ{ record , Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecord . active Ġ= Ġitem . active ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecord . permissions Ġ= Ġitem . permissions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfields Ġto Ġkeep Ġ( may Ġbe Ġinvalid Ġin Ġitem ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem . hint Ġ= Ġrecord . hint ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem . num Reports Ġ= Ġrecord . num Reports ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem . password Ġ= Ġrecord . password ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem . name Ġ= Ġrecord . name ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . update ( items , Ġare Same Items Ġ= Ġare Same Items , Ġis Update Needed Ġ= Ġis Update Needed , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Record Based On Item Ġ= Ġupdate Record Based On Item ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Self ( user ToUpdate : ĠUser ): ĠInt Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġare Same Items : Ġ( User , ĠUser ) Ġ-> ĠBoolean Ġ= Ġ{ record , Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( record . email Ġ== Ġitem . email ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġis Update Needed : Ġ( User , ĠUser ) Ġ-> ĠBoolean Ġ= Ġ{ record , Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġupdate Record Based On Item : Ġ( User , ĠUser ) Ġ-> ĠUnit Ġ= Ġ{ record , Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecord . name Ġ= Ġuser ToUpdate . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecord . password Ġ= Ġuser ToUpdate . password ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfields Ġto Ġkeep Ġ( may Ġbe Ġinvalid Ġin Ġitem ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem . permissions Ġ= Ġrecord . permissions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem . hint Ġ= Ġrecord . hint ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem . num Reports Ġ= Ġrecord . num Reports ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem . active Ġ= Ġrecord . active ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . update ( listOf ( user ToUpdate ), Ġare Same Items Ġ= Ġare Same Items , Ġis Update Needed Ġ= Ġis Update Needed , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Record Based On Item Ġ= Ġupdate Record Based On Item ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġauthorize User ( user : ĠUser , Ġrequired Permission : ĠPermission Type ) Ġ: ĠInt { ĊĊĠĠĠĠĠĠĠ Ġfor ( record Ġin Ġrecords ){ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( record . email Ġ!= Ġuser . email ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (! record . active ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( record . password Ġ!= Ġuser . password ) Ġreturn ĠStatus Codes . UN AUTHORIZ ED ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( permission Ġin Ġrecord . permissions ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( required Permission Ġ== Ġpermission ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠStatus Codes . SUCCESS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠStatus Codes . UN AUTHORIZ ED ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Report Counters () Ġ: ĠInt { ĊĠĠĠĠĠĠĠ Ġfor ( user Ġin Ġrecords ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser . num Reports Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġwrite ( records ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġincrease Report Counter Of User ( key : ĠString ) Ġ: ĠInt { ĊĠĠĠĠĠĠĠ Ġfor ( user Ġin Ġrecords ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( user . email Ġ== Ġkey ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser . num Reports Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġwrite ( records ) ĊĠĠĠ Ġ} Ċ Ċ }