Improve file listing and fix notification metadata field

Backend:
- Optimize file listing for non-superusers with dedicated CRUD methods
- Add get_visible_for_user and count_visible_for_user for efficient queries
- Move /allowed-types/ and /max-size/ routes before /{file_id} for proper matching
- Rename notification 'metadata' field to 'extra_data' for clarity
- Fix settings export to use get_value() method

Frontend:
- Update NotificationItem interface to use extra_data field

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-20 22:27:08 +01:00
parent 724d550599
commit fc605f03c9
5 changed files with 117 additions and 74 deletions

View File

@@ -137,57 +137,53 @@ def list_files(
# Filter by ownership for non-superusers
if not current_user.is_superuser:
if mine_only:
uploaded_by = current_user.id
is_public = None
files = crud.file_storage.get_multi(
db,
skip=skip,
limit=page_size,
uploaded_by=current_user.id,
is_public=is_public,
content_type=content_type
)
total = crud.file_storage.count(
db,
uploaded_by=current_user.id,
is_public=is_public,
content_type=content_type
)
else:
# Show user's files and public files
own_files = crud.file_storage.get_multi(
files = crud.file_storage.get_visible_for_user(
db,
skip=0,
limit=1000, # Get all for filtering
uploaded_by=current_user.id
user_id=current_user.id,
skip=skip,
limit=page_size,
is_public=is_public,
content_type=content_type
)
public_files = crud.file_storage.get_multi(
total = crud.file_storage.count_visible_for_user(
db,
skip=0,
limit=1000,
is_public=True
user_id=current_user.id,
is_public=is_public,
content_type=content_type
)
# Combine and deduplicate
all_files = {f.id: f for f in own_files}
all_files.update({f.id: f for f in public_files})
files_list = list(all_files.values())
# Sort by created_at desc
files_list.sort(key=lambda x: x.created_at, reverse=True)
# Paginate
total = len(files_list)
files = files_list[skip:skip + page_size]
return {
"files": [file_to_schema(f) for f in files],
"total": total,
"page": page,
"page_size": page_size
}
uploaded_by = current_user.id if mine_only else None
else:
uploaded_by = current_user.id if mine_only else None
files = crud.file_storage.get_multi(
db,
skip=skip,
limit=page_size,
uploaded_by=uploaded_by,
is_public=is_public,
content_type=content_type
)
files = crud.file_storage.get_multi(
db,
skip=skip,
limit=page_size,
uploaded_by=uploaded_by,
is_public=is_public,
content_type=content_type
)
total = crud.file_storage.count(
db,
uploaded_by=uploaded_by,
is_public=is_public
)
total = crud.file_storage.count(
db,
uploaded_by=uploaded_by,
is_public=is_public,
content_type=content_type
)
return {
"files": [file_to_schema(f) for f in files],
@@ -197,6 +193,29 @@ def list_files(
}
@router.get("/allowed-types/", response_model=List[str])
def get_allowed_types(
current_user: User = Depends(get_current_user),
):
"""
Get list of allowed file types for upload.
"""
return ALLOWED_CONTENT_TYPES
@router.get("/max-size/", response_model=dict)
def get_max_size(
current_user: User = Depends(get_current_user),
):
"""
Get maximum allowed file size.
"""
return {
"max_size_bytes": MAX_FILE_SIZE,
"max_size_mb": MAX_FILE_SIZE / (1024 * 1024)
}
@router.get("/{file_id}", response_model=StoredFileSchema)
def get_file(
file_id: str,
@@ -352,26 +371,3 @@ def delete_file(
crud.file_storage.soft_delete(db, id=file_id)
return None
@router.get("/allowed-types/", response_model=List[str])
def get_allowed_types(
current_user: User = Depends(get_current_user),
):
"""
Get list of allowed file types for upload.
"""
return ALLOWED_CONTENT_TYPES
@router.get("/max-size/", response_model=dict)
def get_max_size(
current_user: User = Depends(get_current_user),
):
"""
Get maximum allowed file size.
"""
return {
"max_size_bytes": MAX_FILE_SIZE,
"max_size_mb": MAX_FILE_SIZE / (1024 * 1024)
}