import { getFilterObject, getSortObject, PageQueryParams } from "../pagination"; import { generateId } from "../utils/id"; import { CreateOrgInput, orgFields, orgModel, UpdateOrgInput, } from "./organization.schema"; export async function createOrg(input: CreateOrgInput, tenantId: string) { const org = await orgModel.create({ tenantId: tenantId, pid: generateId(), createdAt: new Date(), ...input, }); return org; } export async function getOrg(orgId: string, tenantId: string) { return await orgModel.findOne({ $and: [{ tenantId: tenantId }, { pid: orgId }], }); } export async function listOrgs(params: PageQueryParams, tenantId: string) { const page = params.page || 1; const pageSize = params.pageSize || 10; const sortObj = getSortObject(params, orgFields); const filterObj = getFilterObject(params, orgFields); const orgs = await orgModel.aggregate([ { $match: { $and: [{ tenantId: tenantId }, ...filterObj] } }, { $facet: { metadata: [{ $count: "count" }], data: [ { $skip: (page - 1) * pageSize }, { $limit: pageSize }, { $sort: sortObj }, ], }, }, ]); if (orgs[0].data.length === 0) return { orgs: [], metadata: { count: 0, page, pageSize } }; return { orgs: orgs[0].data, metadata: { count: orgs[0].metadata[0].count, page, pageSize, }, }; } export async function updateOrg( input: UpdateOrgInput, orgId: string, tenantId: string ) { const updateOrgResult = await orgModel.findOneAndUpdate( { $and: [{ tenantId: tenantId }, { pid: orgId }], }, { ...input, updatedAt: new Date() }, { new: true } ); return updateOrgResult; } export async function deleteOrg(orgId: string, tenantId: string) { return await orgModel.deleteOne({ $and: [{ tenantId: tenantId }, { pid: orgId }], }); } export async function searchOrgs(params: PageQueryParams, tenantId: string) { const page = params.page || 1; const pageSize = params.pageSize || 10; const sortObj = getSortObject(params, orgFields); const filterObj = getFilterObject(params, orgFields); if (!params.searchToken) return { orgs: [], metadata: { count: 0, page, pageSize } }; const regex = new RegExp(params.searchToken, "i"); const orgs = await orgModel.aggregate([ { $match: { $and: [{ tenantId: tenantId }, ...filterObj] } }, { $match: { $or: [{ name: { $regex: regex } }, { domain: { $regex: regex } }], }, }, { $facet: { metadata: [{ $count: "count" }], data: [ { $skip: (page - 1) * pageSize }, { $limit: pageSize }, { $sort: sortObj }, ], }, }, ]); if (orgs[0].data.length === 0) return { orgs: [], metadata: { count: 0, page, pageSize } }; return { orgs: orgs[0].data, metadata: { count: orgs[0].metadata[0].count, page, pageSize, }, }; } export async function getUniqueValuesOrg(field: string, tenenatId: string) { return await orgModel.distinct(field, { tenantId: tenenatId }); }