diff --git a/packages/api/src/resolvers/recommendations/index.ts b/packages/api/src/resolvers/recommendations/index.ts index d2fed1092..44242f534 100644 --- a/packages/api/src/resolvers/recommendations/index.ts +++ b/packages/api/src/resolvers/recommendations/index.ts @@ -26,6 +26,7 @@ import { import { createGroup, createLabelAndRuleForGroup, + getGroupsWhereUserCanPost, getInviteUrl, getRecommendationGroups, joinGroup, @@ -187,18 +188,16 @@ export const recommendResolver = authorized< } } - const groups = await getRepository(Group).find({ - where: { id: In(input.groupIds) }, - relations: ['members', 'members.user'], - }) - if (groups.length === 0) { + const page = await getPageByParam({ _id: input.pageId, userId: uid }) + if (!page) { return { errorCodes: [RecommendErrorCode.NotFound], } } - const page = await getPageByParam({ _id: input.pageId, userId: uid }) - if (!page) { + // find groups where id is in the groupIds and the user is a member of the group and the user is allowed to post + const groups = await getGroupsWhereUserCanPost(uid, input.groupIds) + if (groups.length === 0) { return { errorCodes: [RecommendErrorCode.NotFound], } @@ -211,7 +210,7 @@ export const recommendResolver = authorized< const exp = Math.floor(Date.now() / 1000) + 60 * 60 * 24 // 1 day const auth = (await signToken({ uid, exp }, env.server.jwtSecret)) as string - await Promise.all( + const taskNames = await Promise.all( groups .map((group) => group.members.map((member) => @@ -237,6 +236,7 @@ export const recommendResolver = authorized< ) .flat() ) + console.log('taskNames', taskNames) return { success: true, diff --git a/packages/api/src/services/groups.ts b/packages/api/src/services/groups.ts index 3725b3215..dd0fb8002 100644 --- a/packages/api/src/services/groups.ts +++ b/packages/api/src/services/groups.ts @@ -79,17 +79,16 @@ export const getRecommendationGroups = async ( return groupMembers.map((gm) => { const admins: GraphqlUser[] = [] const members: GraphqlUser[] = [] + // Return all members + gm.group.members.forEach((m) => { + const user = userDataToUser(m.user) + if (m.isAdmin) { + admins.push(user) + } + members.push(user) + }) + const canSeeMembers = gm.group.onlyAdminCanSeeMembers ? gm.isAdmin : true - if (canSeeMembers) { - // Return all members - gm.group.members.forEach((m) => { - const user = userDataToUser(m.user) - if (m.isAdmin) { - admins.push(user) - } - members.push(user) - }) - } return { id: gm.group.id, @@ -98,7 +97,7 @@ export const getRecommendationGroups = async ( updatedAt: gm.group.updatedAt, inviteUrl: getInviteUrl(gm.invite), admins, - members, + members: canSeeMembers ? members : [], topics: gm.group.topics?.split(','), description: gm.group.description, canPost: gm.group.onlyAdminCanPost ? gm.isAdmin : true, @@ -151,22 +150,20 @@ having count(*) < $4`, }) const admins: GraphqlUser[] = [] const members: GraphqlUser[] = [] - if (!group.onlyAdminCanSeeMembers) { - // Return all members - group.members.forEach((m) => { - const user = userDataToUser(m.user) - if (m.isAdmin) { - admins.push(user) - } - members.push(user) - }) - } + // Return all members + group.members.forEach((m) => { + const user = userDataToUser(m.user) + if (m.isAdmin) { + admins.push(user) + } + members.push(user) + }) return { ...group, inviteUrl: getInviteUrl(invite), admins, - members, + members: group.onlyAdminCanSeeMembers ? [] : members, topics: group.topics?.split(','), description: group.description, canPost: !group.onlyAdminCanPost, @@ -269,3 +266,19 @@ export const createLabelAndRuleForGroup = async ( await Promise.all([addLabelPromise, sendNotificationPromise]) } + +// find groups where id is in the groupIds and the user is a member of the group and the user is allowed to post +export const getGroupsWhereUserCanPost = async ( + userId: string, + groupIds: string[] +): Promise => { + return getRepository(Group) + .createQueryBuilder('group') + .innerJoin('group.members', 'members1') + .whereInIds(groupIds) + .andWhere('members1.user_id = :userId', { userId }) + .andWhere('(members1.is_admin = true OR group.only_admin_can_post = false)') + .innerJoinAndSelect('group.members', 'members') + .innerJoinAndSelect('members.user', 'user') + .getMany() +}