diff --git a/CHANGELOG.md b/CHANGELOG.md index 84d60f67..a64b9586 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Added + +- Extended the support for feature flags to simplify the initial project setup + ## 0.90.0 - 22.04.2021 ### Added diff --git a/apps/api/src/app/info/info.service.ts b/apps/api/src/app/info/info.service.ts index c0840780..171d0d50 100644 --- a/apps/api/src/app/info/info.service.ts +++ b/apps/api/src/app/info/info.service.ts @@ -26,7 +26,11 @@ export class InfoService { const globalPermissions: string[] = []; if (this.configurationService.get('ENABLE_FEATURE_SOCIAL_LOGIN')) { - globalPermissions.push(permissions.useSocialLogin); + globalPermissions.push(permissions.enableSocialLogin); + } + + if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { + globalPermissions.push(permissions.enableSubscription); } return { diff --git a/apps/api/src/services/configuration.service.ts b/apps/api/src/services/configuration.service.ts index 9ac011e5..6a5af44d 100644 --- a/apps/api/src/services/configuration.service.ts +++ b/apps/api/src/services/configuration.service.ts @@ -15,6 +15,7 @@ export class ConfigurationService { ENABLE_FEATURE_CUSTOM_SYMBOLS: bool({ default: false }), ENABLE_FEATURE_FEAR_AND_GREED_INDEX: bool({ default: false }), ENABLE_FEATURE_SOCIAL_LOGIN: bool({ default: false }), + ENABLE_FEATURE_SUBSCRIPTION: bool({ default: false }), GOOGLE_CLIENT_ID: str({ default: 'dummyClientId' }), GOOGLE_SECRET: str({ default: 'dummySecret' }), JWT_SECRET_KEY: str({}), diff --git a/apps/api/src/services/interfaces/environment.interface.ts b/apps/api/src/services/interfaces/environment.interface.ts index 264b2e41..ab73a0fe 100644 --- a/apps/api/src/services/interfaces/environment.interface.ts +++ b/apps/api/src/services/interfaces/environment.interface.ts @@ -7,6 +7,7 @@ export interface Environment extends CleanedEnvAccessors { ENABLE_FEATURE_CUSTOM_SYMBOLS: boolean; ENABLE_FEATURE_FEAR_AND_GREED_INDEX: boolean; ENABLE_FEATURE_SOCIAL_LOGIN: boolean; + ENABLE_FEATURE_SUBSCRIPTION: boolean; GOOGLE_CLIENT_ID: string; GOOGLE_SECRET: string; JWT_SECRET_KEY: string; diff --git a/apps/client/src/app/components/header/header.component.html b/apps/client/src/app/components/header/header.component.html index fb54d957..48050ccd 100644 --- a/apps/client/src/app/components/header/header.component.html +++ b/apps/client/src/app/components/header/header.component.html @@ -37,7 +37,7 @@ >Transactions Account (); @@ -49,15 +49,15 @@ export class HeaderComponent implements OnChanges { public ngOnChanges() { if (this.user) { - this.canAccessAdminAccessControl = hasPermission( + this.hasPermissionToAccessAdminControl = hasPermission( this.user.permissions, permissions.accessAdminControl ); } - this.hasPermissionToUseSocialLogin = hasPermission( + this.hasPermissionForSocialLogin = hasPermission( this.info?.globalPermissions, - permissions.useSocialLogin + permissions.enableSocialLogin ); } @@ -81,7 +81,7 @@ export class HeaderComponent implements OnChanges { autoFocus: false, data: { accessToken: '', - hasPermissionToUseSocialLogin: this.hasPermissionToUseSocialLogin + hasPermissionToUseSocialLogin: this.hasPermissionForSocialLogin }, width: '30rem' }); diff --git a/apps/client/src/app/pages/about/about-page.component.ts b/apps/client/src/app/pages/about/about-page.component.ts index 4a677a9e..a770ac0a 100644 --- a/apps/client/src/app/pages/about/about-page.component.ts +++ b/apps/client/src/app/pages/about/about-page.component.ts @@ -1,8 +1,9 @@ import { ChangeDetectorRef, Component, OnInit } from '@angular/core'; +import { InfoItem } from '@ghostfolio/api/app/info/interfaces/info-item.interface'; import { User } from '@ghostfolio/api/app/user/interfaces/user.interface'; import { DataService } from '@ghostfolio/client/services/data.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; -import { baseCurrency } from '@ghostfolio/helper'; +import { baseCurrency, hasPermission, permissions } from '@ghostfolio/helper'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; @@ -15,6 +16,7 @@ import { environment } from '../../../environments/environment'; }) export class AboutPageComponent implements OnInit { public baseCurrency = baseCurrency; + public hasPermissionForSubscription: boolean; public isLoggedIn: boolean; public lastPublish = environment.lastPublish; public user: User; @@ -35,6 +37,13 @@ export class AboutPageComponent implements OnInit { * Initializes the controller */ public ngOnInit() { + this.dataService.fetchInfo().subscribe((info) => { + this.hasPermissionForSubscription = hasPermission( + info.globalPermissions, + permissions.enableSubscription + ); + }); + this.isLoggedIn = !!this.tokenStorageService.getToken(); if (this.isLoggedIn) diff --git a/apps/client/src/app/pages/about/about-page.html b/apps/client/src/app/pages/about/about-page.html index 8929afa8..db80ba25 100644 --- a/apps/client/src/app/pages/about/about-page.html +++ b/apps/client/src/app/pages/about/about-page.html @@ -61,7 +61,7 @@ -
+

Pricing Plans

diff --git a/apps/client/src/app/pages/account/account-page.component.ts b/apps/client/src/app/pages/account/account-page.component.ts index 069e1004..e905973c 100644 --- a/apps/client/src/app/pages/account/account-page.component.ts +++ b/apps/client/src/app/pages/account/account-page.component.ts @@ -3,7 +3,11 @@ import { Access } from '@ghostfolio/api/app/access/interfaces/access.interface'; import { User } from '@ghostfolio/api/app/user/interfaces/user.interface'; import { DataService } from '@ghostfolio/client/services/data.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; -import { DEFAULT_DATE_FORMAT } from '@ghostfolio/helper'; +import { + DEFAULT_DATE_FORMAT, + hasPermission, + permissions +} from '@ghostfolio/helper'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; @@ -19,6 +23,7 @@ export class AccountPageComponent implements OnDestroy, OnInit { public baseCurrency: Currency; public currencies: Currency[] = []; public defaultDateFormat = DEFAULT_DATE_FORMAT; + public hasPermissionForSubscription: boolean; public user: User; private unsubscribeSubject = new Subject(); @@ -34,8 +39,13 @@ export class AccountPageComponent implements OnDestroy, OnInit { this.dataService .fetchInfo() .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe(({ currencies }) => { + .subscribe(({ currencies, globalPermissions }) => { this.currencies = currencies; + + this.hasPermissionForSubscription = hasPermission( + globalPermissions, + permissions.enableSubscription + ); }); this.tokenStorageService @@ -70,6 +80,11 @@ export class AccountPageComponent implements OnDestroy, OnInit { }); } + public ngOnDestroy() { + this.unsubscribeSubject.next(); + this.unsubscribeSubject.complete(); + } + private update() { this.dataService .fetchAccesses() @@ -80,9 +95,4 @@ export class AccountPageComponent implements OnDestroy, OnInit { this.cd.markForCheck(); }); } - - public ngOnDestroy() { - this.unsubscribeSubject.next(); - this.unsubscribeSubject.complete(); - } } diff --git a/apps/client/src/app/pages/account/account-page.html b/apps/client/src/app/pages/account/account-page.html index ffd2f73e..6b9792de 100644 --- a/apps/client/src/app/pages/account/account-page.html +++ b/apps/client/src/app/pages/account/account-page.html @@ -15,7 +15,7 @@
Alias
{{ user.alias }}
-
+
Membership
diff --git a/libs/helper/src/lib/permissions.ts b/libs/helper/src/lib/permissions.ts index 29a53414..99093aaf 100644 --- a/libs/helper/src/lib/permissions.ts +++ b/libs/helper/src/lib/permissions.ts @@ -10,10 +10,11 @@ export const permissions = { createAccount: 'createAccount', createOrder: 'createOrder', deleteOrder: 'deleteOrder', + enableSocialLogin: 'enableSocialLogin', + enableSubscription: 'enableSubscription', readForeignPortfolio: 'readForeignPortfolio', updateOrder: 'updateOrder', - updateUserSettings: 'updateUserSettings', - useSocialLogin: 'useSocialLogin' + updateUserSettings: 'updateUserSettings' }; export function hasPermission(