infrasynth-backend-kit/infrasynth/security/urls.py
jcv-dev a2930426b4 feat: tenant configs, live signals, and automatic permission management
- infrasynth.configs: typed multi-tenant config store (registry, service,
  secrets, cache) + public config_changed/config_reset signals and API
- emit the declared-but-dead signals (features flags/overrides, scheduler
  task_completed/task_failed, tenancy tenant_updated, audit model_changed)
  and per-model audit field exclusions
- security: permission catalog (security_permission), Django-style
  model-derived AutoPermission, PermissionRegistry, RoleAssignment,
  global-or-tenant Grant/Revoke, catalog API
- consolidate the permission surface: PermissionRegistry only (drop the
  settings dict), IsAuthenticatedAndPermitted aliases HybridPermission,
  require_permission replaced by required_permissions + require_all
- packaging: add [build-system]; add Forgejo publish workflow (.forgejo)
2026-09-29 17:06:54 -05:00

84 lines
2.4 KiB
Python

from django.urls import include, path
from rest_framework.routers import DefaultRouter
from .views import (
ALTCHAViewSet,
APIKeyViewSet,
AuthViewSet,
GrantViewSet,
PermissionViewSet,
RevokeViewSet,
RoleViewSet,
TwoFactorViewSet,
UserPermissionViewSet,
)
router = DefaultRouter()
router.register(r"api-keys", APIKeyViewSet, basename="api-keys")
router.register(r"roles", RoleViewSet, basename="roles")
router.register(r"permissions", PermissionViewSet, basename="permissions")
router.register(r"grants", GrantViewSet, basename="grants")
router.register(r"revokes", RevokeViewSet, basename="revokes")
urlpatterns = [
path("login/", AuthViewSet.as_view({"post": "login"}), name="auth-login"),
path("logout/", AuthViewSet.as_view({"post": "logout"}), name="auth-logout"),
path("refresh/", AuthViewSet.as_view({"post": "refresh"}), name="auth-refresh"),
path("check/", AuthViewSet.as_view({"get": "check"}), name="auth-check"),
path(
"select-workspace/",
AuthViewSet.as_view({"post": "select_workspace"}),
name="auth-select-workspace",
),
path(
"switch-workspace/",
AuthViewSet.as_view({"post": "switch_workspace"}),
name="auth-switch-workspace",
),
path(
"2fa/setup/",
TwoFactorViewSet.as_view({"post": "setup"}),
name="2fa-setup",
),
path(
"2fa/verify-setup/",
TwoFactorViewSet.as_view({"post": "verify_setup"}),
name="2fa-verify-setup",
),
path(
"2fa/verify/",
TwoFactorViewSet.as_view({"post": "verify"}),
name="2fa-verify",
),
path(
"2fa/disable/",
TwoFactorViewSet.as_view({"post": "disable"}),
name="2fa-disable",
),
path(
"2fa/recovery/",
TwoFactorViewSet.as_view({"post": "recovery"}),
name="2fa-recovery",
),
path(
"altcha/challenge/",
ALTCHAViewSet.as_view({"post": "challenge"}),
name="altcha-challenge",
),
path(
"altcha/verify/",
ALTCHAViewSet.as_view({"post": "verify"}),
name="altcha-verify",
),
path(
"users/<int:pk>/permissions/",
UserPermissionViewSet.as_view({"get": "permissions"}),
name="user-permissions",
),
path(
"users/<int:pk>/roles/",
UserPermissionViewSet.as_view({"get": "roles", "put": "roles"}),
name="user-roles",
),
path("", include(router.urls)),
]