Compare commits
	
		
			4 Commits
		
	
	
		
			docusaurus
			...
			api/nested
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 8128d8dab5 | |||
| f4a68c7878 | |||
| 7ab17822e3 | |||
| 76da77f26e | 
							
								
								
									
										67
									
								
								authentik/api/v3/routers.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								authentik/api/v3/routers.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,67 @@ | |||||||
|  | from rest_framework.routers import DefaultRouter as UpstreamDefaultRouter | ||||||
|  | from rest_framework.viewsets import ViewSet | ||||||
|  | from rest_framework_nested.routers import NestedMixin | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class DefaultRouter(UpstreamDefaultRouter): | ||||||
|  |     include_format_suffixes = False | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class NestedRouter(DefaultRouter): | ||||||
|  |  | ||||||
|  |     def __init__(self, *args, **kwargs): | ||||||
|  |         super().__init__(*args, **kwargs) | ||||||
|  |         self.nested_routers = [] | ||||||
|  |  | ||||||
|  |     class nested: | ||||||
|  |         def __init__(self, parent: "NestedRouter", prefix: str): | ||||||
|  |             self.parent = parent | ||||||
|  |             self.prefix = prefix | ||||||
|  |             self.inner = None | ||||||
|  |  | ||||||
|  |         def nested(self, lookup: str, prefix: str, viewset: type[ViewSet]): | ||||||
|  |             if not self.inner: | ||||||
|  |                 self.inner = NestedDefaultRouter(self.parent, self.prefix, lookup=lookup) | ||||||
|  |             self.inner.register(prefix, viewset) | ||||||
|  |             return self | ||||||
|  |  | ||||||
|  |         @property | ||||||
|  |         def urls(self): | ||||||
|  |             return self.parent.urls | ||||||
|  |  | ||||||
|  |     def register(self, prefix, viewset, basename=None): | ||||||
|  |         super().register(prefix, viewset, basename) | ||||||
|  |         nested_router = self.nested(self, prefix) | ||||||
|  |         self.nested_routers.append(nested_router) | ||||||
|  |         return nested_router | ||||||
|  |  | ||||||
|  |     def get_urls(self): | ||||||
|  |         urls = super().get_urls() | ||||||
|  |         for nested in self.nested_routers: | ||||||
|  |             if not nested.inner: | ||||||
|  |                 continue | ||||||
|  |             urls.extend(nested.inner.urls) | ||||||
|  |         return urls | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class NestedDefaultRouter(NestedMixin, DefaultRouter): | ||||||
|  |     ... | ||||||
|  |     # def __init__(self, *args, **kwargs): | ||||||
|  |     #     self.args = args | ||||||
|  |     #     self.kwargs = kwargs | ||||||
|  |     #     self.routes = [] | ||||||
|  |  | ||||||
|  |     # def register(self, *args, **kwargs): | ||||||
|  |     #     self.routes.append((args, kwargs)) | ||||||
|  |  | ||||||
|  |     # @property | ||||||
|  |     # def urls(self): | ||||||
|  |     #     class r(NestedMixin, DefaultRouter): | ||||||
|  |     #         ... | ||||||
|  |     #     router = r(*self.args, **self.kwargs) | ||||||
|  |     #     for route_args, route_kwrags in self.routes: | ||||||
|  |     #         router.register(*route_args, **route_kwrags) | ||||||
|  |     #     return router | ||||||
|  |  | ||||||
|  |  | ||||||
|  | root_router = DefaultRouter() | ||||||
| @ -6,18 +6,15 @@ from django.urls import path | |||||||
| from django.urls.resolvers import URLPattern | from django.urls.resolvers import URLPattern | ||||||
| from django.views.decorators.cache import cache_page | from django.views.decorators.cache import cache_page | ||||||
| from drf_spectacular.views import SpectacularAPIView | from drf_spectacular.views import SpectacularAPIView | ||||||
| from rest_framework import routers |  | ||||||
| from structlog.stdlib import get_logger | from structlog.stdlib import get_logger | ||||||
|  |  | ||||||
| from authentik.api.v3.config import ConfigView | from authentik.api.v3.config import ConfigView | ||||||
|  | from authentik.api.v3.routers import root_router | ||||||
| from authentik.api.views import APIBrowserView | from authentik.api.views import APIBrowserView | ||||||
| from authentik.lib.utils.reflection import get_apps | from authentik.lib.utils.reflection import get_apps | ||||||
|  |  | ||||||
| LOGGER = get_logger() | LOGGER = get_logger() | ||||||
|  |  | ||||||
| router = routers.DefaultRouter() |  | ||||||
| router.include_format_suffixes = False |  | ||||||
|  |  | ||||||
| _other_urls = [] | _other_urls = [] | ||||||
| for _authentik_app in get_apps(): | for _authentik_app in get_apps(): | ||||||
|     try: |     try: | ||||||
| @ -38,7 +35,7 @@ for _authentik_app in get_apps(): | |||||||
|         if isinstance(url, URLPattern): |         if isinstance(url, URLPattern): | ||||||
|             _other_urls.append(url) |             _other_urls.append(url) | ||||||
|         else: |         else: | ||||||
|             router.register(*url) |             root_router.register(*url) | ||||||
|     LOGGER.debug( |     LOGGER.debug( | ||||||
|         "Mounted API URLs", |         "Mounted API URLs", | ||||||
|         app_name=_authentik_app.name, |         app_name=_authentik_app.name, | ||||||
| @ -49,7 +46,7 @@ urlpatterns = ( | |||||||
|     [ |     [ | ||||||
|         path("", APIBrowserView.as_view(), name="schema-browser"), |         path("", APIBrowserView.as_view(), name="schema-browser"), | ||||||
|     ] |     ] | ||||||
|     + router.urls |     + root_router.urls | ||||||
|     + _other_urls |     + _other_urls | ||||||
|     + [ |     + [ | ||||||
|         path("root/config/", ConfigView.as_view(), name="config"), |         path("root/config/", ConfigView.as_view(), name="config"), | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ from djangoql.ast import Name | |||||||
| from djangoql.exceptions import DjangoQLError | from djangoql.exceptions import DjangoQLError | ||||||
| from djangoql.queryset import apply_search | from djangoql.queryset import apply_search | ||||||
| from djangoql.schema import DjangoQLSchema | from djangoql.schema import DjangoQLSchema | ||||||
| from rest_framework.filters import BaseFilterBackend, SearchFilter | from rest_framework.filters import SearchFilter | ||||||
| from rest_framework.request import Request | from rest_framework.request import Request | ||||||
| from structlog.stdlib import get_logger | from structlog.stdlib import get_logger | ||||||
|  |  | ||||||
| @ -39,7 +39,8 @@ class BaseSchema(DjangoQLSchema): | |||||||
|         return super().resolve_name(name) |         return super().resolve_name(name) | ||||||
|  |  | ||||||
|  |  | ||||||
| class QLSearch(BaseFilterBackend): | # Inherits from SearchFilter to keep the schema correctly | ||||||
|  | class QLSearch(SearchFilter): | ||||||
|     """rest_framework search filter which uses DjangoQL""" |     """rest_framework search filter which uses DjangoQL""" | ||||||
|  |  | ||||||
|     def __init__(self): |     def __init__(self): | ||||||
|  | |||||||
| @ -40,9 +40,16 @@ class ConnectionTokenViewSet( | |||||||
| ): | ): | ||||||
|     """ConnectionToken Viewset""" |     """ConnectionToken Viewset""" | ||||||
|  |  | ||||||
|     queryset = ConnectionToken.objects.all().select_related("session", "endpoint") |     queryset = ConnectionToken.objects.none() | ||||||
|     serializer_class = ConnectionTokenSerializer |     serializer_class = ConnectionTokenSerializer | ||||||
|     filterset_fields = ["endpoint", "session__user", "provider"] |     filterset_fields = ["endpoint", "session__user"] | ||||||
|     search_fields = ["endpoint__name", "provider__name"] |     search_fields = ["endpoint__name", "session__user__username"] | ||||||
|     ordering = ["endpoint__name", "provider__name"] |     ordering = ["endpoint__name", "session__user__username"] | ||||||
|     owner_field = "session__user" |     owner_field = "session__user" | ||||||
|  |  | ||||||
|  |     def get_queryset(self): | ||||||
|  |         return ( | ||||||
|  |             ConnectionToken.objects.all() | ||||||
|  |             .select_related("session", "endpoint") | ||||||
|  |             .filter(provider=self.kwargs["provider_pk"]) | ||||||
|  |         ) | ||||||
|  | |||||||
| @ -22,9 +22,9 @@ from authentik.rbac.filters import ObjectFilter | |||||||
| LOGGER = get_logger() | LOGGER = get_logger() | ||||||
|  |  | ||||||
|  |  | ||||||
| def user_endpoint_cache_key(user_pk: str) -> str: | def user_endpoint_cache_key(user_pk: str, provider_pk: str) -> str: | ||||||
|     """Cache key where endpoint list for user is saved""" |     """Cache key where endpoint list for user is saved""" | ||||||
|     return f"goauthentik.io/providers/rac/endpoint_access/{user_pk}" |     return f"goauthentik.io/providers/rac/endpoint_access/{user_pk}/{provider_pk}" | ||||||
|  |  | ||||||
|  |  | ||||||
| class EndpointSerializer(ModelSerializer): | class EndpointSerializer(ModelSerializer): | ||||||
| @ -65,12 +65,15 @@ class EndpointSerializer(ModelSerializer): | |||||||
| class EndpointViewSet(UsedByMixin, ModelViewSet): | class EndpointViewSet(UsedByMixin, ModelViewSet): | ||||||
|     """Endpoint Viewset""" |     """Endpoint Viewset""" | ||||||
|  |  | ||||||
|     queryset = Endpoint.objects.all() |     queryset = Endpoint.objects.none() | ||||||
|     serializer_class = EndpointSerializer |     serializer_class = EndpointSerializer | ||||||
|     filterset_fields = ["name", "provider"] |     filterset_fields = ["name"] | ||||||
|     search_fields = ["name", "protocol"] |     search_fields = ["name", "protocol"] | ||||||
|     ordering = ["name", "protocol"] |     ordering = ["name", "protocol"] | ||||||
|  |  | ||||||
|  |     def get_queryset(self): | ||||||
|  |         return Endpoint.objects.filter(provider=self.kwargs["provider_pk"]) | ||||||
|  |  | ||||||
|     def _filter_queryset_for_list(self, queryset: QuerySet) -> QuerySet: |     def _filter_queryset_for_list(self, queryset: QuerySet) -> QuerySet: | ||||||
|         """Custom filter_queryset method which ignores guardian, but still supports sorting""" |         """Custom filter_queryset method which ignores guardian, but still supports sorting""" | ||||||
|         for backend in list(self.filter_backends): |         for backend in list(self.filter_backends): | ||||||
| @ -120,14 +123,11 @@ class EndpointViewSet(UsedByMixin, ModelViewSet): | |||||||
|         if not should_cache: |         if not should_cache: | ||||||
|             allowed_endpoints = self._get_allowed_endpoints(queryset) |             allowed_endpoints = self._get_allowed_endpoints(queryset) | ||||||
|         if should_cache: |         if should_cache: | ||||||
|             allowed_endpoints = cache.get(user_endpoint_cache_key(self.request.user.pk)) |             key = user_endpoint_cache_key(self.request.user.pk, self.kwargs["provider_pk"]) | ||||||
|  |             allowed_endpoints = cache.get(key) | ||||||
|             if not allowed_endpoints: |             if not allowed_endpoints: | ||||||
|                 LOGGER.debug("Caching allowed endpoint list") |                 LOGGER.debug("Caching allowed endpoint list") | ||||||
|                 allowed_endpoints = self._get_allowed_endpoints(queryset) |                 allowed_endpoints = self._get_allowed_endpoints(queryset) | ||||||
|                 cache.set( |                 cache.set(key, allowed_endpoints, timeout=86400) | ||||||
|                     user_endpoint_cache_key(self.request.user.pk), |  | ||||||
|                     allowed_endpoints, |  | ||||||
|                     timeout=86400, |  | ||||||
|                 ) |  | ||||||
|         serializer = self.get_serializer(allowed_endpoints, many=True) |         serializer = self.get_serializer(allowed_endpoints, many=True) | ||||||
|         return self.get_paginated_response(serializer.data) |         return self.get_paginated_response(serializer.data) | ||||||
|  | |||||||
| @ -43,5 +43,5 @@ def pre_delete_connection_token_disconnect(sender, instance: ConnectionToken, ** | |||||||
| @receiver([post_save, post_delete], sender=Endpoint) | @receiver([post_save, post_delete], sender=Endpoint) | ||||||
| def post_save_post_delete_endpoint(**_): | def post_save_post_delete_endpoint(**_): | ||||||
|     """Clear user's endpoint cache upon endpoint creation or deletion""" |     """Clear user's endpoint cache upon endpoint creation or deletion""" | ||||||
|     keys = cache.keys(user_endpoint_cache_key("*")) |     keys = cache.keys(user_endpoint_cache_key("*", "*")) | ||||||
|     cache.delete_many(keys) |     cache.delete_many(keys) | ||||||
|  | |||||||
| @ -2,6 +2,7 @@ | |||||||
|  |  | ||||||
| from django.urls import path | from django.urls import path | ||||||
|  |  | ||||||
|  | from authentik.api.v3.routers import NestedRouter | ||||||
| from authentik.outposts.channels import TokenOutpostMiddleware | from authentik.outposts.channels import TokenOutpostMiddleware | ||||||
| from authentik.providers.rac.api.connection_tokens import ConnectionTokenViewSet | from authentik.providers.rac.api.connection_tokens import ConnectionTokenViewSet | ||||||
| from authentik.providers.rac.api.endpoints import EndpointViewSet | from authentik.providers.rac.api.endpoints import EndpointViewSet | ||||||
| @ -38,8 +39,10 @@ websocket_urlpatterns = [ | |||||||
| ] | ] | ||||||
|  |  | ||||||
| api_urlpatterns = [ | api_urlpatterns = [ | ||||||
|     ("providers/rac", RACProviderViewSet), |     *NestedRouter() | ||||||
|  |     .register("providers/rac", RACProviderViewSet) | ||||||
|  |     .nested("provider", "endpoints", EndpointViewSet) | ||||||
|  |     .nested("provider", "connection_tokens", ConnectionTokenViewSet) | ||||||
|  |     .urls, | ||||||
|     ("propertymappings/provider/rac", RACPropertyMappingViewSet), |     ("propertymappings/provider/rac", RACPropertyMappingViewSet), | ||||||
|     ("rac/endpoints", EndpointViewSet), |  | ||||||
|     ("rac/connection_tokens", ConnectionTokenViewSet), |  | ||||||
| ] | ] | ||||||
|  | |||||||
| @ -28,6 +28,7 @@ dependencies = [ | |||||||
|     "djangorestframework-guardian==0.3.0", |     "djangorestframework-guardian==0.3.0", | ||||||
|     "djangorestframework==3.16.0", |     "djangorestframework==3.16.0", | ||||||
|     "docker==7.1.0", |     "docker==7.1.0", | ||||||
|  |     "drf-nested-routers==0.94.2", | ||||||
|     "drf-orjson-renderer==1.7.3", |     "drf-orjson-renderer==1.7.3", | ||||||
|     "drf-spectacular==0.28.0", |     "drf-spectacular==0.28.0", | ||||||
|     "dumb-init==1.2.5.post1", |     "dumb-init==1.2.5.post1", | ||||||
|  | |||||||
							
								
								
									
										1092
									
								
								schema.yml
									
									
									
									
									
								
							
							
						
						
									
										1092
									
								
								schema.yml
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										15
									
								
								uv.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										15
									
								
								uv.lock
									
									
									
										generated
									
									
									
								
							| @ -191,6 +191,7 @@ dependencies = [ | |||||||
|     { name = "djangorestframework" }, |     { name = "djangorestframework" }, | ||||||
|     { name = "djangorestframework-guardian" }, |     { name = "djangorestframework-guardian" }, | ||||||
|     { name = "docker" }, |     { name = "docker" }, | ||||||
|  |     { name = "drf-nested-routers" }, | ||||||
|     { name = "drf-orjson-renderer" }, |     { name = "drf-orjson-renderer" }, | ||||||
|     { name = "drf-spectacular" }, |     { name = "drf-spectacular" }, | ||||||
|     { name = "dumb-init" }, |     { name = "dumb-init" }, | ||||||
| @ -290,6 +291,7 @@ requires-dist = [ | |||||||
|     { name = "djangorestframework", git = "https://github.com/goauthentik/django-rest-framework?rev=896722bab969fabc74a08b827da59409cf9f1a4e" }, |     { name = "djangorestframework", git = "https://github.com/goauthentik/django-rest-framework?rev=896722bab969fabc74a08b827da59409cf9f1a4e" }, | ||||||
|     { name = "djangorestframework-guardian", specifier = "==0.3.0" }, |     { name = "djangorestframework-guardian", specifier = "==0.3.0" }, | ||||||
|     { name = "docker", specifier = "==7.1.0" }, |     { name = "docker", specifier = "==7.1.0" }, | ||||||
|  |     { name = "drf-nested-routers", specifier = "==0.94.2" }, | ||||||
|     { name = "drf-orjson-renderer", specifier = "==1.7.3" }, |     { name = "drf-orjson-renderer", specifier = "==1.7.3" }, | ||||||
|     { name = "drf-spectacular", specifier = "==0.28.0" }, |     { name = "drf-spectacular", specifier = "==0.28.0" }, | ||||||
|     { name = "dumb-init", specifier = "==1.2.5.post1" }, |     { name = "dumb-init", specifier = "==1.2.5.post1" }, | ||||||
| @ -1190,6 +1192,19 @@ wheels = [ | |||||||
|     { url = "https://files.pythonhosted.org/packages/2f/71/1f500097efe09e04c3be862ab26c997314237a8b0a16dc3e3047fee23f4c/drf_jsonschema_serializer-3.0.0-py3-none-any.whl", hash = "sha256:d0e5cce095a5638b0bb7867aa060ed59ab9eed2f54ba5058dd9b483c9c887ed5", size = 8994, upload-time = "2024-06-26T13:09:59.929Z" }, |     { url = "https://files.pythonhosted.org/packages/2f/71/1f500097efe09e04c3be862ab26c997314237a8b0a16dc3e3047fee23f4c/drf_jsonschema_serializer-3.0.0-py3-none-any.whl", hash = "sha256:d0e5cce095a5638b0bb7867aa060ed59ab9eed2f54ba5058dd9b483c9c887ed5", size = 8994, upload-time = "2024-06-26T13:09:59.929Z" }, | ||||||
| ] | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "drf-nested-routers" | ||||||
|  | version = "0.94.2" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | dependencies = [ | ||||||
|  |     { name = "django" }, | ||||||
|  |     { name = "djangorestframework" }, | ||||||
|  | ] | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/f6/98/2d29f3ecd337255bc2775b9addef347b6fd30ff7b3757649d0e50602ba08/drf_nested_routers-0.94.2.tar.gz", hash = "sha256:aa70923b716dc47cd93b8129b06be6c15706b405cf5f718f59cb8eed01de59cc", size = 22845, upload-time = "2025-05-14T17:03:50.896Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/62/dc/6bdb857a631fe6558db18a009c93ae16c3ad94fef0b7be7a3aa35c3264fa/drf_nested_routers-0.94.2-py2.py3-none-any.whl", hash = "sha256:74dbdceeae2a32f8668ba0df8e3eeabeb9b1c64d2621d914901ae653e4e3bcff", size = 36367, upload-time = "2025-05-14T17:03:49.257Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
| [[package]] | [[package]] | ||||||
| name = "drf-orjson-renderer" | name = "drf-orjson-renderer" | ||||||
| version = "1.7.3" | version = "1.7.3" | ||||||
|  | |||||||
| @ -12,7 +12,7 @@ import { customElement, property } from "lit/decorators.js"; | |||||||
|  |  | ||||||
| import PFDescriptionList from "@patternfly/patternfly/components/DescriptionList/description-list.css"; | import PFDescriptionList from "@patternfly/patternfly/components/DescriptionList/description-list.css"; | ||||||
|  |  | ||||||
| import { ConnectionToken, RACProvider, RacApi } from "@goauthentik/api"; | import { ConnectionToken, ProvidersApi, RACProvider } from "@goauthentik/api"; | ||||||
|  |  | ||||||
| @customElement("ak-rac-connection-token-list") | @customElement("ak-rac-connection-token-list") | ||||||
| export class ConnectionTokenListPage extends Table<ConnectionToken> { | export class ConnectionTokenListPage extends Table<ConnectionToken> { | ||||||
| @ -37,9 +37,9 @@ export class ConnectionTokenListPage extends Table<ConnectionToken> { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     async apiEndpoint(): Promise<PaginatedResponse<ConnectionToken>> { |     async apiEndpoint(): Promise<PaginatedResponse<ConnectionToken>> { | ||||||
|         return new RacApi(DEFAULT_CONFIG).racConnectionTokensList({ |         return new ProvidersApi(DEFAULT_CONFIG).providersRacConnectionTokensList({ | ||||||
|             ...(await this.defaultEndpointConfig()), |             ...(await this.defaultEndpointConfig()), | ||||||
|             provider: this.provider?.pk, |             providerPk: this.provider!.pk, | ||||||
|             sessionUser: this.userId, |             sessionUser: this.userId, | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
| @ -56,12 +56,14 @@ export class ConnectionTokenListPage extends Table<ConnectionToken> { | |||||||
|                 ]; |                 ]; | ||||||
|             }} |             }} | ||||||
|             .usedBy=${(item: ConnectionToken) => { |             .usedBy=${(item: ConnectionToken) => { | ||||||
|                 return new RacApi(DEFAULT_CONFIG).racConnectionTokensUsedByList({ |                 return new ProvidersApi(DEFAULT_CONFIG).providersRacConnectionTokensUsedByList({ | ||||||
|  |                     providerPk: this.provider!.pk, | ||||||
|                     connectionTokenUuid: item.pk || "", |                     connectionTokenUuid: item.pk || "", | ||||||
|                 }); |                 }); | ||||||
|             }} |             }} | ||||||
|             .delete=${(item: ConnectionToken) => { |             .delete=${(item: ConnectionToken) => { | ||||||
|                 return new RacApi(DEFAULT_CONFIG).racConnectionTokensDestroy({ |                 return new ProvidersApi(DEFAULT_CONFIG).providersRacConnectionTokensDestroy({ | ||||||
|  |                     providerPk: this.provider!.pk, | ||||||
|                     connectionTokenUuid: item.pk || "", |                     connectionTokenUuid: item.pk || "", | ||||||
|                 }); |                 }); | ||||||
|             }} |             }} | ||||||
|  | |||||||
| @ -12,7 +12,7 @@ import { TemplateResult, html } from "lit"; | |||||||
| import { customElement, property } from "lit/decorators.js"; | import { customElement, property } from "lit/decorators.js"; | ||||||
| import { ifDefined } from "lit/directives/if-defined.js"; | import { ifDefined } from "lit/directives/if-defined.js"; | ||||||
|  |  | ||||||
| import { AuthModeEnum, Endpoint, ProtocolEnum, RacApi } from "@goauthentik/api"; | import { AuthModeEnum, Endpoint, ProtocolEnum, ProvidersApi } from "@goauthentik/api"; | ||||||
|  |  | ||||||
| import { propertyMappingsProvider, propertyMappingsSelector } from "./RACProviderFormHelpers.js"; | import { propertyMappingsProvider, propertyMappingsSelector } from "./RACProviderFormHelpers.js"; | ||||||
|  |  | ||||||
| @ -22,7 +22,8 @@ export class EndpointForm extends ModelForm<Endpoint, string> { | |||||||
|     providerID?: number; |     providerID?: number; | ||||||
|  |  | ||||||
|     loadInstance(pk: string): Promise<Endpoint> { |     loadInstance(pk: string): Promise<Endpoint> { | ||||||
|         return new RacApi(DEFAULT_CONFIG).racEndpointsRetrieve({ |         return new ProvidersApi(DEFAULT_CONFIG).providersRacEndpointsRetrieve({ | ||||||
|  |             providerPk: this.providerID!, | ||||||
|             pbmUuid: pk, |             pbmUuid: pk, | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
| @ -41,12 +42,14 @@ export class EndpointForm extends ModelForm<Endpoint, string> { | |||||||
|             data.provider = this.instance.provider; |             data.provider = this.instance.provider; | ||||||
|         } |         } | ||||||
|         if (this.instance) { |         if (this.instance) { | ||||||
|             return new RacApi(DEFAULT_CONFIG).racEndpointsPartialUpdate({ |             return new ProvidersApi(DEFAULT_CONFIG).providersRacEndpointsPartialUpdate({ | ||||||
|  |                 providerPk: this.providerID!, | ||||||
|                 pbmUuid: this.instance.pk || "", |                 pbmUuid: this.instance.pk || "", | ||||||
|                 patchedEndpointRequest: data, |                 patchedEndpointRequest: data, | ||||||
|             }); |             }); | ||||||
|         } |         } | ||||||
|         return new RacApi(DEFAULT_CONFIG).racEndpointsCreate({ |         return new ProvidersApi(DEFAULT_CONFIG).providersRacEndpointsCreate({ | ||||||
|  |             providerPk: this.providerID!, | ||||||
|             endpointRequest: data, |             endpointRequest: data, | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -17,8 +17,8 @@ import PFDescriptionList from "@patternfly/patternfly/components/DescriptionList | |||||||
|  |  | ||||||
| import { | import { | ||||||
|     Endpoint, |     Endpoint, | ||||||
|  |     ProvidersApi, | ||||||
|     RACProvider, |     RACProvider, | ||||||
|     RacApi, |  | ||||||
|     RbacPermissionsAssignedByUsersListModelEnum, |     RbacPermissionsAssignedByUsersListModelEnum, | ||||||
| } from "@goauthentik/api"; | } from "@goauthentik/api"; | ||||||
|  |  | ||||||
| @ -43,9 +43,9 @@ export class EndpointListPage extends Table<Endpoint> { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     async apiEndpoint(): Promise<PaginatedResponse<Endpoint>> { |     async apiEndpoint(): Promise<PaginatedResponse<Endpoint>> { | ||||||
|         return new RacApi(DEFAULT_CONFIG).racEndpointsList({ |         return new ProvidersApi(DEFAULT_CONFIG).providersRacEndpointsList({ | ||||||
|             ...(await this.defaultEndpointConfig()), |             ...(await this.defaultEndpointConfig()), | ||||||
|             provider: this.provider?.pk, |             providerPk: this.provider!.pk, | ||||||
|             superuserFullList: true, |             superuserFullList: true, | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
| @ -70,12 +70,14 @@ export class EndpointListPage extends Table<Endpoint> { | |||||||
|                 ]; |                 ]; | ||||||
|             }} |             }} | ||||||
|             .usedBy=${(item: Endpoint) => { |             .usedBy=${(item: Endpoint) => { | ||||||
|                 return new RacApi(DEFAULT_CONFIG).racEndpointsUsedByList({ |                 return new ProvidersApi(DEFAULT_CONFIG).providersRacEndpointsUsedByList({ | ||||||
|  |                     providerPk: this.provider!.pk, | ||||||
|                     pbmUuid: item.pk, |                     pbmUuid: item.pk, | ||||||
|                 }); |                 }); | ||||||
|             }} |             }} | ||||||
|             .delete=${(item: Endpoint) => { |             .delete=${(item: Endpoint) => { | ||||||
|                 return new RacApi(DEFAULT_CONFIG).racEndpointsDestroy({ |                 return new ProvidersApi(DEFAULT_CONFIG).providersRacEndpointsDestroy({ | ||||||
|  |                     providerPk: this.provider!.pk, | ||||||
|                     pbmUuid: item.pk, |                     pbmUuid: item.pk, | ||||||
|                 }); |                 }); | ||||||
|             }} |             }} | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ import { msg } from "@lit/localize"; | |||||||
| import { TemplateResult, html } from "lit"; | import { TemplateResult, html } from "lit"; | ||||||
| import { customElement, property } from "lit/decorators.js"; | import { customElement, property } from "lit/decorators.js"; | ||||||
|  |  | ||||||
| import { Application, Endpoint, RacApi } from "@goauthentik/api"; | import { Application, Endpoint, ProvidersApi } from "@goauthentik/api"; | ||||||
|  |  | ||||||
| @customElement("ak-library-rac-endpoint-launch") | @customElement("ak-library-rac-endpoint-launch") | ||||||
| export class RACLaunchEndpointModal extends TableModal<Endpoint> { | export class RACLaunchEndpointModal extends TableModal<Endpoint> { | ||||||
| @ -30,9 +30,9 @@ export class RACLaunchEndpointModal extends TableModal<Endpoint> { | |||||||
|     app?: Application; |     app?: Application; | ||||||
|  |  | ||||||
|     async apiEndpoint(): Promise<PaginatedResponse<Endpoint>> { |     async apiEndpoint(): Promise<PaginatedResponse<Endpoint>> { | ||||||
|         const endpoints = await new RacApi(DEFAULT_CONFIG).racEndpointsList({ |         const endpoints = await new ProvidersApi(DEFAULT_CONFIG).providersRacEndpointsList({ | ||||||
|             ...(await this.defaultEndpointConfig()), |             ...(await this.defaultEndpointConfig()), | ||||||
|             provider: this.app?.provider || 0, |             providerPk: this.app?.provider || 0, | ||||||
|         }); |         }); | ||||||
|         if (this.open && endpoints.pagination.count === 1) { |         if (this.open && endpoints.pagination.count === 1) { | ||||||
|             this.clickHandler(endpoints.results[0]); |             this.clickHandler(endpoints.results[0]); | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	