codex/fix-502-feed-profile #1

Merged
adolforeyna merged 2 commits from codex/fix-502-feed-profile into master 2026-02-21 00:46:35 +00:00
4 changed files with 74 additions and 35 deletions
Showing only changes of commit c136d25974 - Show all commits
+8 -5
View File
@@ -96,16 +96,18 @@ userDB = (DB) => {
DB.getFriendsFriends = async (profileId, limit = 10) => { DB.getFriendsFriends = async (profileId, limit = 10) => {
const profile = await DB.getProfile(profileId); const profile = await DB.getProfile(profileId);
if (!profile) return []; if (!profile) return [];
let ids = profile.following.map((id) => DB.ObjectID(id)); const following = Array.isArray(profile.following) ? profile.following : [];
let ids = following.filter((id) => DB.ObjectID.isValid(id)).map((id) => DB.ObjectID(id));
let alreadyFollowingMap = {}; let alreadyFollowingMap = {};
alreadyFollowingMap[profileId] = 1; //skip that profile alreadyFollowingMap[profileId] = 1; //skip that profile
profile.following.forEach(id => { following.forEach(id => {
if (!alreadyFollowingMap[id]) alreadyFollowingMap[id] = 1; if (!alreadyFollowingMap[id]) alreadyFollowingMap[id] = 1;
}) })
return DB.profileCols.find({ _id: { $in: ids } }).project({ following: 1 }).limit(limit).toArray().then(profiles => { return DB.profileCols.find({ _id: { $in: ids } }).project({ following: 1 }).limit(limit).toArray().then(profiles => {
let friendsOfFriendsMap = {}; let friendsOfFriendsMap = {};
profiles.forEach(p => { profiles.forEach(p => {
p.following.forEach(followingId => { const related = Array.isArray(p.following) ? p.following : [];
related.forEach(followingId => {
if (alreadyFollowingMap[followingId]) return 0; if (alreadyFollowingMap[followingId]) return 0;
if (!friendsOfFriendsMap[followingId]) friendsOfFriendsMap[followingId] = 0; if (!friendsOfFriendsMap[followingId]) friendsOfFriendsMap[followingId] = 0;
friendsOfFriendsMap[followingId] = friendsOfFriendsMap[followingId] + 1; friendsOfFriendsMap[followingId] = friendsOfFriendsMap[followingId] + 1;
@@ -312,9 +314,10 @@ userDB = (DB) => {
DB.getFollowingGroups = async (profileid) => { DB.getFollowingGroups = async (profileid) => {
const profile = await DB.getProfile(profileid); const profile = await DB.getProfile(profileid);
let ids = []; let ids = [];
for (id in profile.following) { const following = Array.isArray(profile?.following) ? profile.following : [];
for (id in following) {
try { try {
let oId = DB.ObjectID(profile.following[id]); let oId = DB.ObjectID(following[id]);
let checkProfile = await DB.getProfileCache(oId) let checkProfile = await DB.getProfileCache(oId)
if (checkProfile && checkProfile.isGroup && !checkProfile.isChat) { if (checkProfile && checkProfile.isGroup && !checkProfile.isChat) {
ids.push(oId) ids.push(oId)
+15 -4
View File
@@ -2,19 +2,30 @@ const { getSessionId, getUserId, getProfileId } = require('../utils/sessionUtils
const { client_logger } = require('../utils/analyticsLogger'); const { client_logger } = require('../utils/analyticsLogger');
const { cookiesOptions } = require('../config/cookiesOptions'); const { cookiesOptions } = require('../config/cookiesOptions');
const MongoDB = require("../mongoDB.js"); const MongoDB = require("../mongoDB.js");
const { ObjectId } = require("mongodb");
const sessionChecker = async (req, res, next) => { const sessionChecker = async (req, res, next) => {
try {
const session_id = getSessionId(req); const session_id = getSessionId(req);
const user_sid = getUserId(req); const user_sid = getUserId(req);
let profile_id = getProfileId(req); let profile_id = getProfileId(req);
if (session_id && user_sid) { if (!session_id || !user_sid) {
DB = await MongoDB.getDB; return res.redirect('/login');
}
if (!ObjectId.isValid(session_id) || !ObjectId.isValid(user_sid)) {
return res.redirect('/login');
}
const DB = await MongoDB.getDB;
const userInfo = await DB.checkSessionOnDB(session_id, user_sid); const userInfo = await DB.checkSessionOnDB(session_id, user_sid);
req.userInfo = userInfo; req.userInfo = userInfo;
if (!await DB.getProfileCache(profile_id)) { if (!await DB.getProfileCache(profile_id)) {
const latestProfile = await DB.latestProfile(user_sid); const latestProfile = await DB.latestProfile(user_sid);
if (!latestProfile || !latestProfile._id) {
return res.redirect('/login');
}
res.cookie('profile_id', latestProfile._id, cookiesOptions); res.cookie('profile_id', latestProfile._id, cookiesOptions);
profile_id = latestProfile._id; profile_id = latestProfile._id;
} }
@@ -23,14 +34,14 @@ const sessionChecker = async (req, res, next) => {
if (!userInfo) return res.redirect('/login'); if (!userInfo) return res.redirect('/login');
// Log Request
client_logger.capture({ client_logger.capture({
distinctId: user_sid, distinctId: user_sid,
event: 'server@' + req.method + '@' + req.originalUrl, event: 'server@' + req.method + '@' + req.originalUrl,
}); });
next(); next();
} else { } catch (error) {
console.error("Session checker error", error);
return res.redirect('/login'); return res.redirect('/login');
} }
}; };
+18 -5
View File
@@ -8,7 +8,10 @@ const Notifications = require("./../notifications.js");
DB.getDB.then((DB) => { DB.getDB.then((DB) => {
const getProfileId = (req) => { const getProfileId = (req) => {
return DB.ObjectID(req.cookies.profile_id || req.query.profile_id || req.body.profile_id); const rawProfileId = req.cookies.profile_id || req.query.profile_id || req.body.profile_id || req.profileInfo?._id;
if (!rawProfileId) return null;
if (!DB.ObjectID.isValid(rawProfileId)) return null;
return DB.ObjectID(rawProfileId);
}; };
const postBelongToProfile = (post, profileid) => { const postBelongToProfile = (post, profileid) => {
@@ -155,12 +158,17 @@ DB.getDB.then((DB) => {
* $ref: '#/components/schemas/Post' * $ref: '#/components/schemas/Post'
*/ */
router.get("/organic", async (req, res) => { router.get("/organic", async (req, res) => {
try {
const profileid = getProfileId(req); const profileid = getProfileId(req);
if (!profileid) return res.status(400).json([]);
let organicPosts = await DB.getFeed(profileid); let organicPosts = await DB.getFeed(profileid);
//Add non-organic posts
const nonOrganicPosts = await generateNonOrganicPosts(req, profileid); const nonOrganicPosts = await generateNonOrganicPosts(req, profileid);
const posts = mergePosts(organicPosts, nonOrganicPosts); const posts = mergePosts(organicPosts || [], nonOrganicPosts || []);
return res.json(posts); return res.json(posts);
} catch (error) {
console.error("Error loading organic feed", error);
return res.status(500).json([]);
}
}); });
/** /**
@@ -182,12 +190,17 @@ DB.getDB.then((DB) => {
* $ref: '#/components/schemas/Post' * $ref: '#/components/schemas/Post'
*/ */
router.get("/", async (req, res) => { router.get("/", async (req, res) => {
try {
const profileid = getProfileId(req); const profileid = getProfileId(req);
//Add non-organic posts if (!profileid) return res.status(400).json([]);
const nonOrganicPosts = await generateNonOrganicPosts(req, profileid); const nonOrganicPosts = await generateNonOrganicPosts(req, profileid);
let promotionalPosts = await DB.getPromotionalPosts(profileid); let promotionalPosts = await DB.getPromotionalPosts(profileid);
const posts = mergePosts(promotionalPosts, nonOrganicPosts); const posts = mergePosts(promotionalPosts || [], nonOrganicPosts || []);
return res.json(posts); return res.json(posts);
} catch (error) {
console.error("Error loading feed", error);
return res.status(500).json([]);
}
}); });
/** /**
+12
View File
@@ -795,12 +795,24 @@ DB.getDB.then((DB) => {
* $ref: '#/components/schemas/Profile' * $ref: '#/components/schemas/Profile'
*/ */
router.get("/:id", async (req, res) => { router.get("/:id", async (req, res) => {
try {
let profileId = req.params.id; let profileId = req.params.id;
let profile = await DB.getProfile(profileId); let profile = await DB.getProfile(profileId);
if (!profile || !profile._id) {
return res.status(404).json({
status: "Profile not found",
});
}
return res.json({ return res.json({
status: "ok", status: "ok",
...profile ...profile
}); });
} catch (error) {
console.error("Error loading profile", error);
return res.status(500).json({
status: "Internal server error"
});
}
}); });
/** /**