import time from typing import cast, Optional, List from sqlalchemy import select from sqlmodel.ext.asyncio.session import AsyncSession from defs import sqlite from models.models.post import Post class PostAction: @staticmethod async def add_post(post: Post): async with sqlite.session() as session: session = cast(AsyncSession, session) session.add(post) await session.commit() @staticmethod async def update_post(old_post: Post, new_post: Post = None): if new_post: old_post.tid = new_post.tid old_post.uid = new_post.uid old_post.title = new_post.title old_post.content = new_post.content old_post.create_time = new_post.create_time old_post.update_time = new_post.update_time old_post.is_hidden = new_post.is_hidden old_post.is_delete = new_post.is_delete async with sqlite.session() as session: session = cast(AsyncSession, session) session.add(old_post) await session.commit() await session.refresh(old_post) @staticmethod async def get_post_by_pid(pid: int) -> Post: async with sqlite.session() as session: session = cast(AsyncSession, session) query = select(Post).where(Post.pid == pid) results = await session.execute(query) return post[0] if (post := results.first()) else None @staticmethod async def get_posts_by_tid(tid: int = None, admin: bool = False) -> List[Post]: async with sqlite.session() as session: session = cast(AsyncSession, session) query = select(Post) if tid: query = query.where(Post.tid == tid) if not admin: query = query.where( Post.is_delete == False ).where( Post.is_hidden == False ) results = await session.execute(query) return results.scalars().all() @staticmethod def gen_new_post( tid: int, uid: int, title: str, content: str, create_time: Optional[int] = None, update_time: Optional[int] = None, is_hidden: Optional[bool] = False, is_delete: Optional[bool] = False, ) -> Post: if not create_time: create_time = int(time.time()) return Post( tid=tid, uid=uid, title=title, content=content, create_time=create_time, update_time=update_time, is_hidden=is_hidden, is_delete=is_delete, )