package Ġio . feature hub . edge . db . sql Ċ Ċ import Ġio . e bean . annotation . Transactional Ċ import Ġio . feature hub . d acha . api . D acha ApiKey Service Ċ import Ġio . feature hub . db . model . Db Application Feature Ċ import Ġio . feature hub . db . model . Db Feature Value Ċ import Ġio . feature hub . db . model . query . Q Db Application Feature Ċ import Ġio . feature hub . db . model . query . Q Db Feature Value Ċ import Ġio . feature hub . db . model . query . Q Db ServiceAccount Environment Ċ import Ġio . feature hub . mr . model .* Ċ import Ġorg . slf 4 j . Logger Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . util .* Ċ Ċ class ĠDb D acha Sql Api Ġ: ĠD acha ApiKey Service Ġ{ ĊĠ Ġprivate Ġval Ġlog : ĠLogger Ġ= ĠLoggerFactory . getLogger ( Db D acha Sql Api :: class . java ) ĊĊĠ Ġ// Ġthese Ġare Ġnot Ġactually Ġrequired Ġbecause Ġthe Ġstats ĠAPI Ġisn 't Ġused , Ġso Ġwe Ġmake Ġthem Ġup ĊĠ Ġprivate Ġval Ġfake Application Id Ġ= ĠUUID . randomUUID () ĊĠ Ġprivate Ġval Ġfake Portfolio Id Ġ= ĠUUID . randomUUID () ĊĠ Ġprivate Ġval Ġfake Organ isation Id Ġ= ĠUUID . randomUUID () ĊĊĠ Ġ@ Transactional ( readOnly Ġ= Ġtrue ) ĊĠ Ġoverride Ġfun Ġget ApiKey Details ( e Id : ĠUUID , Ġservice Account Key : ĠString ): ĠD acha Key Details Response ? Ġ{ ĊĠĠĠ Ġval Ġsa Env Ġ= Ġfind Match ( ĊĠĠĠĠĠ Ġe Id , ĊĠĠĠĠĠ Ġservice Account Key ĊĠĠĠ Ġ). environment . parent Application . features . fetch ( ĊĠĠĠĠĠ ĠQ Db Application Feature . Alias . key , ĊĠĠĠĠĠ ĠQ Db Application Feature . Alias . id , ĊĠĠĠĠĠ ĠQ Db Application Feature . Alias . valueType , ĊĠĠĠ Ġ) ĊĠĠĠ Ġ. environment . environment Features . fetch ( ĊĠĠĠĠĠ ĠQ Db Feature Value . Alias . locked , ĊĠĠĠĠĠ ĠQ Db Feature Value . Alias . version , ĊĠĠĠĠĠ ĠQ Db Feature Value . Alias . rol lout Str ategies , ĊĠĠĠĠĠ ĠQ Db Feature Value . Alias . defaultValue , ĊĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ. findOne () ĊĊĠĠĠ Ġreturn Ġif Ġ( sa Env Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġval Ġfeature Values Ġ= Ġsa Env . environment . environment Features . map Ġ{ Ġit . feature . key Ġto Ġit Ġ}. toMap () ĊĠĠĠĠĠ Ġval Ġfeatures Ġ= Ġsa Env . environment . parent Application . features ĊĠĠĠĠĠ Ġval Ġresponse Ġ= ĠD acha Key Details Response () ĊĠĠĠĠĠĠĠ Ġ. service KeyId ( sa Env . service Account . id ) ĊĠĠĠĠĠĠĠ Ġ. application Id ( fake Application Id ) ĊĠĠĠĠĠĠĠ Ġ. portfolio Id ( fake Portfolio Id ) ĊĠĠĠĠĠĠĠ Ġ. organization Id ( fake Organ isation Id ) ĊĠĠĠĠĠĠĠ Ġ. features ( features . map Ġ{ Ġto Feature Value Cache Item ( e Id , Ġit , Ġfeature Values [ it . key ]) Ġ}) ĊĊĠĠĠĠĠ Ġresponse . etag Ġ= Ġcalculate E tag ( response ) ĊĠĠĠĠĠ Ġlog . trace (" etag Ġis Ġ{}", Ġresponse . etag ) ĊĊĠĠĠĠĠ Ġresponse ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġfind Match ( ĊĠĠĠ Ġe Id : ĠUUID , ĊĠĠĠ Ġservice Account Key : ĠString ĊĠ Ġ): ĠQ Db ServiceAccount Environment Ġ{ ĊĠĠĠ Ġval Ġq Ġ= ĠQ Db ServiceAccount Environment () ĊĠĠĠĠĠ Ġ. select ( Q Db ServiceAccount Environment . Alias . service Account . id ) ĊĠĠĠĠĠ Ġ. environment . id . eq ( e Id ) ĊĊĠĠĠ Ġreturn Ġif Ġ( service Account Key . contains ("* ")) Ġ{ ĊĠĠĠĠĠ Ġq . service Account . apiKey Client Eval . eq ( service Account Key ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġq . service Account . apiKey Server Eval . eq ( service Account Key ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġto Feature Value Cache Item ( env Id : ĠUUID , Ġfeature : ĠDb Application Feature , Ġfv : ĠDb Feature Value ?) Ġ: ĠFeature Value Cache Item Ġ= ĊĠĠĠ ĠFeature Value Cache Item () ĊĠĠĠĠĠ Ġ. environment Id ( env Id ) ĊĠĠĠĠĠ Ġ. feature ( Feature (). key ( feature . key ). id ( feature . id ). valueType ( feature . valueType )) ĊĠĠĠĠĠ Ġ. value ( if Ġ( fv Ġ== Ġnull ) Ġto Empty Feature Value ( feature ) Ġelse Ġto Feature Value ( fv ) Ġ) ĊĊĊĠ Ġprivate Ġfun Ġto Empty Feature Value ( feature : ĠDb Application Feature ): ĠFeature Value Ġ= ĊĠĠĠ ĠFeature Value () ĊĠĠĠĠĠ Ġ. key ( feature . key ) ĊĠĠĠĠĠ Ġ. id ( feature . id ) ĊĠĠĠĠĠ Ġ. version ( 0 ) ĊĠĠĠĠĠ Ġ. locked ( false ) ĊĊĠ Ġprivate Ġfun Ġto Feature ( db Feature : ĠDb Feature Value ) Ġ= ĊĠĠĠ ĠFeature (). key ( db Feature . feature . key ). id ( db Feature . feature . id ). valueType ( db Feature . feature . valueType ) ĊĊĠ Ġprivate Ġfun Ġto Feature Value ( db Feature : ĠDb Feature Value ): ĠFeature Value Ġ{ ĊĠĠĠ Ġval Ġfv Ġ= ĠFeature Value () ĊĠĠĠĠĠ Ġ. key ( db Feature . feature . key ) ĊĠĠĠĠĠ Ġ. locked ( db Feature . is Locked ) ĊĠĠĠĠĠ Ġ. version ( db Feature . version ) ĊĠĠĠĠĠ Ġ. id ( db Feature . id ) ĊĊĠĠĠ Ġ// Ġwe Ġhaven 't Ġimplemented Ġshared Ġrol lout Ġstrategies Ġso Ġdon 't Ġboth Ġto Ġinclude Ġthose ĊĠĠĠ Ġwhen Ġ( db Feature . feature . valueType ) Ġ{ ĊĠĠĠĠĠ ĠFeature ValueType . BOOLEAN Ġ-> Ġfv . value Boolean ( db Feature . defaultValue Ġ== Ġ" true ") ĊĠĠĠĠĠ ĠFeature ValueType . STRING Ġ-> Ġfv . value String ( db Feature . defaultValue ) ĊĠĠĠĠĠ ĠFeature ValueType . NUMBER Ġ-> Ġif Ġ( db Feature . defaultValue Ġ!= Ġnull ) Ġfv . value Number ( BigDecimal ( db Feature . defaultValue )) ĊĠĠĠĠĠ ĠFeature ValueType . JSON Ġ-> Ġfv . value Json ( db Feature . defaultValue ) ĊĠĠĠĠĠ Ġelse Ġ-> Ġfv . value String ( null ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġfv ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcalculate E tag ( details : ĠD acha Key Details Response ): ĠString Ġ{ ĊĠĠĠ Ġval Ġdet Ġ= ĊĠĠĠĠĠ Ġdetails ĊĠĠĠĠĠĠĠ Ġ. features !!. map Ġ{ Ġfv ci Ġ-> Ġfv ci . feature . id . toString () Ġ+ Ġ"-" Ġ+ Ġfv ci . value . version Ġ} ĊĠĠĠĠĠĠĠ Ġ. join ToString ("- ") ĊĠĠĠ Ġreturn ĠInteger . to HexString ( det . hashCode ()) ĊĠ Ġ} ĊĊĊĠ Ġ@ Transactional ( readOnly Ġ= Ġtrue ) ĊĠ Ġoverride Ġfun Ġget ApiKey Permissions ( ĊĠĠĠ Ġe Id : ĠUUID , ĊĠĠĠ Ġservice Account Key : ĠString , ĊĠĠĠ Ġfeature Key : ĠString ĊĠ Ġ): ĠD acha Permission Response ? Ġ{ ĊĠĠĠ Ġval Ġsa Ġ= ĠQ Db ServiceAccount Environment () ĊĠĠĠĠĠ Ġ. select ( ĊĠĠĠĠĠĠĠ ĠQ Db ServiceAccount Environment . Alias . service Account . id , ĊĠĠĠĠĠĠĠ ĠQ Db ServiceAccount Environment . Alias . permissions , ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ. environment . id . eq ( e Id ) ĊĊĠĠĠ Ġval Ġservice Account Ġ= Ġif Ġ( service Account Key . contains ("* ")) Ġ{ ĊĠĠĠĠĠ Ġsa . service Account . apiKey Client Eval . eq ( service Account Key ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġsa . service Account . apiKey Server Eval . eq ( service Account Key ) ĊĠĠĠ Ġ}. findOne () Ġ?: Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġq Ġ= ĠQ Db Feature Value () ĊĠĠĠĠĠ Ġ. select ( ĊĠĠĠĠĠĠĠ ĠQ Db Feature Value . Alias . locked , ĊĠĠĠĠĠĠĠ ĠQ Db Feature Value . Alias . version , ĊĠĠĠĠĠĠĠ ĠQ Db Feature Value . Alias . rol lout Str ategies , ĊĠĠĠĠĠĠĠ ĠQ Db Feature Value . Alias . defaultValue , ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ. environment . id . eq ( e Id ). feature . key . eq ( feature Key ). feature . fetch ( ĊĠĠĠĠĠĠĠ ĠQ Db Application Feature . Alias . key , ĊĠĠĠĠĠĠĠ ĠQ Db Application Feature . Alias . id , ĊĠĠĠĠĠĠĠ ĠQ Db Application Feature . Alias . valueType , ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġfound Ġ= Ġif Ġ( service Account Key . contains ("* ")) Ġ{ ĊĠĠĠĠĠ Ġq . environment . service Account Environments . eq ( service Account ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġq . environment . service Account Environments . eq ( service Account ) ĊĠĠĠ Ġ}. findOne () Ġ?: Ġreturn Ġnull ĊĊĠĠĠ Ġ// Ġit Ġwants Ġroles , Ġvalue Type , Ġkey , Ġlocked , Ġthe Ġfeature Ġvalue ĊĠĠĠ Ġreturn ĠD acha Permission Response () ĊĠĠĠĠĠ Ġ. feature ( ĊĠĠĠĠĠĠĠ ĠD acha Feature Value Item () ĊĠĠĠĠĠĠĠĠĠ Ġ. feature ( to Feature ( found )) ĊĠĠĠĠĠĠĠĠĠ Ġ. value ( to Feature Value ( found )) ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ. roles ( service Account . permissions ?. split (",") ?. filter Not Ġ{ Ġit . isEmpty () Ġ} ?. map Ġ{ ĠRole Type . valueOf ( it ) Ġ} Ġ?: ĠlistOf ()) ĊĠĠĠĠĠ Ġ. service KeyId ( service Account . service Account . id ) ĊĠĠĠĠĠ Ġ. application Id ( fake Application Id ) ĊĠĠĠĠĠ Ġ. portfolio Id ( fake Portfolio Id ) ĊĠĠĠĠĠ Ġ. organization Id ( fake Organ isation Id ) ĊĠ Ġ} Ċ } Ċ