user-serializer.ts 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  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<
  5. U,
  6. 'password' | 'apiToken' | 'email'
  7. > & { email?: string };
  8. export const omitInsecureAttributes = <U extends IUser>(
  9. user: U,
  10. ): IUserSerializedSecurely<U> => {
  11. const leanDoc = user instanceof Document ? user.toObject<U>() : user;
  12. const {
  13. // eslint-disable-next-line @typescript-eslint/no-unused-vars
  14. password,
  15. apiToken,
  16. email,
  17. ...rest
  18. } = leanDoc;
  19. const secureUser: IUserSerializedSecurely<U> = rest;
  20. // omit email
  21. if (secureUser.isEmailPublished) {
  22. secureUser.email = email;
  23. }
  24. return secureUser;
  25. };
  26. export function serializeUserSecurely<U extends IUser>(
  27. user?: U,
  28. ): IUserSerializedSecurely<U>;
  29. export function serializeUserSecurely<U extends IUser>(
  30. user?: Ref<U>,
  31. ): Ref<IUserSerializedSecurely<U>>;
  32. export function serializeUserSecurely<U extends IUser>(
  33. user?: U | Ref<U>,
  34. ): undefined | IUserSerializedSecurely<U> | Ref<IUserSerializedSecurely<U>> {
  35. if (user == null) return user;
  36. if (isRef(user) && !isPopulated(user)) return user;
  37. return omitInsecureAttributes(user);
  38. }