#include "routes.h" #include "../servehelper.h" #include "../client.h" #include "../models.h" void status_route(const httplib::Request& req, httplib::Response& res) { std::string server = req.matches.str(1); std::string id = req.matches.str(2); std::optional post; PostContext context; try { post = mastodon_client.get_post(server, id); if (post) { context = mastodon_client.get_post_context(server, id); } } catch (const std::exception& e) { res.status = 500; serve_error(req, res, "500: Internal server error", "Failed to fetch post information", e.what()); return; } if (!post) { res.status = 404; serve_error(req, res, "404: Post not found"); return; } if (post->reblog) { serve_redirect(req, res, get_origin(req) + '/' + server + "/@" + post->reblog->account.acct(false) + '/' + post->reblog->id, true); return; } Element body("body"); body.nodes.reserve(context.ancestors.size() * 2 + 1 + context.descendants.size() * 2); for (const Post& i : context.ancestors) { body.nodes.push_back(serialize_post(req, server, i)); body.nodes.push_back(Element("hr")); } body.nodes.push_back(serialize_post(req, server, *post, false, true)); for (const Post& i : context.descendants) { body.nodes.push_back(Element("hr")); body.nodes.push_back(serialize_post(req, server, i)); } serve(req, res, "", std::move(body)); }