OpChan/src/lib/forum/transformers.ts

136 lines
5.0 KiB
TypeScript
Raw Normal View History

2025-04-27 15:54:24 +05:30
import { Cell, Post, Comment, OpchanMessage } from '@/types';
import { CellMessage, CommentMessage, MessageType, PostMessage, VoteMessage } from '@/lib/waku/types';
import messageManager from '@/lib/waku';
2025-04-27 15:54:24 +05:30
type VerifyFunction = (message: OpchanMessage) => boolean;
export const transformCell = (
2025-07-30 13:22:06 +05:30
cellMessage: CellMessage,
2025-04-27 15:54:24 +05:30
verifyMessage?: VerifyFunction
): Cell | null => {
if (verifyMessage && !verifyMessage(cellMessage)) {
console.warn(`Cell message ${cellMessage.id} failed verification`);
return null;
}
return {
id: cellMessage.id,
name: cellMessage.name,
description: cellMessage.description,
icon: cellMessage.icon || '',
2025-04-27 15:54:24 +05:30
signature: cellMessage.signature,
2025-07-30 13:22:06 +05:30
browserPubKey: cellMessage.browserPubKey,
};
};
2025-04-27 15:54:24 +05:30
export const transformPost = (
postMessage: PostMessage,
verifyMessage?: VerifyFunction
): Post | null => {
if (verifyMessage && !verifyMessage(postMessage)) {
console.warn(`Post message ${postMessage.id} failed verification`);
return null;
}
const votes = Object.values(messageManager.messageCache.votes).filter(
2025-07-30 13:22:06 +05:30
(vote) => vote.targetId === postMessage.id,
);
2025-07-30 13:22:06 +05:30
const filteredVotes = verifyMessage
? votes.filter((vote) => verifyMessage(vote))
2025-04-27 15:54:24 +05:30
: votes;
2025-07-30 13:22:06 +05:30
const upvotes = filteredVotes.filter((vote) => vote.value === 1);
const downvotes = filteredVotes.filter((vote) => vote.value === -1);
2025-04-27 15:54:24 +05:30
const modMsg = messageManager.messageCache.moderations[postMessage.id];
const isPostModerated = !!modMsg && modMsg.targetType === 'post';
const userModMsg = Object.values(messageManager.messageCache.moderations).find(
2025-07-30 13:22:06 +05:30
(m) => m.targetType === 'user' && m.cellId === postMessage.cellId && m.targetId === postMessage.author,
);
const isUserModerated = !!userModMsg;
return {
id: postMessage.id,
cellId: postMessage.cellId,
authorAddress: postMessage.author,
title: postMessage.title,
content: postMessage.content,
timestamp: postMessage.timestamp,
2025-07-30 13:22:06 +05:30
upvotes,
downvotes,
2025-04-27 15:54:24 +05:30
signature: postMessage.signature,
browserPubKey: postMessage.browserPubKey,
moderated: isPostModerated || isUserModerated,
moderatedBy: isPostModerated ? modMsg.author : isUserModerated ? userModMsg!.author : undefined,
moderationReason: isPostModerated ? modMsg.reason : isUserModerated ? userModMsg!.reason : undefined,
moderationTimestamp: isPostModerated ? modMsg.timestamp : isUserModerated ? userModMsg!.timestamp : undefined,
};
};
2025-04-27 15:54:24 +05:30
export const transformComment = (
commentMessage: CommentMessage,
2025-07-30 13:22:06 +05:30
verifyMessage?: VerifyFunction,
2025-04-27 15:54:24 +05:30
): Comment | null => {
if (verifyMessage && !verifyMessage(commentMessage)) {
console.warn(`Comment message ${commentMessage.id} failed verification`);
return null;
}
const votes = Object.values(messageManager.messageCache.votes).filter(
2025-07-30 13:22:06 +05:30
(vote) => vote.targetId === commentMessage.id,
);
2025-07-30 13:22:06 +05:30
const filteredVotes = verifyMessage
? votes.filter((vote) => verifyMessage(vote))
2025-04-27 15:54:24 +05:30
: votes;
2025-07-30 13:22:06 +05:30
const upvotes = filteredVotes.filter((vote) => vote.value === 1);
const downvotes = filteredVotes.filter((vote) => vote.value === -1);
const modMsg = messageManager.messageCache.moderations[commentMessage.id];
const isCommentModerated = !!modMsg && modMsg.targetType === 'comment';
const userModMsg = Object.values(messageManager.messageCache.moderations).find(
2025-07-30 13:22:06 +05:30
(m) =>
m.targetType === 'user' &&
m.cellId === commentMessage.postId.split('-')[0] &&
m.targetId === commentMessage.author,
);
const isUserModerated = !!userModMsg;
return {
id: commentMessage.id,
postId: commentMessage.postId,
authorAddress: commentMessage.author,
content: commentMessage.content,
timestamp: commentMessage.timestamp,
2025-07-30 13:22:06 +05:30
upvotes,
downvotes,
2025-04-27 15:54:24 +05:30
signature: commentMessage.signature,
browserPubKey: commentMessage.browserPubKey,
moderated: isCommentModerated || isUserModerated,
moderatedBy: isCommentModerated ? modMsg.author : isUserModerated ? userModMsg!.author : undefined,
moderationReason: isCommentModerated ? modMsg.reason : isUserModerated ? userModMsg!.reason : undefined,
moderationTimestamp: isCommentModerated ? modMsg.timestamp : isUserModerated ? userModMsg!.timestamp : undefined,
};
};
2025-04-27 15:54:24 +05:30
export const transformVote = (
voteMessage: VoteMessage,
2025-07-30 13:22:06 +05:30
verifyMessage?: VerifyFunction,
2025-04-27 15:54:24 +05:30
): VoteMessage | null => {
if (verifyMessage && !verifyMessage(voteMessage)) {
console.warn(`Vote message ${voteMessage.id} failed verification`);
return null;
}
return voteMessage;
};
export const getDataFromCache = (verifyMessage?: VerifyFunction) => {
const cells = Object.values(messageManager.messageCache.cells)
2025-07-30 13:22:06 +05:30
.map((cell) => transformCell(cell, verifyMessage))
.filter(Boolean) as Cell[];
2025-04-27 15:54:24 +05:30
const posts = Object.values(messageManager.messageCache.posts)
2025-07-30 13:22:06 +05:30
.map((post) => transformPost(post, verifyMessage))
.filter(Boolean) as Post[];
2025-04-27 15:54:24 +05:30
const comments = Object.values(messageManager.messageCache.comments)
2025-07-30 13:22:06 +05:30
.map((c) => transformComment(c, verifyMessage))
.filter(Boolean) as Comment[];
return { cells, posts, comments };
2025-07-30 13:22:06 +05:30
};