mirror of
https://github.com/open-webui/open-webui
synced 2025-06-04 03:37:35 +00:00
219 lines
6.3 KiB
Python
219 lines
6.3 KiB
Python
import json
|
|
import logging
|
|
from typing import Optional
|
|
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException, Request, status, BackgroundTasks
|
|
from pydantic import BaseModel
|
|
|
|
from open_webui.models.users import Users, UserResponse
|
|
from open_webui.models.notes import Notes, NoteModel, NoteForm, NoteUserResponse
|
|
|
|
from open_webui.config import ENABLE_ADMIN_CHAT_ACCESS, ENABLE_ADMIN_EXPORT
|
|
from open_webui.constants import ERROR_MESSAGES
|
|
from open_webui.env import SRC_LOG_LEVELS
|
|
|
|
|
|
from open_webui.utils.auth import get_admin_user, get_verified_user
|
|
from open_webui.utils.access_control import has_access, has_permission
|
|
|
|
log = logging.getLogger(__name__)
|
|
log.setLevel(SRC_LOG_LEVELS["MODELS"])
|
|
|
|
router = APIRouter()
|
|
|
|
############################
|
|
# GetNotes
|
|
############################
|
|
|
|
|
|
@router.get("/", response_model=list[NoteUserResponse])
|
|
async def get_notes(request: Request, user=Depends(get_verified_user)):
|
|
|
|
if user.role != "admin" and not has_permission(
|
|
user.id, "features.notes", request.app.state.config.USER_PERMISSIONS
|
|
):
|
|
raise HTTPException(
|
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
detail=ERROR_MESSAGES.UNAUTHORIZED,
|
|
)
|
|
|
|
notes = [
|
|
NoteUserResponse(
|
|
**{
|
|
**note.model_dump(),
|
|
"user": UserResponse(**Users.get_user_by_id(note.user_id).model_dump()),
|
|
}
|
|
)
|
|
for note in Notes.get_notes_by_user_id(user.id, "write")
|
|
]
|
|
|
|
return notes
|
|
|
|
|
|
@router.get("/list", response_model=list[NoteUserResponse])
|
|
async def get_note_list(request: Request, user=Depends(get_verified_user)):
|
|
|
|
if user.role != "admin" and not has_permission(
|
|
user.id, "features.notes", request.app.state.config.USER_PERMISSIONS
|
|
):
|
|
raise HTTPException(
|
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
detail=ERROR_MESSAGES.UNAUTHORIZED,
|
|
)
|
|
|
|
notes = [
|
|
NoteUserResponse(
|
|
**{
|
|
**note.model_dump(),
|
|
"user": UserResponse(**Users.get_user_by_id(note.user_id).model_dump()),
|
|
}
|
|
)
|
|
for note in Notes.get_notes_by_user_id(user.id, "read")
|
|
]
|
|
|
|
return notes
|
|
|
|
|
|
############################
|
|
# CreateNewNote
|
|
############################
|
|
|
|
|
|
@router.post("/create", response_model=Optional[NoteModel])
|
|
async def create_new_note(
|
|
request: Request, form_data: NoteForm, user=Depends(get_verified_user)
|
|
):
|
|
|
|
if user.role != "admin" and not has_permission(
|
|
user.id, "features.notes", request.app.state.config.USER_PERMISSIONS
|
|
):
|
|
raise HTTPException(
|
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
detail=ERROR_MESSAGES.UNAUTHORIZED,
|
|
)
|
|
|
|
try:
|
|
note = Notes.insert_new_note(form_data, user.id)
|
|
return note
|
|
except Exception as e:
|
|
log.exception(e)
|
|
raise HTTPException(
|
|
status_code=status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.DEFAULT()
|
|
)
|
|
|
|
|
|
############################
|
|
# GetNoteById
|
|
############################
|
|
|
|
|
|
@router.get("/{id}", response_model=Optional[NoteModel])
|
|
async def get_note_by_id(request: Request, id: str, user=Depends(get_verified_user)):
|
|
if user.role != "admin" and not has_permission(
|
|
user.id, "features.notes", request.app.state.config.USER_PERMISSIONS
|
|
):
|
|
raise HTTPException(
|
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
detail=ERROR_MESSAGES.UNAUTHORIZED,
|
|
)
|
|
|
|
note = Notes.get_note_by_id(id)
|
|
if not note:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_404_NOT_FOUND, detail=ERROR_MESSAGES.NOT_FOUND
|
|
)
|
|
|
|
if (
|
|
user.role != "admin"
|
|
and user.id != note.user_id
|
|
and not has_access(user.id, type="read", access_control=note.access_control)
|
|
):
|
|
raise HTTPException(
|
|
status_code=status.HTTP_403_FORBIDDEN, detail=ERROR_MESSAGES.DEFAULT()
|
|
)
|
|
|
|
return note
|
|
|
|
|
|
############################
|
|
# UpdateNoteById
|
|
############################
|
|
|
|
|
|
@router.post("/{id}/update", response_model=Optional[NoteModel])
|
|
async def update_note_by_id(
|
|
request: Request, id: str, form_data: NoteForm, user=Depends(get_verified_user)
|
|
):
|
|
if user.role != "admin" and not has_permission(
|
|
user.id, "features.notes", request.app.state.config.USER_PERMISSIONS
|
|
):
|
|
raise HTTPException(
|
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
detail=ERROR_MESSAGES.UNAUTHORIZED,
|
|
)
|
|
|
|
note = Notes.get_note_by_id(id)
|
|
if not note:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_404_NOT_FOUND, detail=ERROR_MESSAGES.NOT_FOUND
|
|
)
|
|
|
|
if (
|
|
user.role != "admin"
|
|
and user.id != note.user_id
|
|
and not has_access(user.id, type="write", access_control=note.access_control)
|
|
):
|
|
raise HTTPException(
|
|
status_code=status.HTTP_403_FORBIDDEN, detail=ERROR_MESSAGES.DEFAULT()
|
|
)
|
|
|
|
try:
|
|
note = Notes.update_note_by_id(id, form_data)
|
|
return note
|
|
except Exception as e:
|
|
log.exception(e)
|
|
raise HTTPException(
|
|
status_code=status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.DEFAULT()
|
|
)
|
|
|
|
|
|
############################
|
|
# DeleteNoteById
|
|
############################
|
|
|
|
|
|
@router.delete("/{id}/delete", response_model=bool)
|
|
async def delete_note_by_id(request: Request, id: str, user=Depends(get_verified_user)):
|
|
if user.role != "admin" and not has_permission(
|
|
user.id, "features.notes", request.app.state.config.USER_PERMISSIONS
|
|
):
|
|
raise HTTPException(
|
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
detail=ERROR_MESSAGES.UNAUTHORIZED,
|
|
)
|
|
|
|
note = Notes.get_note_by_id(id)
|
|
if not note:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_404_NOT_FOUND, detail=ERROR_MESSAGES.NOT_FOUND
|
|
)
|
|
|
|
if (
|
|
user.role != "admin"
|
|
and user.id != note.user_id
|
|
and not has_access(user.id, type="write", access_control=note.access_control)
|
|
):
|
|
raise HTTPException(
|
|
status_code=status.HTTP_403_FORBIDDEN, detail=ERROR_MESSAGES.DEFAULT()
|
|
)
|
|
|
|
try:
|
|
note = Notes.delete_note_by_id(id)
|
|
return True
|
|
except Exception as e:
|
|
log.exception(e)
|
|
raise HTTPException(
|
|
status_code=status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.DEFAULT()
|
|
)
|