mirror of
https://github.com/omnivore-app/omnivore.git
synced 2026-03-11 08:54:26 +00:00
Merge pull request #1541 from omnivore-app/fix/group-permissions
fix/group permissions
This commit is contained in:
commit
99dbc5b233
2 changed files with 43 additions and 30 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue