Merge pull request #1541 from omnivore-app/fix/group-permissions

fix/group permissions
This commit is contained in:
Hongbo Wu 2022-12-13 19:07:58 +08:00 committed by GitHub
commit 99dbc5b233
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 43 additions and 30 deletions

View file

@ -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,

View file

@ -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<Group[]> => {
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()
}