user-serializer.ts 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. import { Document } from 'mongoose';
  2. import { isPopulated, isRef, type Ref } from '../../interfaces/common';
  3. import type { IUser } from '../../interfaces/user';
  4. export type IUserSerializedSecurely<U extends IUser> = Omit<U, 'password' | 'apiToken' | 'email'> & { email?: string };
  5. export const omitInsecureAttributes = <U extends IUser>(user: U): IUserSerializedSecurely<U> => {
  6. const leanDoc = (user instanceof Document)
  7. ? user.toObject<U>()
  8. : user;
  9. const {
  10. // eslint-disable-next-line @typescript-eslint/no-unused-vars
  11. password, apiToken, email, ...rest
  12. } = leanDoc;
  13. const secureUser: IUserSerializedSecurely<U> = rest;
  14. // omit email
  15. if (secureUser.isEmailPublished) {
  16. secureUser.email = email;
  17. }
  18. return secureUser;
  19. };
  20. export function serializeUserSecurely<U extends IUser>(user?: U): IUserSerializedSecurely<U>;
  21. export function serializeUserSecurely<U extends IUser>(user?: Ref<U>): Ref<IUserSerializedSecurely<U>>;
  22. export function serializeUserSecurely<U extends IUser>(user?: U | Ref<U>): undefined | IUserSerializedSecurely<U> | Ref<IUserSerializedSecurely<U>> {
  23. if (user == null) return user;
  24. if (isRef(user) && !isPopulated(user)) return user;
  25. return omitInsecureAttributes(user);
  26. }