universo-platform-3d
187 строк · 5.5 Кб
1import { Injectable } from '@nestjs/common'2import { InjectModel } from '@nestjs/mongoose'3import { Model } from 'mongoose'4import mongoose from 'mongoose'5import { GROUP_ROLE } from '../option-sets/group-users-roles'6import {7UserGroupMembershipDocument,8UserGroupMembership
9} from './user-group-membership.schema'10import { CreateUserGroupMembershipDto } from './dto/create-group-users-membership.dto'11
12@Injectable()13export class UserGroupMembershipService {14constructor(15@InjectModel(UserGroupMembership.name)16private userGroupMembershipModel: Model<UserGroupMembershipDocument>17) {}18
19public create(20createUserGroupMembershipDto: CreateUserGroupMembershipDto21): Promise<any> {22const created = new this.userGroupMembershipModel(23createUserGroupMembershipDto
24)25return created.save()26}27
28public findOne(id: string): Promise<any> {29return this.userGroupMembershipModel.findById(id).exec()30}31
32public remove(id: string): Promise<any> {33return this.userGroupMembershipModel.findOneAndDelete({ _id: id }).exec()34}35
36public findPublicGroupMembershipForUser(37userId: string38): Promise<UserGroupMembershipDocument[]> {39return (40this.userGroupMembershipModel41.find()42.where({ user: userId, membershipIsPubliclyVisible: true })43// TODO add a test such that only name is exposed44// TODO add a filter45.populate({46path: 'group',47select: ['name', 'publicDescription', 'public']48// TODO fix this. For some reason, the below code isn't working. Groups with public: false are still being returned. The returned doc is for some reason set to "public": "false" as string false, not boolean false. That could be part of the issue.49// match: {50// public: {51// $eq: true52// }53// }54})55.exec()56)57}58
59public findAllForUserViaUserMembership(userId: string): Promise<any> {60return this.userGroupMembershipModel61.find({ user: userId })62.populate('group')63.exec()64}65
66public findAllForUserWithGroup(userId: string): Promise<any> {67return this.userGroupMembershipModel.find().where({ user: userId }).exec()68}69
70public async getAllAdminLinks(groupId: string, user: string): Promise<any> {71return await this.userGroupMembershipModel.find({72group_id: groupId,73role: { $in: [GROUP_ROLE.GROUP_OWNER, GROUP_ROLE.GROUP_ADMIN] }74})75}76
77public async getAllPublicMembersForPublicGroup(78groupId: string79): Promise<UserGroupMembershipDocument[]> {80return await this.userGroupMembershipModel81.find({ group: groupId, membershipIsPubliclyVisible: true }) // TODO add a test to ensure private group membership isn't exposed82.populate('user', {83role: 1,84_id: 1,85displayName: 186})87.exec()88}89
90public async findLeaderShip(groupId: string): Promise<any> {91return await this.userGroupMembershipModel92.aggregate()93.append({94$match: {95group: new mongoose.Types.ObjectId(groupId),96role: {97$in: [GROUP_ROLE.GROUP_OWNER, GROUP_ROLE.GROUP_ADMIN]98}99}100})101.lookup({102from: 'users',103localField: 'user',104foreignField: '_id',105as: 'user'106})107.unwind({ path: '$user' })108.exec()109}110public async findOwners(groupId: string): Promise<any> {111return await this.userGroupMembershipModel112.aggregate()113.append({114$match: {115group: new mongoose.Types.ObjectId(groupId),116role: { $in: GROUP_ROLE.GROUP_ADMIN }117}118})119.lookup({120from: 'users',121localField: 'user',122foreignField: '_id',123as: 'user'124})125.unwind({ path: '$user' })126.exec()127}128
129public async findAllMembers(groupId: string, userId: string): Promise<any> {130return await this.userGroupMembershipModel.findOne({131group: groupId,132user: userId133})134}135public async promoteAdmin(groupId: string, userId: string): Promise<any> {136const userLinkFound = await this.userGroupMembershipModel.findOne({137group: groupId,138user: userId139})140return await this.userGroupMembershipModel141.findByIdAndUpdate(142userLinkFound._id,143{ role: GROUP_ROLE.GROUP_ADMIN },144{ new: true }145)146.exec()147}148public async promoteOwner(groupId: string, userId: string): Promise<any> {149const userLinkFound = await this.userGroupMembershipModel.findOne({150group: groupId,151user: userId152})153return await this.userGroupMembershipModel154.findByIdAndUpdate(155userLinkFound._id,156{ role: GROUP_ROLE.GROUP_OWNER },157{ new: true }158)159.exec()160}161public async demoteOwner(groupId: string, userId: string): Promise<any> {162const userLinkFound = await this.userGroupMembershipModel.findOne({163group: groupId,164user: userId165})166return await this.userGroupMembershipModel167.findByIdAndUpdate(168userLinkFound._id,169{ role: GROUP_ROLE.GROUP_ADMIN },170{ new: true }171)172.exec()173}174public async demoteAdmin(groupId: string, userId: string): Promise<any> {175const userLinkFound = await this.userGroupMembershipModel.findOne({176group: groupId,177user: userId178})179return await this.userGroupMembershipModel180.findByIdAndUpdate(181userLinkFound._id,182{ role: GROUP_ROLE.MEMBER },183{ new: true }184)185.exec()186}187}
188