checkSetupStrategiesHasAdmin.ts 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import mongoose from 'mongoose';
  2. import type { IExternalAuthProviderType } from '~/interfaces/external-auth-provider';
  3. interface AggregateResult {
  4. count: number;
  5. }
  6. const checkLocalStrategyHasAdmin = async(): Promise<boolean> => {
  7. const User = mongoose.model('User') as any;
  8. const localAdmins: AggregateResult[] = await User.aggregate([
  9. {
  10. $match: {
  11. admin: true,
  12. status: User.STATUS_ACTIVE,
  13. password: { $exists: true },
  14. },
  15. },
  16. { $count: 'count' },
  17. ]).exec();
  18. return localAdmins.length > 0 && localAdmins[0].count > 0;
  19. };
  20. const checkExternalStrategiesHasAdmin = async(setupExternalStrategies: IExternalAuthProviderType[]): Promise<boolean> => {
  21. const User = mongoose.model('User') as any;
  22. const externalAdmins: AggregateResult[] = await User.aggregate([
  23. { $match: { admin: true, status: User.STATUS_ACTIVE } },
  24. {
  25. $lookup: {
  26. from: 'externalaccounts',
  27. localField: '_id',
  28. foreignField: 'user',
  29. as: 'externalAccounts',
  30. },
  31. },
  32. {
  33. $match: {
  34. 'externalAccounts.providerType': { $in: setupExternalStrategies },
  35. },
  36. },
  37. { $count: 'count' },
  38. ]).exec();
  39. return externalAdmins.length > 0 && externalAdmins[0].count > 0;
  40. };
  41. export const checkSetupStrategiesHasAdmin = async(setupStrategies: (IExternalAuthProviderType | 'local')[]): Promise<boolean> => {
  42. if (setupStrategies.includes('local')) {
  43. const isLocalStrategyHasAdmin = await checkLocalStrategyHasAdmin();
  44. if (isLocalStrategyHasAdmin) {
  45. return true;
  46. }
  47. }
  48. const setupExternalStrategies = setupStrategies.filter(strategy => strategy !== 'local') as IExternalAuthProviderType[];
  49. if (setupExternalStrategies.length === 0) {
  50. return false;
  51. }
  52. const isExternalStrategiesHasAdmin = await checkExternalStrategiesHasAdmin(setupExternalStrategies);
  53. return isExternalStrategiesHasAdmin;
  54. };