import { Document } from 'mongoose'; import { isPopulated, isRef, type Ref } from '../../interfaces/common'; import type { IUser } from '../../interfaces/user'; export type IUserSerializedSecurely = Omit & { email?: string }; export const omitInsecureAttributes = (user: U): IUserSerializedSecurely => { const leanDoc = (user instanceof Document) ? user.toObject() : user; const { // eslint-disable-next-line @typescript-eslint/no-unused-vars password, apiToken, email, ...rest } = leanDoc; const secureUser: IUserSerializedSecurely = rest; // omit email if (secureUser.isEmailPublished) { secureUser.email = email; } return secureUser; }; export function serializeUserSecurely(user?: U): IUserSerializedSecurely; export function serializeUserSecurely(user?: Ref): Ref>; export function serializeUserSecurely(user?: U | Ref): undefined | IUserSerializedSecurely | Ref> { if (user == null) return user; if (isRef(user) && !isPopulated(user)) return user; return omitInsecureAttributes(user); }