import { prismaClient as prisma } from '../../prismaClient' import { uniqBy } from 'lodash' import { logger } from '../../utils/logger' import * as helpers from './helper' export async function getUsersForSegments(segments) { const validSegments = segments.filter(Boolean) if (validSegments.length === 0) { return [] } let users = [] await segments.reduce(async (promise, segment) => { await promise segment = await prisma.segment.findOne({ where: { id: segment.id }, select: { id: true, project: { select: { id: true, }, }, users: { select: { id: true, }, }, properties: { select: { owners: { select: { id: true, }, }, users: { select: { id: true, }, }, }, }, segmentFields: { select: { model: true, comparison: true, path: true, value: true, }, }, }, }) if (segment.segmentFields) { const projectUsers = await prisma.user.findMany({ where: { projects: { some: { id: segment.project.id } } }, select: { id: true, projectsTenants: { select: { id: true, }, }, projectsBoardMember: { select: { id: true, }, }, properties: { select: { id: true, building: { select: { id: true, }, }, address: { select: { id: true, apartmentNumber: true, }, }, }, }, property: { select: { id: true, building: { select: { id: true, }, }, address: { select: { id: true, apartmentNumber: true, }, }, }, }, }, }) const projectUsersFiltered = projectUsers?.filter((user) => { return segment.segmentFields.some((segmentField) => { if (segmentField.path === 'residentType') { if (segmentField.comparison === 'EQUALS') { return helpers.residentIsType(segmentField.value, user) } return !helpers.residentIsType(segmentField.value, user) } }) }) || [] // TMP because we keep receiving error that it's not an array if (!Array.isArray(projectUsersFiltered)) { logger.info(`${JSON.stringify(projectUsersFiltered)} is not an array`) } users = [...users, ...projectUsersFiltered] } return [ ...users, ...(segment.users || []), ...( segment.properties?.map((property) => [...property.users, ...property.owners]) || [] ).flat(), ] }, Promise.resolve) return uniqBy(users, 'id') }