Mark-Lasfar commited on
Commit ·
459ac93
1
Parent(s): ea0b187
Add GraphQL
Browse files- graphql/resolvers.js +89 -87
- graphql/schema.js +1 -1
graphql/resolvers.js
CHANGED
|
@@ -1697,97 +1697,99 @@ const Query = {
|
|
| 1697 |
},
|
| 1698 |
|
| 1699 |
userPosts: async (parent, { userId, page = 1, limit = 20 }, context) => {
|
| 1700 |
-
|
| 1701 |
-
|
| 1702 |
-
|
| 1703 |
-
let visibilityFilter = {};
|
| 1704 |
-
if (!isOwner) {
|
| 1705 |
-
visibilityFilter = { visibility: { $in: ['public', 'followers'] } };
|
| 1706 |
-
}
|
| 1707 |
-
|
| 1708 |
-
const [posts, total] = await Promise.all([
|
| 1709 |
-
Post.find({ userId, ...visibilityFilter })
|
| 1710 |
-
.sort({ pinned: -1, createdAt: -1 })
|
| 1711 |
-
.skip(skip)
|
| 1712 |
-
.limit(limit)
|
| 1713 |
-
.populate('userId', 'username profile.nickname profile.avatar')
|
| 1714 |
-
.lean(),
|
| 1715 |
-
Post.countDocuments({ userId, ...visibilityFilter })
|
| 1716 |
-
]);
|
| 1717 |
-
|
| 1718 |
-
// ✅ جلب البوستات الأصلية للمشاركات
|
| 1719 |
-
const sharedPostIds = posts
|
| 1720 |
-
.filter(p => p.sharedFrom?.originalPostId)
|
| 1721 |
-
.map(p => p.sharedFrom.originalPostId);
|
| 1722 |
-
|
| 1723 |
-
let originalPostsMap = new Map();
|
| 1724 |
-
if (sharedPostIds.length > 0) {
|
| 1725 |
-
const originalPosts = await Post.find({
|
| 1726 |
-
_id: { $in: sharedPostIds }
|
| 1727 |
-
})
|
| 1728 |
-
.populate('userId', 'username profile.nickname profile.avatar profile.jobTitle')
|
| 1729 |
-
.lean();
|
| 1730 |
|
| 1731 |
-
|
| 1732 |
-
|
| 1733 |
-
|
| 1734 |
-
|
| 1735 |
-
|
| 1736 |
-
|
| 1737 |
-
|
| 1738 |
-
|
| 1739 |
-
|
| 1740 |
-
|
| 1741 |
-
|
| 1742 |
-
|
| 1743 |
-
|
| 1744 |
-
|
| 1745 |
-
|
| 1746 |
-
|
| 1747 |
-
|
| 1748 |
-
|
| 1749 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1750 |
|
| 1751 |
-
|
| 1752 |
-
|
| 1753 |
-
|
| 1754 |
-
|
| 1755 |
-
|
| 1756 |
-
|
| 1757 |
-
|
| 1758 |
-
|
| 1759 |
-
|
| 1760 |
-
|
| 1761 |
-
|
| 1762 |
-
|
| 1763 |
-
|
| 1764 |
-
|
| 1765 |
-
|
| 1766 |
-
|
| 1767 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1768 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1769 |
}
|
| 1770 |
-
|
| 1771 |
-
return {
|
| 1772 |
-
...post,
|
| 1773 |
-
sharedFrom,
|
| 1774 |
-
likesCount: post.likes?.length || 0,
|
| 1775 |
-
commentsCount: post.comments?.length || 0,
|
| 1776 |
-
sharesCount: post.shares?.length || 0,
|
| 1777 |
-
savesCount: post.saves?.length || 0,
|
| 1778 |
-
isLiked: post.likes?.some(l => l.userId?.toString() === context.user?.userId) || false,
|
| 1779 |
-
isSaved: post.saves?.some(s => s.userId?.toString() === context.user?.userId) || false
|
| 1780 |
-
};
|
| 1781 |
-
}),
|
| 1782 |
-
pagination: {
|
| 1783 |
-
page,
|
| 1784 |
-
limit,
|
| 1785 |
-
total,
|
| 1786 |
-
pages: Math.ceil(total / limit),
|
| 1787 |
-
hasNext: skip + limit < total,
|
| 1788 |
-
hasPrev: page > 1
|
| 1789 |
-
}
|
| 1790 |
-
};
|
| 1791 |
},
|
| 1792 |
|
| 1793 |
savedPosts: async (parent, { page = 1, limit = 20 }, context) => {
|
|
|
|
| 1697 |
},
|
| 1698 |
|
| 1699 |
userPosts: async (parent, { userId, page = 1, limit = 20 }, context) => {
|
| 1700 |
+
const skip = (page - 1) * limit;
|
| 1701 |
+
const isOwner = context.user && context.user.userId === userId;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1702 |
|
| 1703 |
+
let visibilityFilter = {};
|
| 1704 |
+
if (!isOwner) {
|
| 1705 |
+
visibilityFilter = { visibility: { $in: ['public', 'followers'] } };
|
| 1706 |
+
}
|
| 1707 |
+
|
| 1708 |
+
const [posts, total] = await Promise.all([
|
| 1709 |
+
Post.find({ userId, ...visibilityFilter })
|
| 1710 |
+
.sort({ pinned: -1, createdAt: -1 })
|
| 1711 |
+
.skip(skip)
|
| 1712 |
+
.limit(limit)
|
| 1713 |
+
.populate('userId', 'username profile.nickname profile.avatar')
|
| 1714 |
+
.lean(),
|
| 1715 |
+
Post.countDocuments({ userId, ...visibilityFilter })
|
| 1716 |
+
]);
|
| 1717 |
+
|
| 1718 |
+
// ✅ جلب البوستات الأصلية للمشاركات
|
| 1719 |
+
const sharedPostIds = posts
|
| 1720 |
+
.filter(p => p.sharedFrom?.originalPostId)
|
| 1721 |
+
.map(p => p.sharedFrom.originalPostId);
|
| 1722 |
+
|
| 1723 |
+
let originalPostsMap = new Map();
|
| 1724 |
+
if (sharedPostIds.length > 0) {
|
| 1725 |
+
const originalPosts = await Post.find({
|
| 1726 |
+
_id: { $in: sharedPostIds }
|
| 1727 |
+
})
|
| 1728 |
+
.populate('userId', 'username profile.nickname profile.avatar profile.jobTitle')
|
| 1729 |
+
.lean();
|
| 1730 |
|
| 1731 |
+
originalPosts.forEach(op => {
|
| 1732 |
+
originalPostsMap.set(op._id.toString(), {
|
| 1733 |
+
_id: op._id,
|
| 1734 |
+
content: op.content || '',
|
| 1735 |
+
images: op.images || [],
|
| 1736 |
+
video: op.video || null,
|
| 1737 |
+
userId: op.userId,
|
| 1738 |
+
createdAt: op.createdAt,
|
| 1739 |
+
likesCount: op.likes?.length || 0,
|
| 1740 |
+
commentsCount: op.comments?.length || 0,
|
| 1741 |
+
sharesCount: op.shares?.length || 0
|
| 1742 |
+
});
|
| 1743 |
+
});
|
| 1744 |
+
}
|
| 1745 |
+
|
| 1746 |
+
return {
|
| 1747 |
+
data: posts.map(post => {
|
| 1748 |
+
// ✅ نبدأ بـ sharedFrom كـ null
|
| 1749 |
+
let sharedFrom = null;
|
| 1750 |
+
|
| 1751 |
+
// ✅ لو في مشاركة، نبني الكائن كامل
|
| 1752 |
+
if (post.sharedFrom && post.sharedFrom.originalPostId) {
|
| 1753 |
+
const originalPost = originalPostsMap.get(post.sharedFrom.originalPostId.toString());
|
| 1754 |
+
if (originalPost) {
|
| 1755 |
+
sharedFrom = {
|
| 1756 |
+
originalPostId: post.sharedFrom.originalPostId,
|
| 1757 |
+
originalAuthorId: originalPost.userId?._id || null,
|
| 1758 |
+
originalAuthorName: post.sharedFrom.originalAuthorName || 'Unknown',
|
| 1759 |
+
originalAuthorAvatar: originalPost.userId?.profile?.avatar || null,
|
| 1760 |
+
originalAuthorJobTitle: originalPost.userId?.profile?.jobTitle || null,
|
| 1761 |
+
originalContent: originalPost.content || '',
|
| 1762 |
+
originalImages: originalPost.images || [], // ✅ دائماً array وليس null
|
| 1763 |
+
originalVideo: originalPost.video || null,
|
| 1764 |
+
originalCreatedAt: originalPost.createdAt || null,
|
| 1765 |
+
originalLikesCount: originalPost.likesCount || 0,
|
| 1766 |
+
originalCommentsCount: originalPost.commentsCount || 0,
|
| 1767 |
+
originalSharesCount: originalPost.sharesCount || 0,
|
| 1768 |
+
sharedAt: post.sharedFrom.sharedAt || null
|
| 1769 |
+
};
|
| 1770 |
+
}
|
| 1771 |
}
|
| 1772 |
+
|
| 1773 |
+
return {
|
| 1774 |
+
...post,
|
| 1775 |
+
sharedFrom, // ✅ null للبوستات العادية، أو كائن كامل للمشاركات
|
| 1776 |
+
likesCount: post.likes?.length || 0,
|
| 1777 |
+
commentsCount: post.comments?.length || 0,
|
| 1778 |
+
sharesCount: post.shares?.length || 0,
|
| 1779 |
+
savesCount: post.saves?.length || 0,
|
| 1780 |
+
isLiked: post.likes?.some(l => l.userId?.toString() === context.user?.userId) || false,
|
| 1781 |
+
isSaved: post.saves?.some(s => s.userId?.toString() === context.user?.userId) || false
|
| 1782 |
+
};
|
| 1783 |
+
}),
|
| 1784 |
+
pagination: {
|
| 1785 |
+
page,
|
| 1786 |
+
limit,
|
| 1787 |
+
total,
|
| 1788 |
+
pages: Math.ceil(total / limit),
|
| 1789 |
+
hasNext: skip + limit < total,
|
| 1790 |
+
hasPrev: page > 1
|
| 1791 |
}
|
| 1792 |
+
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1793 |
},
|
| 1794 |
|
| 1795 |
savedPosts: async (parent, { page = 1, limit = 20 }, context) => {
|
graphql/schema.js
CHANGED
|
@@ -719,7 +719,7 @@ const typeDefs = gql`
|
|
| 719 |
originalAuthorAvatar: String
|
| 720 |
originalAuthorJobTitle: String
|
| 721 |
originalContent: String
|
| 722 |
-
originalImages: [PostImage!]
|
| 723 |
originalVideo: PostVideo
|
| 724 |
originalCreatedAt: Date
|
| 725 |
originalLikesCount: Int
|
|
|
|
| 719 |
originalAuthorAvatar: String
|
| 720 |
originalAuthorJobTitle: String
|
| 721 |
originalContent: String
|
| 722 |
+
originalImages: [PostImage!]
|
| 723 |
originalVideo: PostVideo
|
| 724 |
originalCreatedAt: Date
|
| 725 |
originalLikesCount: Int
|