@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
JavaScript
/* 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));
}