import { CreateOrgUserDto } from '@gitroom/nestjs-libraries/dtos/auth/create.org.user.dto'; import { Injectable } from '@nestjs/common'; import { OrganizationRepository } from '@gitroom/nestjs-libraries/database/prisma/organizations/organization.repository'; import { NotificationService } from '@gitroom/nestjs-libraries/database/prisma/notifications/notification.service'; import { AddTeamMemberDto } from '@gitroom/nestjs-libraries/dtos/settings/add.team.member.dto'; import { AuthService } from '@gitroom/helpers/auth/auth.service'; import dayjs from 'dayjs'; import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; import { Organization } from '@prisma/client'; @Injectable() export class OrganizationService { constructor( private _organizationRepository: OrganizationRepository, private _notificationsService: NotificationService ) {} async createOrgAndUser( body: Omit & { providerId?: string } ) { return this._organizationRepository.createOrgAndUser(body, this._notificationsService.hasEmailProvider()); } addUserToOrg( userId: string, id: string, orgId: string, role: 'USER' | 'ADMIN' ) { return this._organizationRepository.addUserToOrg(userId, id, orgId, role); } getOrgById(id: string) { return this._organizationRepository.getOrgById(id); } getUserOrg(id: string) { return this._organizationRepository.getUserOrg(id); } getOrgsByUserId(userId: string) { return this._organizationRepository.getOrgsByUserId(userId); } getTeam(orgId: string) { return this._organizationRepository.getTeam(orgId); } async inviteTeamMember(orgId: string, body: AddTeamMemberDto) { const timeLimit = dayjs().add(1, 'hour').format('YYYY-MM-DD HH:mm:ss'); const id = makeId(5); const url = process.env.FRONTEND_URL + `/?org=${AuthService.signJWT({ ...body, orgId, timeLimit, id })}`; if (body.sendEmail) { await this._notificationsService.sendEmail( body.email, 'You have been invited to join an organization', `You have been invited to join an organization. Click here to join.
The link will expire in 1 hour.` ); } return { url }; } async deleteTeamMember(org: Organization, userId: string) { const userOrgs = await this._organizationRepository.getOrgsByUserId(userId); const findOrgToDelete = userOrgs.find((orgUser) => orgUser.id === org.id); if (!findOrgToDelete) { throw new Error('User is not part of this organization'); } // @ts-ignore const myRole = org.users[0].role; const userRole = findOrgToDelete.users[0].role; const myLevel = myRole === 'USER' ? 0 : myRole === 'ADMIN' ? 1 : 2; const userLevel = userRole === 'USER' ? 0 : userRole === 'ADMIN' ? 1 : 2; if (myLevel < userLevel) { throw new Error('You do not have permission to delete this user'); } return this._organizationRepository.deleteTeamMember(org.id, userId); } disableOrEnableNonSuperAdminUsers(orgId: string, disable: boolean) { return this._organizationRepository.disableOrEnableNonSuperAdminUsers(orgId, disable); } }