Skip to content

Commit 4561b89

Browse files
committed
feat: report feature flags in /whoami
1 parent 8e39f41 commit 4561b89

File tree

4 files changed

+51
-1
lines changed

4 files changed

+51
-1
lines changed

src/backend/src/routers/whoami.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,10 @@ const WHOAMI_GET = eggspress('/whoami', {
6161

6262
// Get whoami values from other services
6363
const svc_whoami = req.services.get('whoami');
64-
const provider_details = await svc_whoami.get_details({ user: req.user });
64+
const provider_details = await svc_whoami.get_details({
65+
user: req.user,
66+
actor: actor,
67+
});
6568
Object.assign(details, provider_details);
6669

6770
if ( ! is_user ) {

src/backend/src/services/FeatureFlagService.js

+33
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,20 @@ const BaseService = require("./BaseService");
88
* are enabled or disabled for the current user.
99
*/
1010
class FeatureFlagService extends BaseService {
11+
_construct () {
12+
this.known_flags = new Map();
13+
}
14+
register (name, spec) {
15+
this.known_flags.set(name, spec);
16+
}
17+
async _init () {
18+
const svc_detailProvider = this.services.get('whoami');
19+
svc_detailProvider.register_provider(async (context, out) => {
20+
console.log(`\x1B[36;1mCALLED\x1B[0m`);
21+
if ( ! context.actor ) return;
22+
out.feature_flags = await this.get_summary(context.actor);
23+
});
24+
}
1125
async check (...a) {
1226
// allows binding call with multiple options objects;
1327
// the last argument is the permission to check
@@ -25,6 +39,9 @@ class FeatureFlagService extends BaseService {
2539
return { options, value };
2640
})();
2741

42+
if ( ! this.known_flags.has(permission) ) {
43+
this.known_flags.set(permission, true);
44+
}
2845

2946

3047
const actor = options.actor ?? Context.get('actor');
@@ -35,6 +52,22 @@ class FeatureFlagService extends BaseService {
3552
if ( l.length === 0 ) return false;
3653
return true;
3754
}
55+
56+
async get_summary (actor) {
57+
const summary = {};
58+
for ( const [key, value] of this.known_flags.entries() ) {
59+
if ( value.$ === 'config-flag' ) {
60+
summary[key] = value.value;
61+
continue;
62+
}
63+
const svc_permission = this.services.get('permission');
64+
const reading = await svc_permission.scan(actor, `feature:`);
65+
const l = PermissionUtil.reading_to_options(reading);
66+
summary[key] = l.length > 0;
67+
}
68+
69+
return summary;
70+
}
3871
}
3972

4073
module.exports = {

src/backend/src/services/ShareService.js

+7
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,13 @@ class ShareService extends BaseService {
3737

3838
async _init () {
3939
this.db = await this.services.get('database').get(DB_WRITE, 'share');
40+
41+
// registry "share" as a feature flag so gui is informed
42+
// about whether or not a user has access to this feature
43+
const svc_featureFlag = this.services.get('feature-flag');
44+
svc_featureFlag.register('share', {
45+
$: 'permission-flag'
46+
});
4047
}
4148

4249
['__on_install.routes'] (_, { app }) {

src/backend/src/services/auth/ACLService.js

+7
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@ const { AppUnderUserActorType, UserActorType, Actor, SystemActorType, AccessToke
2525
const { PermissionUtil } = require("./PermissionService");
2626

2727
class ACLService extends BaseService {
28+
async _init () {
29+
const svc_featureFlag = this.services.get('feature-flag');
30+
svc_featureFlag.register('public-folders', {
31+
$: 'config-flag',
32+
value: this.global_config.enable_public_folders ?? false,
33+
});
34+
}
2835
async check (actor, resource, mode) {
2936
const ld = (Context.get('logdent') ?? 0) + 1;
3037
return await Context.get().sub({ logdent: ld }).arun(async () => {

0 commit comments

Comments
 (0)