@sync-in/server 1.5.2 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -0
- package/README.md +2 -1
- package/environment/environment.dist.min.yaml +1 -0
- package/environment/environment.dist.yaml +88 -30
- package/migrations/0002_sleepy_korath.sql +1 -0
- package/migrations/meta/0002_snapshot.json +2424 -0
- package/migrations/meta/_journal.json +7 -0
- package/package.json +14 -12
- package/server/app.bootstrap.js +1 -1
- package/server/app.bootstrap.js.map +1 -1
- package/server/applications/files/services/files-manager.service.js +1 -2
- package/server/applications/files/services/files-manager.service.js.map +1 -1
- package/server/applications/files/services/files-only-office-manager.service.js +5 -6
- package/server/applications/files/services/files-only-office-manager.service.js.map +1 -1
- package/server/applications/files/utils/files.js +6 -4
- package/server/applications/files/utils/files.js.map +1 -1
- package/server/applications/links/links.controller.js +2 -2
- package/server/applications/links/links.controller.js.map +1 -1
- package/server/applications/links/services/links-manager.service.js +2 -1
- package/server/applications/links/services/links-manager.service.js.map +1 -1
- package/server/applications/links/services/links-manager.service.spec.js +6 -3
- package/server/applications/links/services/links-manager.service.spec.js.map +1 -1
- package/server/applications/notifications/constants/notifications.js +9 -0
- package/server/applications/notifications/constants/notifications.js.map +1 -1
- package/server/applications/notifications/i18n/fr.js +10 -1
- package/server/applications/notifications/i18n/fr.js.map +1 -1
- package/server/applications/notifications/interfaces/notification-properties.interface.js.map +1 -1
- package/server/applications/notifications/mails/models.js +41 -3
- package/server/applications/notifications/mails/models.js.map +1 -1
- package/server/applications/notifications/mails/templates.js +1 -1
- package/server/applications/notifications/mails/templates.js.map +1 -1
- package/server/applications/notifications/schemas/notifications.schema.js +2 -1
- package/server/applications/notifications/schemas/notifications.schema.js.map +1 -1
- package/server/applications/notifications/services/notifications-manager.service.js +16 -13
- package/server/applications/notifications/services/notifications-manager.service.js.map +1 -1
- package/server/applications/notifications/services/notifications-manager.service.spec.js +9 -8
- package/server/applications/notifications/services/notifications-manager.service.spec.js.map +1 -1
- package/server/applications/notifications/services/notifications-queries.service.js +1 -1
- package/server/applications/notifications/services/notifications-queries.service.js.map +1 -1
- package/server/applications/shares/services/shares-manager.service.js +3 -2
- package/server/applications/shares/services/shares-manager.service.js.map +1 -1
- package/server/applications/sync/constants/auth.js +2 -2
- package/server/applications/sync/constants/auth.js.map +1 -1
- package/server/applications/sync/dtos/sync-client-registration.dto.js +5 -0
- package/server/applications/sync/dtos/sync-client-registration.dto.js.map +1 -1
- package/server/applications/sync/dtos/sync-operations.dto.js +1 -2
- package/server/applications/sync/dtos/sync-operations.dto.js.map +1 -1
- package/server/applications/sync/schemas/sync-clients.schema.js +2 -1
- package/server/applications/sync/schemas/sync-clients.schema.js.map +1 -1
- package/server/applications/sync/schemas/sync-paths.schema.js +2 -1
- package/server/applications/sync/schemas/sync-paths.schema.js.map +1 -1
- package/server/applications/sync/services/sync-clients-manager.service.js +28 -20
- package/server/applications/sync/services/sync-clients-manager.service.js.map +1 -1
- package/server/applications/sync/services/sync-clients-manager.service.spec.js +24 -18
- package/server/applications/sync/services/sync-clients-manager.service.spec.js.map +1 -1
- package/server/applications/sync/services/sync-queries.service.js +5 -5
- package/server/applications/sync/services/sync-queries.service.js.map +1 -1
- package/server/applications/users/admin-users.controller.js +48 -37
- package/server/applications/users/admin-users.controller.js.map +1 -1
- package/server/applications/users/admin-users.controller.spec.js +15 -0
- package/server/applications/users/admin-users.controller.spec.js.map +1 -1
- package/server/applications/users/constants/routes.js +5 -0
- package/server/applications/users/constants/routes.js.map +1 -1
- package/server/applications/users/constants/user.js +8 -0
- package/server/applications/users/constants/user.js.map +1 -1
- package/server/applications/users/dto/delete-user.dto.js +5 -23
- package/server/applications/users/dto/delete-user.dto.js.map +1 -1
- package/server/applications/users/dto/user-properties.dto.js +38 -3
- package/server/applications/users/dto/user-properties.dto.js.map +1 -1
- package/server/applications/users/interfaces/admin-user.interface.js.map +1 -1
- package/server/applications/users/interfaces/user-secrets.interface.js +10 -0
- package/server/applications/users/interfaces/user-secrets.interface.js.map +1 -0
- package/server/applications/users/models/user.model.js +84 -50
- package/server/applications/users/models/user.model.js.map +1 -1
- package/server/applications/users/schemas/user.interface.js.map +1 -1
- package/server/applications/users/schemas/users.schema.js +2 -0
- package/server/applications/users/schemas/users.schema.js.map +1 -1
- package/server/applications/users/services/admin-users-manager.service.js +7 -19
- package/server/applications/users/services/admin-users-manager.service.js.map +1 -1
- package/server/applications/users/services/admin-users-manager.service.spec.js +7 -26
- package/server/applications/users/services/admin-users-manager.service.spec.js.map +1 -1
- package/server/applications/users/services/admin-users-queries.service.js +1 -0
- package/server/applications/users/services/admin-users-queries.service.js.map +1 -1
- package/server/applications/users/services/users-manager.service.js +138 -28
- package/server/applications/users/services/users-manager.service.js.map +1 -1
- package/server/applications/users/services/users-manager.service.spec.js +11 -9
- package/server/applications/users/services/users-manager.service.spec.js.map +1 -1
- package/server/applications/users/services/users-queries.service.js +63 -57
- package/server/applications/users/services/users-queries.service.js.map +1 -1
- package/server/applications/users/users.controller.js +48 -1
- package/server/applications/users/users.controller.js.map +1 -1
- package/server/applications/users/users.controller.spec.js +8 -1
- package/server/applications/users/users.controller.spec.js.map +1 -1
- package/server/applications/users/users.e2e-spec.js +2 -1
- package/server/applications/users/users.e2e-spec.js.map +1 -1
- package/server/applications/users/utils/avatar.js +48 -0
- package/server/applications/users/utils/avatar.js.map +1 -0
- package/server/authentication/auth.config.js +89 -26
- package/server/authentication/auth.config.js.map +1 -1
- package/server/authentication/auth.controller.js +117 -9
- package/server/authentication/auth.controller.js.map +1 -1
- package/server/authentication/auth.controller.spec.js +16 -1
- package/server/authentication/auth.controller.spec.js.map +1 -1
- package/server/authentication/auth.e2e-spec.js +4 -3
- package/server/authentication/auth.e2e-spec.js.map +1 -1
- package/server/authentication/auth.module.js +4 -1
- package/server/authentication/auth.module.js.map +1 -1
- package/server/authentication/constants/auth-ldap.js +44 -0
- package/server/authentication/constants/auth-ldap.js.map +1 -0
- package/server/authentication/constants/auth.js +37 -4
- package/server/authentication/constants/auth.js.map +1 -1
- package/server/authentication/constants/routes.js +21 -0
- package/server/authentication/constants/routes.js.map +1 -1
- package/server/authentication/constants/scope.js +20 -0
- package/server/authentication/constants/scope.js.map +1 -0
- package/server/authentication/dto/login-response.dto.js +27 -4
- package/server/authentication/dto/login-response.dto.js.map +1 -1
- package/server/authentication/dto/token-response.dto.js +5 -0
- package/server/authentication/dto/token-response.dto.js.map +1 -1
- package/server/{applications/users/dto/user-password.dto.js → authentication/dto/two-fa-verify.dto.js} +27 -9
- package/server/authentication/dto/two-fa-verify.dto.js.map +1 -0
- package/server/authentication/guards/auth-basic.strategy.js +6 -5
- package/server/authentication/guards/auth-basic.strategy.js.map +1 -1
- package/server/authentication/guards/auth-token-access.strategy.js +3 -2
- package/server/authentication/guards/auth-token-access.strategy.js.map +1 -1
- package/server/authentication/guards/auth-token-refresh.strategy.js +3 -2
- package/server/authentication/guards/auth-token-refresh.strategy.js.map +1 -1
- package/server/authentication/guards/auth-two-fa-guard.js +81 -0
- package/server/authentication/guards/auth-two-fa-guard.js.map +1 -0
- package/server/authentication/interfaces/jwt-payload.interface.js +5 -0
- package/server/authentication/interfaces/jwt-payload.interface.js.map +1 -1
- package/server/authentication/interfaces/token.interface.js +2 -0
- package/server/authentication/interfaces/token.interface.js.map +1 -1
- package/server/authentication/interfaces/two-fa-setup.interface.js +10 -0
- package/server/authentication/interfaces/two-fa-setup.interface.js.map +1 -0
- package/server/authentication/models/auth-method.js.map +1 -1
- package/server/authentication/services/auth-manager.service.js +72 -49
- package/server/authentication/services/auth-manager.service.js.map +1 -1
- package/server/authentication/services/auth-methods/auth-method-database.service.js +3 -3
- package/server/authentication/services/auth-methods/auth-method-database.service.js.map +1 -1
- package/server/authentication/services/auth-methods/auth-method-database.service.spec.js +5 -0
- package/server/authentication/services/auth-methods/auth-method-database.service.spec.js.map +1 -1
- package/server/authentication/services/auth-methods/auth-method-ldap.service.js +151 -66
- package/server/authentication/services/auth-methods/auth-method-ldap.service.js.map +1 -1
- package/server/authentication/services/auth-methods/auth-method-ldap.service.spec.js +52 -50
- package/server/authentication/services/auth-methods/auth-method-ldap.service.spec.js.map +1 -1
- package/server/authentication/services/auth-methods/auth-method-two-fa.service.js +251 -0
- package/server/authentication/services/auth-methods/auth-method-two-fa.service.js.map +1 -0
- package/server/authentication/services/auth-methods/auth-method-two-fa.service.spec.js +41 -0
- package/server/authentication/services/auth-methods/auth-method-two-fa.service.spec.js.map +1 -0
- package/server/authentication/utils/crypt-secret.js +68 -0
- package/server/authentication/utils/crypt-secret.js.map +1 -0
- package/server/common/functions.js +18 -2
- package/server/common/functions.js.map +1 -1
- package/server/common/qrcode.js +34 -0
- package/server/common/qrcode.js.map +1 -0
- package/server/common/shared.js +18 -0
- package/server/common/shared.js.map +1 -1
- package/server/configuration/config.environment.js +23 -6
- package/server/configuration/config.environment.js.map +1 -1
- package/server/configuration/config.interfaces.js +10 -0
- package/server/configuration/config.interfaces.js.map +1 -0
- package/server/configuration/config.loader.js.map +1 -1
- package/server/configuration/config.validation.js +13 -13
- package/server/configuration/config.validation.js.map +1 -1
- package/server/infrastructure/cache/adapters/mysql-cache.adapter.js +6 -6
- package/server/infrastructure/cache/adapters/mysql-cache.adapter.js.map +1 -1
- package/server/infrastructure/cache/schemas/mysql-cache.schema.js +2 -1
- package/server/infrastructure/cache/schemas/mysql-cache.schema.js.map +1 -1
- package/server/infrastructure/cache/services/cache.service.js.map +1 -1
- package/server/infrastructure/database/columns.js +39 -0
- package/server/infrastructure/database/columns.js.map +1 -0
- package/server/infrastructure/database/database.config.js +0 -1
- package/server/infrastructure/database/database.config.js.map +1 -1
- package/server/infrastructure/mailer/interfaces/mail.interface.js.map +1 -1
- package/server/infrastructure/mailer/mailer.config.js +12 -0
- package/server/infrastructure/mailer/mailer.config.js.map +1 -1
- package/server/infrastructure/mailer/mailer.service.js +2 -1
- package/server/infrastructure/mailer/mailer.service.js.map +1 -1
- package/static/assets/mimes/text-x-c.svg +1 -0
- package/static/assets/pdfjs/build/pdf.mjs +2522 -914
- package/static/assets/pdfjs/build/pdf.mjs.map +1 -1
- package/static/assets/pdfjs/build/pdf.sandbox.mjs +2 -2
- package/static/assets/pdfjs/build/pdf.worker.mjs +1024 -566
- package/static/assets/pdfjs/build/pdf.worker.mjs.map +1 -1
- package/static/assets/pdfjs/version +1 -1
- package/static/assets/pdfjs/web/debugger.mjs +116 -37
- package/static/assets/pdfjs/web/images/comment-popup-editButton.svg +5 -0
- package/static/assets/pdfjs/web/locale/ach/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/af/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/an/viewer.ftl +0 -16
- package/static/assets/pdfjs/web/locale/ar/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/ast/viewer.ftl +0 -19
- package/static/assets/pdfjs/web/locale/az/viewer.ftl +0 -16
- package/static/assets/pdfjs/web/locale/be/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/bg/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/bn/viewer.ftl +0 -16
- package/static/assets/pdfjs/web/locale/bo/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/br/viewer.ftl +0 -22
- package/static/assets/pdfjs/web/locale/brx/viewer.ftl +0 -16
- package/static/assets/pdfjs/web/locale/bs/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/ca/viewer.ftl +12 -23
- package/static/assets/pdfjs/web/locale/cak/viewer.ftl +0 -23
- package/static/assets/pdfjs/web/locale/ckb/viewer.ftl +0 -16
- package/static/assets/pdfjs/web/locale/cs/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/cy/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/da/viewer.ftl +3 -35
- package/static/assets/pdfjs/web/locale/de/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/dsb/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/el/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/en-CA/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/en-GB/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/en-US/viewer.ftl +25 -13
- package/static/assets/pdfjs/web/locale/eo/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/es-AR/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/es-CL/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/es-ES/viewer.ftl +5 -32
- package/static/assets/pdfjs/web/locale/es-MX/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/et/viewer.ftl +0 -16
- package/static/assets/pdfjs/web/locale/eu/viewer.ftl +38 -32
- package/static/assets/pdfjs/web/locale/fa/viewer.ftl +0 -19
- package/static/assets/pdfjs/web/locale/ff/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/fi/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/fr/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/fur/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/fy-NL/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/ga-IE/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/gd/viewer.ftl +0 -23
- package/static/assets/pdfjs/web/locale/gl/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/gn/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/gu-IN/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/he/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/hi-IN/viewer.ftl +0 -16
- package/static/assets/pdfjs/web/locale/hr/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/hsb/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/hu/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/hy-AM/viewer.ftl +372 -16
- package/static/assets/pdfjs/web/locale/hye/viewer.ftl +0 -16
- package/static/assets/pdfjs/web/locale/ia/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/id/viewer.ftl +38 -32
- package/static/assets/pdfjs/web/locale/is/viewer.ftl +27 -32
- package/static/assets/pdfjs/web/locale/it/viewer.ftl +0 -33
- package/static/assets/pdfjs/web/locale/ja/viewer.ftl +31 -33
- package/static/assets/pdfjs/web/locale/ka/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/kab/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/kk/viewer.ftl +31 -32
- package/static/assets/pdfjs/web/locale/km/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/kn/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/ko/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/lij/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/lo/viewer.ftl +0 -23
- package/static/assets/pdfjs/web/locale/lt/viewer.ftl +0 -16
- package/static/assets/pdfjs/web/locale/ltg/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/lv/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/meh/viewer.ftl +0 -14
- package/static/assets/pdfjs/web/locale/mk/viewer.ftl +0 -19
- package/static/assets/pdfjs/web/locale/ml/viewer.ftl +0 -31
- package/static/assets/pdfjs/web/locale/mr/viewer.ftl +0 -16
- package/static/assets/pdfjs/web/locale/ms/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/my/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/nb-NO/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/ne-NP/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/nl/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/nn-NO/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/oc/viewer.ftl +0 -24
- package/static/assets/pdfjs/web/locale/pa-IN/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/pl/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/pt-BR/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/pt-PT/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/rm/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/ro/viewer.ftl +5 -37
- package/static/assets/pdfjs/web/locale/ru/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/sat/viewer.ftl +0 -23
- package/static/assets/pdfjs/web/locale/sc/viewer.ftl +8 -27
- package/static/assets/pdfjs/web/locale/sco/viewer.ftl +0 -16
- package/static/assets/pdfjs/web/locale/si/viewer.ftl +0 -22
- package/static/assets/pdfjs/web/locale/sk/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/skr/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/sl/viewer.ftl +30 -32
- package/static/assets/pdfjs/web/locale/son/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/sq/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/sr/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/sv-SE/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/szl/viewer.ftl +0 -16
- package/static/assets/pdfjs/web/locale/ta/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/te/viewer.ftl +0 -16
- package/static/assets/pdfjs/web/locale/tg/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/th/viewer.ftl +38 -32
- package/static/assets/pdfjs/web/locale/tl/viewer.ftl +0 -16
- package/static/assets/pdfjs/web/locale/tr/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/trs/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/uk/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/ur/viewer.ftl +0 -16
- package/static/assets/pdfjs/web/locale/uz/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/vi/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/xh/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/zh-CN/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/locale/zh-TW/viewer.ftl +0 -32
- package/static/assets/pdfjs/web/viewer.css +586 -437
- package/static/assets/pdfjs/web/viewer.html +12 -23
- package/static/assets/pdfjs/web/viewer.mjs +955 -514
- package/static/assets/pdfjs/web/viewer.mjs.map +1 -1
- package/static/assets/pdfjs/web/wasm/openjpeg.wasm +0 -0
- package/static/assets/pdfjs/web/wasm/openjpeg_nowasm_fallback.js +10 -22
- package/static/{chunk-SPTF6FSM.js → chunk-27YQB3TE.js} +1 -1
- package/static/chunk-2I4CUFUA.js +1 -0
- package/static/chunk-2MTM6SWN.js +4 -0
- package/static/{chunk-7VRUZRJG.js → chunk-34MKICK5.js} +2 -2
- package/static/chunk-5O3DIUU3.js +1 -0
- package/static/{chunk-VJRTMDEJ.js → chunk-6NMVZIIT.js} +1 -1
- package/static/{chunk-L6MU6S2V.js → chunk-7DN7ZAPU.js} +1 -1
- package/static/{chunk-MVO4WZLK.js → chunk-7FUM3JGM.js} +1 -1
- package/static/{chunk-RSS6GYNE.js → chunk-7ITZXYYJ.js} +1 -1
- package/static/chunk-7P27WBGC.js +4 -0
- package/static/chunk-ATP3BFHV.js +562 -0
- package/static/chunk-AWQ2YTVC.js +1 -0
- package/static/chunk-DSOE3FEP.js +1 -0
- package/static/{chunk-2R6HHGUR.js → chunk-EFKMBLRE.js} +1 -1
- package/static/chunk-FUFKVHPU.js +1 -0
- package/static/{chunk-MRSWNAVB.js → chunk-HCDLWTMW.js} +1 -1
- package/static/chunk-IPAC4VAF.js +1 -0
- package/static/{chunk-ZC5NIT55.js → chunk-IQOALFYU.js} +1 -1
- package/static/chunk-JASU3CIH.js +1 -0
- package/static/{chunk-6OJZWYRZ.js → chunk-JQ5FTO2M.js} +1 -1
- package/static/chunk-JUNZFADM.js +1 -0
- package/static/{chunk-LLWSLOSX.js → chunk-LJUKI4SQ.js} +1 -1
- package/static/{chunk-WI7FOANP.js → chunk-LUWQFIWR.js} +1 -1
- package/static/{chunk-BIUNUYZ5.js → chunk-ORMRCEGT.js} +1 -1
- package/static/{chunk-IZL7JPTS.js → chunk-Q7D6RN4N.js} +1 -1
- package/static/{chunk-JYXLQRHG.js → chunk-QJX6ITLW.js} +1 -1
- package/static/{chunk-YJMN3B4N.js → chunk-QQ6UQQBR.js} +1 -1
- package/static/chunk-S2HDY3OL.js +1 -0
- package/static/{chunk-NE4NDO45.js → chunk-S75P2FFI.js} +1 -1
- package/static/{chunk-CRQNEHTX.js → chunk-T3EYFSVZ.js} +1 -1
- package/static/{chunk-MCLQFZ3S.js → chunk-U34OZUZ7.js} +1 -1
- package/static/chunk-Y7EH7G5K.js +1 -0
- package/static/{chunk-MGGT6MIJ.js → chunk-ZQQPUYLU.js} +1 -1
- package/static/index.html +2 -2
- package/static/main-7SQDDVMD.js +9 -0
- package/static/{styles-FYUSO6OJ.css → styles-A5VYX3CE.css} +1 -1
- package/server/applications/users/dto/user-password.dto.js.map +0 -1
- package/static/chunk-4U5A2DEP.js +0 -4
- package/static/chunk-54EAZ2UD.js +0 -1
- package/static/chunk-7ZRXJONB.js +0 -1
- package/static/chunk-F2J2IIJE.js +0 -1
- package/static/chunk-FNFGUIQH.js +0 -4
- package/static/chunk-GGLK52CG.js +0 -1
- package/static/chunk-HW2H3ISM.js +0 -559
- package/static/chunk-HX6BBYVD.js +0 -1
- package/static/chunk-JF7S3UYQ.js +0 -1
- package/static/chunk-KSHPKI4G.js +0 -1
- package/static/chunk-VPJ2V27B.js +0 -1
- package/static/chunk-VUI3KV7V.js +0 -1
- package/static/chunk-ZXS4V7J2.js +0 -1
- package/static/main-FFIWFD2F.js +0 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../backend/src/applications/users/services/users-manager.service.spec.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Test, TestingModule } from '@nestjs/testing'\nimport bcrypt from 'bcryptjs'\nimport path from 'node:path'\nimport { Readable } from 'node:stream'\nimport { AuthManager } from '../../../authentication/services/auth-manager.service'\nimport { comparePassword } from '../../../common/functions'\nimport * as imageModule from '../../../common/image'\nimport { pngMimeType, svgMimeType } from '../../../common/image'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport * as filesUtilsModule from '../../files/utils/files'\nimport { fileName, isPathExists } from '../../files/utils/files'\nimport { MEMBER_TYPE } from '../constants/member'\nimport { USER_GROUP_ROLE, USER_MAX_PASSWORD_ATTEMPTS, USER_ROLE } from '../constants/user'\nimport { CreateUserDto } from '../dto/create-or-update-user.dto'\nimport { DeleteUserDto } from '../dto/delete-user.dto'\nimport { UserModel } from '../models/user.model'\nimport { generateUserTest } from '../utils/test'\nimport { AdminUsersManager } from './admin-users-manager.service'\nimport { AdminUsersQueries } from './admin-users-queries.service'\nimport { UsersManager } from './users-manager.service'\nimport { UsersQueries } from './users-queries.service'\n\njest.mock('../../../common/functions', () => {\n const actual = jest.requireActual('../../../common/functions')\n return { ...actual, comparePassword: jest.fn() }\n})\njest.mock('bcryptjs', () => ({ __esModule: true, default: { hash: jest.fn(() => Promise.resolve('hashed-password')) } }))\njest.mock('../../../common/image', () => {\n const actual = jest.requireActual('../../../common/image')\n return {\n ...actual,\n generateAvatar: jest.fn(() => Readable.from([Buffer.from('PNGDATA')])),\n convertImageToBase64: jest.fn(() => Promise.resolve('BASE64_IMAGE'))\n }\n})\n\ndescribe(UsersManager.name, () => {\n let usersManager: UsersManager\n let adminUsersManager: AdminUsersManager\n let adminUsersQueries: AdminUsersQueries\n let usersQueriesService: UsersQueries\n let userTest: UserModel\n let deleteUserDto: DeleteUserDto\n const flush = () => new Promise<void>((r) => setImmediate(r))\n const okStream = (d = 'OK') => {\n const s: any = Readable.from([Buffer.from(d)])\n s.truncated = false\n return s\n }\n const errStream = (msg = 'err', truncated = false) => {\n const s: any = new Readable({\n read() {\n this.destroy(new Error(msg))\n }\n })\n s.truncated = truncated\n return s\n }\n const mkReq = (mimetype: string, stream: any, user = userTest) => ({ user, file: jest.fn().mockResolvedValue({ mimetype, file: stream }) })\n const ensurePaths = async () => {\n if (!(await isPathExists(userTest.homePath))) {\n await userTest.makePaths()\n }\n }\n\n beforeAll(async () => {\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n AdminUsersManager,\n AdminUsersQueries,\n UsersManager,\n UsersQueries,\n { provide: AuthManager, useValue: {} },\n { provide: DB_TOKEN_PROVIDER, useValue: {} },\n { provide: Cache, useValue: {} }\n ]\n }).compile()\n module.useLogger(['fatal'])\n usersManager = module.get(UsersManager)\n adminUsersManager = module.get(AdminUsersManager)\n adminUsersQueries = module.get(AdminUsersQueries)\n usersQueriesService = module.get(UsersQueries)\n userTest = new UserModel(generateUserTest(), false)\n deleteUserDto = { deleteSpace: true } satisfies DeleteUserDto\n })\n\n afterEach(() => jest.restoreAllMocks())\n\n afterAll(async () => {\n await expect(adminUsersManager.deleteUserSpace(userTest.login)).resolves.not.toThrow()\n })\n\n it('instances + findUser/me/fromUserId + impersonation', async () => {\n expect(usersManager && adminUsersManager && usersQueriesService && userTest).toBeDefined()\n usersQueriesService.from = jest.fn().mockReturnValue(userTest)\n const u1: any = await usersManager.findUser(userTest.login, true)\n expect(u1).toBeInstanceOf(UserModel)\n expect(u1.password).toBeUndefined()\n const u2 = await usersManager.findUser(userTest.login, false)\n expect(u2).toBeInstanceOf(UserModel)\n expect(u2.password).toBeDefined()\n const me1: any = await usersManager.me(userTest)\n expect(me1.user.password).toBeUndefined()\n usersQueriesService.from = jest.fn().mockReturnValue(null)\n await expect(usersManager.findUser('unknown')).resolves.toBeNull()\n await expect(usersManager.me({ id: 0 } as UserModel)).rejects.toThrow()\n usersQueriesService.from = jest.fn().mockResolvedValue(null)\n await expect(usersManager.fromUserId(123)).resolves.toBeNull()\n const authUser = new UserModel({ ...generateUserTest(), id: 42, clientId: 'CID', impersonatedFromId: 1 } as any, true)\n const fromUser = new UserModel({ ...generateUserTest(), id: 42 }, true)\n usersQueriesService.from = jest.fn().mockResolvedValue(fromUser)\n const me2 = await usersManager.me(authUser)\n expect(me2.user.impersonated).toBe(true)\n expect(me2.user.clientId).toBe('CID')\n })\n\n it('paths + avatars (default/generate) + create/delete user', async () => {\n await expect(ensurePaths()).resolves.not.toThrow()\n expect(await isPathExists(userTest.filesPath)).toBe(true)\n usersQueriesService.from = jest.fn().mockReturnValueOnce(userTest)\n const [p0, m0] = await usersManager.getAvatar(userTest.login)\n expect(fileName(p0)).toBe('avatar.svg')\n expect(m0).toBe(svgMimeType)\n usersQueriesService.from = jest.fn().mockReturnValueOnce(null)\n await expect(usersManager.getAvatar('#', true)).rejects.toThrow('does not exist')\n usersQueriesService.from = jest.fn().mockReturnValue(userTest)\n expect(await usersManager.getAvatar(userTest.login, true)).toBeUndefined()\n const [p1, m1] = await usersManager.getAvatar(userTest.login)\n expect(fileName(p1)).toBe('avatar.png')\n expect(m1).toBe(pngMimeType)\n\n usersQueriesService.checkUserExists = jest.fn().mockReturnValue(undefined)\n usersQueriesService.createUserOrGuest = jest.fn().mockReturnValue(888)\n const created = await adminUsersManager.createUserOrGuest(userTest satisfies CreateUserDto, USER_ROLE.USER)\n expect(created).toBeInstanceOf(UserModel)\n expect(await isPathExists(created.filesPath)).toBe(true)\n\n usersQueriesService.checkUserExists = jest\n .fn()\n .mockReturnValueOnce({ login: userTest.login, email: '' })\n .mockReturnValueOnce({ login: '', email: userTest.email })\n .mockReturnValueOnce(undefined)\n await expect(adminUsersManager.createUserOrGuest(userTest satisfies CreateUserDto, USER_ROLE.USER)).rejects.toThrow()\n await expect(adminUsersManager.createUserOrGuest(userTest satisfies CreateUserDto, USER_ROLE.USER)).rejects.toThrow()\n usersQueriesService.createUserOrGuest = jest.fn().mockImplementation(() => {\n throw new Error('testing')\n })\n await expect(adminUsersManager.createUserOrGuest(userTest satisfies CreateUserDto, USER_ROLE.USER)).rejects.toThrow()\n\n adminUsersQueries.deleteUser = jest.fn().mockReturnValue(true)\n await expect(adminUsersManager.deleteUserOrGuest(userTest.id, userTest.login, deleteUserDto)).resolves.not.toThrow()\n expect(await isPathExists(userTest.filesPath)).toBe(false)\n adminUsersQueries.deleteUser = jest.fn().mockReturnValue(false)\n await expect(adminUsersManager.deleteUserOrGuest(userTest.id, userTest.login, deleteUserDto)).resolves.not.toThrow()\n adminUsersQueries.deleteUser = jest.fn().mockImplementation(() => {\n throw new Error('testing')\n })\n await expect(adminUsersManager.deleteUserOrGuest(userTest.id, userTest.login, deleteUserDto)).rejects.toThrow()\n })\n\n it('logUser branches: forbidden/locked/bad/good', async () => {\n const linkUser = new UserModel({ ...generateUserTest(), role: USER_ROLE.LINK }, false)\n await expect(usersManager.logUser(linkUser, 'x', '127.0.0.1')).rejects.toThrow('Account is not allowed')\n\n const uLocked = new UserModel({ ...generateUserTest(), isActive: false, passwordAttempts: 5 }, false)\n const errSpy = jest.spyOn((usersManager as any)['logger'], 'error').mockImplementation(() => undefined as any)\n const updSpy1 = jest.spyOn(usersManager, 'updateAccesses').mockRejectedValue(new Error('reject-locked'))\n await expect(usersManager.logUser(uLocked, 'pwd', 'ip')).rejects.toThrow('Account locked')\n await flush()\n expect(errSpy).toHaveBeenCalledWith(expect.stringContaining('reject-locked'))\n expect(updSpy1).toHaveBeenCalledWith(uLocked, 'ip', false)\n ;(comparePassword as jest.Mock).mockResolvedValue(false)\n const uBad = new UserModel({ ...generateUserTest(), isActive: true, passwordAttempts: 0 }, false)\n const errSpy2 = jest.spyOn((usersManager as any)['logger'], 'error').mockImplementation(() => undefined as any)\n const updSpy2 = jest.spyOn(usersManager, 'updateAccesses').mockRejectedValue(new Error('reject-auth'))\n const out = await usersManager.logUser(uBad, 'bad', '1.1.1.1')\n expect(out).toBeNull()\n await flush()\n expect(errSpy2).toHaveBeenCalledWith(expect.stringContaining('reject-auth'))\n expect(updSpy2).toHaveBeenCalledWith(uBad, '1.1.1.1', false)\n ;(comparePassword as jest.Mock).mockResolvedValue(true)\n const uGood = new UserModel({ ...generateUserTest(), isActive: true, passwordAttempts: 0 }, false)\n const updSpy3 = jest.spyOn(usersManager, 'updateAccesses').mockResolvedValue(undefined)\n const pathsSpy = jest.spyOn(uGood, 'makePaths').mockResolvedValue(undefined)\n const out2 = await usersManager.logUser(uGood, 'good', '8.8.8.8')\n expect(out2).toBe(uGood)\n expect(updSpy3).toHaveBeenCalledWith(uGood, '8.8.8.8', true)\n expect(pathsSpy).toHaveBeenCalled()\n })\n\n it('compareUserPassword + updateLanguage + updatePassword branches', async () => {\n usersQueriesService.compareUserPassword = jest.fn().mockResolvedValue(true)\n await expect(usersManager.compareUserPassword(1, 'p')).resolves.toBe(true)\n expect(usersQueriesService.compareUserPassword).toHaveBeenCalledWith(1, 'p')\n\n usersQueriesService.updateUserOrGuest = jest.fn().mockResolvedValue(false)\n await expect(usersManager.updateLanguage(userTest, { language: '' })).rejects.toThrow('Unable to update language')\n expect(usersQueriesService.updateUserOrGuest).toHaveBeenCalledWith(userTest.id, { language: null })\n usersQueriesService.updateUserOrGuest = jest.fn().mockResolvedValue(true)\n await expect(usersManager.updateLanguage(userTest, { language: 'fr' })).resolves.toBeUndefined()\n\n usersQueriesService.selectUserProperties = jest.fn().mockResolvedValue(null)\n await expect(usersManager.updatePassword(userTest, { oldPassword: 'a', newPassword: 'b' })).rejects.toThrow('Unable to check password')\n usersQueriesService.selectUserProperties = jest.fn().mockResolvedValue({ password: 'HASH' })\n ;(comparePassword as jest.Mock).mockResolvedValue(false)\n await expect(usersManager.updatePassword(userTest, { oldPassword: 'a', newPassword: 'b' })).rejects.toThrow('Password mismatch')\n ;(comparePassword as jest.Mock).mockResolvedValue(true)\n ;(bcrypt.hash as unknown as jest.Mock).mockResolvedValue('HASHED')\n usersQueriesService.updateUserOrGuest = jest.fn().mockResolvedValue(true)\n await expect(usersManager.updatePassword(userTest, { oldPassword: 'a', newPassword: 'b' })).resolves.toBeUndefined()\n expect(usersQueriesService.updateUserOrGuest).toHaveBeenCalledWith(userTest.id, { password: 'HASHED' })\n usersQueriesService.updateUserOrGuest = jest.fn().mockResolvedValue(false)\n usersQueriesService.selectUserProperties = jest.fn().mockResolvedValue({ password: 'HASH' })\n ;(comparePassword as jest.Mock).mockResolvedValue(true)\n ;(bcrypt.hash as unknown as jest.Mock).mockResolvedValue('HASHED2')\n await expect(usersManager.updatePassword(userTest, { oldPassword: 'a', newPassword: 'b' })).rejects.toThrow('Unable to update password')\n })\n\n it('updateNotification + updateAccesses branches', async () => {\n usersQueriesService.updateUserOrGuest = jest.fn().mockResolvedValue(false)\n await expect(usersManager.updateNotification(userTest, { notification: 1 })).rejects.toThrow('Unable to update notification')\n usersQueriesService.updateUserOrGuest = jest.fn().mockResolvedValue(true)\n await expect(usersManager.updateNotification(userTest, { notification: 2 })).resolves.toBeUndefined()\n\n const prevAccess1 = new Date('2021-01-01T00:00:00Z')\n const u1 = new UserModel(\n { ...generateUserTest(), isActive: true, passwordAttempts: 3, currentIp: '1.2.3.4', currentAccess: prevAccess1 } as any,\n false\n )\n usersQueriesService.updateUserOrGuest = jest.fn().mockResolvedValue(true)\n await expect(usersManager.updateAccesses(u1, '5.6.7.8', true)).resolves.toBeUndefined()\n const payload1 = (usersQueriesService.updateUserOrGuest as jest.Mock).mock.calls[0][1]\n expect(payload1).toMatchObject({ lastIp: '1.2.3.4', currentIp: '5.6.7.8', passwordAttempts: 0, isActive: true })\n expect(payload1.lastAccess).toBe(prevAccess1)\n expect(payload1.currentAccess).toBeInstanceOf(Date)\n\n const prevAccess2 = new Date('2022-02-02T00:00:00Z')\n const u2 = new UserModel(\n {\n ...generateUserTest(),\n isActive: true,\n passwordAttempts: USER_MAX_PASSWORD_ATTEMPTS - 1,\n currentIp: 'old.ip',\n currentAccess: prevAccess2\n } as any,\n false\n )\n usersQueriesService.updateUserOrGuest = jest.fn().mockResolvedValue(true)\n await expect(usersManager.updateAccesses(u2, 'new.ip', false)).resolves.toBeUndefined()\n const payload2 = (usersQueriesService.updateUserOrGuest as jest.Mock).mock.calls[0][1]\n expect(payload2.passwordAttempts).toBe(USER_MAX_PASSWORD_ATTEMPTS)\n expect(payload2.isActive).toBe(false)\n expect(payload2.lastAccess).toBe(prevAccess2)\n expect(payload2.lastIp).toBe('old.ip')\n expect(payload2.currentIp).toBe('new.ip')\n expect(payload2.currentAccess).toBeInstanceOf(Date)\n })\n\n it('avatars advanced: generateIsNotExists, failure branches, base64 fallback', async () => {\n await ensurePaths()\n usersManager.findUser = jest.fn().mockResolvedValue({ getInitials: () => 'UT' } as unknown as UserModel)\n const [p, m] = (await usersManager.getAvatar(userTest.login, false, true)) as [string, string]\n expect(fileName(p)).toBe('avatar.png')\n expect(m).toBe(pngMimeType)\n jest.spyOn(imageModule, 'generateAvatar').mockImplementation(() => errStream('gen error'))\n await expect(usersManager.getAvatar(userTest.login, true)).rejects.toThrow('Unable to create avatar')\n usersManager.findUser = jest.fn().mockResolvedValue(null)\n await expect(usersManager.getAvatar(userTest.login, true)).rejects.toThrow('avatar not found')\n const s1 = await usersManager.getAvatarBase64(userTest.login)\n expect(s1).toBe('BASE64_IMAGE')\n ;(imageModule.convertImageToBase64 as jest.Mock).mockClear()\n const s2 = await usersManager.getAvatarBase64('non-existent-login')\n expect(s2).toBe('BASE64_IMAGE')\n expect(imageModule.convertImageToBase64).toHaveBeenCalledWith(expect.stringMatching(/avatar\\.svg$/))\n })\n\n it('updateAvatar branches: mime error, stream error, truncated, move fail, success', async () => {\n await ensurePaths()\n await expect(usersManager.updateAvatar(mkReq('text/plain', okStream('X')) as any)).rejects.toThrow('Unsupported file type')\n await expect(usersManager.updateAvatar(mkReq('image/png', errStream('stream error')) as any)).rejects.toThrow('Unable to upload avatar')\n\n const t = okStream('OK')\n t.truncated = true\n const mvSpy = jest.spyOn(filesUtilsModule, 'moveFiles').mockResolvedValue(undefined)\n await expect(usersManager.updateAvatar(mkReq('image/png', t) as any)).rejects.toThrow('Image is too large (5MB max)')\n expect(mvSpy).not.toHaveBeenCalled()\n\n jest.spyOn(filesUtilsModule, 'moveFiles').mockRejectedValue(new Error('mv fail'))\n await expect(usersManager.updateAvatar(mkReq('image/png', okStream()) as any)).rejects.toThrow('Unable to create avatar')\n\n const mvSpy2 = jest.spyOn(filesUtilsModule, 'moveFiles').mockResolvedValue(undefined)\n await expect(usersManager.updateAvatar(mkReq('image/png', okStream()) as any)).resolves.toBeUndefined()\n const expectedSrc = path.join(userTest.tmpPath, 'avatar.png')\n const expectedDst = path.join(userTest.homePath, 'avatar.png')\n expect(mvSpy2).toHaveBeenCalledWith(expectedSrc, expectedDst, true)\n })\n\n it('setOnlineStatus + browseGroups + getGroup', async () => {\n usersQueriesService.setOnlineStatus = jest.fn().mockRejectedValue(new Error('boom'))\n expect(() => usersManager.setOnlineStatus({ id: 1 } as any, 1 as any)).not.toThrow()\n\n usersQueriesService.browseRootGroups = jest.fn().mockResolvedValue([{ id: 1 }])\n const root = await usersManager.browseGroups(userTest, '')\n expect(root.parentGroup).toBeUndefined()\n expect(root.members.length).toBe(1)\n usersQueriesService.groupFromName = jest.fn().mockResolvedValue(null)\n await expect(usersManager.browseGroups(userTest, 'unknown')).rejects.toThrow('Group not found')\n const group = { id: 42, name: 'Team' }\n usersQueriesService.groupFromName = jest.fn().mockResolvedValue(group)\n usersQueriesService.browseGroupMembers = jest.fn().mockResolvedValue([{ id: 7 }, { id: 8 }])\n const g2 = await usersManager.browseGroups(userTest, 'Team')\n expect(g2.parentGroup).toEqual(group)\n expect(g2.members).toEqual([{ id: 7 }, { id: 8 }])\n expect(usersQueriesService.browseGroupMembers).toHaveBeenCalledWith(42)\n\n usersQueriesService.getGroupWithMembers = jest.fn().mockResolvedValue({ id: 1, members: [] })\n await expect(usersManager.getGroup(userTest, 1)).resolves.toEqual({ id: 1, members: [] })\n usersQueriesService.getGroup = jest.fn().mockResolvedValue({ id: 2 })\n await expect(usersManager.getGroup(userTest, 2, false)).resolves.toEqual({ id: 2 })\n usersQueriesService.getGroup = jest.fn().mockResolvedValue(null)\n await expect(usersManager.getGroup(userTest, 3, false)).rejects.toThrow('You are not allowed to do this action')\n })\n\n it('create/update personal group', async () => {\n await expect(usersManager.createPersonalGroup(userTest, { name: '' } as any)).rejects.toThrow('Group name is missing')\n usersQueriesService.checkGroupNameExists = jest.fn().mockResolvedValue(true)\n await expect(usersManager.createPersonalGroup(userTest, { name: 'A' })).rejects.toThrow('Name already used')\n usersQueriesService.checkGroupNameExists = jest.fn().mockResolvedValue(false)\n usersQueriesService.createPersonalGroup = jest.fn().mockResolvedValue(10)\n usersQueriesService.clearWhiteListCaches = jest.fn()\n usersManager.getGroup = jest.fn().mockResolvedValue({ id: 10 })\n const logSpy = jest.spyOn((usersManager as any)['logger'], 'log').mockImplementation(() => undefined as any)\n await expect(usersManager.createPersonalGroup(userTest, { name: 'OK' })).resolves.toEqual({ id: 10 })\n expect(logSpy).toHaveBeenCalled()\n usersQueriesService.createPersonalGroup = jest.fn().mockRejectedValue(new Error('db down'))\n await expect(usersManager.createPersonalGroup(userTest, { name: 'OK' })).rejects.toThrow('Unable to create group')\n\n await expect(usersManager.updatePersonalGroup(userTest, 1, {} as any)).rejects.toThrow('No changes to update')\n usersManager.getGroup = jest.fn().mockResolvedValueOnce({ id: 1, type: MEMBER_TYPE.GROUP })\n await expect(usersManager.updatePersonalGroup(userTest, 1, { name: 'x' })).rejects.toThrow('You are not allowed to do this action')\n usersManager.getGroup = jest.fn().mockResolvedValue({ id: 1, type: MEMBER_TYPE.PGROUP })\n usersQueriesService.checkGroupNameExists = jest.fn().mockResolvedValue(true)\n await expect(usersManager.updatePersonalGroup(userTest, 1, { name: 'dup' })).rejects.toThrow('Name already used')\n usersQueriesService.checkGroupNameExists = jest.fn().mockResolvedValue(false)\n usersQueriesService.updateGroup = jest.fn().mockRejectedValue(new Error('oops'))\n await expect(usersManager.updatePersonalGroup(userTest, 1, { name: 'ok' })).rejects.toThrow('oops')\n usersQueriesService.updateGroup = jest.fn().mockResolvedValue(true)\n usersManager.getGroup = jest.fn().mockResolvedValue({ id: 1, type: MEMBER_TYPE.PGROUP })\n await expect(usersManager.updatePersonalGroup(userTest, 1, { name: 'ok' })).resolves.not.toThrow()\n expect(usersManager.getGroup).toHaveBeenCalledWith(userTest, 1, false, userTest.isAdmin)\n })\n\n it('addUsersToGroup (GROUP/PGROUP)', async () => {\n usersManager.getGroup = jest.fn().mockResolvedValue({ id: 1, type: MEMBER_TYPE.GROUP, members: [{ id: 2 }, { id: 3 }] })\n usersQueriesService.usersWhitelist = jest.fn().mockResolvedValue([3, 4, 5])\n await expect(usersManager.addUsersToGroup(userTest, 1, [2, 3])).rejects.toThrow('No users to add to group')\n usersQueriesService.updateGroupMembers = jest.fn().mockResolvedValue(undefined)\n await expect(usersManager.addUsersToGroup(userTest, 1, [3, 4, 5])).resolves.toBeUndefined()\n expect(usersQueriesService.updateGroupMembers).toHaveBeenCalledWith(1, {\n add: [\n { id: 4, groupRole: USER_GROUP_ROLE.MEMBER },\n { id: 5, groupRole: USER_GROUP_ROLE.MEMBER }\n ]\n })\n expect(usersQueriesService.usersWhitelist).toHaveBeenCalledWith(userTest.id, USER_ROLE.USER)\n\n usersManager.getGroup = jest.fn().mockResolvedValue({ id: 2, type: MEMBER_TYPE.PGROUP, members: [] })\n usersQueriesService.usersWhitelist = jest.fn().mockResolvedValue([10, 11])\n usersQueriesService.updateGroupMembers = jest.fn().mockResolvedValue(undefined)\n await expect(usersManager.addUsersToGroup(userTest, 2, [10, 11])).resolves.toBeUndefined()\n expect(usersQueriesService.usersWhitelist).toHaveBeenCalledWith(userTest.id, undefined)\n expect(usersQueriesService.updateGroupMembers).toHaveBeenCalledWith(2, {\n add: [\n { id: 10, groupRole: USER_GROUP_ROLE.MEMBER },\n { id: 11, groupRole: USER_GROUP_ROLE.MEMBER }\n ]\n })\n })\n\n it('updateUserFromPersonalGroup', async () => {\n usersManager.getGroup = jest.fn().mockResolvedValue({ id: 1, type: MEMBER_TYPE.GROUP, members: [] })\n await expect(usersManager.updateUserFromPersonalGroup(userTest, 1, 9, { role: 1 })).rejects.toThrow('You are not allowed to do this action')\n usersManager.getGroup = jest.fn().mockResolvedValue({ id: 1, type: MEMBER_TYPE.PGROUP, members: [] })\n await expect(usersManager.updateUserFromPersonalGroup(userTest, 1, 9, { role: 1 })).rejects.toThrow('User was not found')\n usersManager.getGroup = jest.fn().mockResolvedValue({\n id: 1,\n type: MEMBER_TYPE.PGROUP,\n members: [\n { id: 9, groupRole: USER_GROUP_ROLE.MANAGER },\n { id: 10, groupRole: USER_GROUP_ROLE.MEMBER }\n ]\n })\n await expect(usersManager.updateUserFromPersonalGroup(userTest, 1, 9, { role: USER_GROUP_ROLE.MEMBER })).rejects.toThrow(\n /group must have at least one manager/i\n )\n const spy = jest.spyOn(adminUsersManager, 'updateUserFromGroup').mockResolvedValue(undefined)\n usersManager.getGroup = jest.fn().mockResolvedValue({\n id: 1,\n type: MEMBER_TYPE.PGROUP,\n members: [\n { id: 9, groupRole: USER_GROUP_ROLE.MEMBER },\n { id: 10, groupRole: USER_GROUP_ROLE.MEMBER },\n { id: 11, groupRole: USER_GROUP_ROLE.MEMBER }\n ]\n })\n await expect(usersManager.updateUserFromPersonalGroup(userTest, 1, 9, { role: USER_GROUP_ROLE.MANAGER })).resolves.toBeUndefined()\n expect(spy).toHaveBeenCalledWith(1, 9, { role: 1 })\n usersManager.getGroup = jest.fn().mockResolvedValue({ id: 1, type: MEMBER_TYPE.PGROUP, members: [{ id: 9, groupRole: USER_GROUP_ROLE.MEMBER }] })\n await expect(usersManager.updateUserFromPersonalGroup(userTest, 1, 9, { role: USER_GROUP_ROLE.MEMBER })).resolves.toBeUndefined()\n ;(spy as jest.Mock).mockClear()\n usersManager.getGroup = jest.fn().mockResolvedValue({\n id: 1,\n type: MEMBER_TYPE.PGROUP,\n members: [\n { id: 9, groupRole: USER_GROUP_ROLE.MANAGER },\n { id: 10, groupRole: USER_GROUP_ROLE.MANAGER }\n ]\n })\n await expect(usersManager.updateUserFromPersonalGroup(userTest, 1, 9, { role: USER_GROUP_ROLE.MEMBER })).resolves.toBeUndefined()\n expect(spy).toHaveBeenCalledWith(1, 9, { role: USER_GROUP_ROLE.MEMBER })\n ;(spy as jest.Mock).mockClear()\n usersManager.getGroup = jest.fn().mockResolvedValue({\n id: 1,\n type: MEMBER_TYPE.PGROUP,\n members: [\n { id: 9, groupRole: USER_GROUP_ROLE.MANAGER },\n { id: 10, groupRole: USER_GROUP_ROLE.MANAGER }\n ]\n })\n await expect(usersManager.updateUserFromPersonalGroup(userTest, 1, 9, { role: USER_GROUP_ROLE.MANAGER })).resolves.toBeUndefined()\n expect(spy).not.toHaveBeenCalled()\n })\n\n it('removeUserFromGroup', async () => {\n usersManager.getGroup = jest.fn().mockResolvedValue({ id: 1, members: [] })\n await expect(usersManager.removeUserFromGroup(userTest, 1, 9)).rejects.toThrow('User was not found')\n usersManager.getGroup = jest.fn().mockResolvedValue({ id: 1, type: MEMBER_TYPE.GROUP, members: [{ id: 9, groupRole: USER_GROUP_ROLE.MANAGER }] })\n await expect(usersManager.removeUserFromGroup(userTest, 1, 9)).rejects.toThrow('You are not allowed to do this action')\n usersManager.getGroup = jest.fn().mockResolvedValue({ id: 1, type: MEMBER_TYPE.PGROUP, members: [{ id: 9, groupRole: USER_GROUP_ROLE.MANAGER }] })\n await expect(usersManager.removeUserFromGroup(userTest, 1, 9)).rejects.toThrow('Group must have at least one manager')\n usersQueriesService.updateGroupMembers = jest.fn().mockResolvedValue(undefined)\n usersManager.getGroup = jest.fn().mockResolvedValue({\n id: 1,\n type: MEMBER_TYPE.PGROUP,\n members: [\n { id: 9, groupRole: USER_GROUP_ROLE.MEMBER },\n { id: 10, groupRole: USER_GROUP_ROLE.MANAGER }\n ]\n })\n await expect(usersManager.removeUserFromGroup(userTest, 1, 9)).resolves.toBeUndefined()\n expect(usersQueriesService.updateGroupMembers).toHaveBeenCalledWith(1, { remove: [9] })\n usersQueriesService.updateGroupMembers = jest.fn().mockResolvedValue(undefined)\n usersManager.getGroup = jest.fn().mockResolvedValue({\n id: 1,\n type: MEMBER_TYPE.PGROUP,\n members: [\n { id: 9, groupRole: USER_GROUP_ROLE.MANAGER },\n { id: 10, groupRole: USER_GROUP_ROLE.MANAGER }\n ]\n })\n await expect(usersManager.removeUserFromGroup(userTest, 1, 9)).resolves.toBeUndefined()\n expect(usersQueriesService.updateGroupMembers).toHaveBeenCalledWith(1, { remove: [9] })\n })\n\n it('leave/delete personal group', async () => {\n usersQueriesService.getGroupWithMembers = jest.fn().mockResolvedValue(null)\n await expect(usersManager.leavePersonalGroup(userTest, 1)).rejects.toThrow('You are not allowed to do this action')\n usersQueriesService.getGroupWithMembers = jest.fn().mockResolvedValue({ id: 1, type: MEMBER_TYPE.GROUP, members: [{ id: userTest.id }] })\n await expect(usersManager.leavePersonalGroup(userTest, 1)).rejects.toThrow('You are not allowed to do this action')\n usersQueriesService.getGroupWithMembers = jest.fn().mockResolvedValue({ id: 1, type: MEMBER_TYPE.PGROUP, members: [] })\n await expect(usersManager.leavePersonalGroup(userTest, 1)).rejects.toThrow('User was not found')\n usersQueriesService.getGroupWithMembers = jest.fn().mockResolvedValue({\n id: 1,\n type: MEMBER_TYPE.PGROUP,\n members: [{ id: userTest.id, groupRole: USER_GROUP_ROLE.MANAGER }]\n })\n await expect(usersManager.leavePersonalGroup(userTest, 1)).rejects.toThrow('Group must have at least one manager')\n usersQueriesService.getGroupWithMembers = jest.fn().mockResolvedValue({\n id: 1,\n type: 2,\n members: [\n { id: userTest.id, groupRole: USER_GROUP_ROLE.MEMBER },\n { id: 9, groupRole: USER_GROUP_ROLE.MANAGER }\n ]\n })\n const lSpy = jest.spyOn((usersManager as any)['logger'], 'log').mockImplementation(() => undefined as any)\n usersQueriesService.updateGroupMembers = jest.fn().mockResolvedValue(undefined)\n await expect(usersManager.leavePersonalGroup(userTest, 1)).resolves.toBeUndefined()\n expect(lSpy).toHaveBeenCalledWith(expect.stringMatching(/has left group/))\n usersQueriesService.updateGroupMembers = jest.fn().mockRejectedValue(new Error('DB'))\n await expect(usersManager.leavePersonalGroup(userTest, 1)).rejects.toThrow('DB')\n usersQueriesService.getGroupWithMembers = jest.fn().mockResolvedValue({\n id: 1,\n type: MEMBER_TYPE.PGROUP,\n members: [\n { id: userTest.id, groupRole: USER_GROUP_ROLE.MANAGER },\n { id: 9, groupRole: USER_GROUP_ROLE.MANAGER }\n ]\n })\n usersQueriesService.updateGroupMembers = jest.fn().mockResolvedValue(undefined)\n await expect(usersManager.leavePersonalGroup(userTest, 1)).resolves.toBeUndefined()\n\n usersQueriesService.canDeletePersonalGroup = jest.fn().mockResolvedValue(false)\n await expect(usersManager.deletePersonalGroup(userTest, 7)).rejects.toThrow('You are not allowed to do this action')\n usersQueriesService.canDeletePersonalGroup = jest.fn().mockResolvedValue(true)\n const wSpy = jest.spyOn((usersManager as any)['logger'], 'warn').mockImplementation(() => undefined as any)\n usersQueriesService.deletePersonalGroup = jest.fn().mockResolvedValue(false)\n await expect(usersManager.deletePersonalGroup(userTest, 7)).rejects.toThrow('Unable to delete group')\n expect(wSpy).toHaveBeenCalledWith(expect.stringMatching(/does not exist/))\n const lgSpy = jest.spyOn((usersManager as any)['logger'], 'log').mockImplementation(() => undefined as any)\n usersQueriesService.deletePersonalGroup = jest.fn().mockResolvedValue(true)\n await expect(usersManager.deletePersonalGroup(userTest, 7)).resolves.toBeUndefined()\n expect(lgSpy).toHaveBeenCalledWith(expect.stringMatching(/was deleted/))\n })\n\n it('guests + proxies', async () => {\n usersQueriesService.listGuests = jest.fn().mockResolvedValue([{ id: 1 }])\n await expect(usersManager.listGuests(userTest)).resolves.toEqual([{ id: 1 }])\n const checkSpy = jest.spyOn(adminUsersManager, 'checkUser').mockImplementation(() => undefined)\n usersQueriesService.listGuests = jest.fn().mockResolvedValue({ id: 9 })\n await expect(usersManager.getGuest(userTest, 9)).resolves.toEqual({ id: 9 })\n expect(checkSpy).toHaveBeenCalled()\n\n usersQueriesService.usersWhitelist = jest.fn().mockResolvedValue([userTest.id, 100])\n usersQueriesService.clearWhiteListCaches = jest.fn()\n const createSpy = jest.spyOn(adminUsersManager, 'createUserOrGuest').mockResolvedValue({ id: 55 } as any)\n const dto1: CreateUserDto = { ...userTest, managers: [100], password: 'x' }\n const r = await usersManager.createGuest(userTest, dto1)\n expect(createSpy).toHaveBeenCalled()\n expect(usersQueriesService.clearWhiteListCaches).toHaveBeenCalledWith([userTest.id])\n expect(r).toEqual({ id: 55 })\n const args1 = (createSpy as jest.Mock).mock.calls[0][0]\n expect(args1.managers).toEqual(expect.arrayContaining([userTest.id]))\n ;(createSpy as jest.Mock).mockClear()\n const dto2: CreateUserDto = { ...userTest, managers: [userTest.id, 100], password: 'y' }\n await usersManager.createGuest(userTest, dto2)\n const args2 = (createSpy as jest.Mock).mock.calls[0][0]\n expect((args2.managers as number[]).filter((m: number) => m === userTest.id)).toHaveLength(1)\n\n await expect(usersManager.updateGuest(userTest, 9, {} as any)).rejects.toThrow('No changes to update')\n usersQueriesService.usersWhitelist = jest.fn().mockResolvedValue([1])\n await expect(usersManager.updateGuest(userTest, 9, { managers: [2] } as any)).rejects.toThrow('Guest must have at least one manager')\n usersQueriesService.isGuestManager = jest.fn().mockResolvedValue(false)\n await expect(usersManager.updateGuest(userTest, 9, { email: 'a' } as any)).rejects.toThrow('You are not allowed to do this action')\n usersQueriesService.isGuestManager = jest.fn().mockResolvedValue(true)\n jest.spyOn(adminUsersManager, 'updateUserOrGuest').mockResolvedValue({ managers: [{ id: 999 }] } as any)\n await expect(usersManager.updateGuest(userTest, 9, { email: 'a' } as any)).resolves.toBeNull()\n jest.spyOn(adminUsersManager, 'updateUserOrGuest').mockResolvedValue({ managers: [{ id: userTest.id }] } as any)\n await expect(usersManager.updateGuest(userTest, 9, { email: 'a' } as any)).resolves.toEqual({ managers: [{ id: userTest.id }] })\n usersQueriesService.usersWhitelist = jest.fn().mockResolvedValue([userTest.id, 77])\n usersQueriesService.isGuestManager = jest.fn().mockResolvedValue(true)\n jest.spyOn(adminUsersManager, 'updateUserOrGuest').mockResolvedValue({ managers: [{ id: userTest.id }, { id: 77 }] } as any)\n await expect(usersManager.updateGuest(userTest, 9, { managers: [userTest.id, 77] } as any)).resolves.toEqual({\n managers: [{ id: userTest.id }, { id: 77 }]\n })\n\n usersQueriesService.isGuestManager = jest.fn().mockResolvedValue(null)\n await expect(usersManager.deleteGuest(userTest, 9)).rejects.toThrow('You are not allowed to do this action')\n usersQueriesService.isGuestManager = jest.fn().mockResolvedValue({ id: 9, login: 'guest' })\n const delSpy = jest.spyOn(adminUsersManager, 'deleteUserOrGuest').mockResolvedValue(undefined)\n await expect(usersManager.deleteGuest(userTest, 9)).resolves.toBeUndefined()\n expect(delSpy).toHaveBeenCalledWith(9, 'guest', { deleteSpace: true, isGuest: true })\n\n usersQueriesService.searchUsersOrGroups = jest.fn().mockResolvedValue([{ id: 1 }])\n await expect(usersManager.searchMembers(userTest, { search: '' } as any)).resolves.toEqual([{ id: 1 }])\n\n usersQueriesService.getOnlineUsers = jest.fn().mockResolvedValue([{ id: 123 }])\n await expect(usersManager.getOnlineUsers([123])).resolves.toEqual([{ id: 123 }])\n expect(usersQueriesService.getOnlineUsers).toHaveBeenCalledWith([123])\n usersQueriesService.usersWhitelist = jest.fn().mockResolvedValue([10, 11])\n await expect(usersManager.usersWhitelist(userTest.id)).resolves.toEqual([10, 11])\n expect(usersQueriesService.usersWhitelist).toHaveBeenCalledWith(userTest.id)\n })\n})\n"],"names":["jest","mock","actual","requireActual","comparePassword","fn","__esModule","default","hash","Promise","resolve","generateAvatar","Readable","from","Buffer","convertImageToBase64","describe","UsersManager","name","usersManager","adminUsersManager","adminUsersQueries","usersQueriesService","userTest","deleteUserDto","flush","r","setImmediate","okStream","d","s","truncated","errStream","msg","read","destroy","Error","mkReq","mimetype","stream","user","file","mockResolvedValue","ensurePaths","isPathExists","homePath","makePaths","beforeAll","module","Test","createTestingModule","providers","AdminUsersManager","AdminUsersQueries","UsersQueries","provide","AuthManager","useValue","DB_TOKEN_PROVIDER","Cache","compile","useLogger","get","UserModel","generateUserTest","deleteSpace","afterEach","restoreAllMocks","afterAll","expect","deleteUserSpace","login","resolves","not","toThrow","it","toBeDefined","mockReturnValue","u1","findUser","toBeInstanceOf","password","toBeUndefined","u2","me1","me","toBeNull","id","rejects","fromUserId","authUser","clientId","impersonatedFromId","fromUser","me2","impersonated","toBe","filesPath","mockReturnValueOnce","p0","m0","getAvatar","fileName","svgMimeType","p1","m1","pngMimeType","checkUserExists","undefined","createUserOrGuest","created","USER_ROLE","USER","email","mockImplementation","deleteUser","deleteUserOrGuest","linkUser","role","LINK","logUser","uLocked","isActive","passwordAttempts","errSpy","spyOn","updSpy1","mockRejectedValue","toHaveBeenCalledWith","stringContaining","uBad","errSpy2","updSpy2","out","uGood","updSpy3","pathsSpy","out2","toHaveBeenCalled","compareUserPassword","updateUserOrGuest","updateLanguage","language","selectUserProperties","updatePassword","oldPassword","newPassword","bcrypt","updateNotification","notification","prevAccess1","Date","currentIp","currentAccess","updateAccesses","payload1","calls","toMatchObject","lastIp","lastAccess","prevAccess2","USER_MAX_PASSWORD_ATTEMPTS","payload2","getInitials","p","m","imageModule","s1","getAvatarBase64","mockClear","s2","stringMatching","updateAvatar","t","mvSpy","filesUtilsModule","mvSpy2","expectedSrc","path","join","tmpPath","expectedDst","setOnlineStatus","browseRootGroups","root","browseGroups","parentGroup","members","length","groupFromName","group","browseGroupMembers","g2","toEqual","getGroupWithMembers","getGroup","createPersonalGroup","checkGroupNameExists","clearWhiteListCaches","logSpy","updatePersonalGroup","mockResolvedValueOnce","type","MEMBER_TYPE","GROUP","PGROUP","updateGroup","isAdmin","usersWhitelist","addUsersToGroup","updateGroupMembers","add","groupRole","USER_GROUP_ROLE","MEMBER","updateUserFromPersonalGroup","MANAGER","spy","removeUserFromGroup","remove","leavePersonalGroup","lSpy","canDeletePersonalGroup","deletePersonalGroup","wSpy","lgSpy","listGuests","checkSpy","getGuest","createSpy","dto1","managers","createGuest","args1","arrayContaining","dto2","args2","filter","toHaveLength","updateGuest","isGuestManager","deleteGuest","delSpy","isGuest","searchUsersOrGroups","searchMembers","search","getOnlineUsers"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/users/services/users-manager.service.spec.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Test, TestingModule } from '@nestjs/testing'\nimport bcrypt from 'bcryptjs'\nimport path from 'node:path'\nimport { Readable } from 'node:stream'\nimport { AuthManager } from '../../../authentication/services/auth-manager.service'\nimport { comparePassword } from '../../../common/functions'\nimport * as imageModule from '../../../common/image'\nimport { pngMimeType, svgMimeType } from '../../../common/image'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport * as filesUtilsModule from '../../files/utils/files'\nimport { fileName, isPathExists } from '../../files/utils/files'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { MEMBER_TYPE } from '../constants/member'\nimport { USER_GROUP_ROLE, USER_MAX_PASSWORD_ATTEMPTS, USER_ROLE } from '../constants/user'\nimport { CreateUserDto } from '../dto/create-or-update-user.dto'\nimport { DeleteUserDto } from '../dto/delete-user.dto'\nimport { UserModel } from '../models/user.model'\nimport { generateUserTest } from '../utils/test'\nimport { AdminUsersManager } from './admin-users-manager.service'\nimport { AdminUsersQueries } from './admin-users-queries.service'\nimport { UsersManager } from './users-manager.service'\nimport { UsersQueries } from './users-queries.service'\n\njest.mock('../../../common/functions', () => {\n const actual = jest.requireActual('../../../common/functions')\n return { ...actual, comparePassword: jest.fn() }\n})\njest.mock('bcryptjs', () => ({ __esModule: true, default: { hash: jest.fn(() => Promise.resolve('hashed-password')) } }))\njest.mock('../../../common/image', () => {\n const actual = jest.requireActual('../../../common/image')\n return {\n ...actual,\n generateAvatar: jest.fn(() => Readable.from([Buffer.from('PNGDATA')]))\n }\n})\n\ndescribe(UsersManager.name, () => {\n let usersManager: UsersManager\n let adminUsersManager: AdminUsersManager\n let adminUsersQueries: AdminUsersQueries\n let usersQueriesService: UsersQueries\n let userTest: UserModel\n let deleteUserDto: DeleteUserDto\n const flush = () => new Promise<void>((r) => setImmediate(r))\n const okStream = (d = 'OK') => {\n const s: any = Readable.from([Buffer.from(d)])\n s.truncated = false\n return s\n }\n const errStream = (msg = 'err', truncated = false) => {\n const s: any = new Readable({\n read() {\n this.destroy(new Error(msg))\n }\n })\n s.truncated = truncated\n return s\n }\n const mkReq = (mimetype: string, stream: any, user = userTest) => ({ user, file: jest.fn().mockResolvedValue({ mimetype, file: stream }) })\n const ensurePaths = async () => {\n if (!(await isPathExists(userTest.homePath))) {\n await userTest.makePaths()\n }\n }\n\n const notificationsManager = {\n sendEmailNotification: jest.fn().mockResolvedValue(undefined)\n }\n\n beforeAll(async () => {\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n AdminUsersManager,\n AdminUsersQueries,\n UsersManager,\n UsersQueries,\n { provide: NotificationsManager, useValue: notificationsManager },\n { provide: AuthManager, useValue: {} },\n { provide: DB_TOKEN_PROVIDER, useValue: {} },\n { provide: Cache, useValue: {} }\n ]\n }).compile()\n module.useLogger(['fatal'])\n usersManager = module.get(UsersManager)\n adminUsersManager = module.get(AdminUsersManager)\n adminUsersQueries = module.get(AdminUsersQueries)\n usersQueriesService = module.get(UsersQueries)\n userTest = new UserModel(generateUserTest(), false)\n deleteUserDto = { deleteSpace: true, isGuest: false } satisfies DeleteUserDto\n })\n\n afterEach(() => jest.restoreAllMocks())\n\n afterAll(async () => {\n await expect(adminUsersManager.deleteUserSpace(userTest.login)).resolves.not.toThrow()\n })\n\n it('instances + findUser/me/fromUserId + impersonation', async () => {\n expect(usersManager && adminUsersManager && usersQueriesService && userTest).toBeDefined()\n usersQueriesService.from = jest.fn().mockReturnValue(userTest)\n const u1: any = await usersManager.findUser(userTest.login, true)\n expect(u1).toBeInstanceOf(UserModel)\n expect(u1.password).toBeUndefined()\n const u2 = await usersManager.findUser(userTest.login, false)\n expect(u2).toBeInstanceOf(UserModel)\n expect(u2.password).toBeDefined()\n const me1: any = await usersManager.me(userTest)\n expect(me1.user.password).toBeUndefined()\n usersQueriesService.from = jest.fn().mockReturnValue(null)\n await expect(usersManager.findUser('unknown')).resolves.toBeNull()\n await expect(usersManager.me({ id: 0 } as UserModel)).rejects.toThrow()\n usersQueriesService.from = jest.fn().mockResolvedValue(null)\n await expect(usersManager.fromUserId(123)).resolves.toBeNull()\n const authUser = new UserModel({ ...generateUserTest(), id: 42, clientId: 'CID', impersonatedFromId: 1 } as any, true)\n const fromUser = new UserModel({ ...generateUserTest(), id: 42 }, true)\n usersQueriesService.from = jest.fn().mockResolvedValue(fromUser)\n const me2 = await usersManager.me(authUser)\n expect(me2.user.impersonated).toBe(true)\n expect(me2.user.clientId).toBe('CID')\n })\n\n it('paths + avatars (default/generate) + create/delete user', async () => {\n await expect(ensurePaths()).resolves.not.toThrow()\n expect(await isPathExists(userTest.filesPath)).toBe(true)\n usersQueriesService.from = jest.fn().mockReturnValueOnce(userTest)\n const [p0, m0] = await usersManager.getAvatar(userTest.login)\n expect(fileName(p0)).toBe('avatar.svg')\n expect(m0).toBe(svgMimeType)\n usersQueriesService.from = jest.fn().mockReturnValueOnce(null)\n await expect(usersManager.getAvatar('#', true)).rejects.toThrow('does not exist')\n usersQueriesService.from = jest.fn().mockReturnValue(userTest)\n expect(await usersManager.getAvatar(userTest.login, true)).toBeUndefined()\n const [p1, m1] = await usersManager.getAvatar(userTest.login)\n expect(fileName(p1)).toBe('avatar.png')\n expect(m1).toBe(pngMimeType)\n\n usersQueriesService.checkUserExists = jest.fn().mockReturnValue(undefined)\n usersQueriesService.createUserOrGuest = jest.fn().mockReturnValue(888)\n const created = await adminUsersManager.createUserOrGuest(userTest satisfies CreateUserDto, USER_ROLE.USER)\n expect(created).toBeInstanceOf(UserModel)\n expect(await isPathExists(created.filesPath)).toBe(true)\n\n usersQueriesService.checkUserExists = jest\n .fn()\n .mockReturnValueOnce({ login: userTest.login, email: '' })\n .mockReturnValueOnce({ login: '', email: userTest.email })\n .mockReturnValueOnce(undefined)\n await expect(adminUsersManager.createUserOrGuest(userTest satisfies CreateUserDto, USER_ROLE.USER)).rejects.toThrow()\n await expect(adminUsersManager.createUserOrGuest(userTest satisfies CreateUserDto, USER_ROLE.USER)).rejects.toThrow()\n usersQueriesService.createUserOrGuest = jest.fn().mockImplementation(() => {\n throw new Error('testing')\n })\n await expect(adminUsersManager.createUserOrGuest(userTest satisfies CreateUserDto, USER_ROLE.USER)).rejects.toThrow()\n\n adminUsersQueries.deleteUser = jest.fn().mockReturnValue(true)\n await expect(adminUsersManager.deleteUserOrGuest(userTest.id, userTest.login, deleteUserDto)).resolves.not.toThrow()\n expect(await isPathExists(userTest.filesPath)).toBe(false)\n adminUsersQueries.deleteUser = jest.fn().mockReturnValue(false)\n await expect(adminUsersManager.deleteUserOrGuest(userTest.id, userTest.login, deleteUserDto)).resolves.not.toThrow()\n adminUsersQueries.deleteUser = jest.fn().mockImplementation(() => {\n throw new Error('testing')\n })\n await expect(adminUsersManager.deleteUserOrGuest(userTest.id, userTest.login, deleteUserDto)).rejects.toThrow()\n })\n\n it('logUser branches: forbidden/locked/bad/good', async () => {\n const linkUser = new UserModel({ ...generateUserTest(), role: USER_ROLE.LINK }, false)\n await expect(usersManager.logUser(linkUser, 'x', '127.0.0.1')).rejects.toThrow('Account is not allowed')\n\n const uLocked = new UserModel({ ...generateUserTest(), isActive: false, passwordAttempts: 5 }, false)\n const errSpy = jest.spyOn((usersManager as any)['logger'], 'error').mockImplementation(() => undefined as any)\n const updSpy1 = jest.spyOn(usersManager, 'updateAccesses').mockRejectedValue(new Error('reject-locked'))\n await expect(usersManager.logUser(uLocked, 'pwd', 'ip')).rejects.toThrow('Account locked')\n await flush()\n expect(errSpy).toHaveBeenCalledWith(expect.stringContaining('reject-locked'))\n expect(updSpy1).toHaveBeenCalledWith(uLocked, 'ip', false)\n ;(comparePassword as jest.Mock).mockResolvedValue(false)\n const uBad = new UserModel({ ...generateUserTest(), isActive: true, passwordAttempts: 0 }, false)\n const errSpy2 = jest.spyOn((usersManager as any)['logger'], 'error').mockImplementation(() => undefined as any)\n const updSpy2 = jest.spyOn(usersManager, 'updateAccesses').mockRejectedValue(new Error('reject-auth'))\n const out = await usersManager.logUser(uBad, 'bad', '1.1.1.1')\n expect(out).toBeNull()\n await flush()\n expect(errSpy2).toHaveBeenCalledWith(expect.stringContaining('reject-auth'))\n expect(updSpy2).toHaveBeenCalledWith(uBad, '1.1.1.1', false)\n ;(comparePassword as jest.Mock).mockResolvedValue(true)\n const uGood = new UserModel({ ...generateUserTest(), isActive: true, passwordAttempts: 0 }, false)\n const updSpy3 = jest.spyOn(usersManager, 'updateAccesses').mockResolvedValue(undefined)\n const pathsSpy = jest.spyOn(uGood, 'makePaths').mockResolvedValue(undefined)\n const out2 = await usersManager.logUser(uGood, 'good', '8.8.8.8')\n expect(out2).toBe(uGood)\n expect(updSpy3).toHaveBeenCalledWith(uGood, '8.8.8.8', true)\n expect(pathsSpy).toHaveBeenCalled()\n })\n\n it('compareUserPassword + updateLanguage + updatePassword branches', async () => {\n usersQueriesService.compareUserPassword = jest.fn().mockResolvedValue(true)\n await expect(usersManager.compareUserPassword(1, 'p')).resolves.toBe(true)\n expect(usersQueriesService.compareUserPassword).toHaveBeenCalledWith(1, 'p')\n\n usersQueriesService.updateUserOrGuest = jest.fn().mockResolvedValue(false)\n await expect(usersManager.updateLanguage(userTest, { language: '' })).rejects.toThrow('Unable to update language')\n expect(usersQueriesService.updateUserOrGuest).toHaveBeenCalledWith(userTest.id, { language: null })\n usersQueriesService.updateUserOrGuest = jest.fn().mockResolvedValue(true)\n await expect(usersManager.updateLanguage(userTest, { language: 'fr' })).resolves.toBeUndefined()\n\n usersQueriesService.selectUserProperties = jest.fn().mockResolvedValue(null)\n await expect(usersManager.updatePassword(userTest, { oldPassword: 'a', newPassword: 'b' })).rejects.toThrow('Unable to check password')\n usersQueriesService.selectUserProperties = jest.fn().mockResolvedValue({ password: 'HASH' })\n ;(comparePassword as jest.Mock).mockResolvedValue(false)\n await expect(usersManager.updatePassword(userTest, { oldPassword: 'a', newPassword: 'b' })).rejects.toThrow('Password mismatch')\n ;(comparePassword as jest.Mock).mockResolvedValue(true)\n ;(bcrypt.hash as unknown as jest.Mock).mockResolvedValue('HASHED')\n usersQueriesService.updateUserOrGuest = jest.fn().mockResolvedValue(true)\n await expect(usersManager.updatePassword(userTest, { oldPassword: 'a', newPassword: 'b' })).resolves.toBeUndefined()\n expect(usersQueriesService.updateUserOrGuest).toHaveBeenCalledWith(userTest.id, { password: 'HASHED' })\n usersQueriesService.updateUserOrGuest = jest.fn().mockResolvedValue(false)\n usersQueriesService.selectUserProperties = jest.fn().mockResolvedValue({ password: 'HASH' })\n ;(comparePassword as jest.Mock).mockResolvedValue(true)\n ;(bcrypt.hash as unknown as jest.Mock).mockResolvedValue('HASHED2')\n await expect(usersManager.updatePassword(userTest, { oldPassword: 'a', newPassword: 'b' })).rejects.toThrow('Unable to update password')\n })\n\n it('updateNotification + updateAccesses branches', async () => {\n usersQueriesService.updateUserOrGuest = jest.fn().mockResolvedValue(false)\n await expect(usersManager.updateNotification(userTest, { notification: 1 })).rejects.toThrow('Unable to update notification')\n usersQueriesService.updateUserOrGuest = jest.fn().mockResolvedValue(true)\n await expect(usersManager.updateNotification(userTest, { notification: 2 })).resolves.toBeUndefined()\n\n const prevAccess1 = new Date('2021-01-01T00:00:00Z')\n const u1 = new UserModel(\n { ...generateUserTest(), isActive: true, passwordAttempts: 3, currentIp: '1.2.3.4', currentAccess: prevAccess1 } as any,\n false\n )\n usersQueriesService.updateUserOrGuest = jest.fn().mockResolvedValue(true)\n await expect(usersManager.updateAccesses(u1, '5.6.7.8', true)).resolves.toBeUndefined()\n const payload1 = (usersQueriesService.updateUserOrGuest as jest.Mock).mock.calls[0][1]\n expect(payload1).toMatchObject({ lastIp: '1.2.3.4', currentIp: '5.6.7.8', passwordAttempts: 0, isActive: true })\n expect(payload1.lastAccess).toBe(prevAccess1)\n expect(payload1.currentAccess).toBeInstanceOf(Date)\n\n const prevAccess2 = new Date('2022-02-02T00:00:00Z')\n const u2 = new UserModel(\n {\n ...generateUserTest(),\n isActive: true,\n passwordAttempts: USER_MAX_PASSWORD_ATTEMPTS - 1,\n currentIp: 'old.ip',\n currentAccess: prevAccess2\n } as any,\n false\n )\n usersQueriesService.updateUserOrGuest = jest.fn().mockResolvedValue(true)\n await expect(usersManager.updateAccesses(u2, 'new.ip', false)).resolves.toBeUndefined()\n const payload2 = (usersQueriesService.updateUserOrGuest as jest.Mock).mock.calls[0][1]\n expect(payload2.passwordAttempts).toBe(USER_MAX_PASSWORD_ATTEMPTS)\n expect(payload2.isActive).toBe(false)\n expect(payload2.lastAccess).toBe(prevAccess2)\n expect(payload2.lastIp).toBe('old.ip')\n expect(payload2.currentIp).toBe('new.ip')\n expect(payload2.currentAccess).toBeInstanceOf(Date)\n })\n\n it('avatars advanced: generateIsNotExists, failure branches, base64 fallback', async () => {\n await ensurePaths()\n usersManager.findUser = jest.fn().mockResolvedValue({ getInitials: () => 'UT' } as unknown as UserModel)\n const [p, m] = (await usersManager.getAvatar(userTest.login, false, true)) as [string, string]\n expect(fileName(p)).toBe('avatar.png')\n expect(m).toBe(pngMimeType)\n jest.spyOn(imageModule, 'generateAvatar').mockImplementation(() => errStream('gen error'))\n await expect(usersManager.getAvatar(userTest.login, true)).rejects.toThrow('Unable to create avatar')\n usersManager.findUser = jest.fn().mockResolvedValue(null)\n await expect(usersManager.getAvatar(userTest.login, true)).rejects.toThrow('avatar not found')\n })\n\n it('updateAvatar branches: mime error, stream error, truncated, move fail, success', async () => {\n await ensurePaths()\n await expect(usersManager.updateAvatar(mkReq('text/plain', okStream('X')) as any)).rejects.toThrow('Unsupported file type')\n await expect(usersManager.updateAvatar(mkReq('image/png', errStream('stream error')) as any)).rejects.toThrow('Unable to upload avatar')\n\n const t = okStream('OK')\n t.truncated = true\n const mvSpy = jest.spyOn(filesUtilsModule, 'moveFiles').mockResolvedValue(undefined)\n await expect(usersManager.updateAvatar(mkReq('image/png', t) as any)).rejects.toThrow('Image is too large (5MB max)')\n expect(mvSpy).not.toHaveBeenCalled()\n\n jest.spyOn(filesUtilsModule, 'moveFiles').mockRejectedValue(new Error('mv fail'))\n await expect(usersManager.updateAvatar(mkReq('image/png', okStream()) as any)).rejects.toThrow('Unable to create avatar')\n\n const mvSpy2 = jest.spyOn(filesUtilsModule, 'moveFiles').mockResolvedValue(undefined)\n await expect(usersManager.updateAvatar(mkReq('image/png', okStream()) as any)).resolves.toBeUndefined()\n const expectedSrc = path.join(userTest.tmpPath, 'avatar.png')\n const expectedDst = path.join(userTest.homePath, 'avatar.png')\n expect(mvSpy2).toHaveBeenCalledWith(expectedSrc, expectedDst, true)\n })\n\n it('setOnlineStatus + browseGroups + getGroup', async () => {\n usersQueriesService.setOnlineStatus = jest.fn().mockRejectedValue(new Error('boom'))\n expect(() => usersManager.setOnlineStatus({ id: 1 } as any, 1 as any)).not.toThrow()\n\n usersQueriesService.browseRootGroups = jest.fn().mockResolvedValue([{ id: 1 }])\n const root = await usersManager.browseGroups(userTest, '')\n expect(root.parentGroup).toBeUndefined()\n expect(root.members.length).toBe(1)\n usersQueriesService.groupFromName = jest.fn().mockResolvedValue(null)\n await expect(usersManager.browseGroups(userTest, 'unknown')).rejects.toThrow('Group not found')\n const group = { id: 42, name: 'Team' }\n usersQueriesService.groupFromName = jest.fn().mockResolvedValue(group)\n usersQueriesService.browseGroupMembers = jest.fn().mockResolvedValue([{ id: 7 }, { id: 8 }])\n const g2 = await usersManager.browseGroups(userTest, 'Team')\n expect(g2.parentGroup).toEqual(group)\n expect(g2.members).toEqual([{ id: 7 }, { id: 8 }])\n expect(usersQueriesService.browseGroupMembers).toHaveBeenCalledWith(42)\n\n usersQueriesService.getGroupWithMembers = jest.fn().mockResolvedValue({ id: 1, members: [] })\n await expect(usersManager.getGroup(userTest, 1)).resolves.toEqual({ id: 1, members: [] })\n usersQueriesService.getGroup = jest.fn().mockResolvedValue({ id: 2 })\n await expect(usersManager.getGroup(userTest, 2, false)).resolves.toEqual({ id: 2 })\n usersQueriesService.getGroup = jest.fn().mockResolvedValue(null)\n await expect(usersManager.getGroup(userTest, 3, false)).rejects.toThrow('You are not allowed to do this action')\n })\n\n it('create/update personal group', async () => {\n await expect(usersManager.createPersonalGroup(userTest, { name: '' } as any)).rejects.toThrow('Group name is missing')\n usersQueriesService.checkGroupNameExists = jest.fn().mockResolvedValue(true)\n await expect(usersManager.createPersonalGroup(userTest, { name: 'A' })).rejects.toThrow('Name already used')\n usersQueriesService.checkGroupNameExists = jest.fn().mockResolvedValue(false)\n usersQueriesService.createPersonalGroup = jest.fn().mockResolvedValue(10)\n usersQueriesService.clearWhiteListCaches = jest.fn()\n usersManager.getGroup = jest.fn().mockResolvedValue({ id: 10 })\n const logSpy = jest.spyOn((usersManager as any)['logger'], 'log').mockImplementation(() => undefined as any)\n await expect(usersManager.createPersonalGroup(userTest, { name: 'OK' })).resolves.toEqual({ id: 10 })\n expect(logSpy).toHaveBeenCalled()\n usersQueriesService.createPersonalGroup = jest.fn().mockRejectedValue(new Error('db down'))\n await expect(usersManager.createPersonalGroup(userTest, { name: 'OK' })).rejects.toThrow('Unable to create group')\n\n await expect(usersManager.updatePersonalGroup(userTest, 1, {} as any)).rejects.toThrow('No changes to update')\n usersManager.getGroup = jest.fn().mockResolvedValueOnce({ id: 1, type: MEMBER_TYPE.GROUP })\n await expect(usersManager.updatePersonalGroup(userTest, 1, { name: 'x' })).rejects.toThrow('You are not allowed to do this action')\n usersManager.getGroup = jest.fn().mockResolvedValue({ id: 1, type: MEMBER_TYPE.PGROUP })\n usersQueriesService.checkGroupNameExists = jest.fn().mockResolvedValue(true)\n await expect(usersManager.updatePersonalGroup(userTest, 1, { name: 'dup' })).rejects.toThrow('Name already used')\n usersQueriesService.checkGroupNameExists = jest.fn().mockResolvedValue(false)\n usersQueriesService.updateGroup = jest.fn().mockRejectedValue(new Error('oops'))\n await expect(usersManager.updatePersonalGroup(userTest, 1, { name: 'ok' })).rejects.toThrow('oops')\n usersQueriesService.updateGroup = jest.fn().mockResolvedValue(true)\n usersManager.getGroup = jest.fn().mockResolvedValue({ id: 1, type: MEMBER_TYPE.PGROUP })\n await expect(usersManager.updatePersonalGroup(userTest, 1, { name: 'ok' })).resolves.not.toThrow()\n expect(usersManager.getGroup).toHaveBeenCalledWith(userTest, 1, false, userTest.isAdmin)\n })\n\n it('addUsersToGroup (GROUP/PGROUP)', async () => {\n usersManager.getGroup = jest.fn().mockResolvedValue({ id: 1, type: MEMBER_TYPE.GROUP, members: [{ id: 2 }, { id: 3 }] })\n usersQueriesService.usersWhitelist = jest.fn().mockResolvedValue([3, 4, 5])\n await expect(usersManager.addUsersToGroup(userTest, 1, [2, 3])).rejects.toThrow('No users to add to group')\n usersQueriesService.updateGroupMembers = jest.fn().mockResolvedValue(undefined)\n await expect(usersManager.addUsersToGroup(userTest, 1, [3, 4, 5])).resolves.toBeUndefined()\n expect(usersQueriesService.updateGroupMembers).toHaveBeenCalledWith(1, {\n add: [\n { id: 4, groupRole: USER_GROUP_ROLE.MEMBER },\n { id: 5, groupRole: USER_GROUP_ROLE.MEMBER }\n ]\n })\n expect(usersQueriesService.usersWhitelist).toHaveBeenCalledWith(userTest.id, USER_ROLE.USER)\n\n usersManager.getGroup = jest.fn().mockResolvedValue({ id: 2, type: MEMBER_TYPE.PGROUP, members: [] })\n usersQueriesService.usersWhitelist = jest.fn().mockResolvedValue([10, 11])\n usersQueriesService.updateGroupMembers = jest.fn().mockResolvedValue(undefined)\n await expect(usersManager.addUsersToGroup(userTest, 2, [10, 11])).resolves.toBeUndefined()\n expect(usersQueriesService.usersWhitelist).toHaveBeenCalledWith(userTest.id, undefined)\n expect(usersQueriesService.updateGroupMembers).toHaveBeenCalledWith(2, {\n add: [\n { id: 10, groupRole: USER_GROUP_ROLE.MEMBER },\n { id: 11, groupRole: USER_GROUP_ROLE.MEMBER }\n ]\n })\n })\n\n it('updateUserFromPersonalGroup', async () => {\n usersManager.getGroup = jest.fn().mockResolvedValue({ id: 1, type: MEMBER_TYPE.GROUP, members: [] })\n await expect(usersManager.updateUserFromPersonalGroup(userTest, 1, 9, { role: 1 })).rejects.toThrow('You are not allowed to do this action')\n usersManager.getGroup = jest.fn().mockResolvedValue({ id: 1, type: MEMBER_TYPE.PGROUP, members: [] })\n await expect(usersManager.updateUserFromPersonalGroup(userTest, 1, 9, { role: 1 })).rejects.toThrow('User was not found')\n usersManager.getGroup = jest.fn().mockResolvedValue({\n id: 1,\n type: MEMBER_TYPE.PGROUP,\n members: [\n { id: 9, groupRole: USER_GROUP_ROLE.MANAGER },\n { id: 10, groupRole: USER_GROUP_ROLE.MEMBER }\n ]\n })\n await expect(usersManager.updateUserFromPersonalGroup(userTest, 1, 9, { role: USER_GROUP_ROLE.MEMBER })).rejects.toThrow(\n /group must have at least one manager/i\n )\n const spy = jest.spyOn(adminUsersManager, 'updateUserFromGroup').mockResolvedValue(undefined)\n usersManager.getGroup = jest.fn().mockResolvedValue({\n id: 1,\n type: MEMBER_TYPE.PGROUP,\n members: [\n { id: 9, groupRole: USER_GROUP_ROLE.MEMBER },\n { id: 10, groupRole: USER_GROUP_ROLE.MEMBER },\n { id: 11, groupRole: USER_GROUP_ROLE.MEMBER }\n ]\n })\n await expect(usersManager.updateUserFromPersonalGroup(userTest, 1, 9, { role: USER_GROUP_ROLE.MANAGER })).resolves.toBeUndefined()\n expect(spy).toHaveBeenCalledWith(1, 9, { role: 1 })\n usersManager.getGroup = jest.fn().mockResolvedValue({ id: 1, type: MEMBER_TYPE.PGROUP, members: [{ id: 9, groupRole: USER_GROUP_ROLE.MEMBER }] })\n await expect(usersManager.updateUserFromPersonalGroup(userTest, 1, 9, { role: USER_GROUP_ROLE.MEMBER })).resolves.toBeUndefined()\n ;(spy as jest.Mock).mockClear()\n usersManager.getGroup = jest.fn().mockResolvedValue({\n id: 1,\n type: MEMBER_TYPE.PGROUP,\n members: [\n { id: 9, groupRole: USER_GROUP_ROLE.MANAGER },\n { id: 10, groupRole: USER_GROUP_ROLE.MANAGER }\n ]\n })\n await expect(usersManager.updateUserFromPersonalGroup(userTest, 1, 9, { role: USER_GROUP_ROLE.MEMBER })).resolves.toBeUndefined()\n expect(spy).toHaveBeenCalledWith(1, 9, { role: USER_GROUP_ROLE.MEMBER })\n ;(spy as jest.Mock).mockClear()\n usersManager.getGroup = jest.fn().mockResolvedValue({\n id: 1,\n type: MEMBER_TYPE.PGROUP,\n members: [\n { id: 9, groupRole: USER_GROUP_ROLE.MANAGER },\n { id: 10, groupRole: USER_GROUP_ROLE.MANAGER }\n ]\n })\n await expect(usersManager.updateUserFromPersonalGroup(userTest, 1, 9, { role: USER_GROUP_ROLE.MANAGER })).resolves.toBeUndefined()\n expect(spy).not.toHaveBeenCalled()\n })\n\n it('removeUserFromGroup', async () => {\n usersManager.getGroup = jest.fn().mockResolvedValue({ id: 1, members: [] })\n await expect(usersManager.removeUserFromGroup(userTest, 1, 9)).rejects.toThrow('User was not found')\n usersManager.getGroup = jest.fn().mockResolvedValue({ id: 1, type: MEMBER_TYPE.GROUP, members: [{ id: 9, groupRole: USER_GROUP_ROLE.MANAGER }] })\n await expect(usersManager.removeUserFromGroup(userTest, 1, 9)).rejects.toThrow('You are not allowed to do this action')\n usersManager.getGroup = jest.fn().mockResolvedValue({ id: 1, type: MEMBER_TYPE.PGROUP, members: [{ id: 9, groupRole: USER_GROUP_ROLE.MANAGER }] })\n await expect(usersManager.removeUserFromGroup(userTest, 1, 9)).rejects.toThrow('Group must have at least one manager')\n usersQueriesService.updateGroupMembers = jest.fn().mockResolvedValue(undefined)\n usersManager.getGroup = jest.fn().mockResolvedValue({\n id: 1,\n type: MEMBER_TYPE.PGROUP,\n members: [\n { id: 9, groupRole: USER_GROUP_ROLE.MEMBER },\n { id: 10, groupRole: USER_GROUP_ROLE.MANAGER }\n ]\n })\n await expect(usersManager.removeUserFromGroup(userTest, 1, 9)).resolves.toBeUndefined()\n expect(usersQueriesService.updateGroupMembers).toHaveBeenCalledWith(1, { remove: [9] })\n usersQueriesService.updateGroupMembers = jest.fn().mockResolvedValue(undefined)\n usersManager.getGroup = jest.fn().mockResolvedValue({\n id: 1,\n type: MEMBER_TYPE.PGROUP,\n members: [\n { id: 9, groupRole: USER_GROUP_ROLE.MANAGER },\n { id: 10, groupRole: USER_GROUP_ROLE.MANAGER }\n ]\n })\n await expect(usersManager.removeUserFromGroup(userTest, 1, 9)).resolves.toBeUndefined()\n expect(usersQueriesService.updateGroupMembers).toHaveBeenCalledWith(1, { remove: [9] })\n })\n\n it('leave/delete personal group', async () => {\n usersQueriesService.getGroupWithMembers = jest.fn().mockResolvedValue(null)\n await expect(usersManager.leavePersonalGroup(userTest, 1)).rejects.toThrow('You are not allowed to do this action')\n usersQueriesService.getGroupWithMembers = jest.fn().mockResolvedValue({ id: 1, type: MEMBER_TYPE.GROUP, members: [{ id: userTest.id }] })\n await expect(usersManager.leavePersonalGroup(userTest, 1)).rejects.toThrow('You are not allowed to do this action')\n usersQueriesService.getGroupWithMembers = jest.fn().mockResolvedValue({ id: 1, type: MEMBER_TYPE.PGROUP, members: [] })\n await expect(usersManager.leavePersonalGroup(userTest, 1)).rejects.toThrow('User was not found')\n usersQueriesService.getGroupWithMembers = jest.fn().mockResolvedValue({\n id: 1,\n type: MEMBER_TYPE.PGROUP,\n members: [{ id: userTest.id, groupRole: USER_GROUP_ROLE.MANAGER }]\n })\n await expect(usersManager.leavePersonalGroup(userTest, 1)).rejects.toThrow('Group must have at least one manager')\n usersQueriesService.getGroupWithMembers = jest.fn().mockResolvedValue({\n id: 1,\n type: 2,\n members: [\n { id: userTest.id, groupRole: USER_GROUP_ROLE.MEMBER },\n { id: 9, groupRole: USER_GROUP_ROLE.MANAGER }\n ]\n })\n const lSpy = jest.spyOn((usersManager as any)['logger'], 'log').mockImplementation(() => undefined as any)\n usersQueriesService.updateGroupMembers = jest.fn().mockResolvedValue(undefined)\n await expect(usersManager.leavePersonalGroup(userTest, 1)).resolves.toBeUndefined()\n expect(lSpy).toHaveBeenCalledWith(expect.stringMatching(/has left group/))\n usersQueriesService.updateGroupMembers = jest.fn().mockRejectedValue(new Error('DB'))\n await expect(usersManager.leavePersonalGroup(userTest, 1)).rejects.toThrow('DB')\n usersQueriesService.getGroupWithMembers = jest.fn().mockResolvedValue({\n id: 1,\n type: MEMBER_TYPE.PGROUP,\n members: [\n { id: userTest.id, groupRole: USER_GROUP_ROLE.MANAGER },\n { id: 9, groupRole: USER_GROUP_ROLE.MANAGER }\n ]\n })\n usersQueriesService.updateGroupMembers = jest.fn().mockResolvedValue(undefined)\n await expect(usersManager.leavePersonalGroup(userTest, 1)).resolves.toBeUndefined()\n\n usersQueriesService.canDeletePersonalGroup = jest.fn().mockResolvedValue(false)\n await expect(usersManager.deletePersonalGroup(userTest, 7)).rejects.toThrow('You are not allowed to do this action')\n usersQueriesService.canDeletePersonalGroup = jest.fn().mockResolvedValue(true)\n const wSpy = jest.spyOn((usersManager as any)['logger'], 'warn').mockImplementation(() => undefined as any)\n usersQueriesService.deletePersonalGroup = jest.fn().mockResolvedValue(false)\n await expect(usersManager.deletePersonalGroup(userTest, 7)).rejects.toThrow('Unable to delete group')\n expect(wSpy).toHaveBeenCalledWith(expect.stringMatching(/does not exist/))\n const lgSpy = jest.spyOn((usersManager as any)['logger'], 'log').mockImplementation(() => undefined as any)\n usersQueriesService.deletePersonalGroup = jest.fn().mockResolvedValue(true)\n await expect(usersManager.deletePersonalGroup(userTest, 7)).resolves.toBeUndefined()\n expect(lgSpy).toHaveBeenCalledWith(expect.stringMatching(/was deleted/))\n })\n\n it('guests + proxies', async () => {\n usersQueriesService.listGuests = jest.fn().mockResolvedValue([{ id: 1 }])\n await expect(usersManager.listGuests(userTest)).resolves.toEqual([{ id: 1 }])\n const checkSpy = jest.spyOn(adminUsersManager, 'checkUser').mockImplementation(() => undefined)\n usersQueriesService.listGuests = jest.fn().mockResolvedValue({ id: 9 })\n await expect(usersManager.getGuest(userTest, 9)).resolves.toEqual({ id: 9 })\n expect(checkSpy).toHaveBeenCalled()\n\n usersQueriesService.usersWhitelist = jest.fn().mockResolvedValue([userTest.id, 100])\n usersQueriesService.clearWhiteListCaches = jest.fn()\n const createSpy = jest.spyOn(adminUsersManager, 'createUserOrGuest').mockResolvedValue({ id: 55 } as any)\n const dto1: CreateUserDto = { ...userTest, managers: [100], password: 'x' }\n const r = await usersManager.createGuest(userTest, dto1)\n expect(createSpy).toHaveBeenCalled()\n expect(usersQueriesService.clearWhiteListCaches).toHaveBeenCalledWith([userTest.id])\n expect(r).toEqual({ id: 55 })\n const args1 = (createSpy as jest.Mock).mock.calls[0][0]\n expect(args1.managers).toEqual(expect.arrayContaining([userTest.id]))\n ;(createSpy as jest.Mock).mockClear()\n const dto2: CreateUserDto = { ...userTest, managers: [userTest.id, 100], password: 'y' }\n await usersManager.createGuest(userTest, dto2)\n const args2 = (createSpy as jest.Mock).mock.calls[0][0]\n expect((args2.managers as number[]).filter((m: number) => m === userTest.id)).toHaveLength(1)\n\n await expect(usersManager.updateGuest(userTest, 9, {} as any)).rejects.toThrow('No changes to update')\n usersQueriesService.usersWhitelist = jest.fn().mockResolvedValue([1])\n await expect(usersManager.updateGuest(userTest, 9, { managers: [2] } as any)).rejects.toThrow('Guest must have at least one manager')\n usersQueriesService.isGuestManager = jest.fn().mockResolvedValue(false)\n await expect(usersManager.updateGuest(userTest, 9, { email: 'a' } as any)).rejects.toThrow('You are not allowed to do this action')\n usersQueriesService.isGuestManager = jest.fn().mockResolvedValue(true)\n jest.spyOn(adminUsersManager, 'updateUserOrGuest').mockResolvedValue({ managers: [{ id: 999 }] } as any)\n await expect(usersManager.updateGuest(userTest, 9, { email: 'a' } as any)).resolves.toBeNull()\n jest.spyOn(adminUsersManager, 'updateUserOrGuest').mockResolvedValue({ managers: [{ id: userTest.id }] } as any)\n await expect(usersManager.updateGuest(userTest, 9, { email: 'a' } as any)).resolves.toEqual({ managers: [{ id: userTest.id }] })\n usersQueriesService.usersWhitelist = jest.fn().mockResolvedValue([userTest.id, 77])\n usersQueriesService.isGuestManager = jest.fn().mockResolvedValue(true)\n jest.spyOn(adminUsersManager, 'updateUserOrGuest').mockResolvedValue({ managers: [{ id: userTest.id }, { id: 77 }] } as any)\n await expect(usersManager.updateGuest(userTest, 9, { managers: [userTest.id, 77] } as any)).resolves.toEqual({\n managers: [{ id: userTest.id }, { id: 77 }]\n })\n\n usersQueriesService.isGuestManager = jest.fn().mockResolvedValue(null)\n await expect(usersManager.deleteGuest(userTest, 9)).rejects.toThrow('You are not allowed to do this action')\n usersQueriesService.isGuestManager = jest.fn().mockResolvedValue({ id: 9, login: 'guest' })\n const delSpy = jest.spyOn(adminUsersManager, 'deleteUserOrGuest').mockResolvedValue(undefined)\n await expect(usersManager.deleteGuest(userTest, 9)).resolves.toBeUndefined()\n expect(delSpy).toHaveBeenCalledWith(9, 'guest', { deleteSpace: true, isGuest: true })\n\n usersQueriesService.searchUsersOrGroups = jest.fn().mockResolvedValue([{ id: 1 }])\n await expect(usersManager.searchMembers(userTest, { search: '' } as any)).resolves.toEqual([{ id: 1 }])\n\n usersQueriesService.getOnlineUsers = jest.fn().mockResolvedValue([{ id: 123 }])\n await expect(usersManager.getOnlineUsers([123])).resolves.toEqual([{ id: 123 }])\n expect(usersQueriesService.getOnlineUsers).toHaveBeenCalledWith([123])\n usersQueriesService.usersWhitelist = jest.fn().mockResolvedValue([10, 11])\n await expect(usersManager.usersWhitelist(userTest.id)).resolves.toEqual([10, 11])\n expect(usersQueriesService.usersWhitelist).toHaveBeenCalledWith(userTest.id)\n })\n})\n"],"names":["jest","mock","actual","requireActual","comparePassword","fn","__esModule","default","hash","Promise","resolve","generateAvatar","Readable","from","Buffer","describe","UsersManager","name","usersManager","adminUsersManager","adminUsersQueries","usersQueriesService","userTest","deleteUserDto","flush","r","setImmediate","okStream","d","s","truncated","errStream","msg","read","destroy","Error","mkReq","mimetype","stream","user","file","mockResolvedValue","ensurePaths","isPathExists","homePath","makePaths","notificationsManager","sendEmailNotification","undefined","beforeAll","module","Test","createTestingModule","providers","AdminUsersManager","AdminUsersQueries","UsersQueries","provide","NotificationsManager","useValue","AuthManager","DB_TOKEN_PROVIDER","Cache","compile","useLogger","get","UserModel","generateUserTest","deleteSpace","isGuest","afterEach","restoreAllMocks","afterAll","expect","deleteUserSpace","login","resolves","not","toThrow","it","toBeDefined","mockReturnValue","u1","findUser","toBeInstanceOf","password","toBeUndefined","u2","me1","me","toBeNull","id","rejects","fromUserId","authUser","clientId","impersonatedFromId","fromUser","me2","impersonated","toBe","filesPath","mockReturnValueOnce","p0","m0","getAvatar","fileName","svgMimeType","p1","m1","pngMimeType","checkUserExists","createUserOrGuest","created","USER_ROLE","USER","email","mockImplementation","deleteUser","deleteUserOrGuest","linkUser","role","LINK","logUser","uLocked","isActive","passwordAttempts","errSpy","spyOn","updSpy1","mockRejectedValue","toHaveBeenCalledWith","stringContaining","uBad","errSpy2","updSpy2","out","uGood","updSpy3","pathsSpy","out2","toHaveBeenCalled","compareUserPassword","updateUserOrGuest","updateLanguage","language","selectUserProperties","updatePassword","oldPassword","newPassword","bcrypt","updateNotification","notification","prevAccess1","Date","currentIp","currentAccess","updateAccesses","payload1","calls","toMatchObject","lastIp","lastAccess","prevAccess2","USER_MAX_PASSWORD_ATTEMPTS","payload2","getInitials","p","m","imageModule","updateAvatar","t","mvSpy","filesUtilsModule","mvSpy2","expectedSrc","path","join","tmpPath","expectedDst","setOnlineStatus","browseRootGroups","root","browseGroups","parentGroup","members","length","groupFromName","group","browseGroupMembers","g2","toEqual","getGroupWithMembers","getGroup","createPersonalGroup","checkGroupNameExists","clearWhiteListCaches","logSpy","updatePersonalGroup","mockResolvedValueOnce","type","MEMBER_TYPE","GROUP","PGROUP","updateGroup","isAdmin","usersWhitelist","addUsersToGroup","updateGroupMembers","add","groupRole","USER_GROUP_ROLE","MEMBER","updateUserFromPersonalGroup","MANAGER","spy","mockClear","removeUserFromGroup","remove","leavePersonalGroup","lSpy","stringMatching","canDeletePersonalGroup","deletePersonalGroup","wSpy","lgSpy","listGuests","checkSpy","getGuest","createSpy","dto1","managers","createGuest","args1","arrayContaining","dto2","args2","filter","toHaveLength","updateGuest","isGuestManager","deleteGuest","delSpy","searchUsersOrGroups","searchMembers","search","getOnlineUsers"],"mappings":"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"}
|
|
@@ -121,6 +121,12 @@ let UsersQueries = class UsersQueries {
|
|
|
121
121
|
user.permissions = (0, _functions.uniquePermissions)(`${user.permissions},${groupsPermissions}`, _user.USER_PERMS_SEP);
|
|
122
122
|
return user;
|
|
123
123
|
}
|
|
124
|
+
async getUserSecrets(userId) {
|
|
125
|
+
const [r] = await this.db.select({
|
|
126
|
+
secrets: _usersschema.users.secrets
|
|
127
|
+
}).from(_usersschema.users).where((0, _drizzleorm.eq)(_usersschema.users.id, userId)).limit(1);
|
|
128
|
+
return r.secrets || {};
|
|
129
|
+
}
|
|
124
130
|
selectUsers(fields = [
|
|
125
131
|
'id',
|
|
126
132
|
'login',
|
|
@@ -373,63 +379,6 @@ let UsersQueries = class UsersQueries {
|
|
|
373
379
|
}).from(_usersguestsschema.usersGuests).innerJoin(_usersschema.users, (0, _drizzleorm.eq)(_usersschema.users.id, _usersguestsschema.usersGuests.guestId)).where((0, _drizzleorm.and)((0, _drizzleorm.eq)(_usersguestsschema.usersGuests.userId, managerId), (0, _drizzleorm.eq)(_usersguestsschema.usersGuests.guestId, guestId), (0, _drizzleorm.eq)(_usersschema.users.role, _user.USER_ROLE.GUEST))).limit(1);
|
|
374
380
|
return guest;
|
|
375
381
|
}
|
|
376
|
-
async searchGroups(searchMembersDto, userId, limit = 3) {
|
|
377
|
-
/* Search for groups */ const where = [
|
|
378
|
-
(0, _drizzleorm.like)(_groupsschema.groups.name, `%${searchMembersDto.search}%`)
|
|
379
|
-
];
|
|
380
|
-
if (userId) {
|
|
381
|
-
let idsWhitelist = await this.groupsWhitelist(userId);
|
|
382
|
-
if (searchMembersDto.ignoreGroupIds?.length) {
|
|
383
|
-
idsWhitelist = idsWhitelist.filter((id)=>searchMembersDto.ignoreGroupIds.indexOf(id) === -1);
|
|
384
|
-
}
|
|
385
|
-
where.unshift((0, _drizzleorm.inArray)(_groupsschema.groups.id, idsWhitelist));
|
|
386
|
-
} else if (searchMembersDto.ignoreGroupIds?.length) {
|
|
387
|
-
where.unshift((0, _drizzleorm.notInArray)(_groupsschema.groups.id, searchMembersDto.ignoreGroupIds));
|
|
388
|
-
}
|
|
389
|
-
if (searchMembersDto.excludePersonalGroups) {
|
|
390
|
-
where.unshift((0, _drizzleorm.eq)(_groupsschema.groups.type, _group.GROUP_TYPE.USER));
|
|
391
|
-
}
|
|
392
|
-
return this.db.select({
|
|
393
|
-
id: _groupsschema.groups.id,
|
|
394
|
-
name: _groupsschema.groups.name,
|
|
395
|
-
description: _groupsschema.groups.description,
|
|
396
|
-
type: _groupsschema.groups.type,
|
|
397
|
-
permissions: _groupsschema.groups.permissions
|
|
398
|
-
}).from(_groupsschema.groups).where((0, _drizzleorm.and)(...where)).limit(limit);
|
|
399
|
-
}
|
|
400
|
-
async searchUsers(searchMembersDto, userId, limit = 3) {
|
|
401
|
-
/* Search for users */ const where = [
|
|
402
|
-
(0, _drizzleorm.ne)(_usersschema.users.role, _user.USER_ROLE.LINK),
|
|
403
|
-
(0, _drizzleorm.or)((0, _drizzleorm.like)((0, _drizzleorm.sql)`CONCAT_WS('-', ${_usersschema.users.login}, ${_usersschema.users.email}, ${_usersschema.users.firstName}, ${_usersschema.users.lastName})`, `%${searchMembersDto.search}%`))
|
|
404
|
-
];
|
|
405
|
-
if (userId) {
|
|
406
|
-
let idsWhitelist = await this.usersWhitelist(userId);
|
|
407
|
-
if (searchMembersDto.ignoreUserIds?.length) {
|
|
408
|
-
idsWhitelist = idsWhitelist.filter((id)=>searchMembersDto.ignoreUserIds.indexOf(id) === -1);
|
|
409
|
-
}
|
|
410
|
-
where.unshift((0, _drizzleorm.inArray)(_usersschema.users.id, idsWhitelist));
|
|
411
|
-
} else {
|
|
412
|
-
if (searchMembersDto.ignoreUserIds?.length) {
|
|
413
|
-
where.unshift((0, _drizzleorm.notInArray)(_usersschema.users.id, searchMembersDto.ignoreUserIds));
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
if (typeof searchMembersDto.usersRole !== 'undefined') {
|
|
417
|
-
if (searchMembersDto.usersRole === _user.USER_ROLE.USER) {
|
|
418
|
-
// allow admin users
|
|
419
|
-
where.unshift((0, _drizzleorm.lte)(_usersschema.users.role, searchMembersDto.usersRole));
|
|
420
|
-
} else {
|
|
421
|
-
where.unshift((0, _drizzleorm.eq)(_usersschema.users.role, searchMembersDto.usersRole));
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
return this.db.select({
|
|
425
|
-
id: _usersschema.users.id,
|
|
426
|
-
login: _usersschema.users.login,
|
|
427
|
-
email: _usersschema.users.email,
|
|
428
|
-
fullName: (0, _usersschema.userFullNameSQL)(_usersschema.users),
|
|
429
|
-
role: _usersschema.users.role,
|
|
430
|
-
permissions: _usersschema.users.permissions
|
|
431
|
-
}).from(_usersschema.users).where((0, _drizzleorm.and)(...where)).limit(limit);
|
|
432
|
-
}
|
|
433
382
|
async usersWhitelist(userId, lowerOrEqualUserRole = _user.USER_ROLE.GUEST) {
|
|
434
383
|
/* Get the list of user ids allowed to the current user
|
|
435
384
|
- all users with no groups (except link users)
|
|
@@ -532,6 +481,63 @@ let UsersQueries = class UsersQueries {
|
|
|
532
481
|
const [r] = await this.db.execute(withChildren);
|
|
533
482
|
return r.length ? r.map((r)=>r.userId) : [];
|
|
534
483
|
}
|
|
484
|
+
async searchGroups(searchMembersDto, userId, limit = 3) {
|
|
485
|
+
/* Search for groups */ const where = [
|
|
486
|
+
(0, _drizzleorm.like)(_groupsschema.groups.name, `%${searchMembersDto.search}%`)
|
|
487
|
+
];
|
|
488
|
+
if (userId) {
|
|
489
|
+
let idsWhitelist = await this.groupsWhitelist(userId);
|
|
490
|
+
if (searchMembersDto.ignoreGroupIds?.length) {
|
|
491
|
+
idsWhitelist = idsWhitelist.filter((id)=>searchMembersDto.ignoreGroupIds.indexOf(id) === -1);
|
|
492
|
+
}
|
|
493
|
+
where.unshift((0, _drizzleorm.inArray)(_groupsschema.groups.id, idsWhitelist));
|
|
494
|
+
} else if (searchMembersDto.ignoreGroupIds?.length) {
|
|
495
|
+
where.unshift((0, _drizzleorm.notInArray)(_groupsschema.groups.id, searchMembersDto.ignoreGroupIds));
|
|
496
|
+
}
|
|
497
|
+
if (searchMembersDto.excludePersonalGroups) {
|
|
498
|
+
where.unshift((0, _drizzleorm.eq)(_groupsschema.groups.type, _group.GROUP_TYPE.USER));
|
|
499
|
+
}
|
|
500
|
+
return this.db.select({
|
|
501
|
+
id: _groupsschema.groups.id,
|
|
502
|
+
name: _groupsschema.groups.name,
|
|
503
|
+
description: _groupsschema.groups.description,
|
|
504
|
+
type: _groupsschema.groups.type,
|
|
505
|
+
permissions: _groupsschema.groups.permissions
|
|
506
|
+
}).from(_groupsschema.groups).where((0, _drizzleorm.and)(...where)).limit(limit);
|
|
507
|
+
}
|
|
508
|
+
async searchUsers(searchMembersDto, userId, limit = 3) {
|
|
509
|
+
/* Search for users */ const where = [
|
|
510
|
+
(0, _drizzleorm.ne)(_usersschema.users.role, _user.USER_ROLE.LINK),
|
|
511
|
+
(0, _drizzleorm.or)((0, _drizzleorm.like)((0, _drizzleorm.sql)`CONCAT_WS('-', ${_usersschema.users.login}, ${_usersschema.users.email}, ${_usersschema.users.firstName}, ${_usersschema.users.lastName})`, `%${searchMembersDto.search}%`))
|
|
512
|
+
];
|
|
513
|
+
if (userId) {
|
|
514
|
+
let idsWhitelist = await this.usersWhitelist(userId);
|
|
515
|
+
if (searchMembersDto.ignoreUserIds?.length) {
|
|
516
|
+
idsWhitelist = idsWhitelist.filter((id)=>searchMembersDto.ignoreUserIds.indexOf(id) === -1);
|
|
517
|
+
}
|
|
518
|
+
where.unshift((0, _drizzleorm.inArray)(_usersschema.users.id, idsWhitelist));
|
|
519
|
+
} else {
|
|
520
|
+
if (searchMembersDto.ignoreUserIds?.length) {
|
|
521
|
+
where.unshift((0, _drizzleorm.notInArray)(_usersschema.users.id, searchMembersDto.ignoreUserIds));
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
if (typeof searchMembersDto.usersRole !== 'undefined') {
|
|
525
|
+
if (searchMembersDto.usersRole === _user.USER_ROLE.USER) {
|
|
526
|
+
// allow admin users
|
|
527
|
+
where.unshift((0, _drizzleorm.lte)(_usersschema.users.role, searchMembersDto.usersRole));
|
|
528
|
+
} else {
|
|
529
|
+
where.unshift((0, _drizzleorm.eq)(_usersschema.users.role, searchMembersDto.usersRole));
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
return this.db.select({
|
|
533
|
+
id: _usersschema.users.id,
|
|
534
|
+
login: _usersschema.users.login,
|
|
535
|
+
email: _usersschema.users.email,
|
|
536
|
+
fullName: (0, _usersschema.userFullNameSQL)(_usersschema.users),
|
|
537
|
+
role: _usersschema.users.role,
|
|
538
|
+
permissions: _usersschema.users.permissions
|
|
539
|
+
}).from(_usersschema.users).where((0, _drizzleorm.and)(...where)).limit(limit);
|
|
540
|
+
}
|
|
535
541
|
constructor(db, cache){
|
|
536
542
|
this.db = db;
|
|
537
543
|
this.cache = cache;
|