from sqlalchemy import Select, Delete, cast, String from src.uploaded_file.model import UploadedFileData from src.uploaded_file.schema import UploadedFileDataCreate, UploadedFileDataUpdate from src.database.service import search_filter_sort_paginate from typing import Optional from src.database.core import DbSession from src.auth.service import CurrentUser async def get(*, db_session: DbSession, uploaded_file_id: str) -> Optional[UploadedFileData]: """Returns a document based on the given document id.""" query = Select(UploadedFileData).filter(UploadedFileData.id == uploaded_file_id) result = await db_session.execute(query) return result.scalars().one_or_none() async def get_all( *, db_session: DbSession, items_per_page: Optional[int], search: Optional[str] = None, common, ): """Returns all documents.""" query = Select(UploadedFileData).order_by(UploadedFileData.created_at.desc()) if search: query = query.filter(cast(UploadedFileData.filename, String).ilike(f"%{search}%")) common["items_per_page"] = items_per_page results = await search_filter_sort_paginate(model=query, **common) # return results.scalars().all() return results async def create(*, db_session: DbSession, uploaded_file_in: UploadedFileDataCreate): """Creates a new document.""" uploaded_file = UploadedFileData(**uploaded_file_in.model_dump()) db_session.add(uploaded_file) await db_session.commit() return uploaded_file async def update( *, db_session: DbSession, uploaded_file: UploadedFileData, uploaded_file_in: UploadedFileDataUpdate ): """Updates a document.""" data = uploaded_file_in.model_dump() update_data = uploaded_file_in.model_dump(exclude_defaults=True) for field in data: if field in update_data: setattr(uploaded_file, field, update_data[field]) await db_session.commit() return uploaded_file async def delete(*, db_session: DbSession, uploaded_file_id: str): """Deletes a document.""" query = Delete(UploadedFileData).where(UploadedFileData.id == uploaded_file_id) await db_session.execute(query) await db_session.commit()