Implement sales tenant pipeline events

This commit is contained in:
Magzhan Zhumabayev
2026-05-10 18:24:06 +05:00
parent 24ccdb3e73
commit 866d96e560
30 changed files with 24412 additions and 281 deletions
+20 -2
View File
@@ -64,6 +64,7 @@ def issue_app_token(
provider: str | None = None,
full_name: str | None = None,
email: str | None = None,
tenant_id: str | None = None,
ttl_seconds: int | None = None,
) -> str:
now = datetime.now(timezone.utc)
@@ -83,6 +84,8 @@ def issue_app_token(
payload["full_name"] = full_name
if email:
payload["email"] = email
if tenant_id:
payload["tenant_id"] = tenant_id
encoded_header = _b64url_encode(json.dumps(header, separators=(",", ":")).encode("utf-8"))
encoded_payload = _b64url_encode(json.dumps(payload, separators=(",", ":")).encode("utf-8"))
@@ -119,12 +122,18 @@ def get_actor(
authorization: str | None = Header(default=None, alias="Authorization"),
x_user: str | None = Header(default=None, alias="X-User"),
x_role: str | None = Header(default=None, alias="X-Role"),
x_tenant_id: str | None = Header(default=None, alias="X-Tenant-ID"),
) -> dict:
if authorization:
scheme, _, value = authorization.partition(" ")
if scheme.lower() != "bearer" or not value.strip():
raise HTTPException(status_code=401, detail="Invalid authorization header")
payload = decode_app_token(value.strip())
tenant_id = str(payload.get("tenant_id") or "").strip()
tenant_source = "token" if tenant_id else None
if not tenant_id and legacy_header_auth_allowed():
tenant_id = str(x_tenant_id or "").strip()
tenant_source = "header" if tenant_id else None
return {
"sub": payload.get("sub", ""),
"user": payload.get("username", "anonymous"),
@@ -133,13 +142,22 @@ def get_actor(
"provider": payload.get("provider"),
"full_name": payload.get("full_name"),
"email": payload.get("email"),
"tenant_id": tenant_id or None,
"tenant_source": tenant_source,
}
if legacy_header_auth_allowed():
role = (x_role or "").strip().lower()
return {"user": (x_user or "anonymous").strip(), "role": role or "anonymous", "auth_source": "legacy"}
tenant_id = str(x_tenant_id or "").strip()
return {
"user": (x_user or "anonymous").strip(),
"role": role or "anonymous",
"auth_source": "legacy",
"tenant_id": tenant_id or None,
"tenant_source": "header" if tenant_id else None,
}
return {"user": "anonymous", "role": "anonymous", "auth_source": "none"}
return {"user": "anonymous", "role": "anonymous", "auth_source": "none", "tenant_id": None, "tenant_source": None}
def require_roles(*allowed: Role) -> Callable: