Mark-Lasfar commited on
Commit
459ac93
·
1 Parent(s): ea0b187

Add GraphQL

Browse files
Files changed (2) hide show
  1. graphql/resolvers.js +89 -87
  2. 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
- 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
- // ✅ حساب القيم مع إضافة بيانات البوست الأصلي
1747
- return {
1748
- data: posts.map(post => {
1749
- let sharedFrom = post.sharedFrom || null;
 
 
 
 
 
 
 
 
1750
 
1751
- // إضافة بيانات البوست الأصلي للمشاركات
1752
- if (sharedFrom && sharedFrom.originalPostId) {
1753
- const originalPost = originalPostsMap.get(sharedFrom.originalPostId.toString());
1754
- if (originalPost) {
1755
- sharedFrom = {
1756
- ...sharedFrom,
1757
- originalAuthorId: originalPost.userId?._id || null,
1758
- originalAuthorAvatar: originalPost.userId?.profile?.avatar || null,
1759
- originalAuthorJobTitle: originalPost.userId?.profile?.jobTitle || null,
1760
- originalContent: originalPost.content || '',
1761
- originalImages: originalPost.images || [],
1762
- originalVideo: originalPost.video || null,
1763
- originalCreatedAt: originalPost.createdAt || null,
1764
- originalLikesCount: originalPost.likesCount || 0,
1765
- originalCommentsCount: originalPost.commentsCount || 0,
1766
- originalSharesCount: originalPost.sharesCount || 0
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