172 lines
5.6 KiB
JavaScript
Executable File
172 lines
5.6 KiB
JavaScript
Executable File
// Optimized postHotness function
|
|
function postHotness(upvotes, created) {
|
|
let s = 0;
|
|
for (let i = 1; i <= upvotes; i++) {
|
|
if (i <= 3) {
|
|
s += 1;
|
|
} else if (i <= 6) {
|
|
s += 3;
|
|
} else if (i <= 10) {
|
|
s += 3;
|
|
} else if (i <= 20) {
|
|
s += 4;
|
|
} else if (i <= 40) {
|
|
s += 5;
|
|
} else {
|
|
s += 6;
|
|
}
|
|
}
|
|
|
|
const order = Math.log10(Math.max(Math.abs(s), 1));
|
|
let sign = 0;
|
|
if (s > 0) {
|
|
sign = 1;
|
|
} else if (s < 0) {
|
|
sign = -1;
|
|
}
|
|
|
|
const interval = 45000; // or 69000
|
|
const createdDate = new Date(created);
|
|
const seconds = createdDate.getTime() / 1000;
|
|
const hotness = order + (sign * seconds) / interval;
|
|
return Math.round(hotness * 10000000);
|
|
}
|
|
|
|
module.exports = function (fastify, opts, done) {
|
|
const pb = opts.pb;
|
|
|
|
fastify.post("/get-post", async (request, reply) => {
|
|
const data = request.body;
|
|
|
|
let filter;
|
|
const sort = data?.sortingPosts === "hot" ? "-upvote" : "-created";
|
|
let pinnedPost;
|
|
let posts;
|
|
|
|
try {
|
|
if (data?.seenPostId.length !== 0) {
|
|
filter = data?.seenPostId?.map((id) => `id!="${id}"`).join("&&");
|
|
|
|
//applies only for profile and user directory
|
|
if (data?.userId) {
|
|
filter += `&& user="${data?.userId}" && pinned=false`;
|
|
}
|
|
|
|
if (data?.filterTicker) {
|
|
filter += `&& tagline="${data?.filterTicker}" && pinned=false`;
|
|
}
|
|
|
|
if (data?.sortingPosts === "hot") {
|
|
//community page code space
|
|
// In case of sort === 'hot' show the most recent post up to 7 week by ranking them with the function postHotness
|
|
|
|
let endDate = new Date();
|
|
// Get the date one week earlier
|
|
let startDate = new Date();
|
|
startDate.setDate(endDate.getDate() - 180);
|
|
endDate.setDate(endDate.getDate() + 1);
|
|
|
|
// Format the dates as needed (e.g., "YYYY-MM-DD")
|
|
let endDateStr = endDate.toISOString().split("T")[0];
|
|
let startDateStr = startDate.toISOString().split("T")[0];
|
|
|
|
filter += `&& created >= "${startDateStr}" && created <= "${endDateStr}" && pinned = false`;
|
|
}
|
|
|
|
posts = (
|
|
await pb.collection("posts").getList(data?.startPage, 10, {
|
|
sort: "-created",
|
|
filter: filter,
|
|
expand: "user,comments(post),alreadyVoted(post)",
|
|
fields:
|
|
"*,expand.user,expand.comments(post), expand.alreadyVoted(post).user,expand.alreadyVoted(post).type",
|
|
})
|
|
)?.items;
|
|
|
|
if (data?.sortingPosts === "hot") {
|
|
// Add hotness property to each post
|
|
posts?.forEach((post) => {
|
|
post.hotness = postHotness(post?.upvote, post?.created);
|
|
});
|
|
posts?.sort((a, b) => b?.hotness - a?.hotness);
|
|
}
|
|
} else {
|
|
if (data?.userId) {
|
|
posts = (
|
|
await pb.collection("posts").getList(data?.startPage, 10, {
|
|
sort: sort,
|
|
filter: `user="${data?.userId}" && pinned=false`,
|
|
expand: `user,comments(post),alreadyVoted(post)`,
|
|
fields:
|
|
"*,expand.user,expand.comments(post), expand.alreadyVoted(post).user,expand.alreadyVoted(post).type",
|
|
})
|
|
)?.items;
|
|
} else if (data?.filterTicker) {
|
|
posts = await pb.collection("posts").getList(data?.startPage, 10, {
|
|
sort: sort,
|
|
filter: `tagline="${data?.filterTicker}" && pinned=false`,
|
|
expand: `user,comments(post),alreadyVoted(post)`,
|
|
fields:
|
|
"*,expand.user,expand.comments(post), expand.alreadyVoted(post).user,expand.alreadyVoted(post).type",
|
|
});
|
|
} else {
|
|
//community page code space
|
|
// In case of sort === 'hot' show the most recent post up to 7 week by ranking them with the function postHotness
|
|
|
|
if (data?.sortingPosts === "hot") {
|
|
let endDate = new Date();
|
|
// Get the date one week earlier
|
|
let startDate = new Date();
|
|
startDate.setDate(endDate.getDate() - 30);
|
|
endDate.setDate(endDate.getDate() + 1);
|
|
|
|
// Format the dates as needed (e.g., "YYYY-MM-DD")
|
|
let endDateStr = endDate.toISOString().split("T")[0];
|
|
let startDateStr = startDate.toISOString().split("T")[0];
|
|
|
|
filter = `created >= "${startDateStr}" && created <= "${endDateStr}" && pinned = false`;
|
|
} else {
|
|
filter = `pinned=false`;
|
|
}
|
|
posts = await pb.collection("posts").getList(1, 10, {
|
|
sort: "-created",
|
|
filter: filter,
|
|
expand: "user, comments(post), alreadyVoted(post)",
|
|
fields:
|
|
"*,expand.user,expand.comments(post), expand.alreadyVoted(post).user,expand.alreadyVoted(post).type",
|
|
});
|
|
|
|
posts = posts.items;
|
|
// Add hotness property to each post
|
|
if (data?.sortingPosts === "hot") {
|
|
posts?.forEach((post) => {
|
|
post.hotness = postHotness(post?.upvote, post?.created);
|
|
});
|
|
|
|
posts?.sort((a, b) => b?.hotness - a?.hotness);
|
|
}
|
|
|
|
pinnedPost = await pb.collection("posts").getFullList({
|
|
filter: `pinned=true`,
|
|
sort: "-created",
|
|
expand: `user,comments(post),alreadyVoted(post)`,
|
|
fields:
|
|
"*,expand.user,expand.comments(post), expand.alreadyVoted(post).user,expand.alreadyVoted(post).type",
|
|
});
|
|
|
|
for (let i = pinnedPost?.length - 1; i >= 0; i--) {
|
|
posts?.unshift(pinnedPost[i]);
|
|
}
|
|
}
|
|
}
|
|
} catch (e) {
|
|
//console.log(e)
|
|
posts = [];
|
|
}
|
|
|
|
reply.send({ items: posts });
|
|
});
|
|
|
|
done();
|
|
};
|