diff --git a/packages/api/src/entity/groups/group.ts b/packages/api/src/entity/groups/group.ts index 4aa22e1ee..69c35420c 100644 --- a/packages/api/src/entity/groups/group.ts +++ b/packages/api/src/entity/groups/group.ts @@ -32,4 +32,16 @@ export class Group { @OneToMany(() => GroupMembership, (groupMembership) => groupMembership.group) members!: GroupMembership[] + + @Column('text', { nullable: true }) + description?: string | null + + @Column('text', { nullable: true }) + topics?: string | null + + @Column('boolean', { default: false }) + onlyAdminCanPost!: boolean + + @Column('boolean', { default: false }) + onlyAdminCanSeeMembers!: boolean } diff --git a/packages/api/src/resolvers/recommendations/index.ts b/packages/api/src/resolvers/recommendations/index.ts index e443cf1f5..72e7c5043 100644 --- a/packages/api/src/resolvers/recommendations/index.ts +++ b/packages/api/src/resolvers/recommendations/index.ts @@ -71,6 +71,10 @@ export const createGroupResolver = authorized< name: input.name, maxMembers: input.maxMembers, expiresInDays: input.expiresInDays, + description: input.description, + topics: input.topics, + onlyAdminCanPost: input.onlyAdminCanPost, + onlyAdminCanSeeMembers: input.onlyAdminCanSeeMembers, }) analytics.track({ @@ -94,6 +98,10 @@ export const createGroupResolver = authorized< inviteUrl, admins: [user], members: [user], + canSeeMembers: true, + canPost: true, + description: group.description, + topics: group.topics?.split(','), }, } } catch (error) { diff --git a/packages/api/src/services/groups.ts b/packages/api/src/services/groups.ts index 64f5d0f41..2776ef89a 100644 --- a/packages/api/src/services/groups.ts +++ b/packages/api/src/services/groups.ts @@ -17,6 +17,10 @@ export const createGroup = async (input: { name: string maxMembers?: number | null expiresInDays?: number | null + description?: string | null + topics?: string[] | null + onlyAdminCanPost?: boolean | null + onlyAdminCanSeeMembers?: boolean | null }): Promise<[Group, Invite]> => { const [group, invite] = await AppDataSource.transaction<[Group, Invite]>( async (t) => { @@ -32,6 +36,10 @@ export const createGroup = async (input: { const group = await t.getRepository(Group).save({ name: input.name, createdBy: input.admin, + description: input.description, + topics: input.topics?.join(','), + onlyAdminCanPost: input.onlyAdminCanPost ?? false, + onlyAdminCanSeeMembers: input.onlyAdminCanSeeMembers ?? false, }) const code = nanoid(8) @@ -71,13 +79,17 @@ export const getRecommendationGroups = async ( return groupMembers.map((gm) => { const admins: GraphqlUser[] = [] const members: GraphqlUser[] = [] - 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, @@ -87,6 +99,10 @@ export const getRecommendationGroups = async ( inviteUrl: getInviteUrl(gm.invite), admins, members, + topics: gm.group.topics?.split(','), + description: gm.group.description, + canPost: gm.group.onlyAdminCanPost ? gm.isAdmin : true, + canSeeMembers, } }) } @@ -135,19 +151,26 @@ having count(*) < $4`, }) const admins: GraphqlUser[] = [] const members: GraphqlUser[] = [] - group.members.forEach((m) => { - const user = userDataToUser(m.user) - if (m.isAdmin) { - admins.push(user) - } - members.push(user) - }) + 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 { ...group, inviteUrl: getInviteUrl(invite), admins, members, + topics: group.topics?.split(','), + description: group.description, + canPost: !group.onlyAdminCanPost, + canSeeMembers: !group.onlyAdminCanSeeMembers, } }