import { ManagingCompany, Project, User } from 'nexus-plugin-prisma/client' import * as SendBirdController from '../../controllers/sendbird' import { prismaClient as prisma } from '../../prismaClient' /** * Script to fix an error made where some conversation has been moved to wrong project * For all managing companies * Get channels * If the channel's project is in another company. migrate it */ prisma.managingCompany.findMany().then(async (managingCompanies: ManagingCompany[]) => { for await (const managingCompany of managingCompanies) { console.log('managingCompany', managingCompany.shortName) try { const managingCompanyProjects: Project[] = await prisma.project.findMany({ where: { managingCompany: { id: managingCompany.id } }, }) const managingCompanyUsers: User[] = await prisma.user.findMany({ where: { role: 'MANAGER', managingCompany: { id: managingCompany.id, }, }, }) console.log('managingCompanyUsers.length', managingCompanyUsers.length) const channels = await SendBirdController.getChannelsForUserId({ userId: managingCompany.id, all: true, show_member: true, }) console.log('channels.length', channels.length) for await (const channel of channels) { const [channelProjectId] = channel.name.split('-') // Because it's an old channel... if (channelProjectId === 'chat') { return } const existingProject = await prisma.project.findOne({ where: { id: channelProjectId } }) if (!existingProject) { console.log('Project doesnt exists:', channelProjectId) return } const channelIsInRightManagingCompany = managingCompanyProjects.some( (project) => project.id === channelProjectId ) // Move it to the good managing company if (!channelIsInRightManagingCompany) { const goodManagingCompanyForChannel = await prisma.project .findOne({ where: { id: existingProject.id } }) .managingCompany() if (!goodManagingCompanyForChannel) { console.log(`Project ${existingProject.name} doesnt' have any managing company`) return } console.log( `Channel is not in the right managing company! Project (${existingProject.name}) is in ${goodManagingCompanyForChannel.shortName} but was in ${managingCompany.shortName}` ) const goodManagingCompanyUsers = await prisma.managingCompany .findOne({ where: { id: goodManagingCompanyForChannel.id } }) .users() const wrongManagingCompanyMember = channel.members.find( ({ user_id: userId }) => userId === managingCompany.id ) if (wrongManagingCompanyMember) { // public await SendBirdController.removeUsersFromChannel({ userIds: [wrongManagingCompanyMember.user_id], channelUrl: channel.channel_url, }) await SendBirdController.addUsersToChannel({ userIds: [goodManagingCompanyForChannel.id], channelUrl: channel.channel_url, }) // private const privateChannel = await SendBirdController.getChannelByName({ name: `${channel.name}-private`, }) if (privateChannel) { await SendBirdController.addUsersToChannel({ userIds: goodManagingCompanyUsers.map(({ id }) => id), channelUrl: privateChannel.channel_url, }) await SendBirdController.removeUsersFromChannel({ userIds: managingCompanyUsers.map(({ id }) => id), channelUrl: privateChannel.channel_url, }) } } else { console.log('Cant find wrong member') } } } console.log('done') } catch (error) { console.error(error) } } })