88 lines
3.1 KiB
TypeScript
88 lines
3.1 KiB
TypeScript
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<CreateOrgUserDto, 'providerToken'> & { 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 <a href="${url}">here</a> to join.<br />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);
|
|
}
|
|
}
|