Label edit functionality added
Build LinkLog Development Image / development-image (push) Successful in 10s

This commit is contained in:
2026-08-27 20:38:02 +02:00
parent af5d38a16b
commit 89f9be5e72
10 changed files with 481 additions and 31 deletions
+17 -1
View File
@@ -10,7 +10,7 @@ from pydantic import BaseModel
from backend.app.api.dependencies import require_admin
from backend.app.database import get_connection, hash_password
from backend.app.services.link_service import delete_label
from backend.app.services.link_service import delete_label, update_label
from backend.app.services.email_service import (
get_smtp_settings,
save_smtp_settings,
@@ -35,6 +35,10 @@ class AdminPluginUpdate(BaseModel):
config: dict | None = None
class AdminLabelUpdate(BaseModel):
name: str
class AdminUserCreate(BaseModel):
username: str
email: str
@@ -304,6 +308,18 @@ def admin_delete_label(label_id: str, current_user: dict = Depends(require_admin
return {'status': 'deleted', 'id': label_id}
@router.put('/labels/{label_id}')
def admin_edit_label(label_id: str, payload: AdminLabelUpdate, current_user: dict = Depends(require_admin)):
try:
result = update_label(label_id, user_id=current_user['id'], name=payload.name, is_admin=True)
except ValueError as error:
raise HTTPException(status_code=409, detail=str(error)) from error
if result is None:
raise HTTPException(status_code=404, detail='Label not found')
record_audit_event(current_user['id'], 'label_updated', 'label', label_id)
return result
@router.get('/labels')
def admin_list_labels(_: dict = Depends(require_admin)):
with get_connection() as conn:
+16
View File
@@ -38,6 +38,22 @@ def get_current_user(
return dict(user)
def get_optional_current_user(
credentials: HTTPAuthorizationCredentials | None = Depends(bearer_scheme),
) -> dict | None:
if credentials is None or credentials.scheme.lower() != 'bearer':
return None
token_data = validate_token(credentials.credentials)
if token_data is None:
return None
with get_connection() as conn:
user = conn.execute(
'SELECT * FROM users WHERE id = ?',
(token_data['user_id'],),
).fetchone()
return dict(user) if user else None
def require_admin(user: dict = Depends(get_current_user)):
if not user['is_admin']:
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail='Administrator access required')
+5 -3
View File
@@ -2,10 +2,11 @@
## SPDX-License-Identifier: GPL-3.0-or-later
import json
from fastapi import APIRouter, Header, HTTPException, Response, status
from fastapi import APIRouter, Depends, Header, HTTPException, Response, status
import logging
from pydantic import BaseModel
from backend.app.api.dependencies import get_optional_current_user
from backend.app.services.link_service import create_link, delete_link, find_owned_link_by_title_url, get_link_tags, get_owned_link, list_public_links, list_tags, mark_mastodon_posted, update_link
from backend.app.database import get_connection
from backend.app.services.plugin_manager import plugin_manager
@@ -33,8 +34,9 @@ class LinkUpdate(BaseModel):
@router.get('/tags')
def available_tags():
return list_tags()
def available_tags(user: dict | None = Depends(get_optional_current_user)):
user_id = user['id'] if user else None
return list_tags(user_id=user_id)
@router.get('/scrape')