feat(multi-user): add unclaimed doc visibility, claim/assign-owner endpoints, default_owner_id
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
This commit is contained in:
@@ -100,6 +100,29 @@ SETTING_METADATA = {
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"unowned_docs_visible_to_all": {
|
||||
"category": "Authentication",
|
||||
"description": (
|
||||
"In multi-user mode, controls whether documents without an owner are visible to all users. "
|
||||
"When True, unowned documents appear alongside each user's own files. "
|
||||
"When False, only admins can see unowned documents."
|
||||
),
|
||||
"type": "boolean",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"default_owner_id": {
|
||||
"category": "Authentication",
|
||||
"description": (
|
||||
"Automatically assigns this owner ID to newly ingested documents that would otherwise "
|
||||
"have no owner. Leave empty to keep documents unowned until claimed."
|
||||
),
|
||||
"type": "string",
|
||||
"sensitive": False,
|
||||
"required": False,
|
||||
"restart_required": False,
|
||||
},
|
||||
"session_secret": {
|
||||
"category": "Authentication",
|
||||
"description": "Secret key for session encryption (min 32 characters)",
|
||||
|
||||
+13
-1
@@ -10,6 +10,7 @@ documents are visible to all users (single-user / shared mode).
|
||||
import logging
|
||||
|
||||
from fastapi import Request
|
||||
from sqlalchemy import or_
|
||||
from sqlalchemy.orm import Query
|
||||
from sqlalchemy.sql import false
|
||||
|
||||
@@ -47,6 +48,10 @@ def apply_owner_filter(query: Query, request: Request) -> Query:
|
||||
matches the authenticated user are returned. Admin users bypass
|
||||
the filter and see all documents.
|
||||
|
||||
When ``unowned_docs_visible_to_all`` is ``True`` (default), documents
|
||||
with ``owner_id IS NULL`` (unclaimed) are also included for every
|
||||
authenticated user so they can be discovered and claimed.
|
||||
|
||||
When multi-user mode is disabled the query is returned unchanged.
|
||||
|
||||
Args:
|
||||
@@ -69,4 +74,11 @@ def apply_owner_filter(query: Query, request: Request) -> Query:
|
||||
# No authenticated user — return empty result set
|
||||
return query.filter(false())
|
||||
|
||||
return query.filter(FileRecord.owner_id == owner_id)
|
||||
# Build filter: user's own documents
|
||||
conditions = [FileRecord.owner_id == owner_id]
|
||||
|
||||
# Optionally include unclaimed (owner_id IS NULL) documents
|
||||
if settings.unowned_docs_visible_to_all:
|
||||
conditions.append(FileRecord.owner_id.is_(None))
|
||||
|
||||
return query.filter(or_(*conditions))
|
||||
|
||||
Reference in New Issue
Block a user