add Post.feed_info()

This commit is contained in:
Yusur 2025-09-11 12:33:41 +02:00
parent 87d2eb6d0b
commit b6fa88f201
4 changed files with 25 additions and 6 deletions

View file

@ -26,7 +26,7 @@ from suou import twocolon_list, WantsContentType
from .colors import color_themes, theme_classes
__version__ = '0.5.0-dev35'
__version__ = '0.5.0-dev36'
APP_BASE_DIR = os.path.dirname(os.path.dirname(__file__))

View file

@ -79,3 +79,5 @@ class UserLoader(AuthUser):
return self._auth_obj
id: int
username: str
display_name: str

View file

@ -644,6 +644,16 @@ class Post(Base):
def is_text_post(self):
return self.post_type == POST_TYPE_DEFAULT
def feed_info(self):
return dict(
id=Snowflake(self.id).to_b32l(),
slug = self.slug,
title = self.title,
author = self.author.simple_info(),
to = self.topic_or_user().simple_info(),
created_at = self.created_at
)
class Comment(Base):
__tablename__ = 'freak_comment'
__table_args__ = (

View file

@ -3,7 +3,7 @@ from __future__ import annotations
from flask import abort
from pydantic import BaseModel
from quart import Blueprint, redirect, url_for
from quart import Blueprint, redirect, request, url_for
from quart_auth import AuthUser, current_user, login_required, login_user, logout_user
from quart_schema import QuartSchema, validate_request, validate_response
from sqlalchemy import select
@ -48,9 +48,10 @@ async def health():
## to get complete sooner or later
## XXX there is a bug in suou.sqlalchemy.auth_required() — apparently, /user/@me does not
## redirect, neither is able to get user injected.
## redirect, neither is able to get user injected. It was therefore dismissed.
## Auth-based REST endpoints won't be fully functional until 0.6 in most cases
## USERS ##
@bp.get('/user/@me')
@login_required
@ -84,6 +85,7 @@ async def resolve_user(username: str):
abort(404, 'User not found')
return redirect(url_for('rest.user_get', id=uid)), 302
## POSTS ##
@bp.get('/post/<b32l:id>')
async def get_post(id: int):
@ -104,6 +106,8 @@ async def get_post(id: int):
return dict(posts={f'{Snowflake(id):l}': pj})
## GUILDS ##
async def _guild_info(gu: Guild):
return dict(
id = f'{Snowflake(gu.id):l}',
@ -138,21 +142,24 @@ async def guild_feed(gname: str):
# TODO add feed
feed = []
algo = topic_timeline(gname)
posts: list[Post] = makelist((await db.paginate(algo)))
for p in posts:
posts = await db.paginate(algo)
async for p in posts:
feed.append(p.feed_info())
return dict(guilds={f'{Snowflake(gu.id):l}': gj}, feed=feed)
## LOGIN/OUT ##
class LoginIn(BaseModel):
username: str
password: str
remember: bool
remember: bool = False
@bp.post('/login')
@validate_request(LoginIn)
async def login(data: LoginIn):
print(data)
async with db as session:
u = (await session.execute(select(User).where(User.username == data.username))).scalar()
match check_login(u, data.password):