@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
|
});
|
|
@@ -53,7 +49,10 @@ let CommentsManager = class CommentsManager {
|
|
|
53
49
|
fileId = await this.getFileId(space, createCommentDto.fileId);
|
|
54
50
|
}
|
|
55
51
|
const commentId = await this.commentQueries.createComment(user.id, fileId, createCommentDto.content);
|
|
56
|
-
this.notify(user, fileId, space, createCommentDto.content).catch((e)=>this.logger.error(
|
|
52
|
+
this.notify(user, fileId, space, createCommentDto.content).catch((e)=>this.logger.error({
|
|
53
|
+
tag: this.createComment.name,
|
|
54
|
+
msg: `${e}`
|
|
55
|
+
}));
|
|
57
56
|
return (await this.commentQueries.getComments(user.id, space.dbFile?.ownerId === user.id, null, commentId))[0];
|
|
58
57
|
}
|
|
59
58
|
async updateComment(user, space, updateCommentDto) {
|
|
@@ -113,7 +112,10 @@ let CommentsManager = class CommentsManager {
|
|
|
113
112
|
author: fromUser,
|
|
114
113
|
currentUrl: this.contextManager.headerOriginUrl(),
|
|
115
114
|
content: comment
|
|
116
|
-
}).catch((e)=>this.logger.error(
|
|
115
|
+
}).catch((e)=>this.logger.error({
|
|
116
|
+
tag: this.notify.name,
|
|
117
|
+
msg: `${e}`
|
|
118
|
+
}));
|
|
117
119
|
}
|
|
118
120
|
constructor(contextManager, commentQueries, filesQueries, notificationsManager){
|
|
119
121
|
this.contextManager = contextManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../backend/src/applications/comments/services/comments-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 { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport type { FileProps } from '../../files/interfaces/file-props.interface'\nimport { FilesQueries } from '../../files/services/files-queries.service'\nimport { dirName, fileName, getProps, isPathExists } from '../../files/utils/files'\nimport { NOTIFICATION_APP, NOTIFICATION_APP_EVENT } from '../../notifications/constants/notifications'\nimport { NotificationContent } from '../../notifications/interfaces/notification-properties.interface'\nimport { UserMailNotification } from '../../notifications/interfaces/user-mail-notification.interface'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { SpaceEnv } from '../../spaces/models/space-env.model'\nimport { UserModel } from '../../users/models/user.model'\nimport { CreateOrUpdateCommentDto, DeleteCommentDto } from '../dto/comment.dto'\nimport { CommentRecent } from '../interfaces/comment-recent.interface'\nimport type { Comment } from '../schemas/comment.interface'\nimport { CommentsQueries } from './comments-queries.service'\n\n@Injectable()\nexport class CommentsManager {\n private readonly logger = new Logger(CommentsManager.name)\n\n constructor(\n private readonly contextManager: ContextManager,\n private readonly commentQueries: CommentsQueries,\n private readonly filesQueries: FilesQueries,\n private readonly notificationsManager: NotificationsManager\n ) {}\n\n async getComments(user: UserModel, space: SpaceEnv): Promise<Comment[]> {\n const fileId: number = await this.getFileId(space)\n if (!fileId) {\n return []\n }\n return this.commentQueries.getComments(user.id, space.dbFile?.ownerId === user.id, fileId)\n }\n\n async createComment(user: UserModel, space: SpaceEnv, createCommentDto: CreateOrUpdateCommentDto): Promise<Comment> {\n if ((space.dbFile.spaceExternalRootId || space.dbFile.shareExternalId) && space.dbFile.path === '.') {\n // If path is empty a file with path = '.' and name = '.' will be created\n // The space browser does not support this kind of file and will remove it\n // Maybe to implement later\n throw new HttpException(`Not supported on this kind of ${space.dbFile.spaceExternalRootId ? 'space root' : 'share'}`, HttpStatus.BAD_REQUEST)\n }\n let fileId: number\n if (createCommentDto.fileId > 0) {\n fileId = await this.getFileId(space)\n if (createCommentDto.fileId !== fileId) {\n throw new HttpException('File id mismatch', HttpStatus.BAD_REQUEST)\n }\n } else {\n fileId = await this.getFileId(space, createCommentDto.fileId)\n }\n const commentId: number = await this.commentQueries.createComment(user.id, fileId, createCommentDto.content)\n this.notify(user, fileId, space, createCommentDto.content).catch((e: Error) => this.logger.error(`${this.createComment.name} - ${e}`))\n return (await this.commentQueries.getComments(user.id, space.dbFile?.ownerId === user.id, null, commentId))[0]\n }\n\n async updateComment(user: UserModel, space: SpaceEnv, updateCommentDto: CreateOrUpdateCommentDto): Promise<Comment> {\n const [comment] = await this.commentQueries.getComments(user.id, space.dbFile?.ownerId === user.id, null, updateCommentDto.commentId)\n if (!comment) {\n throw new HttpException('Location not found', HttpStatus.NOT_FOUND)\n }\n const fileId: number = await this.getFileId(space)\n if (updateCommentDto.fileId !== fileId || comment.fileId !== fileId) {\n throw new HttpException('File id mismatch', HttpStatus.BAD_REQUEST)\n }\n if (!(await this.commentQueries.updateComment(user.id, updateCommentDto.commentId, updateCommentDto.fileId, updateCommentDto.content))) {\n throw new HttpException('Unable to update', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n return (await this.commentQueries.getComments(user.id, space.dbFile?.ownerId === user.id, null, updateCommentDto.commentId))[0]\n }\n\n async deleteComment(user: UserModel, space: SpaceEnv, deleteCommentDto: DeleteCommentDto): Promise<void> {\n const fileId: number = await this.getFileId(space)\n if (deleteCommentDto.fileId !== fileId) {\n throw new HttpException('File id mismatch', HttpStatus.BAD_REQUEST)\n }\n if (!(await this.commentQueries.deleteComment(user.id, deleteCommentDto.commentId, fileId, space.dbFile?.ownerId === user.id))) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n }\n\n private async getFileId(space: SpaceEnv, fileId?: number): Promise<number> {\n if (!(await isPathExists(space.realPath))) {\n throw new HttpException('Location not found', HttpStatus.NOT_FOUND)\n }\n const fileProps: FileProps = { ...(await getProps(space.realPath, space.dbFile.path)), id: undefined }\n if (fileId) {\n // get or create\n return this.filesQueries.getOrCreateSpaceFile(fileId, fileProps, space.dbFile)\n } else {\n // get only\n return this.filesQueries.getSpaceFileId(fileProps, space.dbFile)\n }\n }\n\n async getRecents(user: UserModel, limit: number): Promise<CommentRecent[]> {\n return this.commentQueries.getRecentsFromUser(user, limit)\n }\n\n private async notify(fromUser: UserModel, fileId: number, space: SpaceEnv, comment: string): Promise<void> {\n const members: UserMailNotification[] = await this.commentQueries.membersToNotify(fromUser.id, fileId)\n if (!members.length) {\n return\n }\n const notification: NotificationContent = {\n app: NOTIFICATION_APP.COMMENTS,\n event: NOTIFICATION_APP_EVENT.COMMENTS,\n element: fileName(space.url),\n url: dirName(space.url)\n }\n this.notificationsManager\n .create(members, notification, {\n author: fromUser,\n currentUrl: this.contextManager.headerOriginUrl(),\n content: comment\n })\n .catch((e: Error) => this.logger.error(`${this.notify.name} - ${e}`))\n }\n}\n"],"names":["CommentsManager","getComments","user","space","fileId","getFileId","commentQueries","id","dbFile","ownerId","createComment","createCommentDto","spaceExternalRootId","shareExternalId","path","HttpException","HttpStatus","BAD_REQUEST","commentId","content","notify","catch","e","logger","error","name","updateComment","updateCommentDto","comment","NOT_FOUND","INTERNAL_SERVER_ERROR","deleteComment","deleteCommentDto","FORBIDDEN","isPathExists","realPath","fileProps","getProps","undefined","filesQueries","getOrCreateSpaceFile","getSpaceFileId","getRecents","limit","getRecentsFromUser","fromUser","members","membersToNotify","length","notification","app","NOTIFICATION_APP","COMMENTS","event","NOTIFICATION_APP_EVENT","element","fileName","url","dirName","notificationsManager","create","author","currentUrl","contextManager","headerOriginUrl","Logger"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/comments/services/comments-manager.service.ts"],"sourcesContent":["import { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport type { FileProps } from '../../files/interfaces/file-props.interface'\nimport { FilesQueries } from '../../files/services/files-queries.service'\nimport { dirName, fileName, getProps, isPathExists } from '../../files/utils/files'\nimport { NOTIFICATION_APP, NOTIFICATION_APP_EVENT } from '../../notifications/constants/notifications'\nimport { NotificationContent } from '../../notifications/interfaces/notification-properties.interface'\nimport { UserMailNotification } from '../../notifications/interfaces/user-mail-notification.interface'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { SpaceEnv } from '../../spaces/models/space-env.model'\nimport { UserModel } from '../../users/models/user.model'\nimport { CreateOrUpdateCommentDto, DeleteCommentDto } from '../dto/comment.dto'\nimport { CommentRecent } from '../interfaces/comment-recent.interface'\nimport type { Comment } from '../schemas/comment.interface'\nimport { CommentsQueries } from './comments-queries.service'\n\n@Injectable()\nexport class CommentsManager {\n private readonly logger = new Logger(CommentsManager.name)\n\n constructor(\n private readonly contextManager: ContextManager,\n private readonly commentQueries: CommentsQueries,\n private readonly filesQueries: FilesQueries,\n private readonly notificationsManager: NotificationsManager\n ) {}\n\n async getComments(user: UserModel, space: SpaceEnv): Promise<Comment[]> {\n const fileId: number = await this.getFileId(space)\n if (!fileId) {\n return []\n }\n return this.commentQueries.getComments(user.id, space.dbFile?.ownerId === user.id, fileId)\n }\n\n async createComment(user: UserModel, space: SpaceEnv, createCommentDto: CreateOrUpdateCommentDto): Promise<Comment> {\n if ((space.dbFile.spaceExternalRootId || space.dbFile.shareExternalId) && space.dbFile.path === '.') {\n // If path is empty a file with path = '.' and name = '.' will be created\n // The space browser does not support this kind of file and will remove it\n // Maybe to implement later\n throw new HttpException(`Not supported on this kind of ${space.dbFile.spaceExternalRootId ? 'space root' : 'share'}`, HttpStatus.BAD_REQUEST)\n }\n let fileId: number\n if (createCommentDto.fileId > 0) {\n fileId = await this.getFileId(space)\n if (createCommentDto.fileId !== fileId) {\n throw new HttpException('File id mismatch', HttpStatus.BAD_REQUEST)\n }\n } else {\n fileId = await this.getFileId(space, createCommentDto.fileId)\n }\n const commentId: number = await this.commentQueries.createComment(user.id, fileId, createCommentDto.content)\n this.notify(user, fileId, space, createCommentDto.content).catch((e: Error) => this.logger.error({ tag: this.createComment.name, msg: `${e}` }))\n return (await this.commentQueries.getComments(user.id, space.dbFile?.ownerId === user.id, null, commentId))[0]\n }\n\n async updateComment(user: UserModel, space: SpaceEnv, updateCommentDto: CreateOrUpdateCommentDto): Promise<Comment> {\n const [comment] = await this.commentQueries.getComments(user.id, space.dbFile?.ownerId === user.id, null, updateCommentDto.commentId)\n if (!comment) {\n throw new HttpException('Location not found', HttpStatus.NOT_FOUND)\n }\n const fileId: number = await this.getFileId(space)\n if (updateCommentDto.fileId !== fileId || comment.fileId !== fileId) {\n throw new HttpException('File id mismatch', HttpStatus.BAD_REQUEST)\n }\n if (!(await this.commentQueries.updateComment(user.id, updateCommentDto.commentId, updateCommentDto.fileId, updateCommentDto.content))) {\n throw new HttpException('Unable to update', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n return (await this.commentQueries.getComments(user.id, space.dbFile?.ownerId === user.id, null, updateCommentDto.commentId))[0]\n }\n\n async deleteComment(user: UserModel, space: SpaceEnv, deleteCommentDto: DeleteCommentDto): Promise<void> {\n const fileId: number = await this.getFileId(space)\n if (deleteCommentDto.fileId !== fileId) {\n throw new HttpException('File id mismatch', HttpStatus.BAD_REQUEST)\n }\n if (!(await this.commentQueries.deleteComment(user.id, deleteCommentDto.commentId, fileId, space.dbFile?.ownerId === user.id))) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n }\n\n private async getFileId(space: SpaceEnv, fileId?: number): Promise<number> {\n if (!(await isPathExists(space.realPath))) {\n throw new HttpException('Location not found', HttpStatus.NOT_FOUND)\n }\n const fileProps: FileProps = { ...(await getProps(space.realPath, space.dbFile.path)), id: undefined }\n if (fileId) {\n // get or create\n return this.filesQueries.getOrCreateSpaceFile(fileId, fileProps, space.dbFile)\n } else {\n // get only\n return this.filesQueries.getSpaceFileId(fileProps, space.dbFile)\n }\n }\n\n async getRecents(user: UserModel, limit: number): Promise<CommentRecent[]> {\n return this.commentQueries.getRecentsFromUser(user, limit)\n }\n\n private async notify(fromUser: UserModel, fileId: number, space: SpaceEnv, comment: string): Promise<void> {\n const members: UserMailNotification[] = await this.commentQueries.membersToNotify(fromUser.id, fileId)\n if (!members.length) {\n return\n }\n const notification: NotificationContent = {\n app: NOTIFICATION_APP.COMMENTS,\n event: NOTIFICATION_APP_EVENT.COMMENTS,\n element: fileName(space.url),\n url: dirName(space.url)\n }\n this.notificationsManager\n .create(members, notification, {\n author: fromUser,\n currentUrl: this.contextManager.headerOriginUrl(),\n content: comment\n })\n .catch((e: Error) => this.logger.error({ tag: this.notify.name, msg: `${e}` }))\n }\n}\n"],"names":["CommentsManager","getComments","user","space","fileId","getFileId","commentQueries","id","dbFile","ownerId","createComment","createCommentDto","spaceExternalRootId","shareExternalId","path","HttpException","HttpStatus","BAD_REQUEST","commentId","content","notify","catch","e","logger","error","tag","name","msg","updateComment","updateCommentDto","comment","NOT_FOUND","INTERNAL_SERVER_ERROR","deleteComment","deleteCommentDto","FORBIDDEN","isPathExists","realPath","fileProps","getProps","undefined","filesQueries","getOrCreateSpaceFile","getSpaceFileId","getRecents","limit","getRecentsFromUser","fromUser","members","membersToNotify","length","notification","app","NOTIFICATION_APP","COMMENTS","event","NOTIFICATION_APP_EVENT","element","fileName","url","dirName","notificationsManager","create","author","currentUrl","contextManager","headerOriginUrl","Logger"],"mappings":";;;;+BAiBaA;;;eAAAA;;;wBAjBiD;uCAC/B;qCAEF;uBAC6B;+BACD;6CAGpB;wCAML;;;;;;;;;;AAGzB,IAAA,AAAMA,kBAAN,MAAMA;IAUX,MAAMC,YAAYC,IAAe,EAAEC,KAAe,EAAsB;QACtE,MAAMC,SAAiB,MAAM,IAAI,CAACC,SAAS,CAACF;QAC5C,IAAI,CAACC,QAAQ;YACX,OAAO,EAAE;QACX;QACA,OAAO,IAAI,CAACE,cAAc,CAACL,WAAW,CAACC,KAAKK,EAAE,EAAEJ,MAAMK,MAAM,EAAEC,YAAYP,KAAKK,EAAE,EAAEH;IACrF;IAEA,MAAMM,cAAcR,IAAe,EAAEC,KAAe,EAAEQ,gBAA0C,EAAoB;QAClH,IAAI,AAACR,CAAAA,MAAMK,MAAM,CAACI,mBAAmB,IAAIT,MAAMK,MAAM,CAACK,eAAe,AAAD,KAAMV,MAAMK,MAAM,CAACM,IAAI,KAAK,KAAK;YACnG,yEAAyE;YACzE,0EAA0E;YAC1E,2BAA2B;YAC3B,MAAM,IAAIC,qBAAa,CAAC,CAAC,8BAA8B,EAAEZ,MAAMK,MAAM,CAACI,mBAAmB,GAAG,eAAe,SAAS,EAAEI,kBAAU,CAACC,WAAW;QAC9I;QACA,IAAIb;QACJ,IAAIO,iBAAiBP,MAAM,GAAG,GAAG;YAC/BA,SAAS,MAAM,IAAI,CAACC,SAAS,CAACF;YAC9B,IAAIQ,iBAAiBP,MAAM,KAAKA,QAAQ;gBACtC,MAAM,IAAIW,qBAAa,CAAC,oBAAoBC,kBAAU,CAACC,WAAW;YACpE;QACF,OAAO;YACLb,SAAS,MAAM,IAAI,CAACC,SAAS,CAACF,OAAOQ,iBAAiBP,MAAM;QAC9D;QACA,MAAMc,YAAoB,MAAM,IAAI,CAACZ,cAAc,CAACI,aAAa,CAACR,KAAKK,EAAE,EAAEH,QAAQO,iBAAiBQ,OAAO;QAC3G,IAAI,CAACC,MAAM,CAAClB,MAAME,QAAQD,OAAOQ,iBAAiBQ,OAAO,EAAEE,KAAK,CAAC,CAACC,IAAa,IAAI,CAACC,MAAM,CAACC,KAAK,CAAC;gBAAEC,KAAK,IAAI,CAACf,aAAa,CAACgB,IAAI;gBAAEC,KAAK,GAAGL,GAAG;YAAC;QAC7I,OAAO,AAAC,CAAA,MAAM,IAAI,CAAChB,cAAc,CAACL,WAAW,CAACC,KAAKK,EAAE,EAAEJ,MAAMK,MAAM,EAAEC,YAAYP,KAAKK,EAAE,EAAE,MAAMW,UAAS,CAAE,CAAC,EAAE;IAChH;IAEA,MAAMU,cAAc1B,IAAe,EAAEC,KAAe,EAAE0B,gBAA0C,EAAoB;QAClH,MAAM,CAACC,QAAQ,GAAG,MAAM,IAAI,CAACxB,cAAc,CAACL,WAAW,CAACC,KAAKK,EAAE,EAAEJ,MAAMK,MAAM,EAAEC,YAAYP,KAAKK,EAAE,EAAE,MAAMsB,iBAAiBX,SAAS;QACpI,IAAI,CAACY,SAAS;YACZ,MAAM,IAAIf,qBAAa,CAAC,sBAAsBC,kBAAU,CAACe,SAAS;QACpE;QACA,MAAM3B,SAAiB,MAAM,IAAI,CAACC,SAAS,CAACF;QAC5C,IAAI0B,iBAAiBzB,MAAM,KAAKA,UAAU0B,QAAQ1B,MAAM,KAAKA,QAAQ;YACnE,MAAM,IAAIW,qBAAa,CAAC,oBAAoBC,kBAAU,CAACC,WAAW;QACpE;QACA,IAAI,CAAE,MAAM,IAAI,CAACX,cAAc,CAACsB,aAAa,CAAC1B,KAAKK,EAAE,EAAEsB,iBAAiBX,SAAS,EAAEW,iBAAiBzB,MAAM,EAAEyB,iBAAiBV,OAAO,GAAI;YACtI,MAAM,IAAIJ,qBAAa,CAAC,oBAAoBC,kBAAU,CAACgB,qBAAqB;QAC9E;QACA,OAAO,AAAC,CAAA,MAAM,IAAI,CAAC1B,cAAc,CAACL,WAAW,CAACC,KAAKK,EAAE,EAAEJ,MAAMK,MAAM,EAAEC,YAAYP,KAAKK,EAAE,EAAE,MAAMsB,iBAAiBX,SAAS,CAAA,CAAE,CAAC,EAAE;IACjI;IAEA,MAAMe,cAAc/B,IAAe,EAAEC,KAAe,EAAE+B,gBAAkC,EAAiB;QACvG,MAAM9B,SAAiB,MAAM,IAAI,CAACC,SAAS,CAACF;QAC5C,IAAI+B,iBAAiB9B,MAAM,KAAKA,QAAQ;YACtC,MAAM,IAAIW,qBAAa,CAAC,oBAAoBC,kBAAU,CAACC,WAAW;QACpE;QACA,IAAI,CAAE,MAAM,IAAI,CAACX,cAAc,CAAC2B,aAAa,CAAC/B,KAAKK,EAAE,EAAE2B,iBAAiBhB,SAAS,EAAEd,QAAQD,MAAMK,MAAM,EAAEC,YAAYP,KAAKK,EAAE,GAAI;YAC9H,MAAM,IAAIQ,qBAAa,CAAC,yCAAyCC,kBAAU,CAACmB,SAAS;QACvF;IACF;IAEA,MAAc9B,UAAUF,KAAe,EAAEC,MAAe,EAAmB;QACzE,IAAI,CAAE,MAAMgC,IAAAA,mBAAY,EAACjC,MAAMkC,QAAQ,GAAI;YACzC,MAAM,IAAItB,qBAAa,CAAC,sBAAsBC,kBAAU,CAACe,SAAS;QACpE;QACA,MAAMO,YAAuB;YAAE,GAAI,MAAMC,IAAAA,eAAQ,EAACpC,MAAMkC,QAAQ,EAAElC,MAAMK,MAAM,CAACM,IAAI,CAAC;YAAGP,IAAIiC;QAAU;QACrG,IAAIpC,QAAQ;YACV,gBAAgB;YAChB,OAAO,IAAI,CAACqC,YAAY,CAACC,oBAAoB,CAACtC,QAAQkC,WAAWnC,MAAMK,MAAM;QAC/E,OAAO;YACL,WAAW;YACX,OAAO,IAAI,CAACiC,YAAY,CAACE,cAAc,CAACL,WAAWnC,MAAMK,MAAM;QACjE;IACF;IAEA,MAAMoC,WAAW1C,IAAe,EAAE2C,KAAa,EAA4B;QACzE,OAAO,IAAI,CAACvC,cAAc,CAACwC,kBAAkB,CAAC5C,MAAM2C;IACtD;IAEA,MAAczB,OAAO2B,QAAmB,EAAE3C,MAAc,EAAED,KAAe,EAAE2B,OAAe,EAAiB;QACzG,MAAMkB,UAAkC,MAAM,IAAI,CAAC1C,cAAc,CAAC2C,eAAe,CAACF,SAASxC,EAAE,EAAEH;QAC/F,IAAI,CAAC4C,QAAQE,MAAM,EAAE;YACnB;QACF;QACA,MAAMC,eAAoC;YACxCC,KAAKC,+BAAgB,CAACC,QAAQ;YAC9BC,OAAOC,qCAAsB,CAACF,QAAQ;YACtCG,SAASC,IAAAA,eAAQ,EAACvD,MAAMwD,GAAG;YAC3BA,KAAKC,IAAAA,cAAO,EAACzD,MAAMwD,GAAG;QACxB;QACA,IAAI,CAACE,oBAAoB,CACtBC,MAAM,CAACd,SAASG,cAAc;YAC7BY,QAAQhB;YACRiB,YAAY,IAAI,CAACC,cAAc,CAACC,eAAe;YAC/C/C,SAASW;QACX,GACCT,KAAK,CAAC,CAACC,IAAa,IAAI,CAACC,MAAM,CAACC,KAAK,CAAC;gBAAEC,KAAK,IAAI,CAACL,MAAM,CAACM,IAAI;gBAAEC,KAAK,GAAGL,GAAG;YAAC;IAChF;IAjGA,YACE,AAAiB2C,cAA8B,EAC/C,AAAiB3D,cAA+B,EAChD,AAAiBmC,YAA0B,EAC3C,AAAiBoB,oBAA0C,CAC3D;aAJiBI,iBAAAA;aACA3D,iBAAAA;aACAmC,eAAAA;aACAoB,uBAAAA;aANFtC,SAAS,IAAI4C,cAAM,CAACnE,gBAAgB0B,IAAI;IAOtD;AA6FL"}
|
|
@@ -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
|
});
|
|
@@ -222,7 +218,9 @@ describe(_commentsmanagerservice.CommentsManager.name, ()=>{
|
|
|
222
218
|
content: 'hello'
|
|
223
219
|
});
|
|
224
220
|
// Verify that the catch of createComment logged the error
|
|
225
|
-
expect(loggerSpy).toHaveBeenCalledWith(expect.
|
|
221
|
+
expect(loggerSpy).toHaveBeenCalledWith(expect.objectContaining({
|
|
222
|
+
tag: 'createComment'
|
|
223
|
+
}));
|
|
226
224
|
loggerSpy.mockRestore();
|
|
227
225
|
});
|
|
228
226
|
it('notifies members when present', async ()=>{
|
|
@@ -252,7 +250,9 @@ describe(_commentsmanagerservice.CommentsManager.name, ()=>{
|
|
|
252
250
|
await new Promise((r)=>setImmediate(r));
|
|
253
251
|
expect(notificationsManager.create).toHaveBeenCalledTimes(1);
|
|
254
252
|
notificationsManager.create.mockClear();
|
|
255
|
-
expect(loggerSpy).toHaveBeenCalledWith(expect.
|
|
253
|
+
expect(loggerSpy).toHaveBeenCalledWith(expect.objectContaining({
|
|
254
|
+
tag: 'notify'
|
|
255
|
+
}));
|
|
256
256
|
loggerSpy.mockRestore();
|
|
257
257
|
const space = makeSpace();
|
|
258
258
|
await commentsManager.createComment(user, space, {
|
|
@@ -308,7 +308,9 @@ describe(_commentsmanagerservice.CommentsManager.name, ()=>{
|
|
|
308
308
|
// Allow the microtask to run the internal catch of notify()
|
|
309
309
|
await new Promise((r)=>setImmediate(r));
|
|
310
310
|
expect(notificationsManager.create).toHaveBeenCalledTimes(1);
|
|
311
|
-
expect(loggerSpy).toHaveBeenCalledWith(expect.
|
|
311
|
+
expect(loggerSpy).toHaveBeenCalledWith(expect.objectContaining({
|
|
312
|
+
tag: 'notify'
|
|
313
|
+
}));
|
|
312
314
|
loggerSpy.mockRestore();
|
|
313
315
|
});
|
|
314
316
|
it('does not notify if no members', async ()=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../backend/src/applications/comments/services/comments-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, HttpStatus } from '@nestjs/common'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport { FilesQueries } from '../../files/services/files-queries.service'\nimport { dirName, fileName, getProps, isPathExists } from '../../files/utils/files'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { SharesQueries } from '../../shares/services/shares-queries.service'\nimport { SpacesQueries } from '../../spaces/services/spaces-queries.service'\nimport { CommentsManager } from './comments-manager.service'\nimport { CommentsQueries } from './comments-queries.service'\n\n// Mocks of the file utilities used by the service\njest.mock('../../files/utils/files', () => ({\n isPathExists: jest.fn(),\n getProps: jest.fn(),\n dirName: jest.fn(),\n fileName: jest.fn()\n}))\n\ndescribe(CommentsManager.name, () => {\n let commentsManager: CommentsManager\n let contextManager: { headerOriginUrl: jest.Mock }\n let commentQueries: {\n getComments: jest.Mock\n createComment: jest.Mock\n updateComment: jest.Mock\n deleteComment: jest.Mock\n getRecentsFromUser: jest.Mock\n membersToNotify: jest.Mock\n }\n let filesQueries: {\n getSpaceFileId: jest.Mock\n getOrCreateSpaceFile: jest.Mock\n }\n let notificationsManager: { create: jest.Mock }\n\n const user = { id: 42, email: 'john@doe.tld' } as any\n\n const makeSpace = (overrides: Partial<any> = {}) =>\n ({\n realPath: '/real/path',\n url: '/space/folder/file.txt',\n dbFile: {\n path: 'folder',\n ownerId: 42,\n spaceExternalRootId: null,\n shareExternalId: null\n },\n ...overrides\n }) as any\n\n beforeAll(async () => {\n commentQueries = {\n getComments: jest.fn(),\n createComment: jest.fn(),\n updateComment: jest.fn(),\n deleteComment: jest.fn(),\n getRecentsFromUser: jest.fn(),\n membersToNotify: jest.fn()\n }\n filesQueries = {\n getSpaceFileId: jest.fn(),\n getOrCreateSpaceFile: jest.fn()\n }\n notificationsManager = {\n create: jest.fn().mockResolvedValue(undefined)\n }\n contextManager = {\n headerOriginUrl: jest.fn().mockReturnValue('https://app.local/path')\n }\n\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n {\n provide: DB_TOKEN_PROVIDER,\n useValue: {}\n },\n { provide: Cache, useValue: {} },\n { provide: NotificationsManager, useValue: notificationsManager },\n { provide: ContextManager, useValue: contextManager },\n { provide: CommentsManager, useClass: CommentsManager },\n { provide: CommentsQueries, useValue: commentQueries },\n { provide: FilesQueries, useValue: filesQueries },\n { provide: SpacesQueries, useValue: {} },\n { provide: SharesQueries, useValue: {} }\n ]\n }).compile()\n\n commentsManager = module.get<CommentsManager>(CommentsManager)\n })\n\n beforeEach(() => {\n jest.clearAllMocks()\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(getProps as jest.Mock).mockResolvedValue({ name: 'file.txt', path: 'folder' })\n ;(dirName as jest.Mock).mockReturnValue('/space/folder')\n ;(fileName as jest.Mock).mockReturnValue('file.txt')\n })\n\n it('should be defined', () => {\n expect(commentsManager).toBeDefined()\n })\n\n describe('getComments', () => {\n it('returns [] if no fileId', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(0)\n\n const res = await commentsManager.getComments(user, makeSpace())\n\n expect(res).toEqual([])\n expect(filesQueries.getSpaceFileId).toHaveBeenCalledTimes(1)\n expect(commentQueries.getComments).not.toHaveBeenCalled()\n })\n\n it('returns comments if fileId is valid', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(123)\n const expected = [{ id: 1 }, { id: 2 }]\n commentQueries.getComments.mockResolvedValue(expected)\n\n const res = await commentsManager.getComments(user, makeSpace())\n\n expect(filesQueries.getSpaceFileId).toHaveBeenCalled()\n expect(commentQueries.getComments).toHaveBeenCalledWith(42, true, 123)\n expect(res).toBe(expected)\n })\n\n it('throws NOT_FOUND if path does not exist', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n\n await expect(commentsManager.getComments(user, makeSpace())).rejects.toThrow(HttpException)\n await expect(commentsManager.getComments(user, makeSpace())).rejects.toMatchObject({ status: HttpStatus.NOT_FOUND })\n })\n })\n\n describe('createComment', () => {\n it(\"rejects on external root/share at path '.'\", async () => {\n const space = makeSpace({\n dbFile: { path: '.', ownerId: 42, spaceExternalRootId: 'ext', shareExternalId: null }\n })\n await expect(commentsManager.createComment(user, space, { fileId: 0, content: 'Hi' } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST\n })\n\n const space2 = makeSpace({\n dbFile: { path: '.', ownerId: 42, spaceExternalRootId: null, shareExternalId: 'shr' }\n })\n await expect(commentsManager.createComment(user, space2, { fileId: 0, content: 'Hi' } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST\n })\n })\n\n it('rejects BAD_REQUEST if provided fileId mismatches', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(100)\n\n await expect(commentsManager.createComment(user, makeSpace(), { fileId: 101, content: 'x' } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST\n })\n })\n\n it('uses getOrCreate when fileId < 0', async () => {\n filesQueries.getOrCreateSpaceFile.mockResolvedValue(555)\n commentQueries.createComment.mockResolvedValue(777)\n commentQueries.getComments.mockResolvedValue([{ id: 777, fileId: 555, content: 'hello' }])\n // Force a rejection in notify() to cover the catch attached to this.notify(...) in createComment\n commentQueries.membersToNotify.mockRejectedValueOnce(new Error('members failed'))\n const loggerSpy = jest.spyOn(commentsManager['logger'], 'error').mockImplementation(() => undefined as any)\n\n const res = await commentsManager.createComment(user, makeSpace(), { fileId: -1, content: 'hello' } as any)\n // Let the microtask run the catch of createComment\n await new Promise((r) => setImmediate(r))\n\n expect(filesQueries.getOrCreateSpaceFile).toHaveBeenCalled()\n expect(filesQueries.getSpaceFileId).not.toHaveBeenCalled()\n expect(commentQueries.createComment).toHaveBeenCalledWith(42, 555, 'hello')\n expect(notificationsManager.create).not.toHaveBeenCalled()\n expect(res).toEqual({ id: 777, fileId: 555, content: 'hello' })\n // Verify that the catch of createComment logged the error\n expect(loggerSpy).toHaveBeenCalledWith(expect.stringContaining('createComment'))\n loggerSpy.mockRestore()\n })\n\n it('notifies members when present', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(10)\n commentQueries.createComment.mockResolvedValue(1)\n commentQueries.getComments.mockResolvedValue([{ id: 1, fileId: 10, content: 'c' }])\n commentQueries.membersToNotify.mockResolvedValue([{ id: 2, email: 'a@b.c' }])\n // Force rejection of notification creation to trigger the catch in notify()\n notificationsManager.create.mockRejectedValueOnce(new Error('notify failed'))\n const loggerSpy = jest.spyOn(commentsManager['logger'], 'error').mockImplementation(() => undefined as any)\n\n await commentsManager.createComment(user, makeSpace(), { fileId: 10, content: 'c' } as any)\n // Let the microtask execute the internal catch of notify()\n await new Promise((r) => setImmediate(r))\n\n expect(notificationsManager.create).toHaveBeenCalledTimes(1)\n notificationsManager.create.mockClear()\n expect(loggerSpy).toHaveBeenCalledWith(expect.stringContaining('notify'))\n loggerSpy.mockRestore()\n\n const space = makeSpace()\n await commentsManager.createComment(user, space, { fileId: 10, content: 'c' } as any)\n\n expect(commentQueries.membersToNotify).toHaveBeenCalledWith(42, 10)\n expect(notificationsManager.create).toHaveBeenCalledTimes(1)\n const [members, notification, data] = notificationsManager.create.mock.calls[0]\n expect(members).toEqual([{ id: 2, email: 'a@b.c' }])\n expect(notification).toMatchObject({\n app: expect.anything(),\n event: expect.anything(),\n element: 'file.txt',\n url: '/space/folder'\n })\n expect(fileName).toHaveBeenCalledWith(space.url)\n expect(dirName).toHaveBeenCalledWith(space.url)\n expect(data).toMatchObject({\n author: user,\n currentUrl: 'https://app.local/path',\n content: 'c'\n })\n })\n\n it('logs an error if notificationsManager.create rejects (covers catch in notify)', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(10)\n commentQueries.createComment.mockResolvedValue(1)\n commentQueries.getComments.mockResolvedValue([{ id: 1, fileId: 10, content: 'c' }])\n commentQueries.membersToNotify.mockResolvedValue([{ id: 2, email: 'a@b.c' }])\n // Force rejection to trigger the catch in notify()\n notificationsManager.create.mockRejectedValueOnce(new Error('notify failed'))\n const loggerSpy = jest.spyOn(commentsManager['logger'], 'error').mockImplementation(() => undefined as any)\n\n await commentsManager.createComment(user, makeSpace(), { fileId: 10, content: 'c' } as any)\n // Allow the microtask to run the internal catch of notify()\n await new Promise((r) => setImmediate(r))\n\n expect(notificationsManager.create).toHaveBeenCalledTimes(1)\n expect(loggerSpy).toHaveBeenCalledWith(expect.stringContaining('notify'))\n loggerSpy.mockRestore()\n })\n\n it('does not notify if no members', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(10)\n commentQueries.createComment.mockResolvedValue(1)\n commentQueries.getComments.mockResolvedValue([{ id: 1 }])\n commentQueries.membersToNotify.mockResolvedValue([])\n\n await commentsManager.createComment(user, makeSpace(), { fileId: 10, content: 'c' } as any)\n\n expect(notificationsManager.create).not.toHaveBeenCalled()\n })\n })\n\n describe('updateComment', () => {\n it('rejects NOT_FOUND if target comment is not found', async () => {\n commentQueries.getComments.mockResolvedValue([])\n\n await expect(commentsManager.updateComment(user, makeSpace(), { commentId: 99, fileId: 1, content: 'z' } as any)).rejects.toMatchObject({\n status: HttpStatus.NOT_FOUND\n })\n })\n\n it('rejects BAD_REQUEST if fileId mismatches', async () => {\n commentQueries.getComments.mockResolvedValue([{ id: 50, fileId: 123 }])\n filesQueries.getSpaceFileId.mockResolvedValue(999)\n\n await expect(commentsManager.updateComment(user, makeSpace(), { commentId: 50, fileId: 123, content: 'z' } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST\n })\n })\n\n it('rejects INTERNAL_SERVER_ERROR if update fails', async () => {\n commentQueries.getComments.mockResolvedValueOnce([{ id: 50, fileId: 5 }])\n filesQueries.getSpaceFileId.mockResolvedValue(5)\n commentQueries.updateComment.mockResolvedValue(false)\n\n await expect(commentsManager.updateComment(user, makeSpace(), { commentId: 50, fileId: 5, content: 'z' } as any)).rejects.toMatchObject({\n status: HttpStatus.INTERNAL_SERVER_ERROR\n })\n })\n\n it('returns the comment after update', async () => {\n commentQueries.getComments\n .mockResolvedValueOnce([{ id: 50, fileId: 5 }]) // initial fetch\n .mockResolvedValueOnce([{ id: 50, fileId: 5, content: 'updated' }]) // fetch after update -> include content\n filesQueries.getSpaceFileId.mockResolvedValue(5)\n commentQueries.updateComment.mockResolvedValue(true)\n\n const res = await commentsManager.updateComment(user, makeSpace(), { commentId: 50, fileId: 5, content: 'updated' } as any)\n\n expect(commentQueries.updateComment).toHaveBeenCalledWith(42, 50, 5, 'updated')\n // allow additional fields via toMatchObject\n expect(res).toMatchObject({ id: 50, fileId: 5, content: 'updated' })\n })\n })\n\n describe('deleteComment', () => {\n it('rejects BAD_REQUEST if fileId mismatches', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(10)\n\n await expect(commentsManager.deleteComment(user, makeSpace(), { commentId: 1, fileId: 11 } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST\n })\n })\n\n it('rejects FORBIDDEN if deletion is denied', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(10)\n commentQueries.deleteComment.mockResolvedValue(false)\n\n await expect(commentsManager.deleteComment(user, makeSpace(), { commentId: 1, fileId: 10 } as any)).rejects.toMatchObject({\n status: HttpStatus.FORBIDDEN\n })\n })\n\n it('resolves when deletion succeeds', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(10)\n commentQueries.deleteComment.mockResolvedValue(true)\n\n await expect(commentsManager.deleteComment(user, makeSpace(), { commentId: 1, fileId: 10 } as any)).resolves.toBeUndefined()\n })\n })\n\n describe('getRecents', () => {\n it('delegates to commentQueries.getRecentsFromUser', async () => {\n const recents = [{ id: 1 }, { id: 2 }]\n commentQueries.getRecentsFromUser.mockResolvedValue(recents)\n\n const res = await commentsManager.getRecents(user, 5)\n\n expect(commentQueries.getRecentsFromUser).toHaveBeenCalledWith(user, 5)\n expect(res).toBe(recents)\n })\n })\n})\n"],"names":["jest","mock","isPathExists","fn","getProps","dirName","fileName","describe","CommentsManager","name","commentsManager","contextManager","commentQueries","filesQueries","notificationsManager","user","id","email","makeSpace","overrides","realPath","url","dbFile","path","ownerId","spaceExternalRootId","shareExternalId","beforeAll","getComments","createComment","updateComment","deleteComment","getRecentsFromUser","membersToNotify","getSpaceFileId","getOrCreateSpaceFile","create","mockResolvedValue","undefined","headerOriginUrl","mockReturnValue","module","Test","createTestingModule","providers","provide","DB_TOKEN_PROVIDER","useValue","Cache","NotificationsManager","ContextManager","useClass","CommentsQueries","FilesQueries","SpacesQueries","SharesQueries","compile","get","beforeEach","clearAllMocks","it","expect","toBeDefined","res","toEqual","toHaveBeenCalledTimes","not","toHaveBeenCalled","expected","toHaveBeenCalledWith","toBe","rejects","toThrow","HttpException","toMatchObject","status","HttpStatus","NOT_FOUND","space","fileId","content","BAD_REQUEST","space2","mockRejectedValueOnce","Error","loggerSpy","spyOn","mockImplementation","Promise","r","setImmediate","stringContaining","mockRestore","mockClear","members","notification","data","calls","app","anything","event","element","author","currentUrl","commentId","mockResolvedValueOnce","INTERNAL_SERVER_ERROR","FORBIDDEN","resolves","toBeUndefined","recents","getRecents"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/comments/services/comments-manager.service.spec.ts"],"sourcesContent":["import { HttpException, HttpStatus } from '@nestjs/common'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport { FilesQueries } from '../../files/services/files-queries.service'\nimport { dirName, fileName, getProps, isPathExists } from '../../files/utils/files'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { SharesQueries } from '../../shares/services/shares-queries.service'\nimport { SpacesQueries } from '../../spaces/services/spaces-queries.service'\nimport { CommentsManager } from './comments-manager.service'\nimport { CommentsQueries } from './comments-queries.service'\n\n// Mocks of the file utilities used by the service\njest.mock('../../files/utils/files', () => ({\n isPathExists: jest.fn(),\n getProps: jest.fn(),\n dirName: jest.fn(),\n fileName: jest.fn()\n}))\n\ndescribe(CommentsManager.name, () => {\n let commentsManager: CommentsManager\n let contextManager: { headerOriginUrl: jest.Mock }\n let commentQueries: {\n getComments: jest.Mock\n createComment: jest.Mock\n updateComment: jest.Mock\n deleteComment: jest.Mock\n getRecentsFromUser: jest.Mock\n membersToNotify: jest.Mock\n }\n let filesQueries: {\n getSpaceFileId: jest.Mock\n getOrCreateSpaceFile: jest.Mock\n }\n let notificationsManager: { create: jest.Mock }\n\n const user = { id: 42, email: 'john@doe.tld' } as any\n\n const makeSpace = (overrides: Partial<any> = {}) =>\n ({\n realPath: '/real/path',\n url: '/space/folder/file.txt',\n dbFile: {\n path: 'folder',\n ownerId: 42,\n spaceExternalRootId: null,\n shareExternalId: null\n },\n ...overrides\n }) as any\n\n beforeAll(async () => {\n commentQueries = {\n getComments: jest.fn(),\n createComment: jest.fn(),\n updateComment: jest.fn(),\n deleteComment: jest.fn(),\n getRecentsFromUser: jest.fn(),\n membersToNotify: jest.fn()\n }\n filesQueries = {\n getSpaceFileId: jest.fn(),\n getOrCreateSpaceFile: jest.fn()\n }\n notificationsManager = {\n create: jest.fn().mockResolvedValue(undefined)\n }\n contextManager = {\n headerOriginUrl: jest.fn().mockReturnValue('https://app.local/path')\n }\n\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n {\n provide: DB_TOKEN_PROVIDER,\n useValue: {}\n },\n { provide: Cache, useValue: {} },\n { provide: NotificationsManager, useValue: notificationsManager },\n { provide: ContextManager, useValue: contextManager },\n { provide: CommentsManager, useClass: CommentsManager },\n { provide: CommentsQueries, useValue: commentQueries },\n { provide: FilesQueries, useValue: filesQueries },\n { provide: SpacesQueries, useValue: {} },\n { provide: SharesQueries, useValue: {} }\n ]\n }).compile()\n\n commentsManager = module.get<CommentsManager>(CommentsManager)\n })\n\n beforeEach(() => {\n jest.clearAllMocks()\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(getProps as jest.Mock).mockResolvedValue({ name: 'file.txt', path: 'folder' })\n ;(dirName as jest.Mock).mockReturnValue('/space/folder')\n ;(fileName as jest.Mock).mockReturnValue('file.txt')\n })\n\n it('should be defined', () => {\n expect(commentsManager).toBeDefined()\n })\n\n describe('getComments', () => {\n it('returns [] if no fileId', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(0)\n\n const res = await commentsManager.getComments(user, makeSpace())\n\n expect(res).toEqual([])\n expect(filesQueries.getSpaceFileId).toHaveBeenCalledTimes(1)\n expect(commentQueries.getComments).not.toHaveBeenCalled()\n })\n\n it('returns comments if fileId is valid', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(123)\n const expected = [{ id: 1 }, { id: 2 }]\n commentQueries.getComments.mockResolvedValue(expected)\n\n const res = await commentsManager.getComments(user, makeSpace())\n\n expect(filesQueries.getSpaceFileId).toHaveBeenCalled()\n expect(commentQueries.getComments).toHaveBeenCalledWith(42, true, 123)\n expect(res).toBe(expected)\n })\n\n it('throws NOT_FOUND if path does not exist', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n\n await expect(commentsManager.getComments(user, makeSpace())).rejects.toThrow(HttpException)\n await expect(commentsManager.getComments(user, makeSpace())).rejects.toMatchObject({ status: HttpStatus.NOT_FOUND })\n })\n })\n\n describe('createComment', () => {\n it(\"rejects on external root/share at path '.'\", async () => {\n const space = makeSpace({\n dbFile: { path: '.', ownerId: 42, spaceExternalRootId: 'ext', shareExternalId: null }\n })\n await expect(commentsManager.createComment(user, space, { fileId: 0, content: 'Hi' } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST\n })\n\n const space2 = makeSpace({\n dbFile: { path: '.', ownerId: 42, spaceExternalRootId: null, shareExternalId: 'shr' }\n })\n await expect(commentsManager.createComment(user, space2, { fileId: 0, content: 'Hi' } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST\n })\n })\n\n it('rejects BAD_REQUEST if provided fileId mismatches', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(100)\n\n await expect(commentsManager.createComment(user, makeSpace(), { fileId: 101, content: 'x' } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST\n })\n })\n\n it('uses getOrCreate when fileId < 0', async () => {\n filesQueries.getOrCreateSpaceFile.mockResolvedValue(555)\n commentQueries.createComment.mockResolvedValue(777)\n commentQueries.getComments.mockResolvedValue([{ id: 777, fileId: 555, content: 'hello' }])\n // Force a rejection in notify() to cover the catch attached to this.notify(...) in createComment\n commentQueries.membersToNotify.mockRejectedValueOnce(new Error('members failed'))\n const loggerSpy = jest.spyOn(commentsManager['logger'], 'error').mockImplementation(() => undefined as any)\n\n const res = await commentsManager.createComment(user, makeSpace(), { fileId: -1, content: 'hello' } as any)\n // Let the microtask run the catch of createComment\n await new Promise((r) => setImmediate(r))\n\n expect(filesQueries.getOrCreateSpaceFile).toHaveBeenCalled()\n expect(filesQueries.getSpaceFileId).not.toHaveBeenCalled()\n expect(commentQueries.createComment).toHaveBeenCalledWith(42, 555, 'hello')\n expect(notificationsManager.create).not.toHaveBeenCalled()\n expect(res).toEqual({ id: 777, fileId: 555, content: 'hello' })\n // Verify that the catch of createComment logged the error\n expect(loggerSpy).toHaveBeenCalledWith(expect.objectContaining({ tag: 'createComment' }))\n loggerSpy.mockRestore()\n })\n\n it('notifies members when present', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(10)\n commentQueries.createComment.mockResolvedValue(1)\n commentQueries.getComments.mockResolvedValue([{ id: 1, fileId: 10, content: 'c' }])\n commentQueries.membersToNotify.mockResolvedValue([{ id: 2, email: 'a@b.c' }])\n // Force rejection of notification creation to trigger the catch in notify()\n notificationsManager.create.mockRejectedValueOnce(new Error('notify failed'))\n const loggerSpy = jest.spyOn(commentsManager['logger'], 'error').mockImplementation(() => undefined as any)\n\n await commentsManager.createComment(user, makeSpace(), { fileId: 10, content: 'c' } as any)\n // Let the microtask execute the internal catch of notify()\n await new Promise((r) => setImmediate(r))\n\n expect(notificationsManager.create).toHaveBeenCalledTimes(1)\n notificationsManager.create.mockClear()\n expect(loggerSpy).toHaveBeenCalledWith(expect.objectContaining({ tag: 'notify' }))\n loggerSpy.mockRestore()\n\n const space = makeSpace()\n await commentsManager.createComment(user, space, { fileId: 10, content: 'c' } as any)\n\n expect(commentQueries.membersToNotify).toHaveBeenCalledWith(42, 10)\n expect(notificationsManager.create).toHaveBeenCalledTimes(1)\n const [members, notification, data] = notificationsManager.create.mock.calls[0]\n expect(members).toEqual([{ id: 2, email: 'a@b.c' }])\n expect(notification).toMatchObject({\n app: expect.anything(),\n event: expect.anything(),\n element: 'file.txt',\n url: '/space/folder'\n })\n expect(fileName).toHaveBeenCalledWith(space.url)\n expect(dirName).toHaveBeenCalledWith(space.url)\n expect(data).toMatchObject({\n author: user,\n currentUrl: 'https://app.local/path',\n content: 'c'\n })\n })\n\n it('logs an error if notificationsManager.create rejects (covers catch in notify)', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(10)\n commentQueries.createComment.mockResolvedValue(1)\n commentQueries.getComments.mockResolvedValue([{ id: 1, fileId: 10, content: 'c' }])\n commentQueries.membersToNotify.mockResolvedValue([{ id: 2, email: 'a@b.c' }])\n // Force rejection to trigger the catch in notify()\n notificationsManager.create.mockRejectedValueOnce(new Error('notify failed'))\n const loggerSpy = jest.spyOn(commentsManager['logger'], 'error').mockImplementation(() => undefined as any)\n\n await commentsManager.createComment(user, makeSpace(), { fileId: 10, content: 'c' } as any)\n // Allow the microtask to run the internal catch of notify()\n await new Promise((r) => setImmediate(r))\n\n expect(notificationsManager.create).toHaveBeenCalledTimes(1)\n expect(loggerSpy).toHaveBeenCalledWith(expect.objectContaining({ tag: 'notify' }))\n loggerSpy.mockRestore()\n })\n\n it('does not notify if no members', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(10)\n commentQueries.createComment.mockResolvedValue(1)\n commentQueries.getComments.mockResolvedValue([{ id: 1 }])\n commentQueries.membersToNotify.mockResolvedValue([])\n\n await commentsManager.createComment(user, makeSpace(), { fileId: 10, content: 'c' } as any)\n\n expect(notificationsManager.create).not.toHaveBeenCalled()\n })\n })\n\n describe('updateComment', () => {\n it('rejects NOT_FOUND if target comment is not found', async () => {\n commentQueries.getComments.mockResolvedValue([])\n\n await expect(commentsManager.updateComment(user, makeSpace(), { commentId: 99, fileId: 1, content: 'z' } as any)).rejects.toMatchObject({\n status: HttpStatus.NOT_FOUND\n })\n })\n\n it('rejects BAD_REQUEST if fileId mismatches', async () => {\n commentQueries.getComments.mockResolvedValue([{ id: 50, fileId: 123 }])\n filesQueries.getSpaceFileId.mockResolvedValue(999)\n\n await expect(commentsManager.updateComment(user, makeSpace(), { commentId: 50, fileId: 123, content: 'z' } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST\n })\n })\n\n it('rejects INTERNAL_SERVER_ERROR if update fails', async () => {\n commentQueries.getComments.mockResolvedValueOnce([{ id: 50, fileId: 5 }])\n filesQueries.getSpaceFileId.mockResolvedValue(5)\n commentQueries.updateComment.mockResolvedValue(false)\n\n await expect(commentsManager.updateComment(user, makeSpace(), { commentId: 50, fileId: 5, content: 'z' } as any)).rejects.toMatchObject({\n status: HttpStatus.INTERNAL_SERVER_ERROR\n })\n })\n\n it('returns the comment after update', async () => {\n commentQueries.getComments\n .mockResolvedValueOnce([{ id: 50, fileId: 5 }]) // initial fetch\n .mockResolvedValueOnce([{ id: 50, fileId: 5, content: 'updated' }]) // fetch after update -> include content\n filesQueries.getSpaceFileId.mockResolvedValue(5)\n commentQueries.updateComment.mockResolvedValue(true)\n\n const res = await commentsManager.updateComment(user, makeSpace(), { commentId: 50, fileId: 5, content: 'updated' } as any)\n\n expect(commentQueries.updateComment).toHaveBeenCalledWith(42, 50, 5, 'updated')\n // allow additional fields via toMatchObject\n expect(res).toMatchObject({ id: 50, fileId: 5, content: 'updated' })\n })\n })\n\n describe('deleteComment', () => {\n it('rejects BAD_REQUEST if fileId mismatches', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(10)\n\n await expect(commentsManager.deleteComment(user, makeSpace(), { commentId: 1, fileId: 11 } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST\n })\n })\n\n it('rejects FORBIDDEN if deletion is denied', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(10)\n commentQueries.deleteComment.mockResolvedValue(false)\n\n await expect(commentsManager.deleteComment(user, makeSpace(), { commentId: 1, fileId: 10 } as any)).rejects.toMatchObject({\n status: HttpStatus.FORBIDDEN\n })\n })\n\n it('resolves when deletion succeeds', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(10)\n commentQueries.deleteComment.mockResolvedValue(true)\n\n await expect(commentsManager.deleteComment(user, makeSpace(), { commentId: 1, fileId: 10 } as any)).resolves.toBeUndefined()\n })\n })\n\n describe('getRecents', () => {\n it('delegates to commentQueries.getRecentsFromUser', async () => {\n const recents = [{ id: 1 }, { id: 2 }]\n commentQueries.getRecentsFromUser.mockResolvedValue(recents)\n\n const res = await commentsManager.getRecents(user, 5)\n\n expect(commentQueries.getRecentsFromUser).toHaveBeenCalledWith(user, 5)\n expect(res).toBe(recents)\n })\n })\n})\n"],"names":["jest","mock","isPathExists","fn","getProps","dirName","fileName","describe","CommentsManager","name","commentsManager","contextManager","commentQueries","filesQueries","notificationsManager","user","id","email","makeSpace","overrides","realPath","url","dbFile","path","ownerId","spaceExternalRootId","shareExternalId","beforeAll","getComments","createComment","updateComment","deleteComment","getRecentsFromUser","membersToNotify","getSpaceFileId","getOrCreateSpaceFile","create","mockResolvedValue","undefined","headerOriginUrl","mockReturnValue","module","Test","createTestingModule","providers","provide","DB_TOKEN_PROVIDER","useValue","Cache","NotificationsManager","ContextManager","useClass","CommentsQueries","FilesQueries","SpacesQueries","SharesQueries","compile","get","beforeEach","clearAllMocks","it","expect","toBeDefined","res","toEqual","toHaveBeenCalledTimes","not","toHaveBeenCalled","expected","toHaveBeenCalledWith","toBe","rejects","toThrow","HttpException","toMatchObject","status","HttpStatus","NOT_FOUND","space","fileId","content","BAD_REQUEST","space2","mockRejectedValueOnce","Error","loggerSpy","spyOn","mockImplementation","Promise","r","setImmediate","objectContaining","tag","mockRestore","mockClear","members","notification","data","calls","app","anything","event","element","author","currentUrl","commentId","mockResolvedValueOnce","INTERNAL_SERVER_ERROR","FORBIDDEN","resolves","toBeUndefined","recents","getRecents"],"mappings":"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"}
|
|
@@ -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
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../backend/src/applications/comments/services/comments-queries.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 { Inject, Injectable } from '@nestjs/common'\nimport { and, desc, eq, getTableColumns, inArray, isNotNull, isNull, ne, or, SelectedFields, SQL, sql } from 'drizzle-orm'\nimport { alias, union } from 'drizzle-orm/mysql-core'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport type { DBSchema } from '../../../infrastructure/database/interfaces/database.interface'\nimport { dbCheckAffectedRows, dbGetInsertedId } from '../../../infrastructure/database/utils'\nimport { filePathSQL, files } from '../../files/schemas/files.schema'\nimport { UserMailNotification } from '../../notifications/interfaces/user-mail-notification.interface'\nimport { shares } from '../../shares/schemas/shares.schema'\nimport { SharesQueries } from '../../shares/services/shares-queries.service'\nimport { SPACE_ALIAS, SPACE_REPOSITORY } from '../../spaces/constants/spaces'\nimport { spacesRoots } from '../../spaces/schemas/spaces-roots.schema'\nimport { spaces } from '../../spaces/schemas/spaces.schema'\nimport { SpacesQueries } from '../../spaces/services/spaces-queries.service'\nimport { UserModel } from '../../users/models/user.model'\nimport { userFullNameSQL, users } from '../../users/schemas/users.schema'\nimport { CommentRecent } from '../interfaces/comment-recent.interface'\nimport { Comment } from '../schemas/comment.interface'\nimport { comments } from '../schemas/comments.schema'\n\n@Injectable()\nexport class CommentsQueries {\n constructor(\n @Inject(DB_TOKEN_PROVIDER) private readonly db: DBSchema,\n private readonly spacesQueries: SpacesQueries,\n private readonly sharesQueries: SharesQueries\n ) {}\n\n getComments(userId: number, isFileOwner: boolean, fromFileId?: number, fromCommentId?: number, limit: number = undefined): Promise<Comment[]> {\n let where: SQL\n if (fromFileId) {\n where = eq(comments.fileId, fromFileId)\n } else if (fromCommentId) {\n where = eq(comments.id, fromCommentId)\n limit = 1\n } else {\n throw Error('fromFileId or fromCommentId must be provided')\n }\n return this.db\n .select({\n ...getTableColumns(comments),\n author: { login: users.login, fullName: userFullNameSQL(users), email: users.email, isAuthor: sql`${users.id} = ${userId}`.mapWith(Boolean) },\n isFileOwner: sql`${+isFileOwner}`.mapWith(Boolean)\n })\n .from(comments)\n .leftJoin(users, eq(users.id, comments.userId))\n .where(where)\n .orderBy(desc(comments.id))\n .limit(limit)\n }\n\n async createComment(userId: number, fileId: number, content: string): Promise<Comment['id']> {\n return dbGetInsertedId(await this.db.insert(comments).values({ userId: userId, fileId: fileId, content: content } as Comment))\n }\n\n async updateComment(userId: number, commentId: number, fileId: number, content: string): Promise<boolean> {\n return dbCheckAffectedRows(\n await this.db\n .update(comments)\n .set({ content: content } as Comment)\n .where(and(eq(comments.userId, userId), eq(comments.id, commentId), eq(comments.fileId, fileId)))\n .limit(1),\n 1,\n false\n )\n }\n\n async deleteComment(userId: number, commentId: number, fileId: number, isFileOwner: boolean): Promise<boolean> {\n return dbCheckAffectedRows(\n await this.db\n .delete(comments)\n .where(and(or(eq(sql`${+isFileOwner}`, 1), eq(comments.userId, userId)), eq(comments.id, commentId), eq(comments.fileId, fileId)))\n .limit(1),\n 1,\n false\n )\n }\n\n membersToNotify(fromUserId: number, fileId: number): Promise<UserMailNotification[]> {\n /* lists the owner of the file and the users who have commented on it */\n const select: UserMailNotification | SelectedFields<any, any> = {\n id: users.id,\n email: users.email,\n language: users.language,\n notification: users.notification\n }\n const fromComments = this.db\n .select(select)\n .from(comments)\n .innerJoin(users, and(eq(users.id, comments.userId), ne(users.id, fromUserId)))\n .where(eq(comments.fileId, fileId))\n const fromFile = this.db\n .select(select)\n .from(files)\n .innerJoin(users, and(eq(users.id, files.ownerId), ne(users.id, fromUserId)))\n .where(eq(files.id, fileId))\n return union(fromComments, fromFile) as any\n }\n\n getRecentsFromShares(userId: number, shareIds: number[], limit: number) {\n const shareFile: any = alias(files, 'shareFile')\n return this.db\n .select({\n id: comments.id,\n content: comments.content,\n modifiedAt: comments.modifiedAt,\n author: { login: users.login, fullName: userFullNameSQL(users).as('fullName'), email: users.email },\n file: {\n name: sql<string>`IF (${files.id} = ${shareFile.id}, ${shares.name}, ${files.name})`.as('name'),\n path: sql<string>`\n CONCAT_WS('/', '${sql.raw(SPACE_REPOSITORY.SHARES)}',\n IF (${shareFile.id} IS NOT NULL,\n IF (${files.id} = ${shareFile.id}, NULL, REGEXP_REPLACE(${files.path}, ${filePathSQL(shareFile)}, ${shares.alias})),\n CONCAT_WS('/', ${shares.alias}, IF (${files.path} = '.', NULL, ${files.path}))\n )\n )`.as('path'),\n mime: files.mime,\n inTrash: sql<number>`0`.as('inTrash'),\n fromSpace: sql<number>`0`.as('fromSpace'),\n fromShare: sql<number>`1`.as('fromShare')\n }\n } satisfies CommentRecent | SelectedFields<any, any>)\n .from(shares)\n .leftJoin(shareFile, eq(shareFile.id, shares.fileId))\n .leftJoin(spaces, eq(spaces.id, shareFile.spaceId))\n .leftJoin(spacesRoots, eq(spacesRoots.spaceId, spaces.id))\n .leftJoin(\n files,\n or(\n // file linked to the share\n eq(files.id, shareFile.id),\n // all files with an external share id\n and(isNull(shareFile.id), eq(files.shareExternalId, shares.id)),\n // all files under the share\n and(\n isNotNull(shareFile.id),\n eq(shareFile.isDir, true),\n sql`${files.spaceId} <=> ${shareFile.spaceId}`,\n sql`${files.ownerId} <=> ${shareFile.ownerId}`,\n sql`${files.spaceExternalRootId} <=> ${shareFile.spaceExternalRootId}`,\n sql`${files.shareExternalId} <=> ${shareFile.shareExternalId}`,\n sql`${files.path} REGEXP CONCAT('^', IF(${shareFile.path} = '.', CONCAT(${shareFile.name}, '(/.*|)$'), CONCAT(${shareFile.path}, '/')))`\n )\n )\n )\n .innerJoin(comments, and(eq(comments.fileId, files.id), ne(comments.userId, userId)))\n .innerJoin(users, eq(users.id, comments.userId))\n .where(inArray(shares.id, shareIds))\n .groupBy(comments.id)\n .orderBy(desc(comments.id))\n .limit(limit)\n }\n\n getRecentsFromSpaces(userId: number, spaceIds: number[], limit: number) {\n const spaceRootFile: any = alias(files, 'spaceRootFile')\n return this.db\n .select({\n id: comments.id,\n content: comments.content,\n modifiedAt: comments.modifiedAt,\n author: { login: users.login, fullName: userFullNameSQL(users).as('fullName'), email: users.email },\n file: {\n name: sql<string>`IF (${files.id} = ${spacesRoots.fileId}, ${spacesRoots.name}, ${files.name})`.as('name'),\n path: sql<string>`\n CONCAT_WS('/', \n IF (${files.inTrash} = 0, '${sql.raw(SPACE_REPOSITORY.FILES)}', '${sql.raw(SPACE_REPOSITORY.TRASH)}'), \n IF (${files.ownerId} = ${userId}, '${sql.raw(SPACE_ALIAS.PERSONAL)}', ${spaces.alias}),\n IF (${spaceRootFile.id} IS NOT NULL,\n IF (${files.id} = ${spaceRootFile.id}, NULL, IF (${files.path} = '.', NULL, REGEXP_REPLACE(${files.path}, ${filePathSQL(spaceRootFile)}, ${spacesRoots.alias}))),\n NULLIF(CONCAT_WS('/', IF (${files.spaceExternalRootId} = ${spacesRoots.id}, ${spacesRoots.alias}, NULL), IF (${files.path} = '.', NULL, ${files.path})), '')\n )\n )`.as('path'),\n mime: files.mime,\n inTrash: sql<number>`${files.inTrash}`.as('inTrash'),\n fromSpace: sql<number>`IF (${files.ownerId} = ${userId}, 0, 1)`.as('fromSpace'),\n fromShare: sql<number>`0`.as('fromShare')\n }\n } satisfies CommentRecent | SelectedFields<any, any>)\n .from(spaces)\n .leftJoin(spacesRoots, eq(spacesRoots.spaceId, spaces.id))\n .leftJoin(spaceRootFile, eq(spaceRootFile.id, spacesRoots.fileId))\n .leftJoin(\n files,\n or(\n // all files from user\n eq(files.ownerId, userId),\n // all files from spaces\n eq(files.spaceId, spaces.id),\n // all files from space roots\n eq(files.id, spacesRoots.fileId),\n // all files under the space roots\n and(\n isNotNull(spaceRootFile.id),\n eq(spaceRootFile.isDir, true),\n sql`${files.ownerId} <=> ${spaceRootFile.ownerId}`,\n sql`${files.path} REGEXP CONCAT('^', IF(${spaceRootFile.path} = '.', CONCAT(${spaceRootFile.name}, '(/.*|)$'), CONCAT(${spaceRootFile.path}, '/')))`\n )\n )\n )\n .innerJoin(comments, and(eq(comments.fileId, files.id), ne(comments.userId, userId)))\n .innerJoin(users, eq(users.id, comments.userId))\n .where(inArray(spaces.id, spaceIds))\n .groupBy(comments.id)\n .orderBy(desc(comments.id))\n .limit(limit)\n }\n\n async getRecentsFromUser(user: UserModel, limit = 10): Promise<CommentRecent[]> {\n const [spaceIds, shareIds] = await Promise.all([this.spacesQueries.spaceIds(user.id), this.sharesQueries.shareIds(user.id, +user.isAdmin)])\n const fromSpaces = this.getRecentsFromSpaces(user.id, spaceIds, limit * 2)\n const fromShares = this.getRecentsFromShares(user.id, shareIds, limit * 2)\n const unionAlias = union(fromSpaces, fromShares).as('unionAlias')\n return this.db.select().from(unionAlias).groupBy(unionAlias.id).orderBy(desc(unionAlias.id)).limit(limit)\n }\n}\n"],"names":["CommentsQueries","getComments","userId","isFileOwner","fromFileId","fromCommentId","limit","undefined","where","eq","comments","fileId","id","Error","db","select","getTableColumns","author","login","users","fullName","userFullNameSQL","email","isAuthor","sql","mapWith","Boolean","from","leftJoin","orderBy","desc","createComment","content","dbGetInsertedId","insert","values","updateComment","commentId","dbCheckAffectedRows","update","set","and","deleteComment","delete","or","membersToNotify","fromUserId","language","notification","fromComments","innerJoin","ne","fromFile","files","ownerId","union","getRecentsFromShares","shareIds","shareFile","alias","modifiedAt","as","file","name","shares","path","raw","SPACE_REPOSITORY","SHARES","filePathSQL","mime","inTrash","fromSpace","fromShare","spaces","spaceId","spacesRoots","isNull","shareExternalId","isNotNull","isDir","spaceExternalRootId","inArray","groupBy","getRecentsFromSpaces","spaceIds","spaceRootFile","FILES","TRASH","SPACE_ALIAS","PERSONAL","getRecentsFromUser","user","Promise","all","spacesQueries","sharesQueries","isAdmin","fromSpaces","fromShares","unionAlias"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/comments/services/comments-queries.service.ts"],"sourcesContent":["import { Inject, Injectable } from '@nestjs/common'\nimport { and, desc, eq, getTableColumns, inArray, isNotNull, isNull, ne, or, SelectedFields, SQL, sql } from 'drizzle-orm'\nimport { alias, union } from 'drizzle-orm/mysql-core'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport type { DBSchema } from '../../../infrastructure/database/interfaces/database.interface'\nimport { dbCheckAffectedRows, dbGetInsertedId } from '../../../infrastructure/database/utils'\nimport { filePathSQL, files } from '../../files/schemas/files.schema'\nimport { UserMailNotification } from '../../notifications/interfaces/user-mail-notification.interface'\nimport { shares } from '../../shares/schemas/shares.schema'\nimport { SharesQueries } from '../../shares/services/shares-queries.service'\nimport { SPACE_ALIAS, SPACE_REPOSITORY } from '../../spaces/constants/spaces'\nimport { spacesRoots } from '../../spaces/schemas/spaces-roots.schema'\nimport { spaces } from '../../spaces/schemas/spaces.schema'\nimport { SpacesQueries } from '../../spaces/services/spaces-queries.service'\nimport { UserModel } from '../../users/models/user.model'\nimport { userFullNameSQL, users } from '../../users/schemas/users.schema'\nimport { CommentRecent } from '../interfaces/comment-recent.interface'\nimport { Comment } from '../schemas/comment.interface'\nimport { comments } from '../schemas/comments.schema'\n\n@Injectable()\nexport class CommentsQueries {\n constructor(\n @Inject(DB_TOKEN_PROVIDER) private readonly db: DBSchema,\n private readonly spacesQueries: SpacesQueries,\n private readonly sharesQueries: SharesQueries\n ) {}\n\n getComments(userId: number, isFileOwner: boolean, fromFileId?: number, fromCommentId?: number, limit: number = undefined): Promise<Comment[]> {\n let where: SQL\n if (fromFileId) {\n where = eq(comments.fileId, fromFileId)\n } else if (fromCommentId) {\n where = eq(comments.id, fromCommentId)\n limit = 1\n } else {\n throw Error('fromFileId or fromCommentId must be provided')\n }\n return this.db\n .select({\n ...getTableColumns(comments),\n author: { login: users.login, fullName: userFullNameSQL(users), email: users.email, isAuthor: sql`${users.id} = ${userId}`.mapWith(Boolean) },\n isFileOwner: sql`${+isFileOwner}`.mapWith(Boolean)\n })\n .from(comments)\n .leftJoin(users, eq(users.id, comments.userId))\n .where(where)\n .orderBy(desc(comments.id))\n .limit(limit)\n }\n\n async createComment(userId: number, fileId: number, content: string): Promise<Comment['id']> {\n return dbGetInsertedId(await this.db.insert(comments).values({ userId: userId, fileId: fileId, content: content } as Comment))\n }\n\n async updateComment(userId: number, commentId: number, fileId: number, content: string): Promise<boolean> {\n return dbCheckAffectedRows(\n await this.db\n .update(comments)\n .set({ content: content } as Comment)\n .where(and(eq(comments.userId, userId), eq(comments.id, commentId), eq(comments.fileId, fileId)))\n .limit(1),\n 1,\n false\n )\n }\n\n async deleteComment(userId: number, commentId: number, fileId: number, isFileOwner: boolean): Promise<boolean> {\n return dbCheckAffectedRows(\n await this.db\n .delete(comments)\n .where(and(or(eq(sql`${+isFileOwner}`, 1), eq(comments.userId, userId)), eq(comments.id, commentId), eq(comments.fileId, fileId)))\n .limit(1),\n 1,\n false\n )\n }\n\n membersToNotify(fromUserId: number, fileId: number): Promise<UserMailNotification[]> {\n /* lists the owner of the file and the users who have commented on it */\n const select: UserMailNotification | SelectedFields<any, any> = {\n id: users.id,\n email: users.email,\n language: users.language,\n notification: users.notification\n }\n const fromComments = this.db\n .select(select)\n .from(comments)\n .innerJoin(users, and(eq(users.id, comments.userId), ne(users.id, fromUserId)))\n .where(eq(comments.fileId, fileId))\n const fromFile = this.db\n .select(select)\n .from(files)\n .innerJoin(users, and(eq(users.id, files.ownerId), ne(users.id, fromUserId)))\n .where(eq(files.id, fileId))\n return union(fromComments, fromFile) as any\n }\n\n getRecentsFromShares(userId: number, shareIds: number[], limit: number) {\n const shareFile: any = alias(files, 'shareFile')\n return this.db\n .select({\n id: comments.id,\n content: comments.content,\n modifiedAt: comments.modifiedAt,\n author: { login: users.login, fullName: userFullNameSQL(users).as('fullName'), email: users.email },\n file: {\n name: sql<string>`IF (${files.id} = ${shareFile.id}, ${shares.name}, ${files.name})`.as('name'),\n path: sql<string>`\n CONCAT_WS('/', '${sql.raw(SPACE_REPOSITORY.SHARES)}',\n IF (${shareFile.id} IS NOT NULL,\n IF (${files.id} = ${shareFile.id}, NULL, REGEXP_REPLACE(${files.path}, ${filePathSQL(shareFile)}, ${shares.alias})),\n CONCAT_WS('/', ${shares.alias}, IF (${files.path} = '.', NULL, ${files.path}))\n )\n )`.as('path'),\n mime: files.mime,\n inTrash: sql<number>`0`.as('inTrash'),\n fromSpace: sql<number>`0`.as('fromSpace'),\n fromShare: sql<number>`1`.as('fromShare')\n }\n } satisfies CommentRecent | SelectedFields<any, any>)\n .from(shares)\n .leftJoin(shareFile, eq(shareFile.id, shares.fileId))\n .leftJoin(spaces, eq(spaces.id, shareFile.spaceId))\n .leftJoin(spacesRoots, eq(spacesRoots.spaceId, spaces.id))\n .leftJoin(\n files,\n or(\n // file linked to the share\n eq(files.id, shareFile.id),\n // all files with an external share id\n and(isNull(shareFile.id), eq(files.shareExternalId, shares.id)),\n // all files under the share\n and(\n isNotNull(shareFile.id),\n eq(shareFile.isDir, true),\n sql`${files.spaceId} <=> ${shareFile.spaceId}`,\n sql`${files.ownerId} <=> ${shareFile.ownerId}`,\n sql`${files.spaceExternalRootId} <=> ${shareFile.spaceExternalRootId}`,\n sql`${files.shareExternalId} <=> ${shareFile.shareExternalId}`,\n sql`${files.path} REGEXP CONCAT('^', IF(${shareFile.path} = '.', CONCAT(${shareFile.name}, '(/.*|)$'), CONCAT(${shareFile.path}, '/')))`\n )\n )\n )\n .innerJoin(comments, and(eq(comments.fileId, files.id), ne(comments.userId, userId)))\n .innerJoin(users, eq(users.id, comments.userId))\n .where(inArray(shares.id, shareIds))\n .groupBy(comments.id)\n .orderBy(desc(comments.id))\n .limit(limit)\n }\n\n getRecentsFromSpaces(userId: number, spaceIds: number[], limit: number) {\n const spaceRootFile: any = alias(files, 'spaceRootFile')\n return this.db\n .select({\n id: comments.id,\n content: comments.content,\n modifiedAt: comments.modifiedAt,\n author: { login: users.login, fullName: userFullNameSQL(users).as('fullName'), email: users.email },\n file: {\n name: sql<string>`IF (${files.id} = ${spacesRoots.fileId}, ${spacesRoots.name}, ${files.name})`.as('name'),\n path: sql<string>`\n CONCAT_WS('/', \n IF (${files.inTrash} = 0, '${sql.raw(SPACE_REPOSITORY.FILES)}', '${sql.raw(SPACE_REPOSITORY.TRASH)}'), \n IF (${files.ownerId} = ${userId}, '${sql.raw(SPACE_ALIAS.PERSONAL)}', ${spaces.alias}),\n IF (${spaceRootFile.id} IS NOT NULL,\n IF (${files.id} = ${spaceRootFile.id}, NULL, IF (${files.path} = '.', NULL, REGEXP_REPLACE(${files.path}, ${filePathSQL(spaceRootFile)}, ${spacesRoots.alias}))),\n NULLIF(CONCAT_WS('/', IF (${files.spaceExternalRootId} = ${spacesRoots.id}, ${spacesRoots.alias}, NULL), IF (${files.path} = '.', NULL, ${files.path})), '')\n )\n )`.as('path'),\n mime: files.mime,\n inTrash: sql<number>`${files.inTrash}`.as('inTrash'),\n fromSpace: sql<number>`IF (${files.ownerId} = ${userId}, 0, 1)`.as('fromSpace'),\n fromShare: sql<number>`0`.as('fromShare')\n }\n } satisfies CommentRecent | SelectedFields<any, any>)\n .from(spaces)\n .leftJoin(spacesRoots, eq(spacesRoots.spaceId, spaces.id))\n .leftJoin(spaceRootFile, eq(spaceRootFile.id, spacesRoots.fileId))\n .leftJoin(\n files,\n or(\n // all files from user\n eq(files.ownerId, userId),\n // all files from spaces\n eq(files.spaceId, spaces.id),\n // all files from space roots\n eq(files.id, spacesRoots.fileId),\n // all files under the space roots\n and(\n isNotNull(spaceRootFile.id),\n eq(spaceRootFile.isDir, true),\n sql`${files.ownerId} <=> ${spaceRootFile.ownerId}`,\n sql`${files.path} REGEXP CONCAT('^', IF(${spaceRootFile.path} = '.', CONCAT(${spaceRootFile.name}, '(/.*|)$'), CONCAT(${spaceRootFile.path}, '/')))`\n )\n )\n )\n .innerJoin(comments, and(eq(comments.fileId, files.id), ne(comments.userId, userId)))\n .innerJoin(users, eq(users.id, comments.userId))\n .where(inArray(spaces.id, spaceIds))\n .groupBy(comments.id)\n .orderBy(desc(comments.id))\n .limit(limit)\n }\n\n async getRecentsFromUser(user: UserModel, limit = 10): Promise<CommentRecent[]> {\n const [spaceIds, shareIds] = await Promise.all([this.spacesQueries.spaceIds(user.id), this.sharesQueries.shareIds(user.id, +user.isAdmin)])\n const fromSpaces = this.getRecentsFromSpaces(user.id, spaceIds, limit * 2)\n const fromShares = this.getRecentsFromShares(user.id, shareIds, limit * 2)\n const unionAlias = union(fromSpaces, fromShares).as('unionAlias')\n return this.db.select().from(unionAlias).groupBy(unionAlias.id).orderBy(desc(unionAlias.id)).limit(limit)\n }\n}\n"],"names":["CommentsQueries","getComments","userId","isFileOwner","fromFileId","fromCommentId","limit","undefined","where","eq","comments","fileId","id","Error","db","select","getTableColumns","author","login","users","fullName","userFullNameSQL","email","isAuthor","sql","mapWith","Boolean","from","leftJoin","orderBy","desc","createComment","content","dbGetInsertedId","insert","values","updateComment","commentId","dbCheckAffectedRows","update","set","and","deleteComment","delete","or","membersToNotify","fromUserId","language","notification","fromComments","innerJoin","ne","fromFile","files","ownerId","union","getRecentsFromShares","shareIds","shareFile","alias","modifiedAt","as","file","name","shares","path","raw","SPACE_REPOSITORY","SHARES","filePathSQL","mime","inTrash","fromSpace","fromShare","spaces","spaceId","spacesRoots","isNull","shareExternalId","isNotNull","isDir","spaceExternalRootId","inArray","groupBy","getRecentsFromSpaces","spaceIds","spaceRootFile","FILES","TRASH","SPACE_ALIAS","PERSONAL","getRecentsFromUser","user","Promise","all","spacesQueries","sharesQueries","isAdmin","fromSpaces","fromShares","unionAlias"],"mappings":"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"}
|
|
@@ -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
|
});
|
|
@@ -49,7 +45,10 @@ let FilesIndexerMySQL = class FilesIndexerMySQL {
|
|
|
49
45
|
await this.db.execute((0, _filescontentschema.createTableFilesContent)(tableName));
|
|
50
46
|
return true;
|
|
51
47
|
} catch (e) {
|
|
52
|
-
this.logger.error(
|
|
48
|
+
this.logger.error({
|
|
49
|
+
tag: this.createIndex.name,
|
|
50
|
+
msg: `${tableName} : ${e}`
|
|
51
|
+
});
|
|
53
52
|
return false;
|
|
54
53
|
}
|
|
55
54
|
}
|
|
@@ -58,7 +57,10 @@ let FilesIndexerMySQL = class FilesIndexerMySQL {
|
|
|
58
57
|
await this.db.execute((0, _drizzleorm.sql)`DROP TABLE IF EXISTS ${_drizzleorm.sql.raw(tableName)} `);
|
|
59
58
|
return true;
|
|
60
59
|
} catch (e) {
|
|
61
|
-
this.logger.error(
|
|
60
|
+
this.logger.error({
|
|
61
|
+
tag: this.dropIndex.name,
|
|
62
|
+
msg: `${tableName} : ${e}`
|
|
63
|
+
});
|
|
62
64
|
return false;
|
|
63
65
|
}
|
|
64
66
|
}
|
|
@@ -75,7 +77,10 @@ let FilesIndexerMySQL = class FilesIndexerMySQL {
|
|
|
75
77
|
content = VALUES(content)
|
|
76
78
|
`);
|
|
77
79
|
} catch (e) {
|
|
78
|
-
this.logger.error(
|
|
80
|
+
this.logger.error({
|
|
81
|
+
tag: this.insertRecord.name,
|
|
82
|
+
msg: `${tableName} : ${e}`
|
|
83
|
+
});
|
|
79
84
|
}
|
|
80
85
|
}
|
|
81
86
|
async getRecordStats(tableName, path) {
|
|
@@ -100,15 +105,24 @@ let FilesIndexerMySQL = class FilesIndexerMySQL {
|
|
|
100
105
|
FROM ${_drizzleorm.sql.raw(tableName)}
|
|
101
106
|
WHERE id IN (${_drizzleorm.sql.raw(ids.join(','))})`);
|
|
102
107
|
if (r.affectedRows !== ids.length) {
|
|
103
|
-
this.logger.warn(
|
|
108
|
+
this.logger.warn({
|
|
109
|
+
tag: this.deleteRecords.name,
|
|
110
|
+
msg: `${tableName} - deleted : ${r.affectedRows}/${ids.length}`
|
|
111
|
+
});
|
|
104
112
|
}
|
|
105
113
|
} catch (e) {
|
|
106
|
-
this.logger.error(
|
|
114
|
+
this.logger.error({
|
|
115
|
+
tag: this.deleteRecords.name,
|
|
116
|
+
msg: `${tableName} : ${e}`
|
|
117
|
+
});
|
|
107
118
|
}
|
|
108
119
|
}
|
|
109
120
|
async searchRecords(tableNames, search, limit) {
|
|
110
121
|
const terms = (0, _filessearch.analyzeTerms)(search);
|
|
111
|
-
this.logger.debug(
|
|
122
|
+
this.logger.debug({
|
|
123
|
+
tag: this.searchRecords.name,
|
|
124
|
+
msg: `convert ${search} -> ${JSON.stringify(terms)}`
|
|
125
|
+
});
|
|
112
126
|
if (!terms.length) {
|
|
113
127
|
return [];
|
|
114
128
|
}
|
|
@@ -147,7 +161,10 @@ let FilesIndexerMySQL = class FilesIndexerMySQL {
|
|
|
147
161
|
const tableNames = tableSuffixes.map((s)=>this.getIndexName(s));
|
|
148
162
|
const tablesToDrop = (await this.indexesList()).filter((t)=>tableNames.indexOf(t) === -1);
|
|
149
163
|
for (const t of tablesToDrop){
|
|
150
|
-
this.logger.log(
|
|
164
|
+
this.logger.log({
|
|
165
|
+
tag: this.cleanIndexes.name,
|
|
166
|
+
msg: `drop table : ${t}`
|
|
167
|
+
});
|
|
151
168
|
await this.dropIndex(t);
|
|
152
169
|
}
|
|
153
170
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../backend/src/applications/files/adapters/files-indexer-mysql.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 { Inject, Injectable, Logger } from '@nestjs/common'\nimport { SQL, sql } from 'drizzle-orm'\nimport { MySqlQueryResult } from 'drizzle-orm/mysql2'\nimport { CacheDecorator } from '../../../infrastructure/cache/cache.decorator'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport { DBSchema } from '../../../infrastructure/database/interfaces/database.interface'\nimport { FilesIndexer } from '../models/files-indexer'\nimport { FileContent } from '../schemas/file-content.interface'\nimport { createTableFilesContent, FILES_CONTENT_TABLE_PREFIX } from '../schemas/files-content.schema'\nimport { analyzeTerms, genTermsPattern, MaxSortedList } from '../utils/files-search'\n\n@Injectable()\nexport class FilesIndexerMySQL implements FilesIndexer {\n private readonly logger = new Logger(FilesIndexerMySQL.name)\n\n constructor(@Inject(DB_TOKEN_PROVIDER) private readonly db: DBSchema) {}\n\n @CacheDecorator(900) // 15 mn\n async indexesList(): Promise<string[]> {\n return ((await this.db.execute(sql`SHOW TABLES LIKE '${sql.raw(FILES_CONTENT_TABLE_PREFIX)}%'`))[0] as any).flatMap((r: Record<string, string>) =>\n Object.values(r)\n )\n }\n\n getIndexName(tableSuffix: string): string {\n return `${FILES_CONTENT_TABLE_PREFIX}${tableSuffix}`\n }\n\n async existingIndexes(tableSuffixes: string[]): Promise<string[]> {\n const currentTables = await this.indexesList()\n return tableSuffixes.map((suffix) => this.getIndexName(suffix)).filter((table) => currentTables.indexOf(table) > -1)\n }\n\n async createIndex(tableName: string): Promise<boolean> {\n try {\n await this.db.execute(createTableFilesContent(tableName))\n return true\n } catch (e) {\n this.logger.error(`${this.createIndex.name} - ${tableName} : ${e}`)\n return false\n }\n }\n\n async dropIndex(tableName: string): Promise<boolean> {\n try {\n await this.db.execute(sql`DROP TABLE IF EXISTS ${sql.raw(tableName)} `)\n return true\n } catch (e) {\n this.logger.error(`${this.dropIndex.name} - ${tableName} : ${e}`)\n return false\n }\n }\n\n async insertRecord(tableName: string, fc: FileContent): Promise<void> {\n try {\n await this.db.execute(sql`\n INSERT INTO ${sql.raw(tableName)} (id, path, name, mime, size, mtime, content)\n VALUES ${sql`(${fc.id}, ${fc.path}, ${fc.name}, ${fc.mime}, ${fc.size}, ${fc.mtime}, ${fc.content})`}\n ON DUPLICATE KEY UPDATE path = VALUES(path),\n name = VALUES(name),\n mime = VALUES(mime),\n size = VALUES(size),\n mtime = VALUES(mtime),\n content = VALUES(content)\n `)\n } catch (e) {\n this.logger.error(`${this.insertRecord.name} - ${tableName} : ${e}`)\n }\n }\n\n async getRecordStats(tableName: string, path?: string): Promise<Map<number, { path: string; name: string; size: number }>> {\n const q: SQL = sql`SELECT id, path, name, size\n FROM ${sql.raw(tableName)}`\n if (path) {\n q.append(sql` WHERE path = ${path}`)\n }\n const [r]: { id: number; path: string; name: string; size: number }[][] = (await this.db.execute(q)) as MySqlQueryResult\n return new Map(r.map((row) => [row.id, { path: row.path, name: row.name, size: row.size }]))\n }\n\n async deleteRecords(tableName: string, ids: number[]): Promise<void> {\n try {\n const [r] = await this.db.execute(sql`DELETE\n FROM ${sql.raw(tableName)}\n WHERE id IN (${sql.raw(ids.join(','))})`)\n if (r.affectedRows !== ids.length) {\n this.logger.warn(`${this.deleteRecords.name} - ${tableName} - deleted : ${r.affectedRows}/${ids.length}`)\n }\n } catch (e) {\n this.logger.error(`${this.deleteRecords.name} - ${tableName} : ${e}`)\n }\n }\n\n async searchRecords(tableNames: string[], search: string, limit: number): Promise<FileContent[]> {\n const terms: string[] = analyzeTerms(search)\n this.logger.debug(`${this.searchRecords.name} - convert ${search} -> ${JSON.stringify(terms)}`)\n if (!terms.length) {\n return []\n }\n // todo: use row iterator for better performance\n // mysql does not calculate MATCH results twice, can be used with select without worrying about performance\n const q: SQL = sql\n .join(\n tableNames.map(\n (tableName) =>\n sql`(SELECT id, path, name, mime, mtime, content, MATCH (content) AGAINST ( ${search} IN BOOLEAN MODE ) as score\n FROM ${sql.raw(tableName)}\n WHERE MATCH (content) AGAINST ( ${search} IN BOOLEAN MODE ) LIMIT ${limit})`\n ),\n sql.raw(' UNION ALL ')\n )\n .append(sql` ORDER BY score DESC LIMIT ${limit}`)\n\n const [records]: FileContent[][] = (await this.db.execute(q)) as MySqlQueryResult\n if (!records.length) {\n return []\n }\n\n const termsPattern = `(${genTermsPattern(terms)})`\n // const termsRegexp = new RegExp(`(?:\\\\b\\\\w+\\\\b[\\\\s\\\\W]){0,20}\\\\b${termsPattern}(?:\\\\s*\\\\S*){0,20}`, 'gi') // best performance\n const termsRegexp = new RegExp(`(?:\\\\b\\\\w+\\\\b[\\\\s\\\\W]{0,4}){0,10}\\\\b${termsPattern}(?:\\\\s*\\\\S*){0,15}`, 'gi')\n\n const termsHighlightRegexp = new RegExp(termsPattern, 'gi')\n for (const r of records) {\n const maxSortedList = new MaxSortedList(5)\n for (const i of r.content.matchAll(termsRegexp)) {\n const matches: string[] = i[0].match(termsHighlightRegexp).map((term) => term.toLowerCase())\n const nbDifferentWords: number = matches.length === 1 ? 1 : parseFloat(`${new Set(matches).size}.${matches.length}`)\n maxSortedList.insert([nbDifferentWords, i[0]])\n }\n // clear content\n r.content = undefined\n r.matches = maxSortedList.data.map(([_nb, content]) => content.replace(termsHighlightRegexp, '<mark>$1</mark>'))\n }\n return records\n }\n\n async cleanIndexes(tableSuffixes: string[]): Promise<void> {\n // remove old tables\n if (!tableSuffixes.length) return\n const tableNames = tableSuffixes.map((s) => this.getIndexName(s))\n const tablesToDrop: string[] = (await this.indexesList()).filter((t: string) => tableNames.indexOf(t) === -1)\n for (const t of tablesToDrop) {\n this.logger.log(`${this.cleanIndexes.name} - drop table : ${t}`)\n await this.dropIndex(t)\n }\n }\n}\n"],"names":["FilesIndexerMySQL","indexesList","db","execute","sql","raw","FILES_CONTENT_TABLE_PREFIX","flatMap","r","Object","values","getIndexName","tableSuffix","existingIndexes","tableSuffixes","currentTables","map","suffix","filter","table","indexOf","createIndex","tableName","createTableFilesContent","e","logger","error","name","dropIndex","insertRecord","fc","id","path","mime","size","mtime","content","getRecordStats","q","append","Map","row","deleteRecords","ids","join","affectedRows","length","warn","searchRecords","tableNames","search","limit","terms","analyzeTerms","debug","JSON","stringify","records","termsPattern","genTermsPattern","termsRegexp","RegExp","termsHighlightRegexp","maxSortedList","MaxSortedList","i","matchAll","matches","match","term","toLowerCase","nbDifferentWords","parseFloat","Set","insert","undefined","data","_nb","replace","cleanIndexes","s","tablesToDrop","t","log","Logger"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/files/adapters/files-indexer-mysql.service.ts"],"sourcesContent":["import { Inject, Injectable, Logger } from '@nestjs/common'\nimport { SQL, sql } from 'drizzle-orm'\nimport { MySqlQueryResult } from 'drizzle-orm/mysql2'\nimport { CacheDecorator } from '../../../infrastructure/cache/cache.decorator'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport { DBSchema } from '../../../infrastructure/database/interfaces/database.interface'\nimport { FilesIndexer } from '../models/files-indexer'\nimport { FileContent } from '../schemas/file-content.interface'\nimport { createTableFilesContent, FILES_CONTENT_TABLE_PREFIX } from '../schemas/files-content.schema'\nimport { analyzeTerms, genTermsPattern, MaxSortedList } from '../utils/files-search'\n\n@Injectable()\nexport class FilesIndexerMySQL implements FilesIndexer {\n private readonly logger = new Logger(FilesIndexerMySQL.name)\n\n constructor(@Inject(DB_TOKEN_PROVIDER) private readonly db: DBSchema) {}\n\n @CacheDecorator(900) // 15 mn\n async indexesList(): Promise<string[]> {\n return ((await this.db.execute(sql`SHOW TABLES LIKE '${sql.raw(FILES_CONTENT_TABLE_PREFIX)}%'`))[0] as any).flatMap((r: Record<string, string>) =>\n Object.values(r)\n )\n }\n\n getIndexName(tableSuffix: string): string {\n return `${FILES_CONTENT_TABLE_PREFIX}${tableSuffix}`\n }\n\n async existingIndexes(tableSuffixes: string[]): Promise<string[]> {\n const currentTables = await this.indexesList()\n return tableSuffixes.map((suffix) => this.getIndexName(suffix)).filter((table) => currentTables.indexOf(table) > -1)\n }\n\n async createIndex(tableName: string): Promise<boolean> {\n try {\n await this.db.execute(createTableFilesContent(tableName))\n return true\n } catch (e) {\n this.logger.error({ tag: this.createIndex.name, msg: `${tableName} : ${e}` })\n return false\n }\n }\n\n async dropIndex(tableName: string): Promise<boolean> {\n try {\n await this.db.execute(sql`DROP TABLE IF EXISTS ${sql.raw(tableName)} `)\n return true\n } catch (e) {\n this.logger.error({ tag: this.dropIndex.name, msg: `${tableName} : ${e}` })\n return false\n }\n }\n\n async insertRecord(tableName: string, fc: FileContent): Promise<void> {\n try {\n await this.db.execute(sql`\n INSERT INTO ${sql.raw(tableName)} (id, path, name, mime, size, mtime, content)\n VALUES ${sql`(${fc.id}, ${fc.path}, ${fc.name}, ${fc.mime}, ${fc.size}, ${fc.mtime}, ${fc.content})`}\n ON DUPLICATE KEY UPDATE path = VALUES(path),\n name = VALUES(name),\n mime = VALUES(mime),\n size = VALUES(size),\n mtime = VALUES(mtime),\n content = VALUES(content)\n `)\n } catch (e) {\n this.logger.error({ tag: this.insertRecord.name, msg: `${tableName} : ${e}` })\n }\n }\n\n async getRecordStats(tableName: string, path?: string): Promise<Map<number, { path: string; name: string; size: number }>> {\n const q: SQL = sql`SELECT id, path, name, size\n FROM ${sql.raw(tableName)}`\n if (path) {\n q.append(sql` WHERE path = ${path}`)\n }\n const [r]: { id: number; path: string; name: string; size: number }[][] = (await this.db.execute(q)) as MySqlQueryResult\n return new Map(r.map((row) => [row.id, { path: row.path, name: row.name, size: row.size }]))\n }\n\n async deleteRecords(tableName: string, ids: number[]): Promise<void> {\n try {\n const [r] = await this.db.execute(sql`DELETE\n FROM ${sql.raw(tableName)}\n WHERE id IN (${sql.raw(ids.join(','))})`)\n if (r.affectedRows !== ids.length) {\n this.logger.warn({ tag: this.deleteRecords.name, msg: `${tableName} - deleted : ${r.affectedRows}/${ids.length}` })\n }\n } catch (e) {\n this.logger.error({ tag: this.deleteRecords.name, msg: `${tableName} : ${e}` })\n }\n }\n\n async searchRecords(tableNames: string[], search: string, limit: number): Promise<FileContent[]> {\n const terms: string[] = analyzeTerms(search)\n this.logger.debug({ tag: this.searchRecords.name, msg: `convert ${search} -> ${JSON.stringify(terms)}` })\n if (!terms.length) {\n return []\n }\n // todo: use row iterator for better performance\n // mysql does not calculate MATCH results twice, can be used with select without worrying about performance\n const q: SQL = sql\n .join(\n tableNames.map(\n (tableName) =>\n sql`(SELECT id, path, name, mime, mtime, content, MATCH (content) AGAINST ( ${search} IN BOOLEAN MODE ) as score\n FROM ${sql.raw(tableName)}\n WHERE MATCH (content) AGAINST ( ${search} IN BOOLEAN MODE ) LIMIT ${limit})`\n ),\n sql.raw(' UNION ALL ')\n )\n .append(sql` ORDER BY score DESC LIMIT ${limit}`)\n\n const [records]: FileContent[][] = (await this.db.execute(q)) as MySqlQueryResult\n if (!records.length) {\n return []\n }\n\n const termsPattern = `(${genTermsPattern(terms)})`\n // const termsRegexp = new RegExp(`(?:\\\\b\\\\w+\\\\b[\\\\s\\\\W]){0,20}\\\\b${termsPattern}(?:\\\\s*\\\\S*){0,20}`, 'gi') // best performance\n const termsRegexp = new RegExp(`(?:\\\\b\\\\w+\\\\b[\\\\s\\\\W]{0,4}){0,10}\\\\b${termsPattern}(?:\\\\s*\\\\S*){0,15}`, 'gi')\n\n const termsHighlightRegexp = new RegExp(termsPattern, 'gi')\n for (const r of records) {\n const maxSortedList = new MaxSortedList(5)\n for (const i of r.content.matchAll(termsRegexp)) {\n const matches: string[] = i[0].match(termsHighlightRegexp).map((term) => term.toLowerCase())\n const nbDifferentWords: number = matches.length === 1 ? 1 : parseFloat(`${new Set(matches).size}.${matches.length}`)\n maxSortedList.insert([nbDifferentWords, i[0]])\n }\n // clear content\n r.content = undefined\n r.matches = maxSortedList.data.map(([_nb, content]) => content.replace(termsHighlightRegexp, '<mark>$1</mark>'))\n }\n return records\n }\n\n async cleanIndexes(tableSuffixes: string[]): Promise<void> {\n // remove old tables\n if (!tableSuffixes.length) return\n const tableNames = tableSuffixes.map((s) => this.getIndexName(s))\n const tablesToDrop: string[] = (await this.indexesList()).filter((t: string) => tableNames.indexOf(t) === -1)\n for (const t of tablesToDrop) {\n this.logger.log({ tag: this.cleanIndexes.name, msg: `drop table : ${t}` })\n await this.dropIndex(t)\n }\n }\n}\n"],"names":["FilesIndexerMySQL","indexesList","db","execute","sql","raw","FILES_CONTENT_TABLE_PREFIX","flatMap","r","Object","values","getIndexName","tableSuffix","existingIndexes","tableSuffixes","currentTables","map","suffix","filter","table","indexOf","createIndex","tableName","createTableFilesContent","e","logger","error","tag","name","msg","dropIndex","insertRecord","fc","id","path","mime","size","mtime","content","getRecordStats","q","append","Map","row","deleteRecords","ids","join","affectedRows","length","warn","searchRecords","tableNames","search","limit","terms","analyzeTerms","debug","JSON","stringify","records","termsPattern","genTermsPattern","termsRegexp","RegExp","termsHighlightRegexp","maxSortedList","MaxSortedList","i","matchAll","matches","match","term","toLowerCase","nbDifferentWords","parseFloat","Set","insert","undefined","data","_nb","replace","cleanIndexes","s","tablesToDrop","t","log","Logger"],"mappings":"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"}
|
|
@@ -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
|
});
|