use nested for RAC

Signed-off-by: Jens Langhammer <jens@goauthentik.io>
This commit is contained in:
Jens Langhammer
2025-07-01 21:46:35 +02:00
parent 7ab17822e3
commit f4a68c7878
8 changed files with 621 additions and 543 deletions

View File

@ -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"])
)

View File

@ -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):

View File

@ -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),
] ]

1092
schema.yml

File diff suppressed because it is too large Load Diff

View File

@ -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 || "",
}); });
}} }}

View File

@ -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,
}); });
} }

View File

@ -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,
}); });
}} }}

View File

@ -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]);