Fixed feature flag handling #393
This commit is contained in:
		@@ -4,7 +4,7 @@
 | 
			
		||||
    "Version": {
 | 
			
		||||
      "Major": "1",
 | 
			
		||||
      "Minor": "1",
 | 
			
		||||
      "Micro": "9"
 | 
			
		||||
      "Micro": "10"
 | 
			
		||||
    },
 | 
			
		||||
    "Author": "Sven Heidemann",
 | 
			
		||||
    "AuthorEmail": "sven.heidemann@sh-edraft.de",
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
    "Version": {
 | 
			
		||||
      "Major": "1",
 | 
			
		||||
      "Minor": "1",
 | 
			
		||||
      "Micro": "9"
 | 
			
		||||
      "Micro": "10"
 | 
			
		||||
    },
 | 
			
		||||
    "Author": "",
 | 
			
		||||
    "AuthorEmail": "",
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
    "Version": {
 | 
			
		||||
      "Major": "1",
 | 
			
		||||
      "Minor": "1",
 | 
			
		||||
      "Micro": "9"
 | 
			
		||||
      "Micro": "10"
 | 
			
		||||
    },
 | 
			
		||||
    "Author": "Sven Heidemann",
 | 
			
		||||
    "AuthorEmail": "sven.heidemann@sh-edraft.de",
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,7 @@ class FeatureFlagsSettings(ConfigurationModelABC):
 | 
			
		||||
        FeatureFlagsEnum.game_server.value: False,  # 25.09.2023 #366
 | 
			
		||||
        FeatureFlagsEnum.sync_xp.value: False,  # 25.09.2023 #366
 | 
			
		||||
        FeatureFlagsEnum.short_role_name.value: False,  # 28.09.2023 #378
 | 
			
		||||
        FeatureFlagsEnum.technician_full_access.value: False,  # 28.09.2023 #393
 | 
			
		||||
        FeatureFlagsEnum.technician_full_access.value: False,  # 03.10.2023 #393
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    def __init__(self, **kwargs: dict):
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,6 @@ from bot_data.abc.technician_config_repository_abc import TechnicianConfigReposi
 | 
			
		||||
from bot_data.model.server import Server
 | 
			
		||||
from bot_data.model.technician_config import TechnicianConfig
 | 
			
		||||
from bot_data.service.server_config_seeder import ServerConfigSeeder
 | 
			
		||||
from bot_data.service.technician_config_seeder import TechnicianConfigSeeder
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ConfigService:
 | 
			
		||||
@@ -17,7 +16,6 @@ class ConfigService:
 | 
			
		||||
        services: ServiceProviderABC,
 | 
			
		||||
        technician_config_repo: TechnicianConfigRepositoryABC,
 | 
			
		||||
        server_config_repo: ServerConfigRepositoryABC,
 | 
			
		||||
        tech_seeder: TechnicianConfigSeeder,
 | 
			
		||||
        server_seeder: ServerConfigSeeder,
 | 
			
		||||
    ):
 | 
			
		||||
        self._config = config
 | 
			
		||||
@@ -25,13 +23,9 @@ class ConfigService:
 | 
			
		||||
        self._technician_config_repo = technician_config_repo
 | 
			
		||||
        self._server_config_repo = server_config_repo
 | 
			
		||||
 | 
			
		||||
        self._tech_seeder = tech_seeder
 | 
			
		||||
        self._server_seeder = server_seeder
 | 
			
		||||
 | 
			
		||||
    async def reload_technician_config(self):
 | 
			
		||||
        if not self._technician_config_repo.does_technician_config_exists():
 | 
			
		||||
            await self._tech_seeder.seed()
 | 
			
		||||
 | 
			
		||||
    def reload_technician_config(self):
 | 
			
		||||
        technician_config = self._technician_config_repo.get_technician_config()
 | 
			
		||||
        self._config.add_configuration(TechnicianConfig, technician_config)
 | 
			
		||||
        self._config.add_configuration(FeatureFlagsSettings, FeatureFlagsSettings(**technician_config.feature_flags))
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
    "Version": {
 | 
			
		||||
      "Major": "1",
 | 
			
		||||
      "Minor": "1",
 | 
			
		||||
      "Micro": "9"
 | 
			
		||||
      "Micro": "10"
 | 
			
		||||
    },
 | 
			
		||||
    "Author": "Sven Heidemann",
 | 
			
		||||
    "AuthorEmail": "sven.heidemann@sh-edraft.de",
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
    "Version": {
 | 
			
		||||
      "Major": "1",
 | 
			
		||||
      "Minor": "1",
 | 
			
		||||
      "Micro": "9"
 | 
			
		||||
      "Micro": "10"
 | 
			
		||||
    },
 | 
			
		||||
    "Author": "Sven Heidemann",
 | 
			
		||||
    "AuthorEmail": "sven.heidemann@sh-edraft.de",
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,7 @@ from bot_data.model.technician_config import TechnicianConfig
 | 
			
		||||
from bot_data.model.technician_id_config import TechnicianIdConfig
 | 
			
		||||
from bot_data.model.technician_ping_url_config import TechnicianPingUrlConfig
 | 
			
		||||
from bot_data.model.user_role_enum import UserRoleEnum
 | 
			
		||||
from bot_data.service.technician_config_seeder import TechnicianConfigSeeder
 | 
			
		||||
from bot_graphql.abc.query_abc import QueryABC
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -23,6 +24,7 @@ class TechnicianConfigMutation(QueryABC):
 | 
			
		||||
        technician_configs: TechnicianConfigRepositoryABC,
 | 
			
		||||
        db: DatabaseContextABC,
 | 
			
		||||
        config_service: ConfigService,
 | 
			
		||||
        tech_seeder: TechnicianConfigSeeder,
 | 
			
		||||
    ):
 | 
			
		||||
        QueryABC.__init__(self, "TechnicianConfigMutation")
 | 
			
		||||
 | 
			
		||||
@@ -32,10 +34,14 @@ class TechnicianConfigMutation(QueryABC):
 | 
			
		||||
        self._technician_configs = technician_configs
 | 
			
		||||
        self._db = db
 | 
			
		||||
        self._config_service = config_service
 | 
			
		||||
        self._tech_seeder = tech_seeder
 | 
			
		||||
 | 
			
		||||
        self.set_field("updateTechnicianConfig", self.resolve_update_technician_config)
 | 
			
		||||
 | 
			
		||||
    def resolve_update_technician_config(self, *_, input: dict):
 | 
			
		||||
        if not self._technician_configs.does_technician_config_exists():
 | 
			
		||||
            self._bot.loop.create_task(self._tech_seeder.seed())
 | 
			
		||||
 | 
			
		||||
        technician_config = self._technician_configs.get_technician_config()
 | 
			
		||||
        self._can_user_mutate_data(Route.get_user().users[0].server, UserRoleEnum.technician)
 | 
			
		||||
 | 
			
		||||
@@ -53,11 +59,16 @@ class TechnicianConfigMutation(QueryABC):
 | 
			
		||||
        technician_config.cache_max_messages = (
 | 
			
		||||
            input["cacheMaxMessages"] if "cacheMaxMessages" in input else technician_config.cache_max_messages
 | 
			
		||||
        )
 | 
			
		||||
        old_feature_flags = technician_config.feature_flags
 | 
			
		||||
        technician_config.feature_flags = (
 | 
			
		||||
            dict(zip([x["key"] for x in input["featureFlags"]], [x["value"] for x in input["featureFlags"]]))
 | 
			
		||||
            if "featureFlags" in input
 | 
			
		||||
            else technician_config.feature_flags
 | 
			
		||||
        )
 | 
			
		||||
        for old_flag in old_feature_flags:
 | 
			
		||||
            if old_flag not in technician_config.feature_flags:
 | 
			
		||||
                technician_config.feature_flags[old_flag] = False
 | 
			
		||||
 | 
			
		||||
        technician_config.ping_urls = (
 | 
			
		||||
            List(str, input["pingURLs"]) if "pingURLs" in input else technician_config.ping_urls
 | 
			
		||||
        )
 | 
			
		||||
@@ -75,6 +86,7 @@ class TechnicianConfigMutation(QueryABC):
 | 
			
		||||
            self._update_technician_ids(technician_config)
 | 
			
		||||
 | 
			
		||||
        self._db.save_changes()
 | 
			
		||||
        self._config_service.reload_technician_config()
 | 
			
		||||
        return technician_config
 | 
			
		||||
 | 
			
		||||
    def _update_ping_urls(self, new_config: TechnicianConfig):
 | 
			
		||||
@@ -109,5 +121,3 @@ class TechnicianConfigMutation(QueryABC):
 | 
			
		||||
                continue
 | 
			
		||||
 | 
			
		||||
            self._technician_configs.add_technician_id_config(TechnicianIdConfig(technician_id))
 | 
			
		||||
 | 
			
		||||
        self._bot.loop.create_task(self._config_service.reload_technician_config())
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
    "Version": {
 | 
			
		||||
      "Major": "1",
 | 
			
		||||
      "Minor": "1",
 | 
			
		||||
      "Micro": "9"
 | 
			
		||||
      "Micro": "10"
 | 
			
		||||
    },
 | 
			
		||||
    "Author": "Sven Heidemann",
 | 
			
		||||
    "AuthorEmail": "sven.heidemann@sh-edraft.de",
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
    "Version": {
 | 
			
		||||
      "Major": "1",
 | 
			
		||||
      "Minor": "1",
 | 
			
		||||
      "Micro": "9"
 | 
			
		||||
      "Micro": "10"
 | 
			
		||||
    },
 | 
			
		||||
    "Author": "",
 | 
			
		||||
    "AuthorEmail": "",
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
    "Version": {
 | 
			
		||||
      "Major": "1",
 | 
			
		||||
      "Minor": "1",
 | 
			
		||||
      "Micro": "9"
 | 
			
		||||
      "Micro": "10"
 | 
			
		||||
    },
 | 
			
		||||
    "Author": "",
 | 
			
		||||
    "AuthorEmail": "",
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
    "Version": {
 | 
			
		||||
      "Major": "1",
 | 
			
		||||
      "Minor": "1",
 | 
			
		||||
      "Micro": "9"
 | 
			
		||||
      "Micro": "10"
 | 
			
		||||
    },
 | 
			
		||||
    "Author": "",
 | 
			
		||||
    "AuthorEmail": "",
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
    "Version": {
 | 
			
		||||
      "Major": "1",
 | 
			
		||||
      "Minor": "1",
 | 
			
		||||
      "Micro": "9"
 | 
			
		||||
      "Micro": "10"
 | 
			
		||||
    },
 | 
			
		||||
    "Author": "",
 | 
			
		||||
    "AuthorEmail": "",
 | 
			
		||||
 
 | 
			
		||||
@@ -19,4 +19,4 @@ class ConfigExtension(ApplicationExtensionABC):
 | 
			
		||||
        logger: LoggerABC = services.get_service(LoggerABC)
 | 
			
		||||
        logger.debug(__name__, "Config extension started")
 | 
			
		||||
        config: ConfigService = services.get_service(ConfigService)
 | 
			
		||||
        await config.reload_technician_config()
 | 
			
		||||
        config.reload_technician_config()
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
    "Version": {
 | 
			
		||||
      "Major": "1",
 | 
			
		||||
      "Minor": "1",
 | 
			
		||||
      "Micro": "9"
 | 
			
		||||
      "Micro": "10"
 | 
			
		||||
    },
 | 
			
		||||
    "Author": "Sven Heidemann",
 | 
			
		||||
    "AuthorEmail": "sven.heidemann@sh-edraft.de",
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
    "Version": {
 | 
			
		||||
      "Major": "1",
 | 
			
		||||
      "Minor": "1",
 | 
			
		||||
      "Micro": "9"
 | 
			
		||||
      "Micro": "10"
 | 
			
		||||
    },
 | 
			
		||||
    "Author": "",
 | 
			
		||||
    "AuthorEmail": "",
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
    "Version": {
 | 
			
		||||
      "Major": "1",
 | 
			
		||||
      "Minor": "1",
 | 
			
		||||
      "Micro": "9"
 | 
			
		||||
      "Micro": "10"
 | 
			
		||||
    },
 | 
			
		||||
    "Author": "",
 | 
			
		||||
    "AuthorEmail": "",
 | 
			
		||||
 
 | 
			
		||||
@@ -29,10 +29,11 @@ class PermissionService(PermissionServiceABC):
 | 
			
		||||
        self._technician_configs = technician_configs
 | 
			
		||||
 | 
			
		||||
    def _has_member_role(self, member: discord.Member, team_member_type: TeamMemberTypeEnum) -> bool:
 | 
			
		||||
        self._logger.debug(__name__, f"Checking permissions for {member.name}")
 | 
			
		||||
        if member is None or member.guild is None:
 | 
			
		||||
            return False
 | 
			
		||||
 | 
			
		||||
        self._logger.debug(__name__, f"Checking is member {member.name} {team_member_type.value}")
 | 
			
		||||
 | 
			
		||||
        try:
 | 
			
		||||
            server = self._servers.get_server_by_discord_id(member.guild.id)
 | 
			
		||||
            config = self._server_configs.get_server_config_by_server(server.id)
 | 
			
		||||
@@ -58,10 +59,11 @@ class PermissionService(PermissionServiceABC):
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    def is_member_technician(self, member: discord.Member) -> bool:
 | 
			
		||||
        self._logger.debug(__name__, f"Checking is member {member.name} technician")
 | 
			
		||||
        if member is None or member.guild is None:
 | 
			
		||||
            return False
 | 
			
		||||
 | 
			
		||||
        self._logger.debug(__name__, f"Checking is member {member.name} technician")
 | 
			
		||||
 | 
			
		||||
        try:
 | 
			
		||||
            tech_config = self._technician_configs.get_technician_config()
 | 
			
		||||
            if member.id in tech_config.technician_ids:
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
    "Version": {
 | 
			
		||||
      "Major": "1",
 | 
			
		||||
      "Minor": "1",
 | 
			
		||||
      "Micro": "9"
 | 
			
		||||
      "Micro": "10"
 | 
			
		||||
    },
 | 
			
		||||
    "Author": "",
 | 
			
		||||
    "AuthorEmail": "",
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
    "Version": {
 | 
			
		||||
      "Major": "1",
 | 
			
		||||
      "Minor": "1",
 | 
			
		||||
      "Micro": "9"
 | 
			
		||||
      "Micro": "10"
 | 
			
		||||
    },
 | 
			
		||||
    "Author": "Sven Heidemann",
 | 
			
		||||
    "AuthorEmail": "sven.heidemann@sh-edraft.de",
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
    "Version": {
 | 
			
		||||
      "Major": "1",
 | 
			
		||||
      "Minor": "1",
 | 
			
		||||
      "Micro": "9"
 | 
			
		||||
      "Micro": "10"
 | 
			
		||||
    },
 | 
			
		||||
    "Author": "Sven Heidemann",
 | 
			
		||||
    "AuthorEmail": "sven.heidemann@sh-edraft.de",
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
    "Version": {
 | 
			
		||||
      "Major": "1",
 | 
			
		||||
      "Minor": "1",
 | 
			
		||||
      "Micro": "9"
 | 
			
		||||
      "Micro": "10"
 | 
			
		||||
    },
 | 
			
		||||
    "Author": "Sven Heidemann",
 | 
			
		||||
    "AuthorEmail": "sven.heidemann@sh-edraft.de",
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
    "Version": {
 | 
			
		||||
      "Major": "1",
 | 
			
		||||
      "Minor": "1",
 | 
			
		||||
      "Micro": "9"
 | 
			
		||||
      "Micro": "10"
 | 
			
		||||
    },
 | 
			
		||||
    "Author": "Sven Heidemann",
 | 
			
		||||
    "AuthorEmail": "sven.heidemann@sh-edraft.de",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "kdb-web",
 | 
			
		||||
    "version": "1.1.9",
 | 
			
		||||
    "version": "1.1.10",
 | 
			
		||||
    "scripts": {
 | 
			
		||||
        "ng": "ng",
 | 
			
		||||
        "update-version": "ts-node update-version.ts",
 | 
			
		||||
 
 | 
			
		||||
@@ -34,11 +34,11 @@ export class AuthGuard implements CanActivate {
 | 
			
		||||
 | 
			
		||||
    const role = route.data["role"];
 | 
			
		||||
    const memberRole = route.data["memberRole"];
 | 
			
		||||
    const authUser = await this.authService.getLoggedInUser();
 | 
			
		||||
    const isTechnician = (authUser?.users?.map(u => u.isTechnician).filter(u => u) ?? []).length > 0;
 | 
			
		||||
 | 
			
		||||
    if (role !== undefined) {
 | 
			
		||||
      this.authService.hasUserPermission(role).then(async hasPermission => {
 | 
			
		||||
        let authUser = await this.authService.getLoggedInUser();
 | 
			
		||||
        let isTechnician = authUser?.users?.map(u => u.isTechnician).filter(u => u) ?? [];
 | 
			
		||||
 | 
			
		||||
        if (!hasPermission && !isTechnician) {
 | 
			
		||||
          this.router.navigate(["/dashboard"]);
 | 
			
		||||
          return false;
 | 
			
		||||
@@ -49,12 +49,15 @@ export class AuthGuard implements CanActivate {
 | 
			
		||||
 | 
			
		||||
    if (memberRole !== undefined) {
 | 
			
		||||
      let userHasAccess = false;
 | 
			
		||||
      let authUser = await this.authService.getLoggedInUser();
 | 
			
		||||
      let server = route.params["serverId"];
 | 
			
		||||
 | 
			
		||||
      if (!authUser || !authUser.users) {
 | 
			
		||||
      if (this.sidebarService.hasFeature("TechnicianFullAccess") && isTechnician) {
 | 
			
		||||
        return true;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (!authUser || !authUser.users) {
 | 
			
		||||
        return false;
 | 
			
		||||
      }
 | 
			
		||||
      authUser?.users?.forEach(u => {
 | 
			
		||||
        if (u.server === +(server ?? 0)) {
 | 
			
		||||
          if (
 | 
			
		||||
 
 | 
			
		||||
@@ -15,216 +15,218 @@ import { DataService } from "../data/data.service";
 | 
			
		||||
import { FeatureFlag } from "../../models/config/feature-flags.model";
 | 
			
		||||
 | 
			
		||||
@Injectable({
 | 
			
		||||
    providedIn: "root"
 | 
			
		||||
  providedIn: "root"
 | 
			
		||||
})
 | 
			
		||||
export class SidebarService {
 | 
			
		||||
 | 
			
		||||
    isSidebarOpen: boolean = true;
 | 
			
		||||
    menuItems$ = new BehaviorSubject<MenuItem[]>(new Array<MenuItem>());
 | 
			
		||||
    server!: Server | undefined;
 | 
			
		||||
  isSidebarOpen: boolean = true;
 | 
			
		||||
  menuItems$ = new BehaviorSubject<MenuItem[]>(new Array<MenuItem>());
 | 
			
		||||
  server!: Server | undefined;
 | 
			
		||||
 | 
			
		||||
    dashboard: MenuItem = {};
 | 
			
		||||
    serverDashboard: MenuItem = {};
 | 
			
		||||
    serverProfile: MenuItem = {};
 | 
			
		||||
    serverMembers: MenuItem = {};
 | 
			
		||||
    serverAutoRoles: MenuItem = {};
 | 
			
		||||
    serverLevels: MenuItem = {};
 | 
			
		||||
    serverAchievements: MenuItem = {};
 | 
			
		||||
    serverShortRoleNames: MenuItem = {};
 | 
			
		||||
    serverConfig: MenuItem = {};
 | 
			
		||||
    serverMenu: MenuItem = {};
 | 
			
		||||
    adminConfig: MenuItem = {};
 | 
			
		||||
    adminUsers: MenuItem = {};
 | 
			
		||||
    adminMenu: MenuItem = {};
 | 
			
		||||
  dashboard: MenuItem = {};
 | 
			
		||||
  serverDashboard: MenuItem = {};
 | 
			
		||||
  serverProfile: MenuItem = {};
 | 
			
		||||
  serverMembers: MenuItem = {};
 | 
			
		||||
  serverAutoRoles: MenuItem = {};
 | 
			
		||||
  serverLevels: MenuItem = {};
 | 
			
		||||
  serverAchievements: MenuItem = {};
 | 
			
		||||
  serverShortRoleNames: MenuItem = {};
 | 
			
		||||
  serverConfig: MenuItem = {};
 | 
			
		||||
  serverMenu: MenuItem = {};
 | 
			
		||||
  adminConfig: MenuItem = {};
 | 
			
		||||
  adminUsers: MenuItem = {};
 | 
			
		||||
  adminMenu: MenuItem = {};
 | 
			
		||||
 | 
			
		||||
    featureFlags: FeatureFlag[] = [];
 | 
			
		||||
  featureFlags: FeatureFlag[] = [];
 | 
			
		||||
 | 
			
		||||
    constructor(
 | 
			
		||||
        private themeService: ThemeService,
 | 
			
		||||
        private authService: AuthService,
 | 
			
		||||
        private translateService: TranslateService,
 | 
			
		||||
        private router: Router,
 | 
			
		||||
        private serverService: ServerService,
 | 
			
		||||
        private data: DataService
 | 
			
		||||
    ) {
 | 
			
		||||
        this.themeService.isSidebarOpen$.subscribe(value => {
 | 
			
		||||
            this.isSidebarOpen = value;
 | 
			
		||||
            this.setMenu(true);
 | 
			
		||||
  constructor(
 | 
			
		||||
    private themeService: ThemeService,
 | 
			
		||||
    private authService: AuthService,
 | 
			
		||||
    private translateService: TranslateService,
 | 
			
		||||
    private router: Router,
 | 
			
		||||
    private serverService: ServerService,
 | 
			
		||||
    private data: DataService
 | 
			
		||||
  ) {
 | 
			
		||||
    this.themeService.isSidebarOpen$.subscribe(value => {
 | 
			
		||||
      this.isSidebarOpen = value;
 | 
			
		||||
      this.setMenu(true);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    this.translateService.onLangChange.subscribe(_ => {
 | 
			
		||||
      this.setMenu(true);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    this.serverService.server$.subscribe(server => {
 | 
			
		||||
      this.server = server;
 | 
			
		||||
      if (server) {
 | 
			
		||||
        this.setMenu(true);
 | 
			
		||||
      } else {
 | 
			
		||||
        this.setMenu(false);
 | 
			
		||||
      }
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async buildMenu(user: UserDTO | null, hasPermission: boolean, isTechnician: boolean = false) {
 | 
			
		||||
    this.dashboard = {
 | 
			
		||||
      label: this.isSidebarOpen ? this.translateService.instant("sidebar.dashboard") : "",
 | 
			
		||||
      icon: "pi pi-th-large",
 | 
			
		||||
      routerLink: "dashboard"
 | 
			
		||||
    };
 | 
			
		||||
    this.serverDashboard = {
 | 
			
		||||
      label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.dashboard") : "",
 | 
			
		||||
      icon: "pi pi-th-large",
 | 
			
		||||
      routerLink: `server/${this.server?.id}`
 | 
			
		||||
    };
 | 
			
		||||
    this.serverProfile = {
 | 
			
		||||
      label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.profile") : "",
 | 
			
		||||
      icon: "pi pi-id-card",
 | 
			
		||||
      routerLink: `server/${this.server?.id}/members/${user?.id}`
 | 
			
		||||
    };
 | 
			
		||||
    this.serverMembers = {
 | 
			
		||||
      label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.members") : "",
 | 
			
		||||
      icon: "pi pi-users",
 | 
			
		||||
      visible: true,
 | 
			
		||||
      routerLink: `server/${this.server?.id}/members`
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    this.serverAutoRoles = {
 | 
			
		||||
      label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.auto_roles") : "",
 | 
			
		||||
      icon: "pi pi-sitemap",
 | 
			
		||||
      visible: true,
 | 
			
		||||
      routerLink: `server/${this.server?.id}/auto-roles`
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    this.serverLevels = {
 | 
			
		||||
      label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.levels") : "",
 | 
			
		||||
      icon: "pi pi-book",
 | 
			
		||||
      visible: true,
 | 
			
		||||
      routerLink: `server/${this.server?.id}/levels`
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    this.serverAchievements = {
 | 
			
		||||
      label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.achievements") : "",
 | 
			
		||||
      icon: "pi pi-angle-double-up",
 | 
			
		||||
      visible: true,
 | 
			
		||||
      routerLink: `server/${this.server?.id}/achievements`
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    this.serverShortRoleNames = {
 | 
			
		||||
      label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.short_role_names") : "",
 | 
			
		||||
      icon: "pi pi-list",
 | 
			
		||||
      visible: true,
 | 
			
		||||
      routerLink: `server/${this.server?.id}/short-role-names`
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    this.serverConfig = {
 | 
			
		||||
      label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.configuration") : "",
 | 
			
		||||
      icon: "pi pi-cog",
 | 
			
		||||
      visible: true,
 | 
			
		||||
      routerLink: `server/${this.server?.id}/config`
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    this.serverMenu = {
 | 
			
		||||
      label: this.isSidebarOpen ? this.server?.name : "",
 | 
			
		||||
      icon: "pi pi-server",
 | 
			
		||||
      visible: false,
 | 
			
		||||
      expanded: true,
 | 
			
		||||
      items: [this.serverDashboard, this.serverProfile, this.serverMembers, this.serverAutoRoles, this.serverLevels, this.serverAchievements, this.serverShortRoleNames, this.serverConfig]
 | 
			
		||||
    };
 | 
			
		||||
    this.adminConfig = {
 | 
			
		||||
      label: this.isSidebarOpen ? this.translateService.instant("sidebar.config") : "",
 | 
			
		||||
      visible: hasPermission || isTechnician,
 | 
			
		||||
      icon: "pi pi-cog",
 | 
			
		||||
      routerLink: "/admin/settings"
 | 
			
		||||
    };
 | 
			
		||||
    this.adminUsers = {
 | 
			
		||||
      label: this.isSidebarOpen ? this.translateService.instant("sidebar.auth_user_list") : "",
 | 
			
		||||
      visible: hasPermission,
 | 
			
		||||
      icon: "pi pi-user-edit",
 | 
			
		||||
      routerLink: "/admin/users"
 | 
			
		||||
    };
 | 
			
		||||
    this.adminMenu = {
 | 
			
		||||
      label: this.isSidebarOpen ? this.translateService.instant("sidebar.administration") : "",
 | 
			
		||||
      icon: "pi pi-cog",
 | 
			
		||||
      visible: hasPermission || isTechnician,
 | 
			
		||||
      expanded: true,
 | 
			
		||||
      items: [this.adminConfig, this.adminUsers]
 | 
			
		||||
    };
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  setMenu(build: boolean = false) {
 | 
			
		||||
    const server = this.server;
 | 
			
		||||
 | 
			
		||||
    if (server) {
 | 
			
		||||
      this.featureFlags = [];
 | 
			
		||||
      this.data.query<PossibleFeatureFlagsQuery>("{possibleFeatureFlags}"
 | 
			
		||||
      ).subscribe(data => {
 | 
			
		||||
        let observables: Observable<HasServerFeatureFlagQuery>[] = [];
 | 
			
		||||
        data.possibleFeatureFlags.forEach(flag => {
 | 
			
		||||
          observables.push(
 | 
			
		||||
            this.data.query<HasServerFeatureFlagQuery>(Queries.hasServerFeatureFlag, {
 | 
			
		||||
                filter: { id: server.id },
 | 
			
		||||
                flag: flag
 | 
			
		||||
              },
 | 
			
		||||
              function(data: Query) {
 | 
			
		||||
                return data.servers[0];
 | 
			
		||||
              }
 | 
			
		||||
            )
 | 
			
		||||
          );
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this.translateService.onLangChange.subscribe(_ => {
 | 
			
		||||
            this.setMenu(true);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this.serverService.server$.subscribe(server => {
 | 
			
		||||
            this.server = server;
 | 
			
		||||
            if (server) {
 | 
			
		||||
                this.setMenu(true);
 | 
			
		||||
            } else {
 | 
			
		||||
                this.setMenu(false);
 | 
			
		||||
        forkJoin(observables).subscribe(data => {
 | 
			
		||||
          data.forEach(flag => {
 | 
			
		||||
            if (!flag.hasFeatureFlag.value) {
 | 
			
		||||
              return;
 | 
			
		||||
            }
 | 
			
		||||
            this.featureFlags.push(flag.hasFeatureFlag);
 | 
			
		||||
          });
 | 
			
		||||
          this._setMenu(build);
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
    } else {
 | 
			
		||||
      this._setMenu(build);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
    async buildMenu(user: UserDTO | null, hasPermission: boolean, isTechnician: boolean = false) {
 | 
			
		||||
        this.dashboard = {
 | 
			
		||||
            label: this.isSidebarOpen ? this.translateService.instant("sidebar.dashboard") : "",
 | 
			
		||||
            icon: "pi pi-th-large",
 | 
			
		||||
            routerLink: "dashboard"
 | 
			
		||||
        };
 | 
			
		||||
        this.serverDashboard = {
 | 
			
		||||
            label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.dashboard") : "",
 | 
			
		||||
            icon: "pi pi-th-large",
 | 
			
		||||
            routerLink: `server/${this.server?.id}`
 | 
			
		||||
        };
 | 
			
		||||
        this.serverProfile = {
 | 
			
		||||
            label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.profile") : "",
 | 
			
		||||
            icon: "pi pi-id-card",
 | 
			
		||||
            routerLink: `server/${this.server?.id}/members/${user?.id}`
 | 
			
		||||
        };
 | 
			
		||||
        this.serverMembers = {
 | 
			
		||||
            label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.members") : "",
 | 
			
		||||
            icon: "pi pi-users",
 | 
			
		||||
            visible: true,
 | 
			
		||||
            routerLink: `server/${this.server?.id}/members`
 | 
			
		||||
        };
 | 
			
		||||
  private _setMenu(build: boolean = false) {
 | 
			
		||||
    this.authService.hasUserPermission(AuthRoles.Admin).then(async hasPermission => {
 | 
			
		||||
      let authUser = await this.authService.getLoggedInUser();
 | 
			
		||||
      let user: UserDTO | null = authUser?.users?.find(u => u.server == this.server?.id) ?? null;
 | 
			
		||||
      let isTechnician = (authUser?.users?.map(u => u.isTechnician).filter(u => u) ?? []).length > 0;
 | 
			
		||||
      let isTechnicianAndFullAccessActive = this.hasFeature("TechnicianFullAccess") && isTechnician;
 | 
			
		||||
      console.log(this.hasFeature("TechnicianFullAccess"))
 | 
			
		||||
 | 
			
		||||
        this.serverAutoRoles = {
 | 
			
		||||
            label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.auto_roles") : "",
 | 
			
		||||
            icon: "pi pi-sitemap",
 | 
			
		||||
            visible: true,
 | 
			
		||||
            routerLink: `server/${this.server?.id}/auto-roles`
 | 
			
		||||
        };
 | 
			
		||||
      if (build || this.menuItems$.value.length == 0) {
 | 
			
		||||
        await this.buildMenu(user, hasPermission, isTechnician);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
        this.serverLevels = {
 | 
			
		||||
            label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.levels") : "",
 | 
			
		||||
            icon: "pi pi-book",
 | 
			
		||||
            visible: true,
 | 
			
		||||
            routerLink: `server/${this.server?.id}/levels`
 | 
			
		||||
        };
 | 
			
		||||
      if (this.server) {
 | 
			
		||||
        this.serverMenu.visible = true;
 | 
			
		||||
        this.serverMembers.visible = isTechnicianAndFullAccessActive || user?.isModerator;
 | 
			
		||||
        this.serverAutoRoles.visible = isTechnicianAndFullAccessActive || this.hasFeature("AutoRoleModule") && user?.isModerator;
 | 
			
		||||
        this.serverLevels.visible = isTechnicianAndFullAccessActive || this.hasFeature("LevelModule") && user?.isModerator;
 | 
			
		||||
        this.serverAchievements.visible = isTechnicianAndFullAccessActive || this.hasFeature("AchievementsModule") && user?.isModerator;
 | 
			
		||||
        this.serverShortRoleNames.visible = isTechnicianAndFullAccessActive || this.hasFeature("ShortRoleName") && user?.isAdmin;
 | 
			
		||||
 | 
			
		||||
        this.serverAchievements = {
 | 
			
		||||
            label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.achievements") : "",
 | 
			
		||||
            icon: "pi pi-angle-double-up",
 | 
			
		||||
            visible: true,
 | 
			
		||||
            routerLink: `server/${this.server?.id}/achievements`
 | 
			
		||||
        };
 | 
			
		||||
        this.serverConfig.visible = isTechnicianAndFullAccessActive || user?.isAdmin;
 | 
			
		||||
      } else {
 | 
			
		||||
        this.serverMenu.visible = false;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
        this.serverShortRoleNames = {
 | 
			
		||||
            label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.short_role_names") : "",
 | 
			
		||||
            icon: "pi pi-list",
 | 
			
		||||
            visible: true,
 | 
			
		||||
            routerLink: `server/${this.server?.id}/short-role-names`
 | 
			
		||||
        };
 | 
			
		||||
      let menuItems: MenuItem[] = [
 | 
			
		||||
        this.dashboard,
 | 
			
		||||
        this.serverMenu,
 | 
			
		||||
        this.adminMenu
 | 
			
		||||
      ];
 | 
			
		||||
      this.menuItems$.next(menuItems);
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
        this.serverConfig = {
 | 
			
		||||
            label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.configuration") : "",
 | 
			
		||||
            icon: "pi pi-cog",
 | 
			
		||||
            visible: true,
 | 
			
		||||
            routerLink: `server/${this.server?.id}/config`
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        this.serverMenu = {
 | 
			
		||||
            label: this.isSidebarOpen ? this.server?.name : "",
 | 
			
		||||
            icon: "pi pi-server",
 | 
			
		||||
            visible: false,
 | 
			
		||||
            expanded: true,
 | 
			
		||||
            items: [this.serverDashboard, this.serverProfile, this.serverMembers, this.serverAutoRoles, this.serverLevels, this.serverAchievements, this.serverShortRoleNames, this.serverConfig]
 | 
			
		||||
        };
 | 
			
		||||
        this.adminConfig = {
 | 
			
		||||
            label: this.isSidebarOpen ? this.translateService.instant("sidebar.config") : "",
 | 
			
		||||
            visible: hasPermission || isTechnician,
 | 
			
		||||
            icon: "pi pi-cog",
 | 
			
		||||
            routerLink: "/admin/settings"
 | 
			
		||||
        };
 | 
			
		||||
        this.adminUsers = {
 | 
			
		||||
            label: this.isSidebarOpen ? this.translateService.instant("sidebar.auth_user_list") : "",
 | 
			
		||||
            visible: hasPermission,
 | 
			
		||||
            icon: "pi pi-user-edit",
 | 
			
		||||
            routerLink: "/admin/users"
 | 
			
		||||
        };
 | 
			
		||||
        this.adminMenu = {
 | 
			
		||||
            label: this.isSidebarOpen ? this.translateService.instant("sidebar.administration") : "",
 | 
			
		||||
            icon: "pi pi-cog",
 | 
			
		||||
            visible: hasPermission || isTechnician,
 | 
			
		||||
            expanded: true,
 | 
			
		||||
            items: [this.adminConfig, this.adminUsers]
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setMenu(build: boolean = false) {
 | 
			
		||||
        const server = this.server;
 | 
			
		||||
 | 
			
		||||
        if (server) {
 | 
			
		||||
            this.featureFlags = [];
 | 
			
		||||
            this.data.query<PossibleFeatureFlagsQuery>("{possibleFeatureFlags}"
 | 
			
		||||
            ).subscribe(data => {
 | 
			
		||||
                let observables: Observable<HasServerFeatureFlagQuery>[] = [];
 | 
			
		||||
                data.possibleFeatureFlags.forEach(flag => {
 | 
			
		||||
                    observables.push(
 | 
			
		||||
                        this.data.query<HasServerFeatureFlagQuery>(Queries.hasServerFeatureFlag, {
 | 
			
		||||
                                filter: { id: server.id },
 | 
			
		||||
                                flag: flag
 | 
			
		||||
                            },
 | 
			
		||||
                            function(data: Query) {
 | 
			
		||||
                                return data.servers[0];
 | 
			
		||||
                            }
 | 
			
		||||
                        )
 | 
			
		||||
                    );
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
                forkJoin(observables).subscribe(data => {
 | 
			
		||||
                    data.forEach(flag => {
 | 
			
		||||
                        if (!flag.hasFeatureFlag.value) {
 | 
			
		||||
                            return;
 | 
			
		||||
                        }
 | 
			
		||||
                        this.featureFlags.push(flag.hasFeatureFlag);
 | 
			
		||||
                    });
 | 
			
		||||
                    this._setMenu(build);
 | 
			
		||||
                });
 | 
			
		||||
            });
 | 
			
		||||
        } else {
 | 
			
		||||
            this._setMenu(build);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private _setMenu(build: boolean = false) {
 | 
			
		||||
        this.authService.hasUserPermission(AuthRoles.Admin).then(async hasPermission => {
 | 
			
		||||
            let authUser = await this.authService.getLoggedInUser();
 | 
			
		||||
            let user: UserDTO | null = authUser?.users?.find(u => u.server == this.server?.id) ?? null;
 | 
			
		||||
            let isTechnician = authUser?.users?.map(u => u.isTechnician).filter(u => u) ?? [];
 | 
			
		||||
 | 
			
		||||
            if (build || this.menuItems$.value.length == 0) {
 | 
			
		||||
                await this.buildMenu(user, hasPermission, isTechnician.length > 0);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (this.server) {
 | 
			
		||||
                this.serverMenu.visible = true;
 | 
			
		||||
                this.serverMembers.visible = !!user?.isModerator;
 | 
			
		||||
                this.serverAutoRoles.visible = this.hasFeature("AutoRoleModule") ? !!user?.isModerator : false;
 | 
			
		||||
                this.serverLevels.visible = this.hasFeature("LevelModule") ? !!user?.isModerator : false;
 | 
			
		||||
                this.serverAchievements.visible = this.hasFeature("AchievementsModule") ? !!user?.isModerator : false;
 | 
			
		||||
                this.serverShortRoleNames.visible = this.hasFeature("ShortRoleName") ? !!user?.isAdmin : false;
 | 
			
		||||
 | 
			
		||||
                this.serverConfig.visible = !!user?.isAdmin || isTechnician.length > 0;
 | 
			
		||||
            } else {
 | 
			
		||||
                this.serverMenu.visible = false;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            let menuItems: MenuItem[] = [
 | 
			
		||||
                this.dashboard,
 | 
			
		||||
                this.serverMenu,
 | 
			
		||||
                this.adminMenu
 | 
			
		||||
            ];
 | 
			
		||||
            this.menuItems$.next(menuItems);
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private hasFeature(key: string): boolean {
 | 
			
		||||
        const flag = this.featureFlags.filter(flag => flag.key == key);
 | 
			
		||||
        if (flag.length == 0) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        return flag[0].value;
 | 
			
		||||
  public hasFeature(key: string): boolean {
 | 
			
		||||
    const flag = this.featureFlags.filter(flag => flag.key == key);
 | 
			
		||||
    if (flag.length == 0) {
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
    return flag[0].value;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,6 @@
 | 
			
		||||
  "WebVersion": {
 | 
			
		||||
    "Major": "1",
 | 
			
		||||
    "Minor": "1",
 | 
			
		||||
    "Micro": "9"
 | 
			
		||||
    "Micro": "10"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user