@sync-in/server 1.10.1 → 2.0.0
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 +47 -0
- package/LICENSE +1 -1
- package/README.md +3 -11
- package/environment/environment.dist.min.yaml +1 -1
- package/environment/environment.dist.yaml +173 -28
- package/package.json +18 -17
- package/server/app.bootstrap.js +1 -5
- package/server/app.bootstrap.js.map +1 -1
- package/server/app.constants.js +1 -5
- package/server/app.constants.js.map +1 -1
- package/server/app.e2e-spec.js +1 -5
- package/server/app.e2e-spec.js.map +1 -1
- package/server/app.functions.js +1 -5
- package/server/app.functions.js.map +1 -1
- package/server/app.module.js +1 -5
- package/server/app.module.js.map +1 -1
- package/server/app.service.js +1 -5
- package/server/app.service.js.map +1 -1
- package/server/app.service.spec.js +2 -6
- package/server/app.service.spec.js.map +1 -1
- package/server/applications/admin/admin.module.js +1 -5
- package/server/applications/admin/admin.module.js.map +1 -1
- package/server/applications/admin/constants/routes.js +1 -5
- package/server/applications/admin/constants/routes.js.map +1 -1
- package/server/applications/admin/interfaces/check-update.interfaces.js +1 -5
- package/server/applications/admin/interfaces/check-update.interfaces.js.map +1 -1
- package/server/applications/admin/services/admin-scheduler.service.js +1 -5
- package/server/applications/admin/services/admin-scheduler.service.js.map +1 -1
- package/server/applications/admin/services/admin.service.js +13 -8
- package/server/applications/admin/services/admin.service.js.map +1 -1
- package/server/applications/admin/services/admin.service.spec.js +1 -5
- package/server/applications/admin/services/admin.service.spec.js.map +1 -1
- package/server/applications/admin/utils/check-update.js +1 -5
- package/server/applications/admin/utils/check-update.js.map +1 -1
- package/server/applications/applications.config.js +1 -5
- package/server/applications/applications.config.js.map +1 -1
- package/server/applications/applications.constants.js +5 -5
- package/server/applications/applications.constants.js.map +1 -1
- package/server/applications/applications.module.js +1 -5
- package/server/applications/applications.module.js.map +1 -1
- package/server/applications/comments/comments.controller.js +1 -5
- package/server/applications/comments/comments.controller.js.map +1 -1
- package/server/applications/comments/comments.controller.spec.js +1 -5
- package/server/applications/comments/comments.controller.spec.js.map +1 -1
- package/server/applications/comments/comments.module.js +1 -5
- package/server/applications/comments/comments.module.js.map +1 -1
- package/server/applications/comments/constants/routes.js +1 -5
- package/server/applications/comments/constants/routes.js.map +1 -1
- package/server/applications/comments/dto/comment.dto.js +1 -5
- package/server/applications/comments/dto/comment.dto.js.map +1 -1
- package/server/applications/comments/interfaces/comment-recent.interface.js +1 -5
- package/server/applications/comments/interfaces/comment-recent.interface.js.map +1 -1
- package/server/applications/comments/schemas/comment.interface.js +1 -5
- package/server/applications/comments/schemas/comment.interface.js.map +1 -1
- package/server/applications/comments/schemas/comments.schema.js +1 -5
- package/server/applications/comments/schemas/comments.schema.js.map +1 -1
- package/server/applications/comments/services/comments-manager.service.js +9 -7
- package/server/applications/comments/services/comments-manager.service.js.map +1 -1
- package/server/applications/comments/services/comments-manager.service.spec.js +10 -8
- package/server/applications/comments/services/comments-manager.service.spec.js.map +1 -1
- package/server/applications/comments/services/comments-queries.service.js +1 -5
- package/server/applications/comments/services/comments-queries.service.js.map +1 -1
- package/server/applications/files/adapters/files-indexer-mysql.service.js +29 -12
- package/server/applications/files/adapters/files-indexer-mysql.service.js.map +1 -1
- package/server/applications/files/adapters/files-indexer-mysql.service.spec.js +1 -5
- package/server/applications/files/adapters/files-indexer-mysql.service.spec.js.map +1 -1
- package/server/applications/files/constants/cache.js +1 -5
- package/server/applications/files/constants/cache.js.map +1 -1
- package/server/applications/files/constants/compress.js +1 -5
- package/server/applications/files/constants/compress.js.map +1 -1
- package/server/applications/files/constants/files.js +1 -5
- package/server/applications/files/constants/files.js.map +1 -1
- package/server/applications/files/constants/indexing.js +1 -5
- package/server/applications/files/constants/indexing.js.map +1 -1
- package/server/applications/files/constants/operations.js +1 -5
- package/server/applications/files/constants/operations.js.map +1 -1
- package/server/applications/files/constants/routes.js +1 -5
- package/server/applications/files/constants/routes.js.map +1 -1
- package/server/applications/files/constants/samples.js +1 -5
- package/server/applications/files/constants/samples.js.map +1 -1
- package/server/applications/files/dto/file-operations.dto.js +1 -5
- package/server/applications/files/dto/file-operations.dto.js.map +1 -1
- package/server/applications/files/events/file-task-event.js +1 -5
- package/server/applications/files/events/file-task-event.js.map +1 -1
- package/server/applications/files/files-tasks.controller.js +1 -5
- package/server/applications/files/files-tasks.controller.js.map +1 -1
- package/server/applications/files/files-tasks.controller.spec.js +1 -5
- package/server/applications/files/files-tasks.controller.spec.js.map +1 -1
- package/server/applications/files/files.config.js +1 -5
- package/server/applications/files/files.config.js.map +1 -1
- package/server/applications/files/files.controller.js +1 -5
- package/server/applications/files/files.controller.js.map +1 -1
- package/server/applications/files/files.controller.spec.js +1 -5
- package/server/applications/files/files.controller.spec.js.map +1 -1
- package/server/applications/files/files.module.js +1 -5
- package/server/applications/files/files.module.js.map +1 -1
- package/server/applications/files/interfaces/file-db-props.interface.js +1 -5
- package/server/applications/files/interfaces/file-db-props.interface.js.map +1 -1
- package/server/applications/files/interfaces/file-lock.interface.js +1 -5
- package/server/applications/files/interfaces/file-lock.interface.js.map +1 -1
- package/server/applications/files/interfaces/file-parse-index.js +1 -5
- package/server/applications/files/interfaces/file-parse-index.js.map +1 -1
- package/server/applications/files/interfaces/file-props.interface.js +1 -5
- package/server/applications/files/interfaces/file-props.interface.js.map +1 -1
- package/server/applications/files/interfaces/file-recent-location.interface.js +1 -5
- package/server/applications/files/interfaces/file-recent-location.interface.js.map +1 -1
- package/server/applications/files/interfaces/file-space.interface.js +1 -5
- package/server/applications/files/interfaces/file-space.interface.js.map +1 -1
- package/server/applications/files/interfaces/file-tree.interface.js +1 -5
- package/server/applications/files/interfaces/file-tree.interface.js.map +1 -1
- package/server/applications/files/models/file-error.js +1 -5
- package/server/applications/files/models/file-error.js.map +1 -1
- package/server/applications/files/models/file-lock-error.js +1 -5
- package/server/applications/files/models/file-lock-error.js.map +1 -1
- package/server/applications/files/models/file-task.js +1 -5
- package/server/applications/files/models/file-task.js.map +1 -1
- package/server/applications/files/models/files-indexer.js +1 -5
- package/server/applications/files/models/files-indexer.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online-environment.decorator.js +1 -5
- package/server/applications/files/modules/collabora-online/collabora-online-environment.decorator.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online-manager.service.js +21 -10
- package/server/applications/files/modules/collabora-online/collabora-online-manager.service.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online-manager.service.spec.js +1 -5
- package/server/applications/files/modules/collabora-online/collabora-online-manager.service.spec.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online.config.js +1 -5
- package/server/applications/files/modules/collabora-online/collabora-online.config.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online.constants.js +1 -5
- package/server/applications/files/modules/collabora-online/collabora-online.constants.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online.controller.js +1 -5
- package/server/applications/files/modules/collabora-online/collabora-online.controller.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online.controller.spec.js +1 -5
- package/server/applications/files/modules/collabora-online/collabora-online.controller.spec.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online.dtos.js +1 -5
- package/server/applications/files/modules/collabora-online/collabora-online.dtos.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online.guard.js +1 -5
- package/server/applications/files/modules/collabora-online/collabora-online.guard.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online.guard.spec.js +1 -5
- package/server/applications/files/modules/collabora-online/collabora-online.guard.spec.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online.interface.js +1 -5
- package/server/applications/files/modules/collabora-online/collabora-online.interface.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online.module.js +1 -5
- package/server/applications/files/modules/collabora-online/collabora-online.module.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online.routes.js +1 -5
- package/server/applications/files/modules/collabora-online/collabora-online.routes.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online.strategy.js +1 -5
- package/server/applications/files/modules/collabora-online/collabora-online.strategy.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online.utils.js +1 -5
- package/server/applications/files/modules/collabora-online/collabora-online.utils.js.map +1 -1
- package/server/applications/files/modules/file-editor-providers.interface.js +6 -0
- package/server/applications/files/modules/file-editor-providers.interface.js.map +1 -0
- package/server/applications/files/modules/only-office/only-office-environment.decorator.js +1 -5
- package/server/applications/files/modules/only-office/only-office-environment.decorator.js.map +1 -1
- package/server/applications/files/modules/only-office/only-office-manager.service.js +57 -19
- package/server/applications/files/modules/only-office/only-office-manager.service.js.map +1 -1
- package/server/applications/files/modules/only-office/only-office-manager.service.spec.js +1 -5
- package/server/applications/files/modules/only-office/only-office-manager.service.spec.js.map +1 -1
- package/server/applications/files/modules/only-office/only-office.config.js +1 -5
- package/server/applications/files/modules/only-office/only-office.config.js.map +1 -1
- package/server/applications/files/modules/only-office/only-office.constants.js +1 -5
- package/server/applications/files/modules/only-office/only-office.constants.js.map +1 -1
- package/server/applications/files/modules/only-office/only-office.controller.js +1 -5
- package/server/applications/files/modules/only-office/only-office.controller.js.map +1 -1
- package/server/applications/files/modules/only-office/only-office.controller.spec.js +1 -5
- package/server/applications/files/modules/only-office/only-office.controller.spec.js.map +1 -1
- package/server/applications/files/modules/only-office/only-office.dtos.js +1 -5
- package/server/applications/files/modules/only-office/only-office.dtos.js.map +1 -1
- package/server/applications/files/modules/only-office/only-office.guard.js +1 -5
- package/server/applications/files/modules/only-office/only-office.guard.js.map +1 -1
- package/server/applications/files/modules/only-office/only-office.guard.spec.js +1 -5
- package/server/applications/files/modules/only-office/only-office.guard.spec.js.map +1 -1
- package/server/applications/files/modules/only-office/only-office.interface.js +1 -5
- package/server/applications/files/modules/only-office/only-office.interface.js.map +1 -1
- package/server/applications/files/modules/only-office/only-office.module.js +1 -5
- package/server/applications/files/modules/only-office/only-office.module.js.map +1 -1
- package/server/applications/files/modules/only-office/only-office.routes.js +1 -5
- package/server/applications/files/modules/only-office/only-office.routes.js.map +1 -1
- package/server/applications/files/modules/only-office/only-office.strategy.js +1 -5
- package/server/applications/files/modules/only-office/only-office.strategy.js.map +1 -1
- package/server/applications/files/schemas/file-content.interface.js +1 -5
- package/server/applications/files/schemas/file-content.interface.js.map +1 -1
- package/server/applications/files/schemas/file-recent.interface.js +1 -5
- package/server/applications/files/schemas/file-recent.interface.js.map +1 -1
- package/server/applications/files/schemas/file.interface.js +1 -5
- package/server/applications/files/schemas/file.interface.js.map +1 -1
- package/server/applications/files/schemas/files-content.schema.js +1 -5
- package/server/applications/files/schemas/files-content.schema.js.map +1 -1
- package/server/applications/files/schemas/files-recents.schema.js +1 -5
- package/server/applications/files/schemas/files-recents.schema.js.map +1 -1
- package/server/applications/files/schemas/files.schema.js +1 -5
- package/server/applications/files/schemas/files.schema.js.map +1 -1
- package/server/applications/files/services/files-content-manager.service.js +45 -16
- package/server/applications/files/services/files-content-manager.service.js.map +1 -1
- package/server/applications/files/services/files-lock-manager.service.js +53 -18
- package/server/applications/files/services/files-lock-manager.service.js.map +1 -1
- package/server/applications/files/services/files-lock-manager.service.spec.js +1 -5
- package/server/applications/files/services/files-lock-manager.service.spec.js.map +1 -1
- package/server/applications/files/services/files-manager.service.js +77 -24
- package/server/applications/files/services/files-manager.service.js.map +1 -1
- package/server/applications/files/services/files-manager.service.spec.js +1 -5
- package/server/applications/files/services/files-manager.service.spec.js.map +1 -1
- package/server/applications/files/services/files-methods.service.js +5 -6
- package/server/applications/files/services/files-methods.service.js.map +1 -1
- package/server/applications/files/services/files-methods.service.spec.js +1 -5
- package/server/applications/files/services/files-methods.service.spec.js.map +1 -1
- package/server/applications/files/services/files-parser.service.js +13 -8
- package/server/applications/files/services/files-parser.service.js.map +1 -1
- package/server/applications/files/services/files-parser.service.spec.js +1 -5
- package/server/applications/files/services/files-parser.service.spec.js.map +1 -1
- package/server/applications/files/services/files-queries.service.js +29 -12
- package/server/applications/files/services/files-queries.service.js.map +1 -1
- package/server/applications/files/services/files-recents.service.js +1 -5
- package/server/applications/files/services/files-recents.service.js.map +1 -1
- package/server/applications/files/services/files-recents.service.spec.js +1 -5
- package/server/applications/files/services/files-recents.service.spec.js.map +1 -1
- package/server/applications/files/services/files-scheduler.service.js +77 -24
- package/server/applications/files/services/files-scheduler.service.js.map +1 -1
- package/server/applications/files/services/files-search-manager.service.js +9 -7
- package/server/applications/files/services/files-search-manager.service.js.map +1 -1
- package/server/applications/files/services/files-search-manager.service.spec.js +1 -5
- package/server/applications/files/services/files-search-manager.service.spec.js.map +1 -1
- package/server/applications/files/services/files-tasks-manager.service.js +77 -24
- package/server/applications/files/services/files-tasks-manager.service.js.map +1 -1
- package/server/applications/files/services/files-tasks-manager.service.spec.js +1 -5
- package/server/applications/files/services/files-tasks-manager.service.spec.js.map +1 -1
- package/server/applications/files/utils/doc-textify/adapters/excel.js +1 -5
- package/server/applications/files/utils/doc-textify/adapters/excel.js.map +1 -1
- package/server/applications/files/utils/doc-textify/adapters/html.js +1 -5
- package/server/applications/files/utils/doc-textify/adapters/html.js.map +1 -1
- package/server/applications/files/utils/doc-textify/adapters/open-office.js +1 -5
- package/server/applications/files/utils/doc-textify/adapters/open-office.js.map +1 -1
- package/server/applications/files/utils/doc-textify/adapters/pdf.js +1 -5
- package/server/applications/files/utils/doc-textify/adapters/pdf.js.map +1 -1
- package/server/applications/files/utils/doc-textify/adapters/power-point.js +1 -5
- package/server/applications/files/utils/doc-textify/adapters/power-point.js.map +1 -1
- package/server/applications/files/utils/doc-textify/adapters/text.js +1 -5
- package/server/applications/files/utils/doc-textify/adapters/text.js.map +1 -1
- package/server/applications/files/utils/doc-textify/adapters/word.js +1 -5
- package/server/applications/files/utils/doc-textify/adapters/word.js.map +1 -1
- package/server/applications/files/utils/doc-textify/doc-textify.js +1 -5
- package/server/applications/files/utils/doc-textify/doc-textify.js.map +1 -1
- package/server/applications/files/utils/doc-textify/interfaces/doc-textify.interfaces.js +1 -5
- package/server/applications/files/utils/doc-textify/interfaces/doc-textify.interfaces.js.map +1 -1
- package/server/applications/files/utils/doc-textify/utils/clean.js +1 -5
- package/server/applications/files/utils/doc-textify/utils/clean.js.map +1 -1
- package/server/applications/files/utils/files-search.js +1 -5
- package/server/applications/files/utils/files-search.js.map +1 -1
- package/server/applications/files/utils/files-tree.js +1 -5
- package/server/applications/files/utils/files-tree.js.map +1 -1
- package/server/applications/files/utils/files.js +1 -5
- package/server/applications/files/utils/files.js.map +1 -1
- package/server/applications/files/utils/send-file.js +1 -5
- package/server/applications/files/utils/send-file.js.map +1 -1
- package/server/applications/files/utils/unzip-file.js +1 -5
- package/server/applications/files/utils/unzip-file.js.map +1 -1
- package/server/applications/files/utils/url-file.js +1 -5
- package/server/applications/files/utils/url-file.js.map +1 -1
- package/server/applications/links/constants/cache.js +1 -5
- package/server/applications/links/constants/cache.js.map +1 -1
- package/server/applications/links/constants/links.js +1 -5
- package/server/applications/links/constants/links.js.map +1 -1
- package/server/applications/links/constants/routes.js +1 -5
- package/server/applications/links/constants/routes.js.map +1 -1
- package/server/applications/links/dto/create-or-update-link.dto.js +1 -5
- package/server/applications/links/dto/create-or-update-link.dto.js.map +1 -1
- package/server/applications/links/interfaces/link-guest.interface.js +1 -5
- package/server/applications/links/interfaces/link-guest.interface.js.map +1 -1
- package/server/applications/links/interfaces/link-space.interface.js +1 -5
- package/server/applications/links/interfaces/link-space.interface.js.map +1 -1
- package/server/applications/links/links.controller.js +1 -5
- package/server/applications/links/links.controller.js.map +1 -1
- package/server/applications/links/links.controller.spec.js +1 -5
- package/server/applications/links/links.controller.spec.js.map +1 -1
- package/server/applications/links/schemas/link.interface.js +1 -5
- package/server/applications/links/schemas/link.interface.js.map +1 -1
- package/server/applications/links/schemas/links.schema.js +1 -5
- package/server/applications/links/schemas/links.schema.js.map +1 -1
- package/server/applications/links/services/links-manager.service.js +55 -20
- package/server/applications/links/services/links-manager.service.js.map +1 -1
- package/server/applications/links/services/links-manager.service.spec.js +3 -7
- package/server/applications/links/services/links-manager.service.spec.js.map +1 -1
- package/server/applications/links/services/links-queries.service.js +1 -5
- package/server/applications/links/services/links-queries.service.js.map +1 -1
- package/server/applications/notifications/constants/notifications.js +1 -5
- package/server/applications/notifications/constants/notifications.js.map +1 -1
- package/server/applications/notifications/constants/routes.js +1 -5
- package/server/applications/notifications/constants/routes.js.map +1 -1
- package/server/applications/notifications/constants/websocket.js +1 -5
- package/server/applications/notifications/constants/websocket.js.map +1 -1
- package/server/applications/notifications/i18n/de.js +1 -9
- package/server/applications/notifications/i18n/de.js.map +1 -1
- package/server/applications/notifications/i18n/es.js +1 -5
- package/server/applications/notifications/i18n/es.js.map +1 -1
- package/server/applications/notifications/i18n/fr.js +1 -5
- package/server/applications/notifications/i18n/fr.js.map +1 -1
- package/server/applications/notifications/i18n/hi.js +1 -5
- package/server/applications/notifications/i18n/hi.js.map +1 -1
- package/server/applications/notifications/i18n/index.js +1 -5
- package/server/applications/notifications/i18n/index.js.map +1 -1
- package/server/applications/notifications/i18n/it.js +1 -5
- package/server/applications/notifications/i18n/it.js.map +1 -1
- package/server/applications/notifications/i18n/ja.js +1 -5
- package/server/applications/notifications/i18n/ja.js.map +1 -1
- package/server/applications/notifications/i18n/ko.js +1 -5
- package/server/applications/notifications/i18n/ko.js.map +1 -1
- package/server/applications/notifications/i18n/pl.js +1 -5
- package/server/applications/notifications/i18n/pl.js.map +1 -1
- package/server/applications/notifications/i18n/pt.js +1 -5
- package/server/applications/notifications/i18n/pt.js.map +1 -1
- package/server/applications/notifications/i18n/pt_br.js +1 -5
- package/server/applications/notifications/i18n/pt_br.js.map +1 -1
- package/server/applications/notifications/i18n/ru.js +1 -5
- package/server/applications/notifications/i18n/ru.js.map +1 -1
- package/server/applications/notifications/i18n/tr.js +1 -5
- package/server/applications/notifications/i18n/tr.js.map +1 -1
- package/server/applications/notifications/i18n/zh.js +1 -5
- package/server/applications/notifications/i18n/zh.js.map +1 -1
- package/server/applications/notifications/interfaces/notification-properties.interface.js +1 -5
- package/server/applications/notifications/interfaces/notification-properties.interface.js.map +1 -1
- package/server/applications/notifications/interfaces/user-mail-notification.interface.js +1 -5
- package/server/applications/notifications/interfaces/user-mail-notification.interface.js.map +1 -1
- package/server/applications/notifications/mails/models.js +1 -5
- package/server/applications/notifications/mails/models.js.map +1 -1
- package/server/applications/notifications/mails/templates.js +1 -5
- package/server/applications/notifications/mails/templates.js.map +1 -1
- package/server/applications/notifications/mails/urls.js +1 -5
- package/server/applications/notifications/mails/urls.js.map +1 -1
- package/server/applications/notifications/notifications.controller.js +1 -5
- package/server/applications/notifications/notifications.controller.js.map +1 -1
- package/server/applications/notifications/notifications.controller.spec.js +1 -5
- package/server/applications/notifications/notifications.controller.spec.js.map +1 -1
- package/server/applications/notifications/notifications.gateway.js +1 -5
- package/server/applications/notifications/notifications.gateway.js.map +1 -1
- package/server/applications/notifications/notifications.module.js +1 -5
- package/server/applications/notifications/notifications.module.js.map +1 -1
- package/server/applications/notifications/schemas/notification.interface.js +1 -5
- package/server/applications/notifications/schemas/notification.interface.js.map +1 -1
- package/server/applications/notifications/schemas/notifications.schema.js +1 -5
- package/server/applications/notifications/schemas/notifications.schema.js.map +1 -1
- package/server/applications/notifications/services/notifications-manager.service.js +25 -11
- package/server/applications/notifications/services/notifications-manager.service.js.map +1 -1
- package/server/applications/notifications/services/notifications-manager.service.spec.js +20 -11
- package/server/applications/notifications/services/notifications-manager.service.spec.js.map +1 -1
- package/server/applications/notifications/services/notifications-queries.service.js +1 -5
- package/server/applications/notifications/services/notifications-queries.service.js.map +1 -1
- package/server/applications/shares/constants/routes.js +1 -5
- package/server/applications/shares/constants/routes.js.map +1 -1
- package/server/applications/shares/constants/shares.js +1 -5
- package/server/applications/shares/constants/shares.js.map +1 -1
- package/server/applications/shares/dto/create-or-update-share.dto.js +1 -5
- package/server/applications/shares/dto/create-or-update-share.dto.js.map +1 -1
- package/server/applications/shares/interfaces/share-child.interface.js +1 -5
- package/server/applications/shares/interfaces/share-child.interface.js.map +1 -1
- package/server/applications/shares/interfaces/share-env.interface.js +1 -5
- package/server/applications/shares/interfaces/share-env.interface.js.map +1 -1
- package/server/applications/shares/interfaces/share-file.interface.js +1 -5
- package/server/applications/shares/interfaces/share-file.interface.js.map +1 -1
- package/server/applications/shares/interfaces/share-link.interface.js +1 -5
- package/server/applications/shares/interfaces/share-link.interface.js.map +1 -1
- package/server/applications/shares/interfaces/share-props.interface.js +1 -5
- package/server/applications/shares/interfaces/share-props.interface.js.map +1 -1
- package/server/applications/shares/models/share-child.model.js +1 -5
- package/server/applications/shares/models/share-child.model.js.map +1 -1
- package/server/applications/shares/schemas/share-members.interface.js +1 -5
- package/server/applications/shares/schemas/share-members.interface.js.map +1 -1
- package/server/applications/shares/schemas/share.interface.js +1 -5
- package/server/applications/shares/schemas/share.interface.js.map +1 -1
- package/server/applications/shares/schemas/shares-members.schema.js +1 -5
- package/server/applications/shares/schemas/shares-members.schema.js.map +1 -1
- package/server/applications/shares/schemas/shares.schema.js +1 -5
- package/server/applications/shares/schemas/shares.schema.js.map +1 -1
- package/server/applications/shares/services/shares-manager.service.js +214 -68
- package/server/applications/shares/services/shares-manager.service.js.map +1 -1
- package/server/applications/shares/services/shares-manager.service.spec.js +1 -5
- package/server/applications/shares/services/shares-manager.service.spec.js.map +1 -1
- package/server/applications/shares/services/shares-queries.service.js +49 -17
- package/server/applications/shares/services/shares-queries.service.js.map +1 -1
- package/server/applications/shares/shares.controller.js +1 -5
- package/server/applications/shares/shares.controller.js.map +1 -1
- package/server/applications/shares/shares.controller.spec.js +1 -5
- package/server/applications/shares/shares.controller.spec.js.map +1 -1
- package/server/applications/shares/shares.module.js +1 -5
- package/server/applications/shares/shares.module.js.map +1 -1
- package/server/applications/spaces/constants/cache.js +1 -5
- package/server/applications/spaces/constants/cache.js.map +1 -1
- package/server/applications/spaces/constants/routes.js +1 -5
- package/server/applications/spaces/constants/routes.js.map +1 -1
- package/server/applications/spaces/constants/spaces.js +1 -5
- package/server/applications/spaces/constants/spaces.js.map +1 -1
- package/server/applications/spaces/decorators/space-override-permission.decorator.js +1 -5
- package/server/applications/spaces/decorators/space-override-permission.decorator.js.map +1 -1
- package/server/applications/spaces/decorators/space-skip-guard.decorator.js +1 -5
- package/server/applications/spaces/decorators/space-skip-guard.decorator.js.map +1 -1
- package/server/applications/spaces/decorators/space-skip-permissions.decorator.js +1 -5
- package/server/applications/spaces/decorators/space-skip-permissions.decorator.js.map +1 -1
- package/server/applications/spaces/decorators/space.decorator.js +1 -5
- package/server/applications/spaces/decorators/space.decorator.js.map +1 -1
- package/server/applications/spaces/dto/create-or-update-space.dto.js +1 -5
- package/server/applications/spaces/dto/create-or-update-space.dto.js.map +1 -1
- package/server/applications/spaces/dto/delete-space.dto.js +1 -5
- package/server/applications/spaces/dto/delete-space.dto.js.map +1 -1
- package/server/applications/spaces/dto/search-space.dto.js +1 -5
- package/server/applications/spaces/dto/search-space.dto.js.map +1 -1
- package/server/applications/spaces/dto/space-roots.dto.js +1 -5
- package/server/applications/spaces/dto/space-roots.dto.js.map +1 -1
- package/server/applications/spaces/guards/space.guard.js +17 -9
- package/server/applications/spaces/guards/space.guard.js.map +1 -1
- package/server/applications/spaces/guards/space.guard.spec.js +1 -5
- package/server/applications/spaces/guards/space.guard.spec.js.map +1 -1
- package/server/applications/spaces/interfaces/space-diff.interface.js +1 -5
- package/server/applications/spaces/interfaces/space-diff.interface.js.map +1 -1
- package/server/applications/spaces/interfaces/space-files.interface.js +1 -5
- package/server/applications/spaces/interfaces/space-files.interface.js.map +1 -1
- package/server/applications/spaces/interfaces/space-request.interface.js +1 -5
- package/server/applications/spaces/interfaces/space-request.interface.js.map +1 -1
- package/server/applications/spaces/interfaces/space-trash.interface.js +1 -5
- package/server/applications/spaces/interfaces/space-trash.interface.js.map +1 -1
- package/server/applications/spaces/models/space-env.model.js +1 -5
- package/server/applications/spaces/models/space-env.model.js.map +1 -1
- package/server/applications/spaces/models/space-props.model.js +1 -5
- package/server/applications/spaces/models/space-props.model.js.map +1 -1
- package/server/applications/spaces/models/space-root-props.model.js +1 -5
- package/server/applications/spaces/models/space-root-props.model.js.map +1 -1
- package/server/applications/spaces/models/space.model.js +1 -5
- package/server/applications/spaces/models/space.model.js.map +1 -1
- package/server/applications/spaces/schemas/space-members.interface.js +1 -5
- package/server/applications/spaces/schemas/space-members.interface.js.map +1 -1
- package/server/applications/spaces/schemas/space-root.interface.js +1 -5
- package/server/applications/spaces/schemas/space-root.interface.js.map +1 -1
- package/server/applications/spaces/schemas/space.interface.js +1 -5
- package/server/applications/spaces/schemas/space.interface.js.map +1 -1
- package/server/applications/spaces/schemas/spaces-members.schema.js +1 -5
- package/server/applications/spaces/schemas/spaces-members.schema.js.map +1 -1
- package/server/applications/spaces/schemas/spaces-roots.schema.js +1 -5
- package/server/applications/spaces/schemas/spaces-roots.schema.js.map +1 -1
- package/server/applications/spaces/schemas/spaces.schema.js +1 -5
- package/server/applications/spaces/schemas/spaces.schema.js.map +1 -1
- package/server/applications/spaces/services/spaces-browser.service.js +77 -24
- package/server/applications/spaces/services/spaces-browser.service.js.map +1 -1
- package/server/applications/spaces/services/spaces-browser.service.spec.js +1 -5
- package/server/applications/spaces/services/spaces-browser.service.spec.js.map +1 -1
- package/server/applications/spaces/services/spaces-manager.service.js +193 -53
- package/server/applications/spaces/services/spaces-manager.service.js.map +1 -1
- package/server/applications/spaces/services/spaces-manager.service.spec.js +1 -5
- package/server/applications/spaces/services/spaces-manager.service.spec.js.map +1 -1
- package/server/applications/spaces/services/spaces-queries.service.js +65 -21
- package/server/applications/spaces/services/spaces-queries.service.js.map +1 -1
- package/server/applications/spaces/services/spaces-scheduler.service.js +49 -17
- package/server/applications/spaces/services/spaces-scheduler.service.js.map +1 -1
- package/server/applications/spaces/spaces.controller.js +1 -5
- package/server/applications/spaces/spaces.controller.js.map +1 -1
- package/server/applications/spaces/spaces.controller.spec.js +1 -5
- package/server/applications/spaces/spaces.controller.spec.js.map +1 -1
- package/server/applications/spaces/spaces.module.js +1 -5
- package/server/applications/spaces/spaces.module.js.map +1 -1
- package/server/applications/spaces/utils/paths.js +1 -5
- package/server/applications/spaces/utils/paths.js.map +1 -1
- package/server/applications/spaces/utils/permissions.js +1 -5
- package/server/applications/spaces/utils/permissions.js.map +1 -1
- package/server/applications/spaces/utils/routes.js +1 -5
- package/server/applications/spaces/utils/routes.js.map +1 -1
- package/server/applications/sync/constants/auth.js +1 -5
- package/server/applications/sync/constants/auth.js.map +1 -1
- package/server/applications/sync/constants/routes.js +6 -5
- package/server/applications/sync/constants/routes.js.map +1 -1
- package/server/applications/sync/constants/store.js +1 -9
- package/server/applications/sync/constants/store.js.map +1 -1
- package/server/applications/sync/constants/sync.js +2 -6
- package/server/applications/sync/constants/sync.js.map +1 -1
- package/server/applications/sync/decorators/sync-context.decorator.js +1 -5
- package/server/applications/sync/decorators/sync-context.decorator.js.map +1 -1
- package/server/applications/sync/decorators/sync-environment.decorator.js +1 -5
- package/server/applications/sync/decorators/sync-environment.decorator.js.map +1 -1
- package/server/applications/sync/dtos/sync-client-auth.dto.js +12 -8
- package/server/applications/sync/dtos/sync-client-auth.dto.js.map +1 -1
- package/server/applications/sync/dtos/sync-client-info.dto.js +49 -0
- package/server/applications/sync/dtos/sync-client-info.dto.js.map +1 -0
- package/server/applications/sync/dtos/sync-client-registration.dto.js +34 -11
- package/server/applications/sync/dtos/sync-client-registration.dto.js.map +1 -1
- package/server/applications/sync/dtos/sync-operations.dto.js +1 -5
- package/server/applications/sync/dtos/sync-operations.dto.js.map +1 -1
- package/server/applications/sync/dtos/sync-path.dto.js +1 -5
- package/server/applications/sync/dtos/sync-path.dto.js.map +1 -1
- package/server/applications/sync/dtos/sync-upload.dto.js +1 -5
- package/server/applications/sync/dtos/sync-upload.dto.js.map +1 -1
- package/server/applications/sync/interceptors/sync-diff-gzip-body.interceptor.js +1 -5
- package/server/applications/sync/interceptors/sync-diff-gzip-body.interceptor.js.map +1 -1
- package/server/applications/sync/interceptors/sync-diff-gzip-body.interceptor.spec.js +1 -5
- package/server/applications/sync/interceptors/sync-diff-gzip-body.interceptor.spec.js.map +1 -1
- package/server/applications/sync/interfaces/store-manifest.interface.js +1 -5
- package/server/applications/sync/interfaces/store-manifest.interface.js.map +1 -1
- package/server/applications/sync/interfaces/sync-client-auth.interface.js +1 -25
- package/server/applications/sync/interfaces/sync-client-auth.interface.js.map +1 -1
- package/server/applications/sync/interfaces/sync-client-paths.interface.js +1 -5
- package/server/applications/sync/interfaces/sync-client-paths.interface.js.map +1 -1
- package/server/applications/sync/interfaces/sync-client.interface.js +1 -5
- package/server/applications/sync/interfaces/sync-client.interface.js.map +1 -1
- package/server/applications/sync/interfaces/sync-diff.interface.js +1 -5
- package/server/applications/sync/interfaces/sync-diff.interface.js.map +1 -1
- package/server/applications/sync/interfaces/sync-path.interface.js +1 -5
- package/server/applications/sync/interfaces/sync-path.interface.js.map +1 -1
- package/server/applications/sync/schemas/sync-client.interface.js +1 -5
- package/server/applications/sync/schemas/sync-client.interface.js.map +1 -1
- package/server/applications/sync/schemas/sync-clients.schema.js +1 -5
- package/server/applications/sync/schemas/sync-clients.schema.js.map +1 -1
- package/server/applications/sync/schemas/sync-path.interface.js +1 -5
- package/server/applications/sync/schemas/sync-path.interface.js.map +1 -1
- package/server/applications/sync/schemas/sync-paths.schema.js +1 -5
- package/server/applications/sync/schemas/sync-paths.schema.js.map +1 -1
- package/server/applications/sync/services/sync-clients-manager.service.js +108 -44
- package/server/applications/sync/services/sync-clients-manager.service.js.map +1 -1
- package/server/applications/sync/services/sync-clients-manager.service.spec.js +14 -17
- package/server/applications/sync/services/sync-clients-manager.service.spec.js.map +1 -1
- package/server/applications/sync/services/sync-manager.service.js +29 -12
- package/server/applications/sync/services/sync-manager.service.js.map +1 -1
- package/server/applications/sync/services/sync-manager.service.spec.js +1 -5
- package/server/applications/sync/services/sync-manager.service.spec.js.map +1 -1
- package/server/applications/sync/services/sync-paths-manager.service.js +27 -17
- package/server/applications/sync/services/sync-paths-manager.service.js.map +1 -1
- package/server/applications/sync/services/sync-paths-manager.service.spec.js +11 -15
- package/server/applications/sync/services/sync-paths-manager.service.spec.js.map +1 -1
- package/server/applications/sync/services/sync-queries.service.js +1 -5
- package/server/applications/sync/services/sync-queries.service.js.map +1 -1
- package/server/applications/sync/sync.config.js +1 -5
- package/server/applications/sync/sync.config.js.map +1 -1
- package/server/applications/sync/sync.controller.js +21 -6
- package/server/applications/sync/sync.controller.js.map +1 -1
- package/server/applications/sync/sync.controller.spec.js +1 -5
- package/server/applications/sync/sync.controller.spec.js.map +1 -1
- package/server/applications/sync/sync.module.js +1 -5
- package/server/applications/sync/sync.module.js.map +1 -1
- package/server/applications/sync/utils/functions.js +1 -5
- package/server/applications/sync/utils/functions.js.map +1 -1
- package/server/applications/sync/utils/normalizedMap.js +1 -5
- package/server/applications/sync/utils/normalizedMap.js.map +1 -1
- package/server/applications/sync/utils/routes.js +1 -5
- package/server/applications/sync/utils/routes.js.map +1 -1
- package/server/applications/users/admin-users.controller.js +2 -6
- package/server/applications/users/admin-users.controller.js.map +1 -1
- package/server/applications/users/admin-users.controller.spec.js +6 -10
- package/server/applications/users/admin-users.controller.spec.js.map +1 -1
- package/server/applications/users/constants/group.js +1 -5
- package/server/applications/users/constants/group.js.map +1 -1
- package/server/applications/users/constants/member.js +1 -5
- package/server/applications/users/constants/member.js.map +1 -1
- package/server/applications/users/constants/routes.js +1 -5
- package/server/applications/users/constants/routes.js.map +1 -1
- package/server/applications/users/constants/user.js +1 -5
- package/server/applications/users/constants/user.js.map +1 -1
- package/server/applications/users/constants/websocket.js +1 -5
- package/server/applications/users/constants/websocket.js.map +1 -1
- package/server/applications/users/decorators/permissions.decorator.js +1 -5
- package/server/applications/users/decorators/permissions.decorator.js.map +1 -1
- package/server/applications/users/decorators/roles.decorator.js +1 -5
- package/server/applications/users/decorators/roles.decorator.js.map +1 -1
- package/server/applications/users/decorators/user.decorator.js +1 -5
- package/server/applications/users/decorators/user.decorator.js.map +1 -1
- package/server/applications/users/dto/create-or-update-group.dto.js +1 -5
- package/server/applications/users/dto/create-or-update-group.dto.js.map +1 -1
- package/server/applications/users/dto/create-or-update-user.dto.js +1 -5
- package/server/applications/users/dto/create-or-update-user.dto.js.map +1 -1
- package/server/applications/users/dto/delete-user.dto.js +1 -5
- package/server/applications/users/dto/delete-user.dto.js.map +1 -1
- package/server/applications/users/dto/search-members.dto.js +1 -5
- package/server/applications/users/dto/search-members.dto.js.map +1 -1
- package/server/applications/users/dto/user-properties.dto.js +1 -5
- package/server/applications/users/dto/user-properties.dto.js.map +1 -1
- package/server/applications/users/guards/permissions.guard.js +1 -5
- package/server/applications/users/guards/permissions.guard.js.map +1 -1
- package/server/applications/users/guards/permissions.guard.spec.js +1 -5
- package/server/applications/users/guards/permissions.guard.spec.js.map +1 -1
- package/server/applications/users/guards/roles.guard.js +1 -5
- package/server/applications/users/guards/roles.guard.js.map +1 -1
- package/server/applications/users/guards/roles.guard.spec.js +1 -5
- package/server/applications/users/guards/roles.guard.spec.js.map +1 -1
- package/server/applications/users/interfaces/admin-group.interface.js +1 -5
- package/server/applications/users/interfaces/admin-group.interface.js.map +1 -1
- package/server/applications/users/interfaces/admin-user.interface.js +1 -5
- package/server/applications/users/interfaces/admin-user.interface.js.map +1 -1
- package/server/applications/users/interfaces/group-browse.interface.js +1 -5
- package/server/applications/users/interfaces/group-browse.interface.js.map +1 -1
- package/server/applications/users/interfaces/group-member.js +1 -5
- package/server/applications/users/interfaces/group-member.js.map +1 -1
- package/server/applications/users/interfaces/guest-user.interface.js +1 -5
- package/server/applications/users/interfaces/guest-user.interface.js.map +1 -1
- package/server/applications/users/interfaces/member.interface.js +1 -5
- package/server/applications/users/interfaces/member.interface.js.map +1 -1
- package/server/applications/users/interfaces/owner.interface.js +1 -5
- package/server/applications/users/interfaces/owner.interface.js.map +1 -1
- package/server/applications/users/interfaces/user-secrets.interface.js +1 -5
- package/server/applications/users/interfaces/user-secrets.interface.js.map +1 -1
- package/server/applications/users/interfaces/websocket.interface.js +1 -5
- package/server/applications/users/interfaces/websocket.interface.js.map +1 -1
- package/server/applications/users/models/user.model.js +1 -5
- package/server/applications/users/models/user.model.js.map +1 -1
- package/server/applications/users/schemas/group.interface.js +1 -5
- package/server/applications/users/schemas/group.interface.js.map +1 -1
- package/server/applications/users/schemas/groups.schema.js +1 -5
- package/server/applications/users/schemas/groups.schema.js.map +1 -1
- package/server/applications/users/schemas/user-group.interface.js +1 -5
- package/server/applications/users/schemas/user-group.interface.js.map +1 -1
- package/server/applications/users/schemas/user.interface.js +1 -5
- package/server/applications/users/schemas/user.interface.js.map +1 -1
- package/server/applications/users/schemas/users-groups.schema.js +1 -5
- package/server/applications/users/schemas/users-groups.schema.js.map +1 -1
- package/server/applications/users/schemas/users-guests.schema.js +1 -5
- package/server/applications/users/schemas/users-guests.schema.js.map +1 -1
- package/server/applications/users/schemas/users.schema.js +1 -5
- package/server/applications/users/schemas/users.schema.js.map +1 -1
- package/server/applications/users/services/admin-users-manager.service.js +67 -23
- package/server/applications/users/services/admin-users-manager.service.js.map +1 -1
- package/server/applications/users/services/admin-users-manager.service.spec.js +3 -7
- package/server/applications/users/services/admin-users-manager.service.spec.js.map +1 -1
- package/server/applications/users/services/admin-users-queries.service.js +65 -21
- package/server/applications/users/services/admin-users-queries.service.js.map +1 -1
- package/server/applications/users/services/users-manager.service.js +81 -25
- package/server/applications/users/services/users-manager.service.js.map +1 -1
- package/server/applications/users/services/users-manager.service.spec.js +14 -12
- package/server/applications/users/services/users-manager.service.spec.js.map +1 -1
- package/server/applications/users/services/users-queries.service.js +49 -17
- package/server/applications/users/services/users-queries.service.js.map +1 -1
- package/server/applications/users/users.controller.js +2 -6
- package/server/applications/users/users.controller.js.map +1 -1
- package/server/applications/users/users.controller.spec.js +5 -9
- package/server/applications/users/users.controller.spec.js.map +1 -1
- package/server/applications/users/users.e2e-spec.js +3 -7
- package/server/applications/users/users.e2e-spec.js.map +1 -1
- package/server/applications/users/users.gateway.js +29 -12
- package/server/applications/users/users.gateway.js.map +1 -1
- package/server/applications/users/users.gateway.spec.js +1 -5
- package/server/applications/users/users.gateway.spec.js.map +1 -1
- package/server/applications/users/users.module.js +1 -5
- package/server/applications/users/users.module.js.map +1 -1
- package/server/applications/users/utils/avatar.js +1 -5
- package/server/applications/users/utils/avatar.js.map +1 -1
- package/server/applications/users/utils/test.js +1 -5
- package/server/applications/users/utils/test.js.map +1 -1
- package/server/applications/webdav/constants/routes.js +1 -5
- package/server/applications/webdav/constants/routes.js.map +1 -1
- package/server/applications/webdav/constants/webdav.js +1 -5
- package/server/applications/webdav/constants/webdav.js.map +1 -1
- package/server/applications/webdav/decorators/if-header.decorator.js +1 -5
- package/server/applications/webdav/decorators/if-header.decorator.js.map +1 -1
- package/server/applications/webdav/decorators/webdav-context.decorator.js +1 -5
- package/server/applications/webdav/decorators/webdav-context.decorator.js.map +1 -1
- package/server/applications/webdav/filters/webdav.filter.js +1 -5
- package/server/applications/webdav/filters/webdav.filter.js.map +1 -1
- package/server/applications/webdav/filters/webdav.filter.spec.js +1 -5
- package/server/applications/webdav/filters/webdav.filter.spec.js.map +1 -1
- package/server/applications/webdav/guards/webdav-protocol.guard.js +54 -20
- package/server/applications/webdav/guards/webdav-protocol.guard.js.map +1 -1
- package/server/applications/webdav/guards/webdav-protocol.guard.spec.js +54 -0
- package/server/applications/webdav/guards/webdav-protocol.guard.spec.js.map +1 -1
- package/server/applications/webdav/interfaces/if-header.interface.js +1 -5
- package/server/applications/webdav/interfaces/if-header.interface.js.map +1 -1
- package/server/applications/webdav/interfaces/webdav.interface.js +1 -5
- package/server/applications/webdav/interfaces/webdav.interface.js.map +1 -1
- package/server/applications/webdav/models/webdav-file.model.js +1 -5
- package/server/applications/webdav/models/webdav-file.model.js.map +1 -1
- package/server/applications/webdav/services/webdav-methods.service.js +74 -26
- package/server/applications/webdav/services/webdav-methods.service.js.map +1 -1
- package/server/applications/webdav/services/webdav-methods.service.spec.js +15 -18
- package/server/applications/webdav/services/webdav-methods.service.spec.js.map +1 -1
- package/server/applications/webdav/services/webdav-spaces.service.js +17 -9
- package/server/applications/webdav/services/webdav-spaces.service.js.map +1 -1
- package/server/applications/webdav/services/webdav-spaces.service.spec.js +1 -5
- package/server/applications/webdav/services/webdav-spaces.service.spec.js.map +1 -1
- package/server/applications/webdav/utils/bootstrap.js +1 -5
- package/server/applications/webdav/utils/bootstrap.js.map +1 -1
- package/server/applications/webdav/utils/if-header.js +1 -5
- package/server/applications/webdav/utils/if-header.js.map +1 -1
- package/server/applications/webdav/utils/routes.js +1 -5
- package/server/applications/webdav/utils/routes.js.map +1 -1
- package/server/applications/webdav/utils/webdav.js +1 -5
- package/server/applications/webdav/utils/webdav.js.map +1 -1
- package/server/applications/webdav/utils/xml.js +1 -5
- package/server/applications/webdav/utils/xml.js.map +1 -1
- package/server/applications/webdav/webdav.controller.js +1 -5
- package/server/applications/webdav/webdav.controller.js.map +1 -1
- package/server/applications/webdav/webdav.controller.spec.js +1 -5
- package/server/applications/webdav/webdav.controller.spec.js.map +1 -1
- package/server/applications/webdav/webdav.e2e-spec.js +1 -5
- package/server/applications/webdav/webdav.e2e-spec.js.map +1 -1
- package/server/applications/webdav/webdav.module.js +1 -5
- package/server/applications/webdav/webdav.module.js.map +1 -1
- package/server/authentication/auth.config.js +23 -123
- package/server/authentication/auth.config.js.map +1 -1
- package/server/authentication/auth.controller.js +27 -21
- package/server/authentication/auth.controller.js.map +1 -1
- package/server/authentication/auth.controller.spec.js +6 -10
- package/server/authentication/auth.controller.spec.js.map +1 -1
- package/server/authentication/auth.e2e-spec.js +1 -5
- package/server/authentication/auth.e2e-spec.js.map +1 -1
- package/server/authentication/auth.module.js +17 -20
- package/server/authentication/auth.module.js.map +1 -1
- package/server/authentication/{services/auth-manager.service.js → auth.service.js} +41 -18
- package/server/authentication/auth.service.js.map +1 -0
- package/server/authentication/{services/auth-manager.service.spec.js → auth.service.spec.js} +6 -10
- package/server/authentication/auth.service.spec.js.map +1 -0
- package/server/authentication/constants/auth.js +1 -5
- package/server/authentication/constants/auth.js.map +1 -1
- package/server/authentication/constants/routes.js +41 -30
- package/server/authentication/constants/routes.js.map +1 -1
- package/server/authentication/constants/scope.js +2 -5
- package/server/authentication/constants/scope.js.map +1 -1
- package/server/authentication/decorators/auth-token-optional.decorator.js +1 -5
- package/server/authentication/decorators/auth-token-optional.decorator.js.map +1 -1
- package/server/authentication/decorators/auth-token-skip.decorator.js +1 -5
- package/server/authentication/decorators/auth-token-skip.decorator.js.map +1 -1
- package/server/authentication/dto/login-response.dto.js +1 -10
- package/server/authentication/dto/login-response.dto.js.map +1 -1
- package/server/authentication/dto/token-response.dto.js +1 -5
- package/server/authentication/dto/token-response.dto.js.map +1 -1
- package/server/authentication/guards/auth-anonymous.guard.js +1 -5
- package/server/authentication/guards/auth-anonymous.guard.js.map +1 -1
- package/server/authentication/guards/auth-anonymous.guard.spec.js +1 -5
- package/server/authentication/guards/auth-anonymous.guard.spec.js.map +1 -1
- package/server/authentication/guards/auth-anonymous.strategy.js +1 -5
- package/server/authentication/guards/auth-anonymous.strategy.js.map +1 -1
- package/server/authentication/guards/auth-basic.guard.js +1 -5
- package/server/authentication/guards/auth-basic.guard.js.map +1 -1
- package/server/authentication/guards/auth-basic.guard.spec.js +13 -14
- package/server/authentication/guards/auth-basic.guard.spec.js.map +1 -1
- package/server/authentication/guards/auth-basic.strategy.js +10 -11
- package/server/authentication/guards/auth-basic.strategy.js.map +1 -1
- package/server/authentication/guards/auth-digest.guard.js +1 -5
- package/server/authentication/guards/auth-digest.guard.js.map +1 -1
- package/server/authentication/guards/auth-digest.strategy.js +1 -5
- package/server/authentication/guards/auth-digest.strategy.js.map +1 -1
- package/server/authentication/guards/auth-local.guard.js +1 -5
- package/server/authentication/guards/auth-local.guard.js.map +1 -1
- package/server/authentication/guards/auth-local.guard.spec.js +9 -13
- package/server/authentication/guards/auth-local.guard.spec.js.map +1 -1
- package/server/authentication/guards/auth-local.strategy.js +6 -10
- package/server/authentication/guards/auth-local.strategy.js.map +1 -1
- package/server/authentication/guards/auth-token-access.guard.js +1 -5
- package/server/authentication/guards/auth-token-access.guard.js.map +1 -1
- package/server/authentication/guards/auth-token-access.guard.spec.js +3 -7
- package/server/authentication/guards/auth-token-access.guard.spec.js.map +1 -1
- package/server/authentication/guards/auth-token-access.strategy.js +3 -7
- package/server/authentication/guards/auth-token-access.strategy.js.map +1 -1
- package/server/authentication/guards/auth-token-refresh.guard.js +1 -5
- package/server/authentication/guards/auth-token-refresh.guard.js.map +1 -1
- package/server/authentication/guards/auth-token-refresh.guard.spec.js +3 -7
- package/server/authentication/guards/auth-token-refresh.guard.spec.js.map +1 -1
- package/server/authentication/guards/auth-token-refresh.strategy.js +3 -7
- package/server/authentication/guards/auth-token-refresh.strategy.js.map +1 -1
- package/server/authentication/guards/implementations/http-basic.strategy.js +1 -5
- package/server/authentication/guards/implementations/http-basic.strategy.js.map +1 -1
- package/server/authentication/guards/implementations/http-digest.strategy.js +1 -5
- package/server/authentication/guards/implementations/http-digest.strategy.js.map +1 -1
- package/server/authentication/interfaces/auth-request.interface.js +1 -5
- package/server/authentication/interfaces/auth-request.interface.js.map +1 -1
- package/server/authentication/interfaces/jwt-payload.interface.js +1 -5
- package/server/authentication/interfaces/jwt-payload.interface.js.map +1 -1
- package/server/authentication/interfaces/token.interface.js +1 -5
- package/server/authentication/interfaces/token.interface.js.map +1 -1
- package/server/authentication/providers/auth-providers.constants.js +18 -0
- package/server/authentication/providers/auth-providers.constants.js.map +1 -0
- package/server/authentication/providers/auth-providers.models.js +14 -0
- package/server/authentication/providers/auth-providers.models.js.map +1 -0
- package/server/authentication/providers/auth-providers.utils.js +42 -0
- package/server/authentication/providers/auth-providers.utils.js.map +1 -0
- package/server/authentication/providers/ldap/auth-ldap.config.js +143 -0
- package/server/authentication/providers/ldap/auth-ldap.config.js.map +1 -0
- package/server/authentication/{constants/auth-ldap.js → providers/ldap/auth-ldap.constants.js} +12 -6
- package/server/authentication/providers/ldap/auth-ldap.constants.js.map +1 -0
- package/server/authentication/providers/ldap/auth-provider-ldap.service.js +506 -0
- package/server/authentication/providers/ldap/auth-provider-ldap.service.js.map +1 -0
- package/server/authentication/providers/ldap/auth-provider-ldap.service.spec.js +674 -0
- package/server/authentication/providers/ldap/auth-provider-ldap.service.spec.js.map +1 -0
- package/server/authentication/{services/auth-methods/auth-method-database.service.js → providers/mysql/auth-provider-mysql.service.js} +16 -14
- package/server/authentication/providers/mysql/auth-provider-mysql.service.js.map +1 -0
- package/server/authentication/{services/auth-methods/auth-method-database.service.spec.js → providers/mysql/auth-provider-mysql.service.spec.js} +15 -19
- package/server/authentication/providers/mysql/auth-provider-mysql.service.spec.js.map +1 -0
- package/server/authentication/providers/oidc/auth-oidc-desktop.constants.js +30 -0
- package/server/authentication/providers/oidc/auth-oidc-desktop.constants.js.map +1 -0
- package/server/authentication/providers/oidc/auth-oidc.config.js +149 -0
- package/server/authentication/providers/oidc/auth-oidc.config.js.map +1 -0
- package/server/authentication/providers/oidc/auth-oidc.constants.js +39 -0
- package/server/authentication/providers/oidc/auth-oidc.constants.js.map +1 -0
- package/server/authentication/providers/oidc/auth-oidc.controller.js +83 -0
- package/server/authentication/providers/oidc/auth-oidc.controller.js.map +1 -0
- package/server/authentication/providers/oidc/auth-oidc.interfaces.js +6 -0
- package/server/authentication/providers/oidc/auth-oidc.interfaces.js.map +1 -0
- package/server/authentication/providers/oidc/auth-provider-oidc.module.js +36 -0
- package/server/authentication/providers/oidc/auth-provider-oidc.module.js.map +1 -0
- package/server/authentication/providers/oidc/auth-provider-oidc.service.js +373 -0
- package/server/authentication/providers/oidc/auth-provider-oidc.service.js.map +1 -0
- package/server/authentication/providers/oidc/auth-provider-oidc.service.spec.js +270 -0
- package/server/authentication/providers/oidc/auth-provider-oidc.service.spec.js.map +1 -0
- package/server/authentication/{services/auth-methods/auth-method-two-fa.service.js → providers/two-fa/auth-provider-two-fa.service.js} +56 -38
- package/server/authentication/providers/two-fa/auth-provider-two-fa.service.js.map +1 -0
- package/server/authentication/{services/auth-methods/auth-method-two-fa.service.spec.js → providers/two-fa/auth-provider-two-fa.service.spec.js} +6 -10
- package/server/authentication/providers/two-fa/auth-provider-two-fa.service.spec.js.map +1 -0
- package/server/authentication/{guards → providers/two-fa}/auth-two-fa-guard.js +10 -14
- package/server/authentication/providers/two-fa/auth-two-fa-guard.js.map +1 -0
- package/server/authentication/providers/two-fa/auth-two-fa.config.js +57 -0
- package/server/authentication/providers/two-fa/auth-two-fa.config.js.map +1 -0
- package/server/authentication/{dto/two-fa-verify.dto.js → providers/two-fa/auth-two-fa.dtos.js} +8 -6
- package/server/authentication/providers/two-fa/auth-two-fa.dtos.js.map +1 -0
- package/server/authentication/providers/two-fa/auth-two-fa.interfaces.js +6 -0
- package/server/authentication/providers/two-fa/auth-two-fa.interfaces.js.map +1 -0
- package/server/authentication/utils/crypt-secret.js +1 -5
- package/server/authentication/utils/crypt-secret.js.map +1 -1
- package/server/common/constants.js +1 -5
- package/server/common/constants.js.map +1 -1
- package/server/common/decorators.js +1 -5
- package/server/common/decorators.js.map +1 -1
- package/server/common/functions.js +25 -9
- package/server/common/functions.js.map +1 -1
- package/server/common/i18n.js +1 -5
- package/server/common/i18n.js.map +1 -1
- package/server/common/image.js +1 -5
- package/server/common/image.js.map +1 -1
- package/server/common/interfaces.js +1 -5
- package/server/common/interfaces.js.map +1 -1
- package/server/common/qrcode.js +1 -5
- package/server/common/qrcode.js.map +1 -1
- package/server/common/shared.js +6 -6
- package/server/common/shared.js.map +1 -1
- package/server/configuration/config.constants.js +1 -5
- package/server/configuration/config.constants.js.map +1 -1
- package/server/configuration/config.environment.js +2 -6
- package/server/configuration/config.environment.js.map +1 -1
- package/server/configuration/config.interfaces.js +1 -5
- package/server/configuration/config.interfaces.js.map +1 -1
- package/server/configuration/config.loader.js +1 -5
- package/server/configuration/config.loader.js.map +1 -1
- package/server/configuration/config.logger.js +4 -8
- package/server/configuration/config.logger.js.map +1 -1
- package/server/configuration/config.validation.js +7 -5
- package/server/configuration/config.validation.js.map +1 -1
- package/server/infrastructure/cache/adapters/mysql-cache.adapter.js +9 -7
- package/server/infrastructure/cache/adapters/mysql-cache.adapter.js.map +1 -1
- package/server/infrastructure/cache/adapters/redis-cache.adapter.js +1 -5
- package/server/infrastructure/cache/adapters/redis-cache.adapter.js.map +1 -1
- package/server/infrastructure/cache/cache.config.js +1 -5
- package/server/infrastructure/cache/cache.config.js.map +1 -1
- package/server/infrastructure/cache/cache.decorator.js +9 -7
- package/server/infrastructure/cache/cache.decorator.js.map +1 -1
- package/server/infrastructure/cache/cache.e2e-spec.js +1 -5
- package/server/infrastructure/cache/cache.e2e-spec.js.map +1 -1
- package/server/infrastructure/cache/cache.module.js +1 -5
- package/server/infrastructure/cache/cache.module.js.map +1 -1
- package/server/infrastructure/cache/schemas/mysql-cache.interface.js +1 -5
- package/server/infrastructure/cache/schemas/mysql-cache.interface.js.map +1 -1
- package/server/infrastructure/cache/schemas/mysql-cache.schema.js +1 -5
- package/server/infrastructure/cache/schemas/mysql-cache.schema.js.map +1 -1
- package/server/infrastructure/cache/services/cache.service.js +1 -5
- package/server/infrastructure/cache/services/cache.service.js.map +1 -1
- package/server/infrastructure/context/context.module.js +1 -5
- package/server/infrastructure/context/context.module.js.map +1 -1
- package/server/infrastructure/context/interceptors/context.interceptor.js +1 -5
- package/server/infrastructure/context/interceptors/context.interceptor.js.map +1 -1
- package/server/infrastructure/context/interceptors/context.interceptor.spec.js +2 -6
- package/server/infrastructure/context/interceptors/context.interceptor.spec.js.map +1 -1
- package/server/infrastructure/context/interfaces/context-store.interface.js +1 -5
- package/server/infrastructure/context/interfaces/context-store.interface.js.map +1 -1
- package/server/infrastructure/context/services/context-manager.service.js +1 -5
- package/server/infrastructure/context/services/context-manager.service.js.map +1 -1
- package/server/infrastructure/context/services/context-manager.service.spec.js +1 -5
- package/server/infrastructure/context/services/context-manager.service.spec.js.map +1 -1
- package/server/infrastructure/database/columns.js +1 -5
- package/server/infrastructure/database/columns.js.map +1 -1
- package/server/infrastructure/database/configuration.js +1 -5
- package/server/infrastructure/database/configuration.js.map +1 -1
- package/server/infrastructure/database/constants.js +2 -6
- package/server/infrastructure/database/constants.js.map +1 -1
- package/server/infrastructure/database/database.config.js +1 -5
- package/server/infrastructure/database/database.config.js.map +1 -1
- package/server/infrastructure/database/database.logger.js +1 -5
- package/server/infrastructure/database/database.logger.js.map +1 -1
- package/server/infrastructure/database/database.module.js +1 -5
- package/server/infrastructure/database/database.module.js.map +1 -1
- package/server/infrastructure/database/interfaces/database.interface.js +1 -5
- package/server/infrastructure/database/interfaces/database.interface.js.map +1 -1
- package/server/infrastructure/database/schema.js +1 -5
- package/server/infrastructure/database/schema.js.map +1 -1
- package/server/infrastructure/database/scripts/create-user.js +1 -5
- package/server/infrastructure/database/scripts/create-user.js.map +1 -1
- package/server/infrastructure/database/scripts/db.js +1 -5
- package/server/infrastructure/database/scripts/db.js.map +1 -1
- package/server/infrastructure/database/scripts/seed/main.js +1 -5
- package/server/infrastructure/database/scripts/seed/main.js.map +1 -1
- package/server/infrastructure/database/scripts/seed/usersgroups.js +1 -5
- package/server/infrastructure/database/scripts/seed/usersgroups.js.map +1 -1
- package/server/infrastructure/database/utils.js +1 -5
- package/server/infrastructure/database/utils.js.map +1 -1
- package/server/infrastructure/mailer/interfaces/mail.interface.js +1 -5
- package/server/infrastructure/mailer/interfaces/mail.interface.js.map +1 -1
- package/server/infrastructure/mailer/mailer.config.js +1 -5
- package/server/infrastructure/mailer/mailer.config.js.map +1 -1
- package/server/infrastructure/mailer/mailer.module.js +1 -5
- package/server/infrastructure/mailer/mailer.module.js.map +1 -1
- package/server/infrastructure/mailer/mailer.service.js +1 -5
- package/server/infrastructure/mailer/mailer.service.js.map +1 -1
- package/server/infrastructure/mailer/mailer.service.spec.js +2 -6
- package/server/infrastructure/mailer/mailer.service.spec.js.map +1 -1
- package/server/infrastructure/scheduler/scheduler.constants.js +1 -5
- package/server/infrastructure/scheduler/scheduler.constants.js.map +1 -1
- package/server/infrastructure/scheduler/scheduler.module.js +1 -5
- package/server/infrastructure/scheduler/scheduler.module.js.map +1 -1
- package/server/infrastructure/websocket/adapters/cluster.adapter.js +1 -5
- package/server/infrastructure/websocket/adapters/cluster.adapter.js.map +1 -1
- package/server/infrastructure/websocket/adapters/redis.adapter.js +1 -5
- package/server/infrastructure/websocket/adapters/redis.adapter.js.map +1 -1
- package/server/infrastructure/websocket/adapters/web-socket.adapter.js +1 -5
- package/server/infrastructure/websocket/adapters/web-socket.adapter.js.map +1 -1
- package/server/infrastructure/websocket/decorators/web-socket-user.decorator.js +1 -5
- package/server/infrastructure/websocket/decorators/web-socket-user.decorator.js.map +1 -1
- package/server/infrastructure/websocket/interfaces/auth-socket-io.interface.js +1 -5
- package/server/infrastructure/websocket/interfaces/auth-socket-io.interface.js.map +1 -1
- package/server/infrastructure/websocket/utils.js +1 -5
- package/server/infrastructure/websocket/utils.js.map +1 -1
- package/server/infrastructure/websocket/web-socket.config.js +1 -5
- package/server/infrastructure/websocket/web-socket.config.js.map +1 -1
- package/server/main.js +5 -0
- package/server/main.js.map +1 -1
- package/static/assets/pdfjs/build/pdf.mjs +724 -745
- 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 +706 -193
- package/static/assets/pdfjs/build/pdf.worker.mjs.map +1 -1
- package/static/assets/pdfjs/version +1 -1
- package/static/assets/pdfjs/web/locale/dsb/viewer.ftl +5 -5
- package/static/assets/pdfjs/web/locale/en-US/viewer.ftl +1 -0
- package/static/assets/pdfjs/web/locale/fur/viewer.ftl +5 -0
- package/static/assets/pdfjs/web/locale/kk/viewer.ftl +28 -0
- package/static/assets/pdfjs/web/locale/ml/viewer.ftl +4 -0
- package/static/assets/pdfjs/web/locale/ru/viewer.ftl +3 -3
- package/static/assets/pdfjs/web/viewer.css +207 -65
- package/static/assets/pdfjs/web/viewer.html +11 -10
- package/static/assets/pdfjs/web/viewer.mjs +850 -270
- package/static/assets/pdfjs/web/viewer.mjs.map +1 -1
- package/static/assets/pdfjs/web/wasm/LICENSE_JBIG2 +196 -0
- package/static/assets/pdfjs/web/wasm/LICENSE_PDFJS_JBIG2 +13 -0
- package/static/assets/pdfjs/web/wasm/jbig2.wasm +0 -0
- package/static/chunk-22TZP6HW.js +1 -0
- package/static/{chunk-U5E5H2DD.js → chunk-27ATUHBH.js} +1 -1
- package/static/{chunk-HZAB6F4Q.js → chunk-2CKLZ3FM.js} +1 -1
- package/static/{chunk-XZHWESIY.js → chunk-2QZPX7LO.js} +1 -1
- package/static/{chunk-UOK3LKSX.js → chunk-2R6IBBPZ.js} +1 -1
- package/static/{chunk-DVCN3P7Q.js → chunk-4FIGEBNL.js} +1 -1
- package/static/chunk-4P3JABAP.js +13 -0
- package/static/chunk-5CZOSAMZ.js +1 -0
- package/static/{chunk-RBTLSPYJ.js → chunk-677WUBCT.js} +1 -1
- package/static/{chunk-KEZNIIFH.js → chunk-74CAHBFM.js} +1 -1
- package/static/{chunk-WRK2FTKU.js → chunk-7GWW6MJO.js} +1 -1
- package/static/{chunk-EKWB5W72.js → chunk-7WOPGQXB.js} +1 -1
- package/static/{chunk-IMFO2MI7.js → chunk-A4UGPSWX.js} +1 -1
- package/static/{chunk-KDUAB76O.js → chunk-AHO37FKW.js} +1 -1
- package/static/chunk-AQCXMKP3.js +1 -0
- package/static/chunk-B6PDYCRO.js +3 -0
- package/static/{chunk-PPJCVBJH.js → chunk-CU76ATCF.js} +1 -1
- package/static/{chunk-ARS47O5X.js → chunk-CWYHOPOP.js} +1 -1
- package/static/{chunk-CSVPAZHK.js → chunk-E5WI5725.js} +1 -1
- package/static/{chunk-XX3JPJUM.js → chunk-FC5HTKVM.js} +1 -1
- package/static/{chunk-QGHNJVJ6.js → chunk-FOSM7EYI.js} +1 -1
- package/static/{chunk-JAJ7VXMB.js → chunk-GAZO25PI.js} +1 -1
- package/static/{chunk-IHS5LSJJ.js → chunk-GB7ABR5N.js} +1 -1
- package/static/{chunk-27V66YJV.js → chunk-GEHFKZQ5.js} +2 -2
- package/static/{chunk-3QTROEHV.js → chunk-GQFMWVFD.js} +1 -1
- package/static/{chunk-FWQJ4ZCD.js → chunk-GVNTC564.js} +1 -1
- package/static/{chunk-4NIYCYRS.js → chunk-HGL3NYP2.js} +2 -2
- package/static/chunk-HLIWPWRA.js +1 -0
- package/static/{chunk-3VRUIWQG.js → chunk-HNYB3M4S.js} +1 -1
- package/static/{chunk-7HJFIMNF.js → chunk-HUXAUQMN.js} +1 -1
- package/static/chunk-I2XA6PPK.js +1 -0
- package/static/{chunk-RJULB733.js → chunk-ISV3BO6R.js} +1 -1
- package/static/{chunk-R4VYKZVJ.js → chunk-IWWBV6EM.js} +1 -1
- package/static/{chunk-TTWMFWEC.js → chunk-JV3AGU5B.js} +1 -1
- package/static/{chunk-X7NHX5C7.js → chunk-K25E7YGG.js} +1 -1
- package/static/chunk-K46PUTZB.js +1 -0
- package/static/{chunk-D2MLAO5N.js → chunk-KERFLJ56.js} +1 -7
- package/static/{chunk-LZUHREOF.js → chunk-KJD3KFF3.js} +1 -1
- package/static/chunk-KPKSI23S.js +1 -0
- package/static/{chunk-CMNMPG6Z.js → chunk-KZS7CTNR.js} +1 -1
- package/static/{chunk-RNVPQQKT.js → chunk-L5IHUVXL.js} +1 -1
- package/static/{chunk-2GXOVGTD.js → chunk-L7RRX2M3.js} +1 -1
- package/static/{chunk-WFMEUST4.js → chunk-LGWJ2WKU.js} +1 -1
- package/static/{chunk-ZOMRIN3G.js → chunk-MLC7JK2H.js} +2 -2
- package/static/{chunk-76REYAEA.js → chunk-MOHNYW2A.js} +1 -1
- package/static/{chunk-ZHUBWKA2.js → chunk-MTRXBVWZ.js} +1 -1
- package/static/{chunk-QJ22N76V.js → chunk-MZQK6LNV.js} +1 -1
- package/static/{chunk-SDJNZULP.js → chunk-NCDUOVMW.js} +1 -1
- package/static/chunk-NGUAJIGI.js +1 -0
- package/static/chunk-NIPP6JDI.js +1 -0
- package/static/{chunk-VD5JHSDS.js → chunk-NMTBMHUL.js} +1 -1
- package/static/chunk-O4XXMZFX.js +4 -0
- package/static/{chunk-WZPF4LS2.js → chunk-OANZITPM.js} +1 -1
- package/static/{chunk-JNTNMIUH.js → chunk-OGE4SAHU.js} +1 -1
- package/static/{chunk-S6H2ELRY.js → chunk-OI3ME22C.js} +1 -1
- package/static/{chunk-7KAYOR3A.js → chunk-Q3EGCMF5.js} +1 -1
- package/static/chunk-QF2NSHZA.js +1 -0
- package/static/{chunk-3ZBAQTHJ.js → chunk-QIGUDEZF.js} +1 -1
- package/static/{chunk-76M3BMK6.js → chunk-QJVC3SRJ.js} +11 -11
- package/static/{chunk-VBTZDHZ3.js → chunk-QKN6LAAA.js} +1 -1
- package/static/{chunk-JRXG43AA.js → chunk-QRFESU5O.js} +2 -2
- package/static/chunk-QVRVFYJH.js +1 -0
- package/static/{chunk-BCN4T5DO.js → chunk-RFJIPIOK.js} +2 -2
- package/static/{chunk-2RWLNKZH.js → chunk-RLL634K4.js} +1 -1
- package/static/{chunk-D5FQ72R4.js → chunk-RS2OFKWP.js} +1 -1
- package/static/{chunk-CN5YVRFT.js → chunk-RWAAC3A4.js} +1 -1
- package/static/{chunk-LWSCODLD.js → chunk-RWCNTCU5.js} +1 -1
- package/static/{chunk-FTFEQDWH.js → chunk-S5Y64DDS.js} +1 -1
- package/static/{chunk-J7474P3L.js → chunk-SLG5KDU6.js} +1 -1
- package/static/chunk-TJ4CVFEL.js +1 -0
- package/static/{chunk-KAUCN24H.js → chunk-TWCGKSYE.js} +1 -1
- package/static/{chunk-PDG7DOEF.js → chunk-UMDRE4S7.js} +1 -1
- package/static/chunk-VRIOLRYR.js +5 -0
- package/static/chunk-VS4O2XDP.js +1 -0
- package/static/{chunk-ZEJLIGAY.js → chunk-VSBFNFOM.js} +1 -1
- package/static/{chunk-XSURUW7C.js → chunk-WN4WXCVK.js} +1 -1
- package/static/{chunk-S44QIK3G.js → chunk-WX7RXW7K.js} +1 -1
- package/static/{chunk-3ZLBVUCX.js → chunk-XC4POKR3.js} +2 -2
- package/static/{chunk-TNCKNU6I.js → chunk-Y4AUYQTG.js} +1 -1
- package/static/{chunk-3MVPXC3U.js → chunk-Y67J3BOL.js} +1 -1
- package/static/{chunk-QTPIEEZW.js → chunk-YMIXHRJQ.js} +1 -7
- package/static/{chunk-VZFZUI6D.js → chunk-ZUNKFAKP.js} +1 -1
- package/static/index.html +3 -3
- package/static/main-QN4UCOC5.js +5 -0
- package/static/{styles-XLLEY5Y3.css → styles-46GLIE7Y.css} +1 -1
- package/server/authentication/constants/auth-ldap.js.map +0 -1
- package/server/authentication/dto/two-fa-verify.dto.js.map +0 -1
- package/server/authentication/guards/auth-two-fa-guard.js.map +0 -1
- package/server/authentication/interfaces/two-fa-setup.interface.js +0 -10
- package/server/authentication/interfaces/two-fa-setup.interface.js.map +0 -1
- package/server/authentication/models/auth-method.js +0 -18
- package/server/authentication/models/auth-method.js.map +0 -1
- package/server/authentication/services/auth-manager.service.js.map +0 -1
- package/server/authentication/services/auth-manager.service.spec.js.map +0 -1
- package/server/authentication/services/auth-methods/auth-method-database.service.js.map +0 -1
- package/server/authentication/services/auth-methods/auth-method-database.service.spec.js.map +0 -1
- package/server/authentication/services/auth-methods/auth-method-ldap.service.js +0 -326
- package/server/authentication/services/auth-methods/auth-method-ldap.service.js.map +0 -1
- package/server/authentication/services/auth-methods/auth-method-ldap.service.spec.js +0 -534
- package/server/authentication/services/auth-methods/auth-method-ldap.service.spec.js.map +0 -1
- package/server/authentication/services/auth-methods/auth-method-two-fa.service.js.map +0 -1
- package/server/authentication/services/auth-methods/auth-method-two-fa.service.spec.js.map +0 -1
- package/static/chunk-2YQ4SX3A.js +0 -13
- package/static/chunk-46TJLPJY.js +0 -1
- package/static/chunk-6OEOADR6.js +0 -1
- package/static/chunk-AALPWGPB.js +0 -3
- package/static/chunk-CVXLHSO5.js +0 -1
- package/static/chunk-G7RZN7HN.js +0 -1
- package/static/chunk-LTJNLOX2.js +0 -1
- package/static/chunk-NIKNG2FX.js +0 -1
- package/static/chunk-NNZWSNAW.js +0 -1
- package/static/chunk-NWKBB7J4.js +0 -1
- package/static/chunk-PVYVY3GD.js +0 -1
- package/static/chunk-Q5X5TPAG.js +0 -1
- package/static/chunk-R4VMWCM5.js +0 -1
- package/static/chunk-SNOOCDJD.js +0 -1
- package/static/chunk-SPQH3ATC.js +0 -5
- package/static/chunk-ZCSHU3D7.js +0 -1
- package/static/chunk-ZU5MQTFN.js +0 -4
- package/static/main-5O3KLGIR.js +0 -11
|
@@ -1,8 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>
|
|
3
|
-
* This file is part of Sync-in | The open source file sync and share solution
|
|
4
|
-
* See the LICENSE file for licensing details
|
|
5
|
-
*/ "use strict";
|
|
1
|
+
"use strict";
|
|
6
2
|
Object.defineProperty(exports, "__esModule", {
|
|
7
3
|
value: true
|
|
8
4
|
});
|
|
@@ -13,7 +9,7 @@ Object.defineProperty(exports, "AdminUsersManager", {
|
|
|
13
9
|
}
|
|
14
10
|
});
|
|
15
11
|
const _common = require("@nestjs/common");
|
|
16
|
-
const
|
|
12
|
+
const _authservice = require("../../../authentication/auth.service");
|
|
17
13
|
const _functions = require("../../../common/functions");
|
|
18
14
|
const _files = require("../../files/utils/files");
|
|
19
15
|
const _group = require("../constants/group");
|
|
@@ -53,7 +49,10 @@ let AdminUsersManager = class AdminUsersManager {
|
|
|
53
49
|
id: userId,
|
|
54
50
|
role: userRole
|
|
55
51
|
});
|
|
56
|
-
this.logger.log(
|
|
52
|
+
this.logger.log({
|
|
53
|
+
tag: this.createUserOrGuest.name,
|
|
54
|
+
msg: `${_user.USER_ROLE[userRole]} (${userId}) was created : ${JSON.stringify((0, _functions.anonymizePassword)(createUserDto))}`
|
|
55
|
+
});
|
|
57
56
|
this.adminQueries.usersQueries.clearWhiteListCaches('*');
|
|
58
57
|
await user.makePaths();
|
|
59
58
|
if (userRole <= _user.USER_ROLE.USER) {
|
|
@@ -62,7 +61,10 @@ let AdminUsersManager = class AdminUsersManager {
|
|
|
62
61
|
return asAdmin ? this.getGuest(user.id) : user;
|
|
63
62
|
}
|
|
64
63
|
} catch (e) {
|
|
65
|
-
this.logger.error(
|
|
64
|
+
this.logger.error({
|
|
65
|
+
tag: this.createUserOrGuest.name,
|
|
66
|
+
msg: `unable to create user *${createUserDto.login}* : ${e}`
|
|
67
|
+
});
|
|
66
68
|
throw new _common.HttpException('Unable to create user', _common.HttpStatus.INTERNAL_SERVER_ERROR);
|
|
67
69
|
}
|
|
68
70
|
}
|
|
@@ -157,15 +159,24 @@ let AdminUsersManager = class AdminUsersManager {
|
|
|
157
159
|
async deleteUserOrGuest(userId, userLogin, deleteUserDto) {
|
|
158
160
|
try {
|
|
159
161
|
if (await this.adminQueries.deleteUser(userId, userLogin)) {
|
|
160
|
-
this.logger.log(
|
|
162
|
+
this.logger.log({
|
|
163
|
+
tag: this.deleteUserOrGuest.name,
|
|
164
|
+
msg: `*${userLogin}* (${userId}) was deleted`
|
|
165
|
+
});
|
|
161
166
|
} else {
|
|
162
|
-
this.logger.error(
|
|
167
|
+
this.logger.error({
|
|
168
|
+
tag: this.deleteUserOrGuest.name,
|
|
169
|
+
msg: `*${userLogin}* (${userId}) was not deleted : not found`
|
|
170
|
+
});
|
|
163
171
|
}
|
|
164
172
|
if (deleteUserDto.deleteSpace) {
|
|
165
173
|
await this.deleteUserSpace(userLogin, deleteUserDto.isGuest);
|
|
166
174
|
}
|
|
167
175
|
} catch (e) {
|
|
168
|
-
this.logger.error(
|
|
176
|
+
this.logger.error({
|
|
177
|
+
tag: this.deleteUserOrGuest.name,
|
|
178
|
+
msg: `unable to delete *${userLogin}* (${userId}) : ${e}`
|
|
179
|
+
});
|
|
169
180
|
throw new _common.HttpException('Unable to delete user', _common.HttpStatus.INTERNAL_SERVER_ERROR);
|
|
170
181
|
}
|
|
171
182
|
}
|
|
@@ -222,16 +233,25 @@ let AdminUsersManager = class AdminUsersManager {
|
|
|
222
233
|
}
|
|
223
234
|
async createGroup(createGroupDto) {
|
|
224
235
|
if (!createGroupDto.name) {
|
|
225
|
-
this.logger.error(
|
|
236
|
+
this.logger.error({
|
|
237
|
+
tag: this.createGroup.name,
|
|
238
|
+
msg: `missing group name : ${JSON.stringify(createGroupDto)}`
|
|
239
|
+
});
|
|
226
240
|
throw new _common.HttpException('Group name is missing', _common.HttpStatus.BAD_REQUEST);
|
|
227
241
|
}
|
|
228
242
|
await this.checkGroupNameExists(createGroupDto.name);
|
|
229
243
|
try {
|
|
230
244
|
const groupId = await this.adminQueries.createGroup(createGroupDto);
|
|
231
|
-
this.logger.log(
|
|
245
|
+
this.logger.log({
|
|
246
|
+
tag: this.createGroup.name,
|
|
247
|
+
msg: `group (${groupId}) was created : ${JSON.stringify(createGroupDto)}`
|
|
248
|
+
});
|
|
232
249
|
return this.adminQueries.groupFromId(groupId);
|
|
233
250
|
} catch (e) {
|
|
234
|
-
this.logger.error(
|
|
251
|
+
this.logger.error({
|
|
252
|
+
tag: this.createGroup.name,
|
|
253
|
+
msg: `group was not created : ${JSON.stringify(createGroupDto)} : ${e}`
|
|
254
|
+
});
|
|
235
255
|
throw new _common.HttpException('Unable to create group', _common.HttpStatus.INTERNAL_SERVER_ERROR);
|
|
236
256
|
}
|
|
237
257
|
}
|
|
@@ -250,9 +270,15 @@ let AdminUsersManager = class AdminUsersManager {
|
|
|
250
270
|
}
|
|
251
271
|
async deleteGroup(groupId) {
|
|
252
272
|
if (await this.adminQueries.deleteGroup(groupId)) {
|
|
253
|
-
this.logger.log(
|
|
273
|
+
this.logger.log({
|
|
274
|
+
tag: this.deleteGroup.name,
|
|
275
|
+
msg: `group (${groupId}) was deleted`
|
|
276
|
+
});
|
|
254
277
|
} else {
|
|
255
|
-
this.logger.warn(
|
|
278
|
+
this.logger.warn({
|
|
279
|
+
tag: this.deleteGroup.name,
|
|
280
|
+
msg: `group (${groupId}) does not exist`
|
|
281
|
+
});
|
|
256
282
|
throw new _common.HttpException('Unable to delete group', _common.HttpStatus.BAD_REQUEST);
|
|
257
283
|
}
|
|
258
284
|
}
|
|
@@ -309,12 +335,21 @@ let AdminUsersManager = class AdminUsersManager {
|
|
|
309
335
|
try {
|
|
310
336
|
if (await (0, _files.isPathExists)(userSpace)) {
|
|
311
337
|
await (0, _files.removeFiles)(userSpace);
|
|
312
|
-
this.logger.log(
|
|
338
|
+
this.logger.log({
|
|
339
|
+
tag: this.deleteUserSpace.name,
|
|
340
|
+
msg: `user space *${userLogin}* was deleted`
|
|
341
|
+
});
|
|
313
342
|
} else {
|
|
314
|
-
this.logger.warn(
|
|
343
|
+
this.logger.warn({
|
|
344
|
+
tag: this.deleteUserSpace.name,
|
|
345
|
+
msg: `user space *${userLogin}* does not exist : ${userSpace}`
|
|
346
|
+
});
|
|
315
347
|
}
|
|
316
348
|
} catch (e) {
|
|
317
|
-
this.logger.warn(
|
|
349
|
+
this.logger.warn({
|
|
350
|
+
tag: this.deleteUserSpace.name,
|
|
351
|
+
msg: `user space *${userLogin}* (${userSpace}) was not deleted : ${e}`
|
|
352
|
+
});
|
|
318
353
|
throw new _common.HttpException('Unable to delete user space', _common.HttpStatus.INTERNAL_SERVER_ERROR);
|
|
319
354
|
}
|
|
320
355
|
}
|
|
@@ -329,12 +364,18 @@ let AdminUsersManager = class AdminUsersManager {
|
|
|
329
364
|
async renameUserSpace(oldLogin, newLogin) {
|
|
330
365
|
const currentUserSpace = _usermodel.UserModel.getHomePath(oldLogin);
|
|
331
366
|
if (!await (0, _files.isPathExists)(currentUserSpace)) {
|
|
332
|
-
this.logger.warn(
|
|
367
|
+
this.logger.warn({
|
|
368
|
+
tag: this.renameUserSpace.name,
|
|
369
|
+
msg: `user space *${oldLogin}* does not exist : ${currentUserSpace}`
|
|
370
|
+
});
|
|
333
371
|
return false;
|
|
334
372
|
}
|
|
335
373
|
const newUserSpace = _usermodel.UserModel.getHomePath(newLogin);
|
|
336
374
|
if (await (0, _files.isPathExists)(newUserSpace)) {
|
|
337
|
-
this.logger.warn(
|
|
375
|
+
this.logger.warn({
|
|
376
|
+
tag: this.renameUserSpace.name,
|
|
377
|
+
msg: `user space *${newLogin}* already exists : ${newUserSpace}`
|
|
378
|
+
});
|
|
338
379
|
return false;
|
|
339
380
|
}
|
|
340
381
|
try {
|
|
@@ -343,7 +384,10 @@ let AdminUsersManager = class AdminUsersManager {
|
|
|
343
384
|
} catch (e) {
|
|
344
385
|
// try to restore
|
|
345
386
|
await (0, _files.moveFiles)(newUserSpace, currentUserSpace, true);
|
|
346
|
-
this.logger.error(
|
|
387
|
+
this.logger.error({
|
|
388
|
+
tag: this.renameUserSpace.name,
|
|
389
|
+
msg: `unable to rename user space from *${currentUserSpace}* to *${newUserSpace}* : ${e}`
|
|
390
|
+
});
|
|
347
391
|
return false;
|
|
348
392
|
}
|
|
349
393
|
}
|
|
@@ -368,7 +412,7 @@ AdminUsersManager = _ts_decorate([
|
|
|
368
412
|
(0, _common.Injectable)(),
|
|
369
413
|
_ts_metadata("design:type", Function),
|
|
370
414
|
_ts_metadata("design:paramtypes", [
|
|
371
|
-
typeof
|
|
415
|
+
typeof _authservice.AuthManager === "undefined" ? Object : _authservice.AuthManager,
|
|
372
416
|
typeof _adminusersqueriesservice.AdminUsersQueries === "undefined" ? Object : _adminusersqueriesservice.AdminUsersQueries
|
|
373
417
|
])
|
|
374
418
|
], AdminUsersManager);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../backend/src/applications/users/services/admin-users-manager.service.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 { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common'\nimport { FastifyReply } from 'fastify'\nimport { LoginResponseDto } from '../../../authentication/dto/login-response.dto'\nimport { AuthManager } from '../../../authentication/services/auth-manager.service'\nimport { anonymizePassword, hashPassword } from '../../../common/functions'\nimport { isPathExists, moveFiles, removeFiles } from '../../files/utils/files'\nimport { GROUP_TYPE } from '../constants/group'\nimport { USER_ROLE } from '../constants/user'\nimport type { CreateOrUpdateGroupDto } from '../dto/create-or-update-group.dto'\nimport type { CreateUserDto, UpdateUserDto, UpdateUserFromGroupDto } from '../dto/create-or-update-user.dto'\nimport type { DeleteUserDto } from '../dto/delete-user.dto'\nimport type { SearchMembersDto } from '../dto/search-members.dto'\nimport type { AdminGroup } from '../interfaces/admin-group.interface'\nimport type { AdminUser } from '../interfaces/admin-user.interface'\nimport type { GroupBrowse } from '../interfaces/group-browse.interface'\nimport type { GuestUser } from '../interfaces/guest-user.interface'\nimport type { Member } from '../interfaces/member.interface'\nimport { UserModel } from '../models/user.model'\nimport type { Group } from '../schemas/group.interface'\nimport type { User } from '../schemas/user.interface'\nimport { AdminUsersQueries } from './admin-users-queries.service'\n\n@Injectable()\nexport class AdminUsersManager {\n private readonly logger = new Logger(AdminUsersManager.name)\n\n constructor(\n private readonly authManager: AuthManager,\n private readonly adminQueries: AdminUsersQueries\n ) {}\n\n listUsers(): Promise<AdminUser[]> {\n return this.adminQueries.listUsers()\n }\n\n async getUser(userId: number): Promise<AdminUser> {\n const user: AdminUser = await this.adminQueries.listUsers(userId)\n this.checkUser(user, true)\n return user\n }\n\n async getGuest(guestId: number): Promise<GuestUser> {\n const user: GuestUser = await this.adminQueries.usersQueries.listGuests(guestId, 0, true)\n this.checkUser(user, true)\n return user\n }\n\n async createUserOrGuest(createUserDto: CreateUserDto, userRole: USER_ROLE.GUEST, asAdmin: boolean): Promise<GuestUser>\n async createUserOrGuest(createUserDto: CreateUserDto, userRole: USER_ROLE, asAdmin: true): Promise<AdminUser | GuestUser>\n async createUserOrGuest(createUserDto: CreateUserDto, userRole: USER_ROLE, asAdmin?: false): Promise<UserModel>\n async createUserOrGuest(\n createUserDto: CreateUserDto,\n userRole: USER_ROLE = USER_ROLE.USER,\n asAdmin = false\n ): Promise<UserModel | AdminUser | GuestUser> {\n await this.loginOrEmailAlreadyUsed(createUserDto.login, createUserDto.email)\n try {\n createUserDto.password = await hashPassword(createUserDto.password)\n const userId: number = await this.adminQueries.usersQueries.createUserOrGuest(createUserDto, userRole)\n const user = new UserModel({ ...createUserDto, id: userId, role: userRole })\n this.logger.log(\n `${this.createUserOrGuest.name} - ${USER_ROLE[userRole]} (${userId}) was created : ${JSON.stringify(anonymizePassword(createUserDto))}`\n )\n this.adminQueries.usersQueries.clearWhiteListCaches('*')\n await user.makePaths()\n if (userRole <= USER_ROLE.USER) {\n return asAdmin ? this.getUser(user.id) : user\n } else {\n return asAdmin ? this.getGuest(user.id) : user\n }\n } catch (e) {\n this.logger.error(`${this.createUserOrGuest.name} - unable to create user *${createUserDto.login}* : ${e}`)\n throw new HttpException('Unable to create user', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async updateUserOrGuest(userId: number, updateUserDto: UpdateUserDto): Promise<AdminUser>\n async updateUserOrGuest(userId: number, updateUserDto: UpdateUserDto, userRole: USER_ROLE.GUEST): Promise<GuestUser>\n async updateUserOrGuest(\n userId: number,\n updateUserDto: UpdateUserDto,\n userRole: USER_ROLE.USER | USER_ROLE.GUEST = USER_ROLE.USER\n ): Promise<AdminUser | GuestUser> {\n const user: AdminUser & GuestUser = userRole === USER_ROLE.USER ? await this.getUser(userId) : await this.getGuest(userId)\n const updateUser: Partial<User> = {}\n const updateUserGroups: { add: number[]; delete: number[] } = { add: [], delete: [] }\n const updateGuestManagers: { add: number[]; delete: number[] } = { add: [], delete: [] }\n for (const [k, v] of Object.entries(updateUserDto)) {\n switch (k as keyof UpdateUserDto) {\n case 'login':\n if (user.login === v) {\n break\n }\n if (await this.adminQueries.usersQueries.checkUserExists(v)) {\n throw new HttpException('Login already used', HttpStatus.FORBIDDEN)\n }\n if (!(await this.renameUserSpace(user.login, v))) {\n throw new HttpException('Unable to rename user space', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n updateUser.login = v\n break\n case 'email':\n if (user.email === v) {\n break\n }\n if (await this.adminQueries.usersQueries.checkUserExists(null, v)) {\n throw new HttpException('Email already used', HttpStatus.FORBIDDEN)\n }\n updateUser.email = v\n break\n case 'isActive':\n updateUser.isActive = v\n if (v) {\n updateUser.passwordAttempts = 0\n }\n break\n case 'password':\n updateUser.password = await hashPassword(updateUserDto.password)\n break\n case 'groups':\n if (userRole === USER_ROLE.USER) {\n const currentGroups: number[] = user.groups?.length ? user.groups.map((g) => g.id) : []\n updateUserGroups.add = v.filter((id: number) => currentGroups.indexOf(id) === -1)\n updateUserGroups.delete = currentGroups.filter((id: number) => v.indexOf(id) === -1)\n }\n break\n case 'managers':\n if (userRole === USER_ROLE.GUEST) {\n const currentManagers: number[] = user.managers?.length ? user.managers.map((m) => m.id) : []\n updateGuestManagers.add = v.filter((id: number) => currentManagers.indexOf(id) === -1)\n updateGuestManagers.delete = currentManagers.filter((id: number) => v.indexOf(id) === -1)\n }\n break\n default:\n updateUser[k] = v\n }\n }\n if (Object.keys(updateUser).length) {\n // force the type for security reason\n const forceRole = userRole === USER_ROLE.GUEST ? USER_ROLE.GUEST : undefined\n if (!(await this.adminQueries.usersQueries.updateUserOrGuest(user.id, updateUser, forceRole))) {\n throw new HttpException('Unable to update user', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n if (userRole === USER_ROLE.USER) {\n if (updateUserGroups.add.length || updateUserGroups.delete.length) {\n try {\n await this.adminQueries.updateUserGroups(user.id, updateUserGroups)\n } catch {\n throw new HttpException('Unable to update user groups', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n return this.getUser(userId)\n } else {\n if (updateGuestManagers.add.length || updateGuestManagers.delete.length) {\n try {\n await this.adminQueries.updateGuestManagers(user.id, updateGuestManagers)\n } catch {\n throw new HttpException('Unable to update guest managers', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n return this.getGuest(userId)\n }\n }\n\n async deleteUserOrGuest(userId: number, userLogin: string, deleteUserDto: DeleteUserDto): Promise<void> {\n try {\n if (await this.adminQueries.deleteUser(userId, userLogin)) {\n this.logger.log(`${this.deleteUserOrGuest.name} - *${userLogin}* (${userId}) was deleted`)\n } else {\n this.logger.error(`${this.deleteUserOrGuest.name} - *${userLogin}* (${userId}) was not deleted : not found`)\n }\n if (deleteUserDto.deleteSpace) {\n await this.deleteUserSpace(userLogin, deleteUserDto.isGuest)\n }\n } catch (e) {\n this.logger.error(`${this.deleteUserOrGuest.name} - unable to delete *${userLogin}* (${userId}) : ${e}`)\n throw new HttpException('Unable to delete user', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async deleteUserOrGuestFromAdmin(userId: number, deleteUserDto: DeleteUserDto): Promise<void> {\n const userToDelete: UserModel = this.checkUser(await this.adminQueries.usersQueries.from(userId))\n if (userToDelete.isGuest !== deleteUserDto.isGuest) {\n throw new HttpException('User mismatch', HttpStatus.BAD_REQUEST)\n }\n await this.deleteUserOrGuest(userToDelete.id, userToDelete.login, {\n deleteSpace: deleteUserDto.isGuest ? true : deleteUserDto.deleteSpace,\n isGuest: deleteUserDto.isGuest\n } satisfies DeleteUserDto)\n }\n\n listGuests(): Promise<AdminUser[]> {\n return this.adminQueries.usersQueries.listGuests(null, null, true)\n }\n\n createGuest(user: UserModel, createGuestDto: CreateUserDto): Promise<GuestUser> {\n if (!createGuestDto.managers.length) {\n createGuestDto.managers.push(user.id)\n }\n return this.createUserOrGuest(createGuestDto, USER_ROLE.GUEST, true)\n }\n\n updateGuest(guestId: number, updateGuestDto: UpdateUserDto): Promise<GuestUser> {\n if (!Object.keys(updateGuestDto).length) {\n throw new HttpException('No changes to update', HttpStatus.BAD_REQUEST)\n }\n if (updateGuestDto.managers && !updateGuestDto.managers.length) {\n throw new HttpException('Guest must have at least one manager', HttpStatus.BAD_REQUEST)\n }\n return this.updateUserOrGuest(guestId, updateGuestDto, USER_ROLE.GUEST)\n }\n\n async browseGroups(name?: string, type: GROUP_TYPE = GROUP_TYPE.USER): Promise<GroupBrowse> {\n if (name) {\n const group: Pick<Group, 'id' | 'name' | 'type'> = await this.adminQueries.groupFromName(name)\n if (!group) {\n throw new HttpException('Group not found', HttpStatus.NOT_FOUND)\n }\n return { parentGroup: group, members: await this.adminQueries.browseGroupMembers(group.id, type) }\n }\n return { parentGroup: undefined, members: await this.adminQueries.browseRootGroupMembers(type) }\n }\n\n async getGroup(groupId: number): Promise<AdminGroup> {\n const group = await this.adminQueries.groupFromId(groupId)\n if (!group) {\n throw new HttpException('Group not found', HttpStatus.NOT_FOUND)\n }\n return group\n }\n\n async createGroup(createGroupDto: CreateOrUpdateGroupDto): Promise<AdminGroup> {\n if (!createGroupDto.name) {\n this.logger.error(`${this.createGroup.name} - missing group name : ${JSON.stringify(createGroupDto)}`)\n throw new HttpException('Group name is missing', HttpStatus.BAD_REQUEST)\n }\n await this.checkGroupNameExists(createGroupDto.name)\n try {\n const groupId: number = await this.adminQueries.createGroup(createGroupDto)\n this.logger.log(`${this.createGroup.name} - group (${groupId}) was created : ${JSON.stringify(createGroupDto)}`)\n return this.adminQueries.groupFromId(groupId)\n } catch (e) {\n this.logger.error(`${this.createGroup.name} - group was not created : ${JSON.stringify(createGroupDto)} : ${e}`)\n throw new HttpException('Unable to create group', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async updateGroup(groupId: number, updateGroupDto: CreateOrUpdateGroupDto): Promise<AdminGroup> {\n if (updateGroupDto.name) {\n await this.checkGroupNameExists(updateGroupDto.name)\n }\n if (!(await this.adminQueries.updateGroup(groupId, updateGroupDto))) {\n throw new HttpException('Unable to update group', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n // Clear whitelist caches when the group’s visibility is changed\n if (updateGroupDto.visibility !== undefined) {\n this.adminQueries.usersQueries.clearWhiteListCaches('*')\n }\n return this.adminQueries.groupFromId(groupId)\n }\n\n async deleteGroup(groupId: number): Promise<void> {\n if (await this.adminQueries.deleteGroup(groupId)) {\n this.logger.log(`${this.deleteGroup.name} - group (${groupId}) was deleted`)\n } else {\n this.logger.warn(`${this.deleteGroup.name} - group (${groupId}) does not exist`)\n throw new HttpException('Unable to delete group', HttpStatus.BAD_REQUEST)\n }\n }\n\n async addUsersToGroup(groupId: number, userIds: number[]): Promise<void> {\n const group: AdminGroup = await this.adminQueries.groupFromId(groupId)\n if (!group) {\n throw new HttpException('Group not found', HttpStatus.NOT_FOUND)\n }\n try {\n await this.adminQueries.addUsersToGroup(groupId, userIds, group.type === GROUP_TYPE.USER ? USER_ROLE.USER : undefined)\n } catch (e) {\n throw new HttpException(e.message, HttpStatus.BAD_REQUEST)\n }\n }\n\n async updateUserFromGroup(groupId: number, userId: number, updateUserFromGroupDto: UpdateUserFromGroupDto): Promise<void> {\n try {\n await this.adminQueries.updateUserFromGroup(groupId, userId, updateUserFromGroupDto.role)\n } catch (e) {\n throw new HttpException(e.message, HttpStatus.BAD_REQUEST)\n }\n }\n\n async removeUserFromGroup(groupId: number, userId: number): Promise<void> {\n try {\n await this.adminQueries.removeUserFromGroup(groupId, userId)\n } catch (e) {\n throw new HttpException(e.message, HttpStatus.BAD_REQUEST)\n }\n }\n\n searchMembers(searchMembersDto: SearchMembersDto): Promise<Member[]> {\n return this.adminQueries.usersQueries.searchUsersOrGroups(searchMembersDto)\n }\n\n async impersonateUser(admin: UserModel, userId: number, res: FastifyReply): Promise<LoginResponseDto> {\n if (admin.id === userId) {\n throw new HttpException('You are already logged in', HttpStatus.BAD_REQUEST)\n }\n const user: UserModel = this.checkUser(await this.adminQueries.usersQueries.from(userId))\n user.impersonatedFromId = admin.id\n user.impersonatedClientId = admin.clientId\n return this.authManager.setCookies(user, res)\n }\n\n async logoutImpersonateUser(user: UserModel, res: FastifyReply): Promise<LoginResponseDto> {\n if (!user.impersonatedFromId) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n const admin: UserModel = this.checkUser(await this.adminQueries.usersQueries.from(user.impersonatedFromId))\n if (!admin.isAdmin) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n admin.clientId = user.impersonatedClientId\n return this.authManager.setCookies(admin, res)\n }\n\n async deleteUserSpace(userLogin: string, isGuest = false): Promise<void> {\n const userSpace: string = UserModel.getHomePath(userLogin, isGuest)\n try {\n if (await isPathExists(userSpace)) {\n await removeFiles(userSpace)\n this.logger.log(`${this.deleteUserSpace.name} - user space *${userLogin}* was deleted`)\n } else {\n this.logger.warn(`${this.deleteUserSpace.name} - user space *${userLogin}* does not exist : ${userSpace}`)\n }\n } catch (e) {\n this.logger.warn(`${this.deleteUserSpace.name} - user space *${userLogin}* (${userSpace}) was not deleted : ${e}`)\n throw new HttpException('Unable to delete user space', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n checkUser(user: User | AdminUser | GuestUser, checkOnly: true): void\n checkUser(user: User | AdminUser | GuestUser, checkOnly?: false): UserModel\n checkUser(user: User | AdminUser | GuestUser, checkOnly = false): UserModel | void {\n if (!user) {\n throw new HttpException('User not found', HttpStatus.NOT_FOUND)\n }\n if (!checkOnly) {\n return new UserModel(user, true)\n }\n }\n\n private async renameUserSpace(oldLogin: string, newLogin: string): Promise<boolean> {\n const currentUserSpace: string = UserModel.getHomePath(oldLogin)\n if (!(await isPathExists(currentUserSpace))) {\n this.logger.warn(`${this.renameUserSpace.name} - user space *${oldLogin}* does not exist : ${currentUserSpace}`)\n return false\n }\n const newUserSpace: string = UserModel.getHomePath(newLogin)\n if (await isPathExists(newUserSpace)) {\n this.logger.warn(`${this.renameUserSpace.name} - user space *${newLogin}* already exists : ${newUserSpace}`)\n return false\n }\n try {\n await moveFiles(currentUserSpace, newUserSpace)\n return true\n } catch (e) {\n // try to restore\n await moveFiles(newUserSpace, currentUserSpace, true)\n this.logger.error(`${this.renameUserSpace.name} - unable to rename user space from *${currentUserSpace}* to *${newUserSpace}* : ${e}`)\n return false\n }\n }\n\n private async checkGroupNameExists(groupName: string): Promise<void> {\n if (await this.adminQueries.usersQueries.checkGroupNameExists(groupName)) {\n throw new HttpException('Name already used', HttpStatus.BAD_REQUEST)\n }\n }\n\n private async loginOrEmailAlreadyUsed(login: string, email: string) {\n const exists = await this.adminQueries.usersQueries.checkUserExists(login, email)\n if (exists) {\n throw new HttpException(`${exists.login === login ? 'Login' : 'Email'} already used`, HttpStatus.BAD_REQUEST)\n }\n }\n}\n"],"names":["AdminUsersManager","listUsers","adminQueries","getUser","userId","user","checkUser","getGuest","guestId","usersQueries","listGuests","createUserOrGuest","createUserDto","userRole","USER_ROLE","USER","asAdmin","loginOrEmailAlreadyUsed","login","email","password","hashPassword","UserModel","id","role","logger","log","name","JSON","stringify","anonymizePassword","clearWhiteListCaches","makePaths","e","error","HttpException","HttpStatus","INTERNAL_SERVER_ERROR","updateUserOrGuest","updateUserDto","updateUser","updateUserGroups","add","delete","updateGuestManagers","k","v","Object","entries","checkUserExists","FORBIDDEN","renameUserSpace","isActive","passwordAttempts","currentGroups","groups","length","map","g","filter","indexOf","GUEST","currentManagers","managers","m","keys","forceRole","undefined","deleteUserOrGuest","userLogin","deleteUserDto","deleteUser","deleteSpace","deleteUserSpace","isGuest","deleteUserOrGuestFromAdmin","userToDelete","from","BAD_REQUEST","createGuest","createGuestDto","push","updateGuest","updateGuestDto","browseGroups","type","GROUP_TYPE","group","groupFromName","NOT_FOUND","parentGroup","members","browseGroupMembers","browseRootGroupMembers","getGroup","groupId","groupFromId","createGroup","createGroupDto","checkGroupNameExists","updateGroup","updateGroupDto","visibility","deleteGroup","warn","addUsersToGroup","userIds","message","updateUserFromGroup","updateUserFromGroupDto","removeUserFromGroup","searchMembers","searchMembersDto","searchUsersOrGroups","impersonateUser","admin","res","impersonatedFromId","impersonatedClientId","clientId","authManager","setCookies","logoutImpersonateUser","isAdmin","userSpace","getHomePath","isPathExists","removeFiles","checkOnly","oldLogin","newLogin","currentUserSpace","newUserSpace","moveFiles","groupName","exists","Logger"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/users/services/admin-users-manager.service.ts"],"sourcesContent":["import { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common'\nimport { FastifyReply } from 'fastify'\nimport { AuthManager } from '../../../authentication/auth.service'\nimport { LoginResponseDto } from '../../../authentication/dto/login-response.dto'\nimport { anonymizePassword, hashPassword } from '../../../common/functions'\nimport { isPathExists, moveFiles, removeFiles } from '../../files/utils/files'\nimport { GROUP_TYPE } from '../constants/group'\nimport { USER_ROLE } from '../constants/user'\nimport type { CreateOrUpdateGroupDto } from '../dto/create-or-update-group.dto'\nimport type { CreateUserDto, UpdateUserDto, UpdateUserFromGroupDto } from '../dto/create-or-update-user.dto'\nimport type { DeleteUserDto } from '../dto/delete-user.dto'\nimport type { SearchMembersDto } from '../dto/search-members.dto'\nimport type { AdminGroup } from '../interfaces/admin-group.interface'\nimport type { AdminUser } from '../interfaces/admin-user.interface'\nimport type { GroupBrowse } from '../interfaces/group-browse.interface'\nimport type { GuestUser } from '../interfaces/guest-user.interface'\nimport type { Member } from '../interfaces/member.interface'\nimport { UserModel } from '../models/user.model'\nimport type { Group } from '../schemas/group.interface'\nimport type { User } from '../schemas/user.interface'\nimport { AdminUsersQueries } from './admin-users-queries.service'\n\n@Injectable()\nexport class AdminUsersManager {\n private readonly logger = new Logger(AdminUsersManager.name)\n\n constructor(\n private readonly authManager: AuthManager,\n private readonly adminQueries: AdminUsersQueries\n ) {}\n\n listUsers(): Promise<AdminUser[]> {\n return this.adminQueries.listUsers()\n }\n\n async getUser(userId: number): Promise<AdminUser> {\n const user: AdminUser = await this.adminQueries.listUsers(userId)\n this.checkUser(user, true)\n return user\n }\n\n async getGuest(guestId: number): Promise<GuestUser> {\n const user: GuestUser = await this.adminQueries.usersQueries.listGuests(guestId, 0, true)\n this.checkUser(user, true)\n return user\n }\n\n async createUserOrGuest(createUserDto: CreateUserDto, userRole: USER_ROLE.GUEST, asAdmin: boolean): Promise<GuestUser>\n async createUserOrGuest(createUserDto: CreateUserDto, userRole: USER_ROLE, asAdmin: true): Promise<AdminUser | GuestUser>\n async createUserOrGuest(createUserDto: CreateUserDto, userRole: USER_ROLE, asAdmin?: false): Promise<UserModel>\n async createUserOrGuest(\n createUserDto: CreateUserDto,\n userRole: USER_ROLE = USER_ROLE.USER,\n asAdmin = false\n ): Promise<UserModel | AdminUser | GuestUser> {\n await this.loginOrEmailAlreadyUsed(createUserDto.login, createUserDto.email)\n try {\n createUserDto.password = await hashPassword(createUserDto.password)\n const userId: number = await this.adminQueries.usersQueries.createUserOrGuest(createUserDto, userRole)\n const user = new UserModel({ ...createUserDto, id: userId, role: userRole })\n this.logger.log({\n tag: this.createUserOrGuest.name,\n msg: `${USER_ROLE[userRole]} (${userId}) was created : ${JSON.stringify(anonymizePassword(createUserDto))}`\n })\n this.adminQueries.usersQueries.clearWhiteListCaches('*')\n await user.makePaths()\n if (userRole <= USER_ROLE.USER) {\n return asAdmin ? this.getUser(user.id) : user\n } else {\n return asAdmin ? this.getGuest(user.id) : user\n }\n } catch (e) {\n this.logger.error({ tag: this.createUserOrGuest.name, msg: `unable to create user *${createUserDto.login}* : ${e}` })\n throw new HttpException('Unable to create user', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async updateUserOrGuest(userId: number, updateUserDto: UpdateUserDto): Promise<AdminUser>\n async updateUserOrGuest(userId: number, updateUserDto: UpdateUserDto, userRole: USER_ROLE.GUEST): Promise<GuestUser>\n async updateUserOrGuest(\n userId: number,\n updateUserDto: UpdateUserDto,\n userRole: USER_ROLE.USER | USER_ROLE.GUEST = USER_ROLE.USER\n ): Promise<AdminUser | GuestUser> {\n const user: AdminUser & GuestUser = userRole === USER_ROLE.USER ? await this.getUser(userId) : await this.getGuest(userId)\n const updateUser: Partial<User> = {}\n const updateUserGroups: { add: number[]; delete: number[] } = { add: [], delete: [] }\n const updateGuestManagers: { add: number[]; delete: number[] } = { add: [], delete: [] }\n for (const [k, v] of Object.entries(updateUserDto)) {\n switch (k as keyof UpdateUserDto) {\n case 'login':\n if (user.login === v) {\n break\n }\n if (await this.adminQueries.usersQueries.checkUserExists(v)) {\n throw new HttpException('Login already used', HttpStatus.FORBIDDEN)\n }\n if (!(await this.renameUserSpace(user.login, v))) {\n throw new HttpException('Unable to rename user space', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n updateUser.login = v\n break\n case 'email':\n if (user.email === v) {\n break\n }\n if (await this.adminQueries.usersQueries.checkUserExists(null, v)) {\n throw new HttpException('Email already used', HttpStatus.FORBIDDEN)\n }\n updateUser.email = v\n break\n case 'isActive':\n updateUser.isActive = v\n if (v) {\n updateUser.passwordAttempts = 0\n }\n break\n case 'password':\n updateUser.password = await hashPassword(updateUserDto.password)\n break\n case 'groups':\n if (userRole === USER_ROLE.USER) {\n const currentGroups: number[] = user.groups?.length ? user.groups.map((g) => g.id) : []\n updateUserGroups.add = v.filter((id: number) => currentGroups.indexOf(id) === -1)\n updateUserGroups.delete = currentGroups.filter((id: number) => v.indexOf(id) === -1)\n }\n break\n case 'managers':\n if (userRole === USER_ROLE.GUEST) {\n const currentManagers: number[] = user.managers?.length ? user.managers.map((m) => m.id) : []\n updateGuestManagers.add = v.filter((id: number) => currentManagers.indexOf(id) === -1)\n updateGuestManagers.delete = currentManagers.filter((id: number) => v.indexOf(id) === -1)\n }\n break\n default:\n updateUser[k] = v\n }\n }\n if (Object.keys(updateUser).length) {\n // force the type for security reason\n const forceRole = userRole === USER_ROLE.GUEST ? USER_ROLE.GUEST : undefined\n if (!(await this.adminQueries.usersQueries.updateUserOrGuest(user.id, updateUser, forceRole))) {\n throw new HttpException('Unable to update user', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n if (userRole === USER_ROLE.USER) {\n if (updateUserGroups.add.length || updateUserGroups.delete.length) {\n try {\n await this.adminQueries.updateUserGroups(user.id, updateUserGroups)\n } catch {\n throw new HttpException('Unable to update user groups', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n return this.getUser(userId)\n } else {\n if (updateGuestManagers.add.length || updateGuestManagers.delete.length) {\n try {\n await this.adminQueries.updateGuestManagers(user.id, updateGuestManagers)\n } catch {\n throw new HttpException('Unable to update guest managers', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n return this.getGuest(userId)\n }\n }\n\n async deleteUserOrGuest(userId: number, userLogin: string, deleteUserDto: DeleteUserDto): Promise<void> {\n try {\n if (await this.adminQueries.deleteUser(userId, userLogin)) {\n this.logger.log({ tag: this.deleteUserOrGuest.name, msg: `*${userLogin}* (${userId}) was deleted` })\n } else {\n this.logger.error({ tag: this.deleteUserOrGuest.name, msg: `*${userLogin}* (${userId}) was not deleted : not found` })\n }\n if (deleteUserDto.deleteSpace) {\n await this.deleteUserSpace(userLogin, deleteUserDto.isGuest)\n }\n } catch (e) {\n this.logger.error({ tag: this.deleteUserOrGuest.name, msg: `unable to delete *${userLogin}* (${userId}) : ${e}` })\n throw new HttpException('Unable to delete user', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async deleteUserOrGuestFromAdmin(userId: number, deleteUserDto: DeleteUserDto): Promise<void> {\n const userToDelete: UserModel = this.checkUser(await this.adminQueries.usersQueries.from(userId))\n if (userToDelete.isGuest !== deleteUserDto.isGuest) {\n throw new HttpException('User mismatch', HttpStatus.BAD_REQUEST)\n }\n await this.deleteUserOrGuest(userToDelete.id, userToDelete.login, {\n deleteSpace: deleteUserDto.isGuest ? true : deleteUserDto.deleteSpace,\n isGuest: deleteUserDto.isGuest\n } satisfies DeleteUserDto)\n }\n\n listGuests(): Promise<AdminUser[]> {\n return this.adminQueries.usersQueries.listGuests(null, null, true)\n }\n\n createGuest(user: UserModel, createGuestDto: CreateUserDto): Promise<GuestUser> {\n if (!createGuestDto.managers.length) {\n createGuestDto.managers.push(user.id)\n }\n return this.createUserOrGuest(createGuestDto, USER_ROLE.GUEST, true)\n }\n\n updateGuest(guestId: number, updateGuestDto: UpdateUserDto): Promise<GuestUser> {\n if (!Object.keys(updateGuestDto).length) {\n throw new HttpException('No changes to update', HttpStatus.BAD_REQUEST)\n }\n if (updateGuestDto.managers && !updateGuestDto.managers.length) {\n throw new HttpException('Guest must have at least one manager', HttpStatus.BAD_REQUEST)\n }\n return this.updateUserOrGuest(guestId, updateGuestDto, USER_ROLE.GUEST)\n }\n\n async browseGroups(name?: string, type: GROUP_TYPE = GROUP_TYPE.USER): Promise<GroupBrowse> {\n if (name) {\n const group: Pick<Group, 'id' | 'name' | 'type'> = await this.adminQueries.groupFromName(name)\n if (!group) {\n throw new HttpException('Group not found', HttpStatus.NOT_FOUND)\n }\n return { parentGroup: group, members: await this.adminQueries.browseGroupMembers(group.id, type) }\n }\n return { parentGroup: undefined, members: await this.adminQueries.browseRootGroupMembers(type) }\n }\n\n async getGroup(groupId: number): Promise<AdminGroup> {\n const group = await this.adminQueries.groupFromId(groupId)\n if (!group) {\n throw new HttpException('Group not found', HttpStatus.NOT_FOUND)\n }\n return group\n }\n\n async createGroup(createGroupDto: CreateOrUpdateGroupDto): Promise<AdminGroup> {\n if (!createGroupDto.name) {\n this.logger.error({ tag: this.createGroup.name, msg: `missing group name : ${JSON.stringify(createGroupDto)}` })\n throw new HttpException('Group name is missing', HttpStatus.BAD_REQUEST)\n }\n await this.checkGroupNameExists(createGroupDto.name)\n try {\n const groupId: number = await this.adminQueries.createGroup(createGroupDto)\n this.logger.log({ tag: this.createGroup.name, msg: `group (${groupId}) was created : ${JSON.stringify(createGroupDto)}` })\n return this.adminQueries.groupFromId(groupId)\n } catch (e) {\n this.logger.error({ tag: this.createGroup.name, msg: `group was not created : ${JSON.stringify(createGroupDto)} : ${e}` })\n throw new HttpException('Unable to create group', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async updateGroup(groupId: number, updateGroupDto: CreateOrUpdateGroupDto): Promise<AdminGroup> {\n if (updateGroupDto.name) {\n await this.checkGroupNameExists(updateGroupDto.name)\n }\n if (!(await this.adminQueries.updateGroup(groupId, updateGroupDto))) {\n throw new HttpException('Unable to update group', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n // Clear whitelist caches when the group’s visibility is changed\n if (updateGroupDto.visibility !== undefined) {\n this.adminQueries.usersQueries.clearWhiteListCaches('*')\n }\n return this.adminQueries.groupFromId(groupId)\n }\n\n async deleteGroup(groupId: number): Promise<void> {\n if (await this.adminQueries.deleteGroup(groupId)) {\n this.logger.log({ tag: this.deleteGroup.name, msg: `group (${groupId}) was deleted` })\n } else {\n this.logger.warn({ tag: this.deleteGroup.name, msg: `group (${groupId}) does not exist` })\n throw new HttpException('Unable to delete group', HttpStatus.BAD_REQUEST)\n }\n }\n\n async addUsersToGroup(groupId: number, userIds: number[]): Promise<void> {\n const group: AdminGroup = await this.adminQueries.groupFromId(groupId)\n if (!group) {\n throw new HttpException('Group not found', HttpStatus.NOT_FOUND)\n }\n try {\n await this.adminQueries.addUsersToGroup(groupId, userIds, group.type === GROUP_TYPE.USER ? USER_ROLE.USER : undefined)\n } catch (e) {\n throw new HttpException(e.message, HttpStatus.BAD_REQUEST)\n }\n }\n\n async updateUserFromGroup(groupId: number, userId: number, updateUserFromGroupDto: UpdateUserFromGroupDto): Promise<void> {\n try {\n await this.adminQueries.updateUserFromGroup(groupId, userId, updateUserFromGroupDto.role)\n } catch (e) {\n throw new HttpException(e.message, HttpStatus.BAD_REQUEST)\n }\n }\n\n async removeUserFromGroup(groupId: number, userId: number): Promise<void> {\n try {\n await this.adminQueries.removeUserFromGroup(groupId, userId)\n } catch (e) {\n throw new HttpException(e.message, HttpStatus.BAD_REQUEST)\n }\n }\n\n searchMembers(searchMembersDto: SearchMembersDto): Promise<Member[]> {\n return this.adminQueries.usersQueries.searchUsersOrGroups(searchMembersDto)\n }\n\n async impersonateUser(admin: UserModel, userId: number, res: FastifyReply): Promise<LoginResponseDto> {\n if (admin.id === userId) {\n throw new HttpException('You are already logged in', HttpStatus.BAD_REQUEST)\n }\n const user: UserModel = this.checkUser(await this.adminQueries.usersQueries.from(userId))\n user.impersonatedFromId = admin.id\n user.impersonatedClientId = admin.clientId\n return this.authManager.setCookies(user, res)\n }\n\n async logoutImpersonateUser(user: UserModel, res: FastifyReply): Promise<LoginResponseDto> {\n if (!user.impersonatedFromId) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n const admin: UserModel = this.checkUser(await this.adminQueries.usersQueries.from(user.impersonatedFromId))\n if (!admin.isAdmin) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n admin.clientId = user.impersonatedClientId\n return this.authManager.setCookies(admin, res)\n }\n\n async deleteUserSpace(userLogin: string, isGuest = false): Promise<void> {\n const userSpace: string = UserModel.getHomePath(userLogin, isGuest)\n try {\n if (await isPathExists(userSpace)) {\n await removeFiles(userSpace)\n this.logger.log({ tag: this.deleteUserSpace.name, msg: `user space *${userLogin}* was deleted` })\n } else {\n this.logger.warn({ tag: this.deleteUserSpace.name, msg: `user space *${userLogin}* does not exist : ${userSpace}` })\n }\n } catch (e) {\n this.logger.warn({ tag: this.deleteUserSpace.name, msg: `user space *${userLogin}* (${userSpace}) was not deleted : ${e}` })\n throw new HttpException('Unable to delete user space', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n checkUser(user: User | AdminUser | GuestUser, checkOnly: true): void\n checkUser(user: User | AdminUser | GuestUser, checkOnly?: false): UserModel\n checkUser(user: User | AdminUser | GuestUser, checkOnly = false): UserModel | void {\n if (!user) {\n throw new HttpException('User not found', HttpStatus.NOT_FOUND)\n }\n if (!checkOnly) {\n return new UserModel(user, true)\n }\n }\n\n private async renameUserSpace(oldLogin: string, newLogin: string): Promise<boolean> {\n const currentUserSpace: string = UserModel.getHomePath(oldLogin)\n if (!(await isPathExists(currentUserSpace))) {\n this.logger.warn({ tag: this.renameUserSpace.name, msg: `user space *${oldLogin}* does not exist : ${currentUserSpace}` })\n return false\n }\n const newUserSpace: string = UserModel.getHomePath(newLogin)\n if (await isPathExists(newUserSpace)) {\n this.logger.warn({ tag: this.renameUserSpace.name, msg: `user space *${newLogin}* already exists : ${newUserSpace}` })\n return false\n }\n try {\n await moveFiles(currentUserSpace, newUserSpace)\n return true\n } catch (e) {\n // try to restore\n await moveFiles(newUserSpace, currentUserSpace, true)\n this.logger.error({ tag: this.renameUserSpace.name, msg: `unable to rename user space from *${currentUserSpace}* to *${newUserSpace}* : ${e}` })\n return false\n }\n }\n\n private async checkGroupNameExists(groupName: string): Promise<void> {\n if (await this.adminQueries.usersQueries.checkGroupNameExists(groupName)) {\n throw new HttpException('Name already used', HttpStatus.BAD_REQUEST)\n }\n }\n\n private async loginOrEmailAlreadyUsed(login: string, email: string) {\n const exists = await this.adminQueries.usersQueries.checkUserExists(login, email)\n if (exists) {\n throw new HttpException(`${exists.login === login ? 'Login' : 'Email'} already used`, HttpStatus.BAD_REQUEST)\n }\n }\n}\n"],"names":["AdminUsersManager","listUsers","adminQueries","getUser","userId","user","checkUser","getGuest","guestId","usersQueries","listGuests","createUserOrGuest","createUserDto","userRole","USER_ROLE","USER","asAdmin","loginOrEmailAlreadyUsed","login","email","password","hashPassword","UserModel","id","role","logger","log","tag","name","msg","JSON","stringify","anonymizePassword","clearWhiteListCaches","makePaths","e","error","HttpException","HttpStatus","INTERNAL_SERVER_ERROR","updateUserOrGuest","updateUserDto","updateUser","updateUserGroups","add","delete","updateGuestManagers","k","v","Object","entries","checkUserExists","FORBIDDEN","renameUserSpace","isActive","passwordAttempts","currentGroups","groups","length","map","g","filter","indexOf","GUEST","currentManagers","managers","m","keys","forceRole","undefined","deleteUserOrGuest","userLogin","deleteUserDto","deleteUser","deleteSpace","deleteUserSpace","isGuest","deleteUserOrGuestFromAdmin","userToDelete","from","BAD_REQUEST","createGuest","createGuestDto","push","updateGuest","updateGuestDto","browseGroups","type","GROUP_TYPE","group","groupFromName","NOT_FOUND","parentGroup","members","browseGroupMembers","browseRootGroupMembers","getGroup","groupId","groupFromId","createGroup","createGroupDto","checkGroupNameExists","updateGroup","updateGroupDto","visibility","deleteGroup","warn","addUsersToGroup","userIds","message","updateUserFromGroup","updateUserFromGroupDto","removeUserFromGroup","searchMembers","searchMembersDto","searchUsersOrGroups","impersonateUser","admin","res","impersonatedFromId","impersonatedClientId","clientId","authManager","setCookies","logoutImpersonateUser","isAdmin","userSpace","getHomePath","isPathExists","removeFiles","checkOnly","oldLogin","newLogin","currentUserSpace","newUserSpace","moveFiles","groupName","exists","Logger"],"mappings":"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"}
|
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
* Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>
|
|
3
|
-
* This file is part of Sync-in | The open source file sync and share solution
|
|
4
|
-
* See the LICENSE file for licensing details
|
|
5
|
-
*/ "use strict";
|
|
1
|
+
"use strict";
|
|
6
2
|
Object.defineProperty(exports, "__esModule", {
|
|
7
3
|
value: true
|
|
8
4
|
});
|
|
9
5
|
const _common = require("@nestjs/common");
|
|
10
6
|
const _testing = require("@nestjs/testing");
|
|
11
|
-
const
|
|
7
|
+
const _authservice = require("../../../authentication/auth.service");
|
|
12
8
|
const _group = require("../constants/group");
|
|
13
9
|
const _user = require("../constants/user");
|
|
14
10
|
const _usermodel = require("../models/user.model");
|
|
@@ -95,7 +91,7 @@ describe(_adminusersmanagerservice.AdminUsersManager.name, ()=>{
|
|
|
95
91
|
providers: [
|
|
96
92
|
_adminusersmanagerservice.AdminUsersManager,
|
|
97
93
|
{
|
|
98
|
-
provide:
|
|
94
|
+
provide: _authservice.AuthManager,
|
|
99
95
|
useValue: authManagerMock
|
|
100
96
|
},
|
|
101
97
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../backend/src/applications/users/services/admin-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 { HttpException } from '@nestjs/common'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { AuthManager } from '../../../authentication/services/auth-manager.service'\nimport { GROUP_TYPE } from '../constants/group'\nimport { USER_GROUP_ROLE, USER_ROLE } from '../constants/user'\nimport type { CreateOrUpdateGroupDto } from '../dto/create-or-update-group.dto'\nimport type { CreateUserDto, UpdateUserDto, UpdateUserFromGroupDto } from '../dto/create-or-update-user.dto'\nimport type { DeleteUserDto } from '../dto/delete-user.dto'\nimport type { SearchMembersDto } from '../dto/search-members.dto'\nimport { UserModel } from '../models/user.model'\nimport { AdminUsersManager } from './admin-users-manager.service'\nimport { AdminUsersQueries } from './admin-users-queries.service'\n\n// mock file utils used by the service (delete/rename user space)\njest.mock('../../files/utils/files', () => ({\n isPathExists: jest.fn(),\n moveFiles: jest.fn(),\n removeFiles: jest.fn()\n}))\n\n// mock hash/anonymize utilities (preserve other module exports)\njest.mock('../../../common/functions', () => {\n const actual = jest.requireActual('../../../common/functions')\n return {\n ...actual,\n hashPassword: jest.fn(async (pwd: string) => `hashed:${pwd}`),\n anonymizePassword: jest.fn((dto: any) => ({ ...dto, password: '***' }))\n }\n})\n\n// Alias FS mocks (avoid repetitions)\nconst fs = jest.requireMock('../../files/utils/files') as { isPathExists: jest.Mock; moveFiles: jest.Mock; removeFiles: jest.Mock }\n\n// Helper utilities\nconst expectHttp = async (p: Promise<any>) => expect(p).rejects.toBeInstanceOf(HttpException)\nconst spyMakePaths = () => jest.spyOn(UserModel.prototype, 'makePaths').mockResolvedValueOnce(undefined)\n\ndescribe(AdminUsersManager.name, () => {\n let service: AdminUsersManager\n\n // deep mocks\n let authManagerMock: { setCookies: jest.Mock }\n let adminQueriesMock: {\n listUsers: jest.Mock\n usersQueries: {\n listGuests: jest.Mock\n from: jest.Mock\n createUserOrGuest: jest.Mock\n updateUserOrGuest: jest.Mock\n deleteUser: jest.Mock\n compareUserPassword: jest.Mock\n checkGroupNameExists: jest.Mock\n checkUserExists: jest.Mock\n searchUsersOrGroups: jest.Mock\n clearWhiteListCaches: jest.Mock\n }\n updateUserGroups: jest.Mock\n updateGuestManagers: jest.Mock\n deleteUser: jest.Mock\n groupFromName: jest.Mock\n browseGroupMembers: jest.Mock\n browseRootGroupMembers: jest.Mock\n groupFromId: jest.Mock\n createGroup: jest.Mock\n updateGroup: jest.Mock\n deleteGroup: jest.Mock\n addUsersToGroup: jest.Mock\n updateUserFromGroup: jest.Mock\n removeUserFromGroup: jest.Mock\n }\n\n const setUser = (u: any) => adminQueriesMock.listUsers.mockResolvedValueOnce(u)\n const setGuest = (g: any) => adminQueriesMock.usersQueries.listGuests.mockResolvedValueOnce(g)\n\n const baseUser = {\n id: 10,\n login: 'john',\n email: 'john@example.com',\n isActive: true,\n role: USER_ROLE.USER,\n groups: [{ id: 1 }, { id: 3 }]\n } as any\n\n beforeAll(async () => {\n authManagerMock = { setCookies: jest.fn() }\n\n adminQueriesMock = {\n listUsers: jest.fn(),\n usersQueries: {\n listGuests: jest.fn(),\n from: jest.fn(),\n createUserOrGuest: jest.fn(),\n updateUserOrGuest: jest.fn(),\n deleteUser: jest.fn(),\n compareUserPassword: jest.fn(),\n checkGroupNameExists: jest.fn(),\n checkUserExists: jest.fn(),\n searchUsersOrGroups: jest.fn(),\n clearWhiteListCaches: jest.fn()\n },\n updateUserGroups: jest.fn(),\n updateGuestManagers: jest.fn(),\n deleteUser: jest.fn(),\n groupFromName: jest.fn(),\n browseGroupMembers: jest.fn(),\n browseRootGroupMembers: jest.fn(),\n groupFromId: jest.fn(),\n createGroup: jest.fn(),\n updateGroup: jest.fn(),\n deleteGroup: jest.fn(),\n addUsersToGroup: jest.fn(),\n updateUserFromGroup: jest.fn(),\n removeUserFromGroup: jest.fn()\n }\n\n const module: TestingModule = await Test.createTestingModule({\n providers: [AdminUsersManager, { provide: AuthManager, useValue: authManagerMock }, { provide: AdminUsersQueries, useValue: adminQueriesMock }]\n }).compile()\n\n module.useLogger(['fatal'])\n service = module.get<AdminUsersManager>(AdminUsersManager)\n })\n\n beforeEach(() => {\n jest.clearAllMocks()\n })\n\n it('should be defined', () => {\n expect(service).toBeDefined()\n })\n\n describe('getUser / getGuest', () => {\n it('user ok + not found + guest ok', async () => {\n setUser(baseUser)\n expect(await service.getUser(10)).toEqual(baseUser)\n expect(adminQueriesMock.listUsers).toHaveBeenCalledWith(10)\n\n setUser(null)\n await expectHttp(service.getUser(999))\n\n const guest = { id: 22, login: 'guest', email: 'g@x', managers: [], role: USER_ROLE.GUEST }\n setGuest(guest as any)\n expect(await service.getGuest(22)).toEqual(guest)\n expect(adminQueriesMock.usersQueries.listGuests).toHaveBeenCalledWith(22, 0, true)\n })\n })\n\n describe('createUserOrGuest', () => {\n it.each([\n { role: USER_ROLE.USER, asAdmin: false, id: 101, exp: 'UserModel' },\n { role: USER_ROLE.GUEST, asAdmin: true, id: 202, exp: 'AdminGuest' },\n { role: USER_ROLE.USER, asAdmin: true, id: 707, exp: 'AdminUser' },\n { role: USER_ROLE.GUEST, asAdmin: false, id: 808, exp: 'UserModel' }\n ])('creation matrix ($role / asAdmin=$asAdmin)', async ({ role, asAdmin, id, exp }) => {\n const dto: CreateUserDto = { login: 'alice', email: 'a@x', password: 'pwd', managers: role === USER_ROLE.GUEST ? [1] : [] } as any\n adminQueriesMock.usersQueries.checkUserExists.mockResolvedValueOnce(false)\n adminQueriesMock.usersQueries.createUserOrGuest.mockResolvedValueOnce(id)\n spyMakePaths()\n\n if (exp === 'AdminUser') setUser({ id, login: 'alice', role })\n if (exp === 'AdminGuest') setGuest({ id, login: 'alice', role } as any)\n\n const res = await (service as any).createUserOrGuest(dto, role, asAdmin)\n\n if (exp === 'UserModel') {\n expect(res).toBeInstanceOf(UserModel)\n expect((res as any).id).toBe(id)\n } else if (exp === 'AdminUser') {\n expect(adminQueriesMock.listUsers).toHaveBeenCalledWith(id)\n } else {\n expect(adminQueriesMock.usersQueries.listGuests).toHaveBeenCalledWith(id, 0, true)\n }\n expect(adminQueriesMock.usersQueries.createUserOrGuest).toHaveBeenCalledWith(\n expect.objectContaining({ login: 'alice', email: 'a@x', password: 'hashed:pwd' }),\n role\n )\n })\n\n it('creation errors: duplication and DB error', async () => {\n adminQueriesMock.usersQueries.checkUserExists.mockResolvedValueOnce({ login: 'dup', email: 'dup@x' })\n await expectHttp(service.createUserOrGuest({ login: 'dup', email: 'dup@x', password: 'p', managers: [] } as any, USER_ROLE.USER, false))\n\n adminQueriesMock.usersQueries.checkUserExists.mockResolvedValueOnce(false)\n adminQueriesMock.usersQueries.createUserOrGuest.mockRejectedValueOnce(new Error('db fail'))\n await expectHttp(service.createUserOrGuest({ login: 'bob', email: 'b@x', password: 'p', managers: [] } as any, USER_ROLE.USER, false))\n })\n })\n\n describe('updateUserOrGuest - USER branch', () => {\n it('full update + FS rename + groups diff', async () => {\n const current = { ...baseUser, groups: [{ id: 1 }, { id: 3 }] }\n setUser(current)\n const updated = { ...current, login: 'johnny', email: 'j@new' }\n setUser(updated)\n\n adminQueriesMock.usersQueries.checkUserExists.mockResolvedValueOnce(false)\n adminQueriesMock.usersQueries.checkUserExists.mockResolvedValueOnce(false)\n fs.isPathExists.mockResolvedValueOnce(true)\n fs.isPathExists.mockResolvedValueOnce(false)\n fs.moveFiles.mockResolvedValueOnce(undefined)\n adminQueriesMock.usersQueries.updateUserOrGuest.mockResolvedValueOnce(true)\n adminQueriesMock.updateUserGroups.mockResolvedValueOnce(undefined)\n\n const dto: UpdateUserDto = { login: 'johnny', email: 'j@new', isActive: true, password: 'newpwd', groups: [3, 5] }\n const res = await service.updateUserOrGuest(current.id, dto)\n\n expect(adminQueriesMock.usersQueries.updateUserOrGuest).toHaveBeenCalledWith(\n current.id,\n expect.objectContaining({ login: 'johnny', email: 'j@new', isActive: true, passwordAttempts: 0, password: 'hashed:newpwd' }),\n undefined\n )\n expect(adminQueriesMock.updateUserGroups).toHaveBeenCalledWith(current.id, { add: [5], delete: [1] })\n expect(res).toEqual(updated)\n })\n\n it('login/email conflict', async () => {\n const current = { ...baseUser }\n setUser(current)\n adminQueriesMock.usersQueries.checkUserExists.mockResolvedValueOnce(true)\n await expectHttp(service.updateUserOrGuest(current.id, { login: 'taken' } as any))\n\n setUser(current)\n adminQueriesMock.usersQueries.checkUserExists.mockResolvedValueOnce(true)\n await expectHttp(service.updateUserOrGuest(current.id, { email: 'dup@x' } as any))\n expect(adminQueriesMock.usersQueries.updateUserOrGuest).not.toHaveBeenCalled()\n })\n\n it('renameUserSpace impossible (new space exists)', async () => {\n const current = { ...baseUser }\n setUser(current)\n adminQueriesMock.usersQueries.checkUserExists.mockResolvedValueOnce(false)\n fs.isPathExists.mockResolvedValueOnce(true) // current\n fs.isPathExists.mockResolvedValueOnce(true) // new already exists\n fs.moveFiles.mockResolvedValue(undefined)\n await expectHttp(service.updateUserOrGuest(current.id, { login: 'new' } as any))\n })\n\n it('DB update false => INTERNAL_SERVER_ERROR', async () => {\n const current = { ...baseUser }\n setUser(current)\n adminQueriesMock.usersQueries.updateUserOrGuest.mockResolvedValueOnce(false)\n await expectHttp(service.updateUserOrGuest(current.id, { email: 'e@x' } as any))\n })\n\n it('updateUserGroups fails', async () => {\n const current = { ...baseUser, groups: [{ id: 1 }] }\n setUser(current)\n adminQueriesMock.usersQueries.updateUserOrGuest.mockResolvedValueOnce(true)\n adminQueriesMock.updateUserGroups.mockRejectedValueOnce(new Error('group error'))\n await expectHttp(service.updateUserOrGuest(current.id, { groups: [2] } as any))\n })\n\n it('no change when login or email unchanged', async () => {\n const current = { ...baseUser }\n setUser(current)\n setUser(current)\n expect(await service.updateUserOrGuest(current.id, { login: current.login } as any)).toEqual(current)\n expect(adminQueriesMock.usersQueries.checkUserExists).not.toHaveBeenCalled()\n\n setUser(current)\n setUser(current)\n expect(await service.updateUserOrGuest(current.id, { email: current.email } as any)).toEqual(current)\n expect(adminQueriesMock.usersQueries.updateUserOrGuest).not.toHaveBeenCalled()\n })\n\n it('default branch (unknown field)', async () => {\n const current = { ...baseUser }\n setUser(current)\n adminQueriesMock.usersQueries.updateUserOrGuest.mockResolvedValueOnce(true)\n const updated = { ...current, language: 'fr' } as any\n setUser(updated)\n\n const res = await service.updateUserOrGuest(current.id, { language: 'fr' } as any)\n expect(adminQueriesMock.usersQueries.updateUserOrGuest).toHaveBeenCalledWith(current.id, expect.objectContaining({ language: 'fr' }), undefined)\n expect(res).toEqual(updated)\n })\n })\n\n describe('updateUserOrGuest - GUEST branch', () => {\n it('update guest + managers diff', async () => {\n const guest = { id: 33, login: 'g', email: 'g@x', managers: [{ id: 2 }, { id: 7 }], role: USER_ROLE.GUEST }\n setGuest(guest as any)\n const updatedGuest = { ...guest, email: 'new@x' }\n setGuest(updatedGuest as any)\n\n adminQueriesMock.usersQueries.updateUserOrGuest.mockResolvedValueOnce(true)\n adminQueriesMock.updateGuestManagers.mockResolvedValueOnce(undefined)\n\n const res = await service.updateUserOrGuest(guest.id, { email: 'new@x', managers: [7, 9] } as UpdateUserDto, USER_ROLE.GUEST)\n expect(adminQueriesMock.usersQueries.updateUserOrGuest).toHaveBeenCalledWith(guest.id, { email: 'new@x' }, USER_ROLE.GUEST)\n expect(adminQueriesMock.updateGuestManagers).toHaveBeenCalledWith(guest.id, { add: [9], delete: [2] })\n expect(res).toEqual(updatedGuest)\n })\n\n it('validations updateGuest', async () => {\n expect(() => service.updateGuest(1, {} as any)).toThrow(/no changes to update/i)\n expect(() => service.updateGuest(1, { managers: [] } as any)).toThrow(/guest must have at least one manager/i)\n })\n\n it('updateGuestManagers échoue', async () => {\n const guest = { id: 33, login: 'g', email: 'g@x', managers: [{ id: 2 }], role: USER_ROLE.GUEST }\n setGuest(guest as any)\n adminQueriesMock.usersQueries.updateUserOrGuest.mockResolvedValueOnce(true)\n adminQueriesMock.updateGuestManagers.mockRejectedValueOnce(new Error('mgr error'))\n await expectHttp(service.updateUserOrGuest(guest.id, { managers: [3] } as any, USER_ROLE.GUEST))\n })\n })\n\n describe('deleteUserOrGuest / deleteGuest', () => {\n it('delete user + optional space and errors', async () => {\n adminQueriesMock.deleteUser.mockResolvedValueOnce(true)\n fs.isPathExists.mockResolvedValueOnce(true)\n fs.removeFiles.mockResolvedValueOnce(undefined)\n await expect(service.deleteUserOrGuest(10, 'john', { deleteSpace: true, isGuest: false })).resolves.toBeUndefined()\n expect(adminQueriesMock.deleteUser).toHaveBeenCalledWith(10, 'john')\n expect(fs.isPathExists).toHaveBeenCalled()\n expect(fs.removeFiles).toHaveBeenCalled()\n\n adminQueriesMock.deleteUser.mockRejectedValueOnce(new Error('db crash'))\n await expectHttp(service.deleteUserOrGuest(10, 'john', { deleteSpace: false } as any))\n })\n })\n\n describe('deleteUserFromAdmin', () => {\n it('admin password incorrect / deletion ok', async () => {\n adminQueriesMock.usersQueries.compareUserPassword.mockResolvedValueOnce(false)\n await expectHttp(service.deleteUserOrGuestFromAdmin(10, { isGuest: false } as DeleteUserDto))\n\n adminQueriesMock.usersQueries.compareUserPassword.mockResolvedValueOnce(true)\n adminQueriesMock.usersQueries.from.mockResolvedValueOnce({ id: 10, login: 'to-del' } as any)\n adminQueriesMock.deleteUser.mockResolvedValueOnce(true)\n await service.deleteUserOrGuestFromAdmin(10, { isGuest: false, deleteSpace: true } as DeleteUserDto)\n expect(adminQueriesMock.deleteUser).toHaveBeenCalledWith(10, 'to-del')\n })\n })\n\n describe('groups', () => {\n it('browseGroups with/without name + NOT_FOUND', async () => {\n adminQueriesMock.groupFromName.mockResolvedValueOnce({ id: 5, name: 'dev', type: GROUP_TYPE.USER })\n adminQueriesMock.browseGroupMembers.mockResolvedValueOnce([{ id: 1 }, { id: 2 }])\n const withName = await service.browseGroups('dev', GROUP_TYPE.USER)\n expect(withName.parentGroup).toEqual({ id: 5, name: 'dev', type: GROUP_TYPE.USER })\n expect(withName.members).toHaveLength(2)\n\n adminQueriesMock.browseRootGroupMembers.mockResolvedValueOnce([{ id: 3 }])\n const root = await service.browseGroups(undefined, GROUP_TYPE.USER)\n expect(root.parentGroup).toBeUndefined()\n expect(root.members).toEqual([{ id: 3 }])\n\n adminQueriesMock.groupFromName.mockResolvedValueOnce(null)\n await expectHttp(service.browseGroups('unknown'))\n })\n\n it('getGroup OK / NOT_FOUND', async () => {\n adminQueriesMock.groupFromId.mockResolvedValueOnce({ id: 9 })\n expect(await service.getGroup(9)).toEqual({ id: 9 })\n adminQueriesMock.groupFromId.mockResolvedValueOnce(null)\n await expectHttp(service.getGroup(999))\n })\n\n it('createGroup OK + validations + creation error', async () => {\n const dto: CreateOrUpdateGroupDto = { name: 'team', type: GROUP_TYPE.USER } as any\n adminQueriesMock.usersQueries.checkGroupNameExists.mockResolvedValueOnce(false)\n adminQueriesMock.createGroup.mockResolvedValueOnce(123)\n adminQueriesMock.groupFromId.mockResolvedValueOnce({ id: 123, name: 'team' })\n expect(await service.createGroup(dto)).toEqual({ id: 123, name: 'team' })\n\n await expectHttp(service.createGroup({} as any))\n\n adminQueriesMock.usersQueries.checkGroupNameExists.mockResolvedValueOnce(true)\n await expectHttp(service.createGroup(dto))\n expect(adminQueriesMock.createGroup).toHaveBeenCalledTimes(1) // only the first one OK\n\n adminQueriesMock.usersQueries.checkGroupNameExists.mockResolvedValueOnce(false)\n adminQueriesMock.createGroup.mockRejectedValueOnce(new Error('db err'))\n await expectHttp(service.createGroup(dto))\n })\n\n it('updateGroup success / failure', async () => {\n adminQueriesMock.usersQueries.checkGroupNameExists.mockResolvedValueOnce(false)\n adminQueriesMock.updateGroup.mockResolvedValueOnce(true)\n adminQueriesMock.groupFromId.mockResolvedValueOnce({ id: 5, name: 'new' })\n expect(await service.updateGroup(5, { name: 'new' } as any)).toEqual({ id: 5, name: 'new' })\n\n adminQueriesMock.updateGroup.mockResolvedValueOnce(false)\n await expectHttp(service.updateGroup(5, {} as any))\n })\n\n it('deleteGroup success / fail', async () => {\n adminQueriesMock.deleteGroup.mockResolvedValueOnce(true)\n await expect(service.deleteGroup(5)).resolves.toBeUndefined()\n adminQueriesMock.deleteGroup.mockResolvedValueOnce(false)\n await expectHttp(service.deleteGroup(6))\n })\n\n it('addUsersToGroup: NOT_FOUND + error', async () => {\n adminQueriesMock.groupFromId.mockResolvedValueOnce(null)\n await expectHttp(service.addUsersToGroup(1, [2, 3]))\n\n adminQueriesMock.groupFromId.mockResolvedValueOnce({ id: 1, type: GROUP_TYPE.USER })\n adminQueriesMock.addUsersToGroup.mockRejectedValueOnce(new Error('bad users'))\n await expectHttp(service.addUsersToGroup(1, [2]))\n })\n\n it('updateUserFromGroup / removeUserFromGroup BAD_REQUEST errors', async () => {\n adminQueriesMock.updateUserFromGroup.mockRejectedValueOnce(new Error('bad role'))\n await expectHttp(service.updateUserFromGroup(1, 2, { role: USER_GROUP_ROLE.MEMBER } as UpdateUserFromGroupDto))\n\n adminQueriesMock.removeUserFromGroup.mockRejectedValueOnce(new Error('not member'))\n await expectHttp(service.removeUserFromGroup(1, 2))\n })\n })\n\n describe('searchMembers', () => {\n it('forwards to usersQueries.searchUsersOrGroups', async () => {\n const dto = { search: 'jo' } as SearchMembersDto\n adminQueriesMock.usersQueries.searchUsersOrGroups.mockResolvedValueOnce([{ id: 1 }])\n expect(await service.searchMembers(dto)).toEqual([{ id: 1 }])\n expect(adminQueriesMock.usersQueries.searchUsersOrGroups).toHaveBeenCalledWith(dto)\n })\n })\n\n describe('impersonation', () => {\n const res: any = {}\n it('self / bad password / ok + logout (guard + non-admin + admin)', async () => {\n const admin = new UserModel({ id: 5 } as any, true)\n await expectHttp(service.impersonateUser(admin, 5, res))\n\n adminQueriesMock.usersQueries.compareUserPassword.mockResolvedValueOnce(false)\n await expectHttp(service.impersonateUser(admin, 6, res))\n\n const admin2 = new UserModel({ id: 5, clientId: 'c1' } as any, true)\n adminQueriesMock.usersQueries.compareUserPassword.mockResolvedValueOnce(true)\n adminQueriesMock.usersQueries.from.mockResolvedValueOnce({ id: 6, login: 'user' } as any)\n authManagerMock.setCookies.mockResolvedValueOnce({ accessToken: 't' })\n expect(await service.impersonateUser(admin2, 6, res)).toEqual({ accessToken: 't' })\n\n const notImpersonated = new UserModel({ id: 1 } as any, true)\n await expectHttp(service.logoutImpersonateUser(notImpersonated, res))\n\n const impersonated = new UserModel({ id: 2, impersonatedFromId: 9, impersonatedClientId: 'X' } as any, true)\n adminQueriesMock.usersQueries.from.mockResolvedValueOnce({ id: 9, role: USER_ROLE.USER } as any)\n await expectHttp(service.logoutImpersonateUser(impersonated, res))\n\n adminQueriesMock.usersQueries.from.mockResolvedValueOnce({ id: 9, role: USER_ROLE.ADMINISTRATOR } as any)\n authManagerMock.setCookies.mockResolvedValueOnce({ accessToken: 'admin' })\n expect(await service.logoutImpersonateUser(impersonated, res)).toEqual({ accessToken: 'admin' })\n })\n })\n\n describe('listing', () => {\n it('forwards listUsers and listGuests', async () => {\n const users = [{ id: 1 }]\n adminQueriesMock.listUsers.mockResolvedValueOnce(users as any)\n expect(await service.listUsers()).toEqual(users)\n expect(adminQueriesMock.listUsers).toHaveBeenCalledWith()\n\n const guests = [{ id: 2 }]\n adminQueriesMock.usersQueries.listGuests.mockResolvedValueOnce(guests as any)\n expect(await service.listGuests()).toEqual(guests)\n expect(adminQueriesMock.usersQueries.listGuests).toHaveBeenCalledWith(null, null, true)\n })\n })\n\n describe('createGuest', () => {\n it('adds the creator as default manager and returns admin guest', async () => {\n const creator = new UserModel({ id: 88 } as any, true)\n const dto: CreateUserDto = { login: 'gg', email: 'g@x', password: 'pwd', managers: [] } as any\n adminQueriesMock.usersQueries.checkUserExists.mockResolvedValueOnce(false)\n adminQueriesMock.usersQueries.createUserOrGuest.mockResolvedValueOnce(505)\n spyMakePaths()\n const expectedGuest = { id: 505, login: 'gg', role: USER_ROLE.GUEST }\n setGuest(expectedGuest as any)\n\n expect(await service.createGuest(creator, dto)).toEqual(expectedGuest)\n expect(adminQueriesMock.usersQueries.createUserOrGuest).toHaveBeenCalledWith(\n expect.objectContaining({ login: 'gg', email: 'g@x', managers: [88] }),\n USER_ROLE.GUEST\n )\n })\n })\n\n describe('updateGuest wrapper', () => {\n it('updateGuest() -> success', async () => {\n const guest = { id: 33, login: 'g', email: 'g@x', managers: [{ id: 2 }], role: USER_ROLE.GUEST }\n const updatedGuest = { ...guest, email: 'new@x' }\n setGuest(guest as any)\n adminQueriesMock.usersQueries.updateUserOrGuest.mockResolvedValueOnce(true)\n setGuest(updatedGuest as any)\n expect(await service.updateGuest(guest.id, { email: 'new@x' } as any)).toEqual(updatedGuest)\n })\n })\n\n describe('deleteUserSpace', () => {\n it('space not existing / removeFiles failure', async () => {\n fs.isPathExists.mockResolvedValueOnce(false)\n await expect(service.deleteUserSpace('nobody')).resolves.toBeUndefined()\n\n fs.isPathExists.mockResolvedValueOnce(true)\n fs.removeFiles.mockRejectedValueOnce(new Error('fs error'))\n await expectHttp(service.deleteUserSpace('bob'))\n })\n })\n\n describe('renameUserSpace error handling', () => {\n it('moveFiles throws then restore', async () => {\n const current = { ...baseUser }\n setUser(current)\n adminQueriesMock.usersQueries.checkUserExists.mockResolvedValueOnce(false)\n fs.isPathExists.mockResolvedValueOnce(true)\n fs.isPathExists.mockResolvedValueOnce(false)\n fs.moveFiles.mockRejectedValueOnce(new Error('io error'))\n fs.moveFiles.mockResolvedValueOnce(undefined)\n await expectHttp(service.updateUserOrGuest(current.id, { login: 'new-login' } as any))\n expect(fs.moveFiles).toHaveBeenCalledTimes(2)\n })\n\n it('current space missing -> early return', async () => {\n const current = { ...baseUser }\n setUser(current)\n adminQueriesMock.usersQueries.checkUserExists.mockResolvedValueOnce(false)\n fs.isPathExists.mockResolvedValueOnce(false)\n await expectHttp(service.updateUserOrGuest(current.id, { login: 'new-login' } as any))\n expect(fs.moveFiles).not.toHaveBeenCalled()\n })\n })\n})\n"],"names":["jest","mock","isPathExists","fn","moveFiles","removeFiles","actual","requireActual","hashPassword","pwd","anonymizePassword","dto","password","fs","requireMock","expectHttp","p","expect","rejects","toBeInstanceOf","HttpException","spyMakePaths","spyOn","UserModel","prototype","mockResolvedValueOnce","undefined","describe","AdminUsersManager","name","service","authManagerMock","adminQueriesMock","setUser","u","listUsers","setGuest","g","usersQueries","listGuests","baseUser","id","login","email","isActive","role","USER_ROLE","USER","groups","beforeAll","setCookies","from","createUserOrGuest","updateUserOrGuest","deleteUser","compareUserPassword","checkGroupNameExists","checkUserExists","searchUsersOrGroups","clearWhiteListCaches","updateUserGroups","updateGuestManagers","groupFromName","browseGroupMembers","browseRootGroupMembers","groupFromId","createGroup","updateGroup","deleteGroup","addUsersToGroup","updateUserFromGroup","removeUserFromGroup","module","Test","createTestingModule","providers","provide","AuthManager","useValue","AdminUsersQueries","compile","useLogger","get","beforeEach","clearAllMocks","it","toBeDefined","getUser","toEqual","toHaveBeenCalledWith","guest","managers","GUEST","getGuest","each","asAdmin","exp","res","toBe","objectContaining","mockRejectedValueOnce","Error","current","updated","passwordAttempts","add","delete","not","toHaveBeenCalled","mockResolvedValue","language","updatedGuest","updateGuest","toThrow","deleteUserOrGuest","deleteSpace","isGuest","resolves","toBeUndefined","deleteUserOrGuestFromAdmin","type","GROUP_TYPE","withName","browseGroups","parentGroup","members","toHaveLength","root","getGroup","toHaveBeenCalledTimes","USER_GROUP_ROLE","MEMBER","search","searchMembers","admin","impersonateUser","admin2","clientId","accessToken","notImpersonated","logoutImpersonateUser","impersonated","impersonatedFromId","impersonatedClientId","ADMINISTRATOR","users","guests","creator","expectedGuest","createGuest","deleteUserSpace"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/users/services/admin-users-manager.service.spec.ts"],"sourcesContent":["import { HttpException } from '@nestjs/common'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { AuthManager } from '../../../authentication/auth.service'\nimport { GROUP_TYPE } from '../constants/group'\nimport { USER_GROUP_ROLE, USER_ROLE } from '../constants/user'\nimport type { CreateOrUpdateGroupDto } from '../dto/create-or-update-group.dto'\nimport type { CreateUserDto, UpdateUserDto, UpdateUserFromGroupDto } from '../dto/create-or-update-user.dto'\nimport type { DeleteUserDto } from '../dto/delete-user.dto'\nimport type { SearchMembersDto } from '../dto/search-members.dto'\nimport { UserModel } from '../models/user.model'\nimport { AdminUsersManager } from './admin-users-manager.service'\nimport { AdminUsersQueries } from './admin-users-queries.service'\n\n// mock file utils used by the service (delete/rename user space)\njest.mock('../../files/utils/files', () => ({\n isPathExists: jest.fn(),\n moveFiles: jest.fn(),\n removeFiles: jest.fn()\n}))\n\n// mock hash/anonymize utilities (preserve other module exports)\njest.mock('../../../common/functions', () => {\n const actual = jest.requireActual('../../../common/functions')\n return {\n ...actual,\n hashPassword: jest.fn(async (pwd: string) => `hashed:${pwd}`),\n anonymizePassword: jest.fn((dto: any) => ({ ...dto, password: '***' }))\n }\n})\n\n// Alias FS mocks (avoid repetitions)\nconst fs = jest.requireMock('../../files/utils/files') as { isPathExists: jest.Mock; moveFiles: jest.Mock; removeFiles: jest.Mock }\n\n// Helper utilities\nconst expectHttp = async (p: Promise<any>) => expect(p).rejects.toBeInstanceOf(HttpException)\nconst spyMakePaths = () => jest.spyOn(UserModel.prototype, 'makePaths').mockResolvedValueOnce(undefined)\n\ndescribe(AdminUsersManager.name, () => {\n let service: AdminUsersManager\n\n // deep mocks\n let authManagerMock: { setCookies: jest.Mock }\n let adminQueriesMock: {\n listUsers: jest.Mock\n usersQueries: {\n listGuests: jest.Mock\n from: jest.Mock\n createUserOrGuest: jest.Mock\n updateUserOrGuest: jest.Mock\n deleteUser: jest.Mock\n compareUserPassword: jest.Mock\n checkGroupNameExists: jest.Mock\n checkUserExists: jest.Mock\n searchUsersOrGroups: jest.Mock\n clearWhiteListCaches: jest.Mock\n }\n updateUserGroups: jest.Mock\n updateGuestManagers: jest.Mock\n deleteUser: jest.Mock\n groupFromName: jest.Mock\n browseGroupMembers: jest.Mock\n browseRootGroupMembers: jest.Mock\n groupFromId: jest.Mock\n createGroup: jest.Mock\n updateGroup: jest.Mock\n deleteGroup: jest.Mock\n addUsersToGroup: jest.Mock\n updateUserFromGroup: jest.Mock\n removeUserFromGroup: jest.Mock\n }\n\n const setUser = (u: any) => adminQueriesMock.listUsers.mockResolvedValueOnce(u)\n const setGuest = (g: any) => adminQueriesMock.usersQueries.listGuests.mockResolvedValueOnce(g)\n\n const baseUser = {\n id: 10,\n login: 'john',\n email: 'john@example.com',\n isActive: true,\n role: USER_ROLE.USER,\n groups: [{ id: 1 }, { id: 3 }]\n } as any\n\n beforeAll(async () => {\n authManagerMock = { setCookies: jest.fn() }\n\n adminQueriesMock = {\n listUsers: jest.fn(),\n usersQueries: {\n listGuests: jest.fn(),\n from: jest.fn(),\n createUserOrGuest: jest.fn(),\n updateUserOrGuest: jest.fn(),\n deleteUser: jest.fn(),\n compareUserPassword: jest.fn(),\n checkGroupNameExists: jest.fn(),\n checkUserExists: jest.fn(),\n searchUsersOrGroups: jest.fn(),\n clearWhiteListCaches: jest.fn()\n },\n updateUserGroups: jest.fn(),\n updateGuestManagers: jest.fn(),\n deleteUser: jest.fn(),\n groupFromName: jest.fn(),\n browseGroupMembers: jest.fn(),\n browseRootGroupMembers: jest.fn(),\n groupFromId: jest.fn(),\n createGroup: jest.fn(),\n updateGroup: jest.fn(),\n deleteGroup: jest.fn(),\n addUsersToGroup: jest.fn(),\n updateUserFromGroup: jest.fn(),\n removeUserFromGroup: jest.fn()\n }\n\n const module: TestingModule = await Test.createTestingModule({\n providers: [AdminUsersManager, { provide: AuthManager, useValue: authManagerMock }, { provide: AdminUsersQueries, useValue: adminQueriesMock }]\n }).compile()\n\n module.useLogger(['fatal'])\n service = module.get<AdminUsersManager>(AdminUsersManager)\n })\n\n beforeEach(() => {\n jest.clearAllMocks()\n })\n\n it('should be defined', () => {\n expect(service).toBeDefined()\n })\n\n describe('getUser / getGuest', () => {\n it('user ok + not found + guest ok', async () => {\n setUser(baseUser)\n expect(await service.getUser(10)).toEqual(baseUser)\n expect(adminQueriesMock.listUsers).toHaveBeenCalledWith(10)\n\n setUser(null)\n await expectHttp(service.getUser(999))\n\n const guest = { id: 22, login: 'guest', email: 'g@x', managers: [], role: USER_ROLE.GUEST }\n setGuest(guest as any)\n expect(await service.getGuest(22)).toEqual(guest)\n expect(adminQueriesMock.usersQueries.listGuests).toHaveBeenCalledWith(22, 0, true)\n })\n })\n\n describe('createUserOrGuest', () => {\n it.each([\n { role: USER_ROLE.USER, asAdmin: false, id: 101, exp: 'UserModel' },\n { role: USER_ROLE.GUEST, asAdmin: true, id: 202, exp: 'AdminGuest' },\n { role: USER_ROLE.USER, asAdmin: true, id: 707, exp: 'AdminUser' },\n { role: USER_ROLE.GUEST, asAdmin: false, id: 808, exp: 'UserModel' }\n ])('creation matrix ($role / asAdmin=$asAdmin)', async ({ role, asAdmin, id, exp }) => {\n const dto: CreateUserDto = { login: 'alice', email: 'a@x', password: 'pwd', managers: role === USER_ROLE.GUEST ? [1] : [] } as any\n adminQueriesMock.usersQueries.checkUserExists.mockResolvedValueOnce(false)\n adminQueriesMock.usersQueries.createUserOrGuest.mockResolvedValueOnce(id)\n spyMakePaths()\n\n if (exp === 'AdminUser') setUser({ id, login: 'alice', role })\n if (exp === 'AdminGuest') setGuest({ id, login: 'alice', role } as any)\n\n const res = await (service as any).createUserOrGuest(dto, role, asAdmin)\n\n if (exp === 'UserModel') {\n expect(res).toBeInstanceOf(UserModel)\n expect((res as any).id).toBe(id)\n } else if (exp === 'AdminUser') {\n expect(adminQueriesMock.listUsers).toHaveBeenCalledWith(id)\n } else {\n expect(adminQueriesMock.usersQueries.listGuests).toHaveBeenCalledWith(id, 0, true)\n }\n expect(adminQueriesMock.usersQueries.createUserOrGuest).toHaveBeenCalledWith(\n expect.objectContaining({ login: 'alice', email: 'a@x', password: 'hashed:pwd' }),\n role\n )\n })\n\n it('creation errors: duplication and DB error', async () => {\n adminQueriesMock.usersQueries.checkUserExists.mockResolvedValueOnce({ login: 'dup', email: 'dup@x' })\n await expectHttp(service.createUserOrGuest({ login: 'dup', email: 'dup@x', password: 'p', managers: [] } as any, USER_ROLE.USER, false))\n\n adminQueriesMock.usersQueries.checkUserExists.mockResolvedValueOnce(false)\n adminQueriesMock.usersQueries.createUserOrGuest.mockRejectedValueOnce(new Error('db fail'))\n await expectHttp(service.createUserOrGuest({ login: 'bob', email: 'b@x', password: 'p', managers: [] } as any, USER_ROLE.USER, false))\n })\n })\n\n describe('updateUserOrGuest - USER branch', () => {\n it('full update + FS rename + groups diff', async () => {\n const current = { ...baseUser, groups: [{ id: 1 }, { id: 3 }] }\n setUser(current)\n const updated = { ...current, login: 'johnny', email: 'j@new' }\n setUser(updated)\n\n adminQueriesMock.usersQueries.checkUserExists.mockResolvedValueOnce(false)\n adminQueriesMock.usersQueries.checkUserExists.mockResolvedValueOnce(false)\n fs.isPathExists.mockResolvedValueOnce(true)\n fs.isPathExists.mockResolvedValueOnce(false)\n fs.moveFiles.mockResolvedValueOnce(undefined)\n adminQueriesMock.usersQueries.updateUserOrGuest.mockResolvedValueOnce(true)\n adminQueriesMock.updateUserGroups.mockResolvedValueOnce(undefined)\n\n const dto: UpdateUserDto = { login: 'johnny', email: 'j@new', isActive: true, password: 'newpwd', groups: [3, 5] }\n const res = await service.updateUserOrGuest(current.id, dto)\n\n expect(adminQueriesMock.usersQueries.updateUserOrGuest).toHaveBeenCalledWith(\n current.id,\n expect.objectContaining({ login: 'johnny', email: 'j@new', isActive: true, passwordAttempts: 0, password: 'hashed:newpwd' }),\n undefined\n )\n expect(adminQueriesMock.updateUserGroups).toHaveBeenCalledWith(current.id, { add: [5], delete: [1] })\n expect(res).toEqual(updated)\n })\n\n it('login/email conflict', async () => {\n const current = { ...baseUser }\n setUser(current)\n adminQueriesMock.usersQueries.checkUserExists.mockResolvedValueOnce(true)\n await expectHttp(service.updateUserOrGuest(current.id, { login: 'taken' } as any))\n\n setUser(current)\n adminQueriesMock.usersQueries.checkUserExists.mockResolvedValueOnce(true)\n await expectHttp(service.updateUserOrGuest(current.id, { email: 'dup@x' } as any))\n expect(adminQueriesMock.usersQueries.updateUserOrGuest).not.toHaveBeenCalled()\n })\n\n it('renameUserSpace impossible (new space exists)', async () => {\n const current = { ...baseUser }\n setUser(current)\n adminQueriesMock.usersQueries.checkUserExists.mockResolvedValueOnce(false)\n fs.isPathExists.mockResolvedValueOnce(true) // current\n fs.isPathExists.mockResolvedValueOnce(true) // new already exists\n fs.moveFiles.mockResolvedValue(undefined)\n await expectHttp(service.updateUserOrGuest(current.id, { login: 'new' } as any))\n })\n\n it('DB update false => INTERNAL_SERVER_ERROR', async () => {\n const current = { ...baseUser }\n setUser(current)\n adminQueriesMock.usersQueries.updateUserOrGuest.mockResolvedValueOnce(false)\n await expectHttp(service.updateUserOrGuest(current.id, { email: 'e@x' } as any))\n })\n\n it('updateUserGroups fails', async () => {\n const current = { ...baseUser, groups: [{ id: 1 }] }\n setUser(current)\n adminQueriesMock.usersQueries.updateUserOrGuest.mockResolvedValueOnce(true)\n adminQueriesMock.updateUserGroups.mockRejectedValueOnce(new Error('group error'))\n await expectHttp(service.updateUserOrGuest(current.id, { groups: [2] } as any))\n })\n\n it('no change when login or email unchanged', async () => {\n const current = { ...baseUser }\n setUser(current)\n setUser(current)\n expect(await service.updateUserOrGuest(current.id, { login: current.login } as any)).toEqual(current)\n expect(adminQueriesMock.usersQueries.checkUserExists).not.toHaveBeenCalled()\n\n setUser(current)\n setUser(current)\n expect(await service.updateUserOrGuest(current.id, { email: current.email } as any)).toEqual(current)\n expect(adminQueriesMock.usersQueries.updateUserOrGuest).not.toHaveBeenCalled()\n })\n\n it('default branch (unknown field)', async () => {\n const current = { ...baseUser }\n setUser(current)\n adminQueriesMock.usersQueries.updateUserOrGuest.mockResolvedValueOnce(true)\n const updated = { ...current, language: 'fr' } as any\n setUser(updated)\n\n const res = await service.updateUserOrGuest(current.id, { language: 'fr' } as any)\n expect(adminQueriesMock.usersQueries.updateUserOrGuest).toHaveBeenCalledWith(current.id, expect.objectContaining({ language: 'fr' }), undefined)\n expect(res).toEqual(updated)\n })\n })\n\n describe('updateUserOrGuest - GUEST branch', () => {\n it('update guest + managers diff', async () => {\n const guest = { id: 33, login: 'g', email: 'g@x', managers: [{ id: 2 }, { id: 7 }], role: USER_ROLE.GUEST }\n setGuest(guest as any)\n const updatedGuest = { ...guest, email: 'new@x' }\n setGuest(updatedGuest as any)\n\n adminQueriesMock.usersQueries.updateUserOrGuest.mockResolvedValueOnce(true)\n adminQueriesMock.updateGuestManagers.mockResolvedValueOnce(undefined)\n\n const res = await service.updateUserOrGuest(guest.id, { email: 'new@x', managers: [7, 9] } as UpdateUserDto, USER_ROLE.GUEST)\n expect(adminQueriesMock.usersQueries.updateUserOrGuest).toHaveBeenCalledWith(guest.id, { email: 'new@x' }, USER_ROLE.GUEST)\n expect(adminQueriesMock.updateGuestManagers).toHaveBeenCalledWith(guest.id, { add: [9], delete: [2] })\n expect(res).toEqual(updatedGuest)\n })\n\n it('validations updateGuest', async () => {\n expect(() => service.updateGuest(1, {} as any)).toThrow(/no changes to update/i)\n expect(() => service.updateGuest(1, { managers: [] } as any)).toThrow(/guest must have at least one manager/i)\n })\n\n it('updateGuestManagers échoue', async () => {\n const guest = { id: 33, login: 'g', email: 'g@x', managers: [{ id: 2 }], role: USER_ROLE.GUEST }\n setGuest(guest as any)\n adminQueriesMock.usersQueries.updateUserOrGuest.mockResolvedValueOnce(true)\n adminQueriesMock.updateGuestManagers.mockRejectedValueOnce(new Error('mgr error'))\n await expectHttp(service.updateUserOrGuest(guest.id, { managers: [3] } as any, USER_ROLE.GUEST))\n })\n })\n\n describe('deleteUserOrGuest / deleteGuest', () => {\n it('delete user + optional space and errors', async () => {\n adminQueriesMock.deleteUser.mockResolvedValueOnce(true)\n fs.isPathExists.mockResolvedValueOnce(true)\n fs.removeFiles.mockResolvedValueOnce(undefined)\n await expect(service.deleteUserOrGuest(10, 'john', { deleteSpace: true, isGuest: false })).resolves.toBeUndefined()\n expect(adminQueriesMock.deleteUser).toHaveBeenCalledWith(10, 'john')\n expect(fs.isPathExists).toHaveBeenCalled()\n expect(fs.removeFiles).toHaveBeenCalled()\n\n adminQueriesMock.deleteUser.mockRejectedValueOnce(new Error('db crash'))\n await expectHttp(service.deleteUserOrGuest(10, 'john', { deleteSpace: false } as any))\n })\n })\n\n describe('deleteUserFromAdmin', () => {\n it('admin password incorrect / deletion ok', async () => {\n adminQueriesMock.usersQueries.compareUserPassword.mockResolvedValueOnce(false)\n await expectHttp(service.deleteUserOrGuestFromAdmin(10, { isGuest: false } as DeleteUserDto))\n\n adminQueriesMock.usersQueries.compareUserPassword.mockResolvedValueOnce(true)\n adminQueriesMock.usersQueries.from.mockResolvedValueOnce({ id: 10, login: 'to-del' } as any)\n adminQueriesMock.deleteUser.mockResolvedValueOnce(true)\n await service.deleteUserOrGuestFromAdmin(10, { isGuest: false, deleteSpace: true } as DeleteUserDto)\n expect(adminQueriesMock.deleteUser).toHaveBeenCalledWith(10, 'to-del')\n })\n })\n\n describe('groups', () => {\n it('browseGroups with/without name + NOT_FOUND', async () => {\n adminQueriesMock.groupFromName.mockResolvedValueOnce({ id: 5, name: 'dev', type: GROUP_TYPE.USER })\n adminQueriesMock.browseGroupMembers.mockResolvedValueOnce([{ id: 1 }, { id: 2 }])\n const withName = await service.browseGroups('dev', GROUP_TYPE.USER)\n expect(withName.parentGroup).toEqual({ id: 5, name: 'dev', type: GROUP_TYPE.USER })\n expect(withName.members).toHaveLength(2)\n\n adminQueriesMock.browseRootGroupMembers.mockResolvedValueOnce([{ id: 3 }])\n const root = await service.browseGroups(undefined, GROUP_TYPE.USER)\n expect(root.parentGroup).toBeUndefined()\n expect(root.members).toEqual([{ id: 3 }])\n\n adminQueriesMock.groupFromName.mockResolvedValueOnce(null)\n await expectHttp(service.browseGroups('unknown'))\n })\n\n it('getGroup OK / NOT_FOUND', async () => {\n adminQueriesMock.groupFromId.mockResolvedValueOnce({ id: 9 })\n expect(await service.getGroup(9)).toEqual({ id: 9 })\n adminQueriesMock.groupFromId.mockResolvedValueOnce(null)\n await expectHttp(service.getGroup(999))\n })\n\n it('createGroup OK + validations + creation error', async () => {\n const dto: CreateOrUpdateGroupDto = { name: 'team', type: GROUP_TYPE.USER } as any\n adminQueriesMock.usersQueries.checkGroupNameExists.mockResolvedValueOnce(false)\n adminQueriesMock.createGroup.mockResolvedValueOnce(123)\n adminQueriesMock.groupFromId.mockResolvedValueOnce({ id: 123, name: 'team' })\n expect(await service.createGroup(dto)).toEqual({ id: 123, name: 'team' })\n\n await expectHttp(service.createGroup({} as any))\n\n adminQueriesMock.usersQueries.checkGroupNameExists.mockResolvedValueOnce(true)\n await expectHttp(service.createGroup(dto))\n expect(adminQueriesMock.createGroup).toHaveBeenCalledTimes(1) // only the first one OK\n\n adminQueriesMock.usersQueries.checkGroupNameExists.mockResolvedValueOnce(false)\n adminQueriesMock.createGroup.mockRejectedValueOnce(new Error('db err'))\n await expectHttp(service.createGroup(dto))\n })\n\n it('updateGroup success / failure', async () => {\n adminQueriesMock.usersQueries.checkGroupNameExists.mockResolvedValueOnce(false)\n adminQueriesMock.updateGroup.mockResolvedValueOnce(true)\n adminQueriesMock.groupFromId.mockResolvedValueOnce({ id: 5, name: 'new' })\n expect(await service.updateGroup(5, { name: 'new' } as any)).toEqual({ id: 5, name: 'new' })\n\n adminQueriesMock.updateGroup.mockResolvedValueOnce(false)\n await expectHttp(service.updateGroup(5, {} as any))\n })\n\n it('deleteGroup success / fail', async () => {\n adminQueriesMock.deleteGroup.mockResolvedValueOnce(true)\n await expect(service.deleteGroup(5)).resolves.toBeUndefined()\n adminQueriesMock.deleteGroup.mockResolvedValueOnce(false)\n await expectHttp(service.deleteGroup(6))\n })\n\n it('addUsersToGroup: NOT_FOUND + error', async () => {\n adminQueriesMock.groupFromId.mockResolvedValueOnce(null)\n await expectHttp(service.addUsersToGroup(1, [2, 3]))\n\n adminQueriesMock.groupFromId.mockResolvedValueOnce({ id: 1, type: GROUP_TYPE.USER })\n adminQueriesMock.addUsersToGroup.mockRejectedValueOnce(new Error('bad users'))\n await expectHttp(service.addUsersToGroup(1, [2]))\n })\n\n it('updateUserFromGroup / removeUserFromGroup BAD_REQUEST errors', async () => {\n adminQueriesMock.updateUserFromGroup.mockRejectedValueOnce(new Error('bad role'))\n await expectHttp(service.updateUserFromGroup(1, 2, { role: USER_GROUP_ROLE.MEMBER } as UpdateUserFromGroupDto))\n\n adminQueriesMock.removeUserFromGroup.mockRejectedValueOnce(new Error('not member'))\n await expectHttp(service.removeUserFromGroup(1, 2))\n })\n })\n\n describe('searchMembers', () => {\n it('forwards to usersQueries.searchUsersOrGroups', async () => {\n const dto = { search: 'jo' } as SearchMembersDto\n adminQueriesMock.usersQueries.searchUsersOrGroups.mockResolvedValueOnce([{ id: 1 }])\n expect(await service.searchMembers(dto)).toEqual([{ id: 1 }])\n expect(adminQueriesMock.usersQueries.searchUsersOrGroups).toHaveBeenCalledWith(dto)\n })\n })\n\n describe('impersonation', () => {\n const res: any = {}\n it('self / bad password / ok + logout (guard + non-admin + admin)', async () => {\n const admin = new UserModel({ id: 5 } as any, true)\n await expectHttp(service.impersonateUser(admin, 5, res))\n\n adminQueriesMock.usersQueries.compareUserPassword.mockResolvedValueOnce(false)\n await expectHttp(service.impersonateUser(admin, 6, res))\n\n const admin2 = new UserModel({ id: 5, clientId: 'c1' } as any, true)\n adminQueriesMock.usersQueries.compareUserPassword.mockResolvedValueOnce(true)\n adminQueriesMock.usersQueries.from.mockResolvedValueOnce({ id: 6, login: 'user' } as any)\n authManagerMock.setCookies.mockResolvedValueOnce({ accessToken: 't' })\n expect(await service.impersonateUser(admin2, 6, res)).toEqual({ accessToken: 't' })\n\n const notImpersonated = new UserModel({ id: 1 } as any, true)\n await expectHttp(service.logoutImpersonateUser(notImpersonated, res))\n\n const impersonated = new UserModel({ id: 2, impersonatedFromId: 9, impersonatedClientId: 'X' } as any, true)\n adminQueriesMock.usersQueries.from.mockResolvedValueOnce({ id: 9, role: USER_ROLE.USER } as any)\n await expectHttp(service.logoutImpersonateUser(impersonated, res))\n\n adminQueriesMock.usersQueries.from.mockResolvedValueOnce({ id: 9, role: USER_ROLE.ADMINISTRATOR } as any)\n authManagerMock.setCookies.mockResolvedValueOnce({ accessToken: 'admin' })\n expect(await service.logoutImpersonateUser(impersonated, res)).toEqual({ accessToken: 'admin' })\n })\n })\n\n describe('listing', () => {\n it('forwards listUsers and listGuests', async () => {\n const users = [{ id: 1 }]\n adminQueriesMock.listUsers.mockResolvedValueOnce(users as any)\n expect(await service.listUsers()).toEqual(users)\n expect(adminQueriesMock.listUsers).toHaveBeenCalledWith()\n\n const guests = [{ id: 2 }]\n adminQueriesMock.usersQueries.listGuests.mockResolvedValueOnce(guests as any)\n expect(await service.listGuests()).toEqual(guests)\n expect(adminQueriesMock.usersQueries.listGuests).toHaveBeenCalledWith(null, null, true)\n })\n })\n\n describe('createGuest', () => {\n it('adds the creator as default manager and returns admin guest', async () => {\n const creator = new UserModel({ id: 88 } as any, true)\n const dto: CreateUserDto = { login: 'gg', email: 'g@x', password: 'pwd', managers: [] } as any\n adminQueriesMock.usersQueries.checkUserExists.mockResolvedValueOnce(false)\n adminQueriesMock.usersQueries.createUserOrGuest.mockResolvedValueOnce(505)\n spyMakePaths()\n const expectedGuest = { id: 505, login: 'gg', role: USER_ROLE.GUEST }\n setGuest(expectedGuest as any)\n\n expect(await service.createGuest(creator, dto)).toEqual(expectedGuest)\n expect(adminQueriesMock.usersQueries.createUserOrGuest).toHaveBeenCalledWith(\n expect.objectContaining({ login: 'gg', email: 'g@x', managers: [88] }),\n USER_ROLE.GUEST\n )\n })\n })\n\n describe('updateGuest wrapper', () => {\n it('updateGuest() -> success', async () => {\n const guest = { id: 33, login: 'g', email: 'g@x', managers: [{ id: 2 }], role: USER_ROLE.GUEST }\n const updatedGuest = { ...guest, email: 'new@x' }\n setGuest(guest as any)\n adminQueriesMock.usersQueries.updateUserOrGuest.mockResolvedValueOnce(true)\n setGuest(updatedGuest as any)\n expect(await service.updateGuest(guest.id, { email: 'new@x' } as any)).toEqual(updatedGuest)\n })\n })\n\n describe('deleteUserSpace', () => {\n it('space not existing / removeFiles failure', async () => {\n fs.isPathExists.mockResolvedValueOnce(false)\n await expect(service.deleteUserSpace('nobody')).resolves.toBeUndefined()\n\n fs.isPathExists.mockResolvedValueOnce(true)\n fs.removeFiles.mockRejectedValueOnce(new Error('fs error'))\n await expectHttp(service.deleteUserSpace('bob'))\n })\n })\n\n describe('renameUserSpace error handling', () => {\n it('moveFiles throws then restore', async () => {\n const current = { ...baseUser }\n setUser(current)\n adminQueriesMock.usersQueries.checkUserExists.mockResolvedValueOnce(false)\n fs.isPathExists.mockResolvedValueOnce(true)\n fs.isPathExists.mockResolvedValueOnce(false)\n fs.moveFiles.mockRejectedValueOnce(new Error('io error'))\n fs.moveFiles.mockResolvedValueOnce(undefined)\n await expectHttp(service.updateUserOrGuest(current.id, { login: 'new-login' } as any))\n expect(fs.moveFiles).toHaveBeenCalledTimes(2)\n })\n\n it('current space missing -> early return', async () => {\n const current = { ...baseUser }\n setUser(current)\n adminQueriesMock.usersQueries.checkUserExists.mockResolvedValueOnce(false)\n fs.isPathExists.mockResolvedValueOnce(false)\n await expectHttp(service.updateUserOrGuest(current.id, { login: 'new-login' } as any))\n expect(fs.moveFiles).not.toHaveBeenCalled()\n })\n })\n})\n"],"names":["jest","mock","isPathExists","fn","moveFiles","removeFiles","actual","requireActual","hashPassword","pwd","anonymizePassword","dto","password","fs","requireMock","expectHttp","p","expect","rejects","toBeInstanceOf","HttpException","spyMakePaths","spyOn","UserModel","prototype","mockResolvedValueOnce","undefined","describe","AdminUsersManager","name","service","authManagerMock","adminQueriesMock","setUser","u","listUsers","setGuest","g","usersQueries","listGuests","baseUser","id","login","email","isActive","role","USER_ROLE","USER","groups","beforeAll","setCookies","from","createUserOrGuest","updateUserOrGuest","deleteUser","compareUserPassword","checkGroupNameExists","checkUserExists","searchUsersOrGroups","clearWhiteListCaches","updateUserGroups","updateGuestManagers","groupFromName","browseGroupMembers","browseRootGroupMembers","groupFromId","createGroup","updateGroup","deleteGroup","addUsersToGroup","updateUserFromGroup","removeUserFromGroup","module","Test","createTestingModule","providers","provide","AuthManager","useValue","AdminUsersQueries","compile","useLogger","get","beforeEach","clearAllMocks","it","toBeDefined","getUser","toEqual","toHaveBeenCalledWith","guest","managers","GUEST","getGuest","each","asAdmin","exp","res","toBe","objectContaining","mockRejectedValueOnce","Error","current","updated","passwordAttempts","add","delete","not","toHaveBeenCalled","mockResolvedValue","language","updatedGuest","updateGuest","toThrow","deleteUserOrGuest","deleteSpace","isGuest","resolves","toBeUndefined","deleteUserOrGuestFromAdmin","type","GROUP_TYPE","withName","browseGroups","parentGroup","members","toHaveLength","root","getGroup","toHaveBeenCalledTimes","USER_GROUP_ROLE","MEMBER","search","searchMembers","admin","impersonateUser","admin2","clientId","accessToken","notImpersonated","logoutImpersonateUser","impersonated","impersonatedFromId","impersonatedClientId","ADMINISTRATOR","users","guests","creator","expectedGuest","createGuest","deleteUserSpace"],"mappings":"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"}
|