user-serializer.ts 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  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 { password, apiToken, email, ...rest } = 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>(
  21. user?: U,
  22. ): IUserSerializedSecurely<U>;
  23. export function serializeUserSecurely<U extends IUser>(
  24. user?: Ref<U>,
  25. ): Ref<IUserSerializedSecurely<U>>;
  26. export function serializeUserSecurely<U extends IUser>(
  27. user?: U | Ref<U>,
  28. ): undefined | IUserSerializedSecurely<U> | Ref<IUserSerializedSecurely<U>> {
  29. if (user == null) return user;
  30. if (isRef(user) && !isPopulated(user)) return user;
  31. return omitInsecureAttributes(user);
  32. }