const{id: rawId}=awaitparams;constpost=db.prepare("SELECT p.content,p.hidden,p.visibility,p.origin,u.username,s.name,s.remote_user,s.base_url AS source_base_url FROM posts p JOIN users u ON u.id=p.author_id LEFT JOIN sources s ON s.id=p.source_id WHERE p.id=?").get(Number(rawId))as{content: string;hidden: number;visibility: string;origin: string;username: string;name: string|null;remote_user: string|null;source_base_url: string|null}|undefined;
constpost=db.prepare("SELECT p.*,u.username,s.name,s.base_url AS source_base_url,s.remote_user,s.remote_display_name FROM posts p JOIN users u ON u.id=p.author_id LEFT JOIN sources s ON s.id=p.source_id WHERE p.id=?").get(id)asany;constquery=awaitsearchParams;
if(user&&post.visibility==="PUBLIC")db.prepare("INSERT INTO reading_history(user_id,post_id) VALUES(?,?) ON CONFLICT(user_id,post_id) DO UPDATE SET last_read_at=CURRENT_TIMESTAMP").run(user.id,id);
constbookmark=user?db.prepare("SELECT kind FROM bookmarks WHERE user_id=? AND post_id=?").get(user.id,id)as{kind: string}|undefined:undefined;
constcomments=db.prepare("SELECT c.*,u.username FROM comments c JOIN users u ON u.id=c.author_id WHERE c.post_id=? AND c.hidden=0 ORDER BY c.created_at").all(id)asany[];
constreactions=db.prepare("SELECT emoji,count(*) count FROM reactions WHERE post_id=? GROUP BY emoji").all(id)asany[];
lettags: string[]=[];try{tags=canonicalTags(JSON.parse(post.tags_json));}catch{}constpublishedAt=post.remote_created_at||post.created_at;constcanExport=Boolean(user&&(post.author_id===user.id||(post.source_id&&db.prepare("SELECT 1 FROM source_members WHERE source_id=? AND user_id=?").get(post.source_id,user.id))));return<article><pclassName="meta">{postAuthorLabel(post)}·{newDate(publishedAt).toLocaleString("zh-TW")}{post.remote_url&&<>·<ahref={post.remote_url}target="_blank"rel="noreferrer">在Memos開啟</a></>}</p>{canExport&&<pclassName="row"><ahref={`/api/export/posts/${id}?format=json`}>匯出JSON</a><ahref={`/api/export/posts/${id}?format=markdown`}>匯出Markdown</a></p>}<sectionclassName="card"><Markdowncontent={post.content}tags={tags}/></section><Attachmentsjson={post.attachments_json}sourceBaseUrl={post.source_base_url}/>