96 lines
2.7 KiB
TypeScript
96 lines
2.7 KiB
TypeScript
import { Router } from "express";
|
|
import { NoteObject, ActorObject } from "./activity";
|
|
import { getCachedActor } from "./federate";
|
|
import { getConnection } from "typeorm";
|
|
import Note from "../entity/Note";
|
|
import Article from "../entity/Article";
|
|
|
|
const domain = process.env.DOMAIN;
|
|
|
|
interface Comment {
|
|
id: string;
|
|
content: string;
|
|
published: string;
|
|
inReplyTo: string;
|
|
author: ActorObject;
|
|
}
|
|
|
|
async function getConversationComments(conversation: string): Promise<Comment[]> {
|
|
try {
|
|
const notes = await getConnection().getRepository(Note).find({ where: { conversation }, relations: ["actor"] });
|
|
return notes.map(it => {
|
|
return {
|
|
id: it.id,
|
|
content: it.content,
|
|
published: it.published,
|
|
inReplyTo: it.inReplyTo,
|
|
author: {
|
|
id: it.actor.id,
|
|
name: it.actor.displayName,
|
|
icon: it.actor.iconURL
|
|
} as ActorObject
|
|
} as Comment;
|
|
});
|
|
} catch (err) {
|
|
console.log("Couldn't load comments: ", err);
|
|
return [];
|
|
}
|
|
//return new Promise((resolve, reject) => {
|
|
//db.all("SELECT notes.id AS comment_id, notes.content, notes.published, notes.in_reply_to, actors.id AS actor_id, actors.display_name, actors.icon_url FROM notes INNER JOIN actors ON actors.id = notes.attributed_to WHERE notes.conversation = $conversation", {
|
|
//$conversation: conversation
|
|
//}, (err, rows) => {
|
|
//if (err) {
|
|
//reject(err);
|
|
//} else {
|
|
//const comments = rows.map(row => {
|
|
//return {
|
|
//id: row.comment_id,
|
|
//content: row.content,
|
|
//published: row.published,
|
|
//inReplyTo: row.in_reply_to,
|
|
//author: {
|
|
//id: row.actor_id,
|
|
//name: row.display_name,
|
|
//icon: row.icon_url
|
|
//} as ActorObject
|
|
//} as Comment;
|
|
//});
|
|
//resolve(comments);
|
|
//}
|
|
//})
|
|
//});
|
|
}
|
|
|
|
export default function comments(router: Router) {
|
|
router.get("/ap/conversation/:id", async (req, res) => {
|
|
const comments = await getConversationComments(`https://${domain}/ap/conversation/${req.params.id}`);
|
|
res.json(comments).end();
|
|
});
|
|
|
|
router.get("/comments", async (req, res) => {
|
|
const id = req.query.id;
|
|
if (!id) {
|
|
res.sendStatus(400).end();
|
|
return;
|
|
}
|
|
try {
|
|
const article = await getConnection().getRepository(Article).findOne(id);
|
|
const comments = await getConversationComments(article.conversation);
|
|
res.json(comments).end();
|
|
} catch (err) {
|
|
console.error("Couldn't retrieve conversation: ", err);
|
|
res.json([]).end();
|
|
}
|
|
//db.get("SELECT conversation FROM articles WHERE id = $id", {
|
|
//$id: id
|
|
//}, async (err, result) => {
|
|
//if (!result || !result.conversation) {
|
|
//res.json([]).end();
|
|
//return;
|
|
//}
|
|
//const comments = await getConversationComments(result.conversation, db);
|
|
//res.json(comments).end();
|
|
//});
|
|
});
|
|
}
|