UNPKG

@tmlmobilidade/interfaces

Version:

This package provides SDK-style connectors for interacting with databases (e.g., stops, plans, rides, alerts) and external providers (e.g., authentication, storage). It simplifies data access and integration across projects.

75 lines (74 loc) 2.46 kB
/* eslint-disable @typescript-eslint/no-explicit-any */ import { users } from '../interfaces/auth/users.js'; import { UserDisplayFields } from '@tmlmobilidade/types'; const isUserRefKey = (k) => k === 'created_by' || k === 'updated_by'; const isEligibleId = (v) => typeof v === 'string' && v && v !== 'system'; function collectUserIds(input, out) { if (Array.isArray(input)) { for (const item of input) collectUserIds(item, out); return; } if (input && typeof input === 'object') { for (const [k, v] of Object.entries(input)) { if (isUserRefKey(k) && isEligibleId(v)) out.add(v); collectUserIds(v, out); } } } function replaceRefs(input, map) { if (Array.isArray(input)) { return input.map(item => replaceRefs(item, map)); } if (input && typeof input === 'object') { const obj = input; const out = Array.isArray(obj) ? [] : {}; for (const [k, v] of Object.entries(obj)) { if (isUserRefKey(k) && typeof v === 'string' && v !== 'system') { const found = map.get(v); out[k] = found ?? v; // fallback to original id if user not found } else { out[k] = replaceRefs(v, map); } } return out; } return input; } async function fetchUsersMap(ids) { if (ids.size === 0) return new Map(); const coll = await users.getCollection(); // Only fetch UserDisplay fields const projection = Object.keys(UserDisplayFields).reduce((acc, field) => { acc[field] = 1; return acc; }, {}); const result = await coll.find({ _id: { $in: Array.from(ids) } }, { projection }).toArray(); const map = new Map(); for (const u of result) { map.set(u._id, { _id: u._id, email: u.email, first_name: u.first_name, last_name: u.last_name, phone: u.phone ?? undefined, }); } return map; } export async function enrichUserRefs(doc) { const ids = new Set(); collectUserIds(doc, ids); const map = await fetchUsersMap(ids); return replaceRefs(doc, map); } export async function enrichUserRefsMany(docs) { const ids = new Set(); for (const d of docs) collectUserIds(d, ids); const map = await fetchUsersMap(ids); return docs.map(d => replaceRefs(d, map)); }