{"version":3,"file":"current-user.context-LxFNwchJ.js","sources":["../../../src/packages/user/current-user/current-user.context.ts"],"sourcesContent":["import type { UmbCurrentUserModel } from './types.js';\r\nimport { UmbCurrentUserRepository } from './repository/index.js';\r\nimport { UMB_CURRENT_USER_CONTEXT } from './current-user.context.token.js';\r\nimport { UmbContextBase } from '@umbraco-cms/backoffice/class-api';\r\nimport type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';\r\nimport { filter, firstValueFrom } from '@umbraco-cms/backoffice/external/rxjs';\r\nimport { UMB_AUTH_CONTEXT } from '@umbraco-cms/backoffice/auth';\r\nimport { UmbObjectState } from '@umbraco-cms/backoffice/observable-api';\r\nimport { umbLocalizationRegistry } from '@umbraco-cms/backoffice/localization';\r\nimport { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';\r\nimport { UMB_SECTION_PATH_PATTERN } from '@umbraco-cms/backoffice/section';\r\nimport { UMB_APP_CONTEXT } from '@umbraco-cms/backoffice/app';\r\nimport { ensurePathEndsWithSlash } from '@umbraco-cms/backoffice/utils';\r\nimport type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models';\r\n\r\nexport class UmbCurrentUserContext extends UmbContextBase {\r\n\t#currentUser = new UmbObjectState(undefined);\r\n\treadonly currentUser = this.#currentUser.asObservable().pipe(filter((user) => !!user));\r\n\treadonly allowedSections = this.#currentUser.asObservablePart((user) => user?.allowedSections);\r\n\treadonly avatarUrls = this.#currentUser.asObservablePart((user) => user?.avatarUrls);\r\n\treadonly documentStartNodeUniques = this.#currentUser.asObservablePart((user) => user?.documentStartNodeUniques);\r\n\treadonly email = this.#currentUser.asObservablePart((user) => user?.email);\r\n\treadonly fallbackPermissions = this.#currentUser.asObservablePart((user) => user?.fallbackPermissions);\r\n\treadonly hasAccessToAllLanguages = this.#currentUser.asObservablePart((user) => user?.hasAccessToAllLanguages);\r\n\treadonly hasAccessToSensitiveData = this.#currentUser.asObservablePart((user) => user?.hasAccessToSensitiveData);\r\n\treadonly hasDocumentRootAccess = this.#currentUser.asObservablePart((user) => user?.hasDocumentRootAccess);\r\n\treadonly hasMediaRootAccess = this.#currentUser.asObservablePart((user) => user?.hasMediaRootAccess);\r\n\treadonly isAdmin = this.#currentUser.asObservablePart((user) => user?.isAdmin);\r\n\treadonly languageIsoCode = this.#currentUser.asObservablePart((user) => user?.languageIsoCode);\r\n\treadonly languages = this.#currentUser.asObservablePart((user) => user?.languages);\r\n\treadonly mediaStartNodeUniques = this.#currentUser.asObservablePart((user) => user?.mediaStartNodeUniques);\r\n\treadonly name = this.#currentUser.asObservablePart((user) => user?.name);\r\n\treadonly permissions = this.#currentUser.asObservablePart((user) => user?.permissions);\r\n\treadonly unique = this.#currentUser.asObservablePart((user) => user?.unique);\r\n\treadonly userName = this.#currentUser.asObservablePart((user) => user?.userName);\r\n\r\n\t#authContext?: typeof UMB_AUTH_CONTEXT.TYPE;\r\n\t#currentUserRepository = new UmbCurrentUserRepository(this);\r\n\r\n\tconstructor(host: UmbControllerHost) {\r\n\t\tsuper(host, UMB_CURRENT_USER_CONTEXT);\r\n\r\n\t\tthis.consumeContext(UMB_AUTH_CONTEXT, (instance) => {\r\n\t\t\tthis.#authContext = instance;\r\n\t\t\tthis.#observeIsAuthorized();\r\n\t\t});\r\n\r\n\t\tthis.observe(this.languageIsoCode, (currentLanguageIsoCode) => {\r\n\t\t\tif (!currentLanguageIsoCode) return;\r\n\t\t\tumbLocalizationRegistry.loadLanguage(currentLanguageIsoCode);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Loads the current user\r\n\t */\r\n\tasync load() {\r\n\t\tconst { asObservable } = await this.#currentUserRepository.requestCurrentUser();\r\n\r\n\t\tif (asObservable) {\r\n\t\t\tawait this.observe(asObservable(), (currentUser) => {\r\n\t\t\t\tthis.#currentUser?.setValue(currentUser);\r\n\t\t\t\tthis.#redirectToFirstAllowedSectionIfNeeded();\r\n\t\t\t}).asPromise();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if a user is the current user.\r\n\t * @param userUnique The user id to check\r\n\t * @returns True if the user is the current user, otherwise false\r\n\t */\r\n\tasync isUserCurrentUser(userUnique: string): Promise {\r\n\t\tconst currentUser = await firstValueFrom(this.currentUser);\r\n\t\treturn currentUser?.unique === userUnique;\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if the current user is an admin.\r\n\t * @returns True if the current user is an admin, otherwise false\r\n\t */\r\n\tasync isCurrentUserAdmin(): Promise {\r\n\t\tconst currentUser = await firstValueFrom(this.currentUser);\r\n\t\treturn currentUser?.isAdmin ?? false;\r\n\t}\r\n\r\n\t/**\r\n\t * Get the allowed sections for the current user\r\n\t * @returns {Array | undefined} The allowed sections for the current user\r\n\t */\r\n\tgetAllowedSection(): Array | undefined {\r\n\t\treturn this.#currentUser.getValue()?.allowedSections;\r\n\t}\r\n\r\n\t/**\r\n\t * Get the avatar urls for the current user\r\n\t * @returns {Array | undefined} The avatar urls for the current user\r\n\t */\r\n\tgetAvatarUrls(): Array | undefined {\r\n\t\treturn this.#currentUser.getValue()?.avatarUrls;\r\n\t}\r\n\r\n\t/**\r\n\t * Get the document start node uniques for the current user\r\n\t * @returns {Array | undefined} The document start node uniques for the current user\r\n\t */\r\n\tgetDocumentStartNodeUniques(): Array | undefined {\r\n\t\treturn this.#currentUser.getValue()?.documentStartNodeUniques;\r\n\t}\r\n\r\n\t/**\r\n\t * Get the email for the current user\r\n\t * @returns {string | undefined} The email for the current user\r\n\t */\r\n\tgetEmail(): string | undefined {\r\n\t\treturn this.#currentUser.getValue()?.email;\r\n\t}\r\n\r\n\t/**\r\n\t * Get the fallback permissions for the current user\r\n\t * @returns {Array | undefined} The fallback permissions for the current user\r\n\t */\r\n\tgetFallbackPermissions(): Array | undefined {\r\n\t\treturn this.#currentUser.getValue()?.fallbackPermissions;\r\n\t}\r\n\r\n\t/**\r\n\t * Get if the current user has access to all languages\r\n\t * @returns {boolean | undefined} True if the current user has access to all languages, otherwise false\r\n\t */\r\n\tgetHasAccessToAllLanguages(): boolean | undefined {\r\n\t\treturn this.#currentUser.getValue()?.hasAccessToAllLanguages;\r\n\t}\r\n\r\n\t/**\r\n\t * Get if the current user has access to sensitive data\r\n\t * @returns {boolean | undefined} True if the current user has access to sensitive data, otherwise false\r\n\t */\r\n\tgetHasAccessToSensitiveData(): boolean | undefined {\r\n\t\treturn this.#currentUser.getValue()?.hasAccessToSensitiveData;\r\n\t}\r\n\r\n\t/**\r\n\t * Get if the current user has document root access\r\n\t * @returns {boolean | undefined} True if the current user has document root access, otherwise false\r\n\t */\r\n\tgetHasDocumentRootAccess(): boolean | undefined {\r\n\t\treturn this.#currentUser.getValue()?.hasDocumentRootAccess;\r\n\t}\r\n\r\n\t/**\r\n\t * Get if the current user has media root access\r\n\t * @returns {boolean | undefined} True if the current user has media root access, otherwise false\r\n\t */\r\n\tgetHasMediaRootAccess(): boolean | undefined {\r\n\t\treturn this.#currentUser.getValue()?.hasMediaRootAccess;\r\n\t}\r\n\r\n\t/**\r\n\t * Get if the current user is an admin\r\n\t * @returns {boolean | undefined} True if the current user is an admin, otherwise false\r\n\t */\r\n\tgetIsAdmin(): boolean | undefined {\r\n\t\treturn this.#currentUser.getValue()?.isAdmin;\r\n\t}\r\n\r\n\t/**\r\n\t * Get the language iso code for the current user\r\n\t * @returns {string | undefined} The language iso code for the current user\r\n\t */\r\n\tgetLanguageIsoCode(): string | undefined {\r\n\t\treturn this.#currentUser.getValue()?.languageIsoCode;\r\n\t}\r\n\r\n\t/**\r\n\t * Get the languages for the current user\r\n\t * @returns {Array | undefined} The languages for the current user\r\n\t */\r\n\tgetLanguages(): Array | undefined {\r\n\t\treturn this.#currentUser.getValue()?.languages;\r\n\t}\r\n\r\n\t/**\r\n\t * Get the media start node uniques for the current user\r\n\t * @returns {Array | undefined} The media start node uniques for the current user\r\n\t */\r\n\tgetMediaStartNodeUniques(): Array | undefined {\r\n\t\treturn this.#currentUser.getValue()?.mediaStartNodeUniques;\r\n\t}\r\n\r\n\t/**\r\n\t * Get the name for the current user\r\n\t * @returns {string | undefined} The name for the current user\r\n\t */\r\n\tgetName(): string | undefined {\r\n\t\treturn this.#currentUser.getValue()?.name;\r\n\t}\r\n\r\n\t/**\r\n\t * Get the permissions for the current user\r\n\t * @returns {Array | undefined} The permissions for the current user\r\n\t */\r\n\tgetPermissions() {\r\n\t\treturn this.#currentUser.getValue()?.permissions;\r\n\t}\r\n\r\n\t/**\r\n\t * Get the unique for the current user\r\n\t * @returns {string | undefined} The unique for the current user\r\n\t */\r\n\tgetUnique(): string | undefined {\r\n\t\treturn this.#currentUser.getValue()?.unique;\r\n\t}\r\n\r\n\t/**\r\n\t * Get the user name for the current user\r\n\t * @returns {string | undefined} The user name for the current user\r\n\t */\r\n\tgetUserName(): string | undefined {\r\n\t\treturn this.#currentUser.getValue()?.userName;\r\n\t}\r\n\r\n\t#observeIsAuthorized() {\r\n\t\tif (!this.#authContext) return;\r\n\t\tthis.observe(this.#authContext.isAuthorized, (isAuthorized) => {\r\n\t\t\tif (isAuthorized) {\r\n\t\t\t\tthis.load();\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tasync #redirectToFirstAllowedSectionIfNeeded() {\r\n\t\tconst url = new URL(window.location.href);\r\n\r\n\t\tconst appContext = await this.getContext(UMB_APP_CONTEXT);\r\n\t\tconst backofficePath = appContext.getBackofficePath();\r\n\r\n\t\tif (url.pathname === backofficePath || url.pathname === ensurePathEndsWithSlash(backofficePath)) {\r\n\t\t\tconst sectionManifest = await this.#firstAllowedSection();\r\n\t\t\tif (!sectionManifest) return;\r\n\r\n\t\t\tconst fallbackSectionPath = UMB_SECTION_PATH_PATTERN.generateLocal({\r\n\t\t\t\tsectionName: sectionManifest.meta.pathname,\r\n\t\t\t});\r\n\r\n\t\t\thistory.pushState(null, '', fallbackSectionPath);\r\n\t\t}\r\n\t}\r\n\r\n\tasync #firstAllowedSection() {\r\n\t\tconst currentUser = this.#currentUser.getValue();\r\n\t\tif (!currentUser) return;\r\n\r\n\t\t/* TODO: this solution is not bullet proof as we still rely on the \"correct\" section to be registered at this point in time so we can get the path.\r\n\t\t It probably would have been better if we used the section alias instead as the path.\r\n\t\t Then we would have it available at all times and it also ensured a unique path. */\r\n\t\tconst sections = await this.observe(\r\n\t\t\tumbExtensionsRegistry.byTypeAndAliases('section', currentUser.allowedSections),\r\n\t\t\t() => {},\r\n\t\t).asPromise();\r\n\r\n\t\treturn sections[0];\r\n\t}\r\n}\r\n\r\nexport default UmbCurrentUserContext;\r\n"],"names":["UmbCurrentUserContext","UmbContextBase","host","UMB_CURRENT_USER_CONTEXT","#currentUser","UmbObjectState","filter","user","#currentUserRepository","UmbCurrentUserRepository","UMB_AUTH_CONTEXT","instance","#authContext","#observeIsAuthorized","currentLanguageIsoCode","umbLocalizationRegistry","asObservable","currentUser","#redirectToFirstAllowedSectionIfNeeded","userUnique","firstValueFrom","isAuthorized","url","backofficePath","UMB_APP_CONTEXT","ensurePathEndsWithSlash","sectionManifest","#firstAllowedSection","fallbackSectionPath","UMB_SECTION_PATH_PATTERN","umbExtensionsRegistry"],"mappings":"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"}