from ..models.users import User as users
from ..models.post import Post as post

from sqlalchemy.orm import Session
class Fpost:
    def __init__(self,session:Session):
        self.session=session
        return
    

    def getlist(self):
        results = self.session.query(post.id, post.title,post.status)
        return results
    def getpost(self,postid):
        res=self.session.query(post).filter(post.id==postid).first()
        return res
    def checkid(self,userid):
        res=self.session.query(users).filter(users.id==userid).first()
        if(not res):
            return False
        if res.role !='superadmin':
            return False
        return True
    
    def review(self,postid,status):
        res=self.session.query(post).filter(post.id==postid).first()
        if not res:
            return False
        res.status=status
        self.session.commit()
        return True