import { Document } from 'mongoose'; import { isPopulated, isRef, type Ref } from '../../interfaces/common'; import type { IUser } from '../../interfaces/user'; export type IUserSerializedSecurely = Omit< U, 'password' | 'apiToken' | 'email' > & { email?: string }; export const omitInsecureAttributes = ( user: U, ): IUserSerializedSecurely => { const leanDoc = user instanceof Document ? user.toObject() : user; const { 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); }