universo-platform-3d
204 строки · 6.7 Кб
1import {
2Body,
3Controller,
4Delete,
5Get,
6HttpException,
7HttpStatus,
8Param,
9Patch,
10Post,
11Query,
12UsePipes,
13ValidationPipe
14} from '@nestjs/common'
15import { FirebaseTokenAuthGuard } from '../auth/auth.guard'
16import { CreateUserGroupDto } from './dto/create-group.users.dto'
17import { UpdateUserGroupDto } from './dto/update-group.users.dto'
18import { UserGroupService } from './user-group.service'
19import { CreateUserGroupInviteDto } from './dto/create-group-users-invite.dto'
20import { USER_GROUP_INVITE_STATUSES } from '../option-sets/user-group-invite-statuses'
21import { UserGroupInviteService } from './user-group-invite.service'
22import { CreateUserGroupRequestDto } from './dto/create-group-users-request.dto'
23import { UserGroupAccessRequestService } from './user-group-access-request.service'
24import { CreateUserGroupMembershipDto } from './dto/create-group-users-membership.dto'
25import { USER_GROUP_MEMBERSHIP_STATUSES } from '../option-sets/user-group-membership-statuses'
26import { GROUP_ROLE } from '../option-sets/group-users-roles'
27import { UserGroupMembershipService } from './user-group-membership.service'
28import { Roles } from '../roles/roles.decorator'
29import { ROLE } from '../roles/models/role.enum'
30import { ApiCreatedResponse, ApiOkResponse, ApiParam } from '@nestjs/swagger'
31import { UserGroup } from './user-group.schema'
32import { ApiResponseProperty } from '@nestjs/swagger/dist/decorators/api-property.decorator'
33import { UserGroupInvite } from './user-group-invite.schema'
34import { UserToken } from '../auth/get-user.decorator'
35
36class UserGroupApiResponse extends UserGroup {
37@ApiResponseProperty()
38_id: string
39}
40
41class UserGroupInviteApiResponse extends UserGroupInvite {
42@ApiResponseProperty()
43_id: string
44}
45
46@UsePipes(new ValidationPipe({ whitelist: true }))
47@Controller('user-group')
48@FirebaseTokenAuthGuard()
49export class UserGroupController {
50public static numberOfMonthsUntilInviteExpires = 1
51private searchMaxLimit = 500
52
53constructor(
54private readonly userGroupService: UserGroupService,
55private readonly userGroupInviteService: UserGroupInviteService,
56private readonly userGroupRequestAccessService: UserGroupAccessRequestService,
57private readonly userGroupMembershipService: UserGroupMembershipService
58) {}
59
60@Post()
61@FirebaseTokenAuthGuard()
62@ApiCreatedResponse({ type: UserGroupApiResponse })
63public async create(
64@UserToken('user_id') userId: string,
65@Body() createUserGroupDto: CreateUserGroupDto,
66@Body() createUserGroupMembershipDto: CreateUserGroupMembershipDto
67) {
68createUserGroupDto.creator = userId
69const createdGroup = await this.userGroupService.create(createUserGroupDto)
70
71const groupMembershipBase = this.createBaseNewUserMembership(
72createUserGroupMembershipDto,
73userId,
74createdGroup._id,
75GROUP_ROLE.GROUP_OWNER
76)
77await this.userGroupMembershipService.create(groupMembershipBase)
78
79return createdGroup
80}
81
82/**
83* @description Find all groups for current user
84*/
85@Get('/my-groups')
86@ApiOkResponse({ type: [UserGroupApiResponse] })
87public async getAllGroupsForMe(@UserToken('user_id') userId: string) {
88return await this.userGroupService.findAllForUser(userId)
89}
90
91/**
92* @description Find all invites for the current user
93*/
94@Get('/my-invites')
95@FirebaseTokenAuthGuard()
96@ApiOkResponse({ type: [UserGroupInviteApiResponse] })
97public async getAllGroupInvitesForMe(@UserToken('user_id') userId: string) {
98return await this.userGroupInviteService.findAllForUser(userId)
99}
100
101/**
102* @description This is used for another user, NOT the current user,
103* so we only get the PUBLIC groups that the person is a part of
104* TODO - add ApiOkResponse type for UserGroupMembership
105*/
106@Get('/group-membership/:otherUserId')
107@ApiParam({ name: 'otherUserId', type: 'string', required: true })
108@FirebaseTokenAuthGuard()
109public async findPublicGroupMembershipForOtherUser(
110@Param('otherUserId') otherUserId: string
111) {
112return await this.userGroupMembershipService.findPublicGroupMembershipForUser(
113otherUserId
114)
115}
116
117/**
118* @description Find all group members of current user
119* TODO - add ApiOkResponse type for UserGroupMembership
120*/
121@Get('/my-group-membership/:id')
122@FirebaseTokenAuthGuard()
123@ApiParam({ name: 'id', type: 'string', required: true })
124public async getGroupMembershipForMe(
125@UserToken('user_id') userId: string,
126@Param('id') id: string
127) {
128return await this.userGroupMembershipService.findAllMembers(id, userId)
129}
130
131@Get('search')
132@ApiOkResponse({ type: [UserGroupApiResponse] })
133public async search(@Query() query) {
134const { filterField, filterValue, sortField, sortValue, limit, skip } =
135query
136
137return await this.userGroupService.search({
138filterField: filterField || 'name',
139filterValue: filterValue || '',
140sortField: sortField || 'name',
141sortValue: sortValue || 1,
142limit: limit && limit < this.searchMaxLimit ? limit : 25,
143skip: skip || 0
144})
145}
146
147@Get(':id')
148@ApiParam({ name: 'id', type: 'string', required: true })
149@ApiOkResponse({ type: UserGroupApiResponse })
150public async findOne(@Param('id') id: string) {
151const groupFound = await this.userGroupService.findOne(id)
152return groupFound[0]
153}
154
155@Patch(':id')
156@ApiParam({ name: 'id', type: 'string', required: true })
157@ApiOkResponse({ type: UserGroupApiResponse })
158public async update(
159@Param('id') id: string,
160@Body() updateUserGroupDto: UpdateUserGroupDto
161) {
162return await this.userGroupService.update(id, updateUserGroupDto)
163}
164
165@Delete(':id')
166@ApiParam({ name: 'id', type: 'string', required: true })
167@ApiOkResponse({ type: UserGroupApiResponse })
168@FirebaseTokenAuthGuard()
169public async remove(
170@UserToken('user_id') userId: string,
171@Param('id') id: string
172) {
173const groupMembership =
174await this.userGroupMembershipService.findAllMembers(id, userId)
175//only owner can delete group
176// TODO this needs to be updated with RBAC
177if (groupMembership.role == 0) {
178return this.userGroupService.remove(id)
179} else {
180throw new HttpException('Forbidden', HttpStatus.FORBIDDEN)
181}
182}
183
184private makeInviteExpirationDate(): Date {
185const now = new Date()
186now.setMonth(
187now.getMonth() + UserGroupController.numberOfMonthsUntilInviteExpires
188)
189return now
190}
191
192private createBaseNewUserMembership(
193createGroupMembershipDto: CreateUserGroupMembershipDto,
194userId: string,
195groupId: string,
196role: GROUP_ROLE
197) {
198createGroupMembershipDto.user = userId
199createGroupMembershipDto.status = USER_GROUP_MEMBERSHIP_STATUSES.ACTIVE
200createGroupMembershipDto.role = role
201createGroupMembershipDto.group = groupId
202return createGroupMembershipDto
203}
204}
205