@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 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../backend/src/applications/sync/services/sync-paths-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 { HttpStatus } from '@nestjs/common'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { currentTimeStamp } from '../../../common/shared'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport { FilesQueries } from '../../files/services/files-queries.service'\nimport { getProps, isPathExists, isPathIsDir } from '../../files/utils/files'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { SpacesManager } from '../../spaces/services/spaces-manager.service'\nimport { getEnvPermissions } from '../../spaces/utils/permissions'\nimport { UsersQueries } from '../../users/services/users-queries.service'\nimport { SyncPathsManager } from './sync-paths-manager.service'\nimport { SyncQueries } from './sync-queries.service'\n\n// Mock modules used directly inside SyncPathsManager\njest.mock('../../../common/shared', () => ({\n currentTimeStamp: jest.fn(() => 1000)\n}))\njest.mock('../../files/utils/files', () => ({\n isPathExists: jest.fn(),\n isPathIsDir: jest.fn(),\n getProps: jest.fn(),\n sanitizePath: jest.fn((p: string) => p)\n}))\njest.mock('../../spaces/utils/permissions', () => ({\n getEnvPermissions: jest.fn(() => 'server-perms')\n}))\njest.mock('../constants/sync', () => ({\n SYNC_PATH_REPOSITORY: {\n SPACES: ['spaces'],\n PERSONAL: ['personal'],\n SHARES: ['shares']\n }\n}))\njest.mock('../../notifications/constants/notifications', () => ({\n NOTIFICATION_APP: { SYNC: 'SYNC' },\n NOTIFICATION_APP_EVENT: { SYNC: { DELETE: 'DELETE', CREATE: 'CREATE', UPDATE: 'UPDATE' } }\n}))\n\ndescribe(SyncPathsManager.name, () => {\n let service: SyncPathsManager\n let contextManager: { headerOriginUrl: jest.Mock }\n let spacesManager: { spaceEnv: jest.Mock }\n let usersQueries: Record<string, jest.Mock>\n let filesQueries: { getSpaceFileId: jest.Mock; getOrCreateSpaceFile: jest.Mock }\n let notificationsManager: { create: jest.Mock }\n let syncQueries: {\n getClient: jest.Mock\n clientExistsForOwner: jest.Mock\n createPath: jest.Mock\n deletePath: jest.Mock\n getPaths: jest.Mock\n getPathSettings: jest.Mock\n updatePathSettings: jest.Mock\n clearCachePathSettings: jest.Mock\n }\n\n const userWith = (clientId?: string) => ({ id: 1, clientId })\n const flush = () => new Promise((r) => setImmediate(r))\n\n beforeEach(async () => {\n contextManager = { headerOriginUrl: jest.fn(() => 'http://origin.local') }\n spacesManager = { spaceEnv: jest.fn() }\n usersQueries = {}\n filesQueries = {\n getSpaceFileId: jest.fn(),\n getOrCreateSpaceFile: jest.fn()\n }\n notificationsManager = {\n create: jest.fn().mockResolvedValue(undefined)\n }\n syncQueries = {\n getClient: jest.fn(),\n clientExistsForOwner: jest.fn(),\n createPath: jest.fn(),\n deletePath: jest.fn(),\n getPaths: jest.fn(),\n getPathSettings: jest.fn(),\n updatePathSettings: jest.fn().mockResolvedValue(undefined),\n clearCachePathSettings: jest.fn()\n }\n ;(isPathExists as jest.Mock).mockReset()\n ;(isPathIsDir as jest.Mock).mockReset()\n ;(getProps as jest.Mock).mockReset()\n ;(getEnvPermissions as jest.Mock).mockReset().mockReturnValue('server-perms')\n ;(currentTimeStamp as jest.Mock).mockReset().mockReturnValue(1000)\n\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n SyncPathsManager,\n { provide: ContextManager, useValue: contextManager },\n { provide: SpacesManager, useValue: spacesManager },\n { provide: UsersQueries, useValue: usersQueries },\n { provide: FilesQueries, useValue: filesQueries },\n { provide: NotificationsManager, useValue: notificationsManager },\n { provide: SyncQueries, useValue: syncQueries }\n ]\n }).compile()\n\n module.useLogger(['fatal'])\n service = module.get<SyncPathsManager>(SyncPathsManager)\n })\n\n it('should be defined', () => {\n expect(service).toBeDefined()\n })\n\n describe('createPath', () => {\n const baseReq = () =>\n ({\n user: { id: 1, clientId: 'client-1' },\n params: { '*': 'SPACES/alias/sub' },\n space: {\n realPath: '/real/path',\n quotaIsExceeded: false,\n root: { id: 1, alias: 'alias' },\n inFilesRepository: true,\n paths: ['sub'],\n dbFile: { ownerId: 1, path: '.' },\n id: 10\n }\n }) as any\n\n it('should throw BAD_REQUEST when client id is missing', async () => {\n const req = baseReq()\n req.user.clientId = undefined\n await expect(service.createPath(req, { remotePath: 'x' } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST,\n message: 'Client id is missing'\n })\n })\n\n it('should throw INSUFFICIENT_STORAGE when storage quota is exceeded', async () => {\n const req = baseReq()\n req.space.quotaIsExceeded = true\n await expect(service.createPath(req, { remotePath: 'x' } as any)).rejects.toMatchObject({\n status: HttpStatus.INSUFFICIENT_STORAGE\n })\n })\n\n it.each([\n {\n title: 'NOT_FOUND when remote path does not exist',\n setup: () => (isPathExists as jest.Mock).mockResolvedValue(false),\n expected: { status: HttpStatus.NOT_FOUND, message: 'Remote path not found : client/remote' }\n },\n {\n title: 'BAD_REQUEST when remote path is not a directory',\n setup: () => ((isPathExists as jest.Mock).mockResolvedValue(true), (isPathIsDir as jest.Mock).mockResolvedValue(false)),\n expected: { status: HttpStatus.BAD_REQUEST, message: 'Remote path must be a directory' }\n },\n {\n title: 'NOT_FOUND when client is not found',\n setup: () => (\n (isPathExists as jest.Mock).mockResolvedValue(true),\n (isPathIsDir as jest.Mock).mockResolvedValue(true),\n syncQueries.getClient.mockResolvedValue(null)\n ),\n expected: { status: HttpStatus.NOT_FOUND, message: 'Client not found' }\n }\n ])('should throw $title', async ({ setup, expected }) => {\n const req = baseReq()\n setup()\n await expect(service.createPath(req, { remotePath: 'client/remote' } as any)).rejects.toMatchObject(expected)\n })\n\n it('should create path and return id and permissions, overriding remotePath and permissions', async () => {\n const req = baseReq()\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(isPathIsDir as jest.Mock).mockResolvedValue(true)\n ;(getEnvPermissions as jest.Mock).mockReturnValue('env-perms')\n syncQueries.getClient.mockResolvedValue({ id: 'client-1' })\n // Spy on private getDBProps to simplify\n const getDBPropsSpy = jest.spyOn<any, any>(service as any, 'getDBProps').mockResolvedValue({ ownerId: 1 })\n syncQueries.createPath.mockResolvedValue(123)\n\n const res = await service.createPath(req, { remotePath: 'client/remote', permissions: 'client-perms' } as any)\n expect(res).toEqual({ id: 123, permissions: 'env-perms' })\n expect(syncQueries.createPath).toHaveBeenCalledWith(\n 'client-1',\n { ownerId: 1 },\n expect.objectContaining({ remotePath: 'SPACES/alias/sub', permissions: 'env-perms' })\n )\n\n getDBPropsSpy.mockRestore()\n })\n })\n\n describe('deletePath', () => {\n it.each([\n { user: { id: 1, clientId: undefined } as any, id: 10, status: HttpStatus.BAD_REQUEST, msg: 'Client id is missing' },\n { user: { id: 1, clientId: 'c1' } as any, id: 10, status: HttpStatus.FORBIDDEN }\n ])('should handle errors (status=$status)', async ({ user, id, status, msg }) => {\n if (status === HttpStatus.FORBIDDEN) syncQueries.clientExistsForOwner.mockResolvedValue(false)\n await expect(service.deletePath(user, id)).rejects.toMatchObject(msg ? { status, message: msg } : { status })\n })\n\n it('should catch errors from deletePath and throw BAD_REQUEST', async () => {\n const user: any = { id: 1, clientId: 'c1' }\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.deletePath.mockRejectedValue(new Error('db'))\n await expect(service.deletePath(user, 10)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST,\n message: 'Unable to remove path'\n })\n expect(syncQueries.deletePath).toHaveBeenCalledWith('c1', 10)\n })\n\n it('should delete path successfully when allowed', async () => {\n const user: any = { id: 1, clientId: undefined }\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.deletePath.mockResolvedValue(undefined)\n await expect(service.deletePath(user, 10, 'cX')).resolves.toBeUndefined()\n expect(syncQueries.deletePath).toHaveBeenCalledWith('cX', 10)\n })\n })\n\n describe('updatePath', () => {\n it('should throw FORBIDDEN when client does not belong to owner', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(false)\n await expect(service.updatePath({ id: 1 } as any, 'c1', 5, {} as any)).rejects.toMatchObject({\n status: HttpStatus.FORBIDDEN\n })\n })\n\n it('should throw NOT_FOUND when path settings do not exist', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPathSettings.mockResolvedValue(null)\n await expect(service.updatePath({ id: 1 } as any, 'c1', 5, {} as any)).rejects.toMatchObject({\n status: HttpStatus.NOT_FOUND,\n message: 'Sync path not found'\n })\n })\n\n it('should update path settings, set new timestamp, clear cache and return updated settings', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPathSettings.mockResolvedValue({ id: 5, timestamp: 500, lastSync: 1, remotePath: '/a', permissions: 'p' })\n syncQueries.updatePathSettings.mockResolvedValue(undefined)\n ;(currentTimeStamp as jest.Mock).mockReturnValue(4242)\n\n const out = await service.updatePath({ id: 1 } as any, 'c1', 5, { id: 666, lastSync: 3, permissions: 'new' } as any)\n expect(syncQueries.updatePathSettings).toHaveBeenCalledWith(\n 'c1',\n 5,\n expect.objectContaining({ id: 5, lastSync: 3, timestamp: 4242, permissions: 'new' })\n )\n expect(syncQueries.clearCachePathSettings).toHaveBeenCalledWith('c1', 5)\n expect(out).toEqual(expect.objectContaining({ id: 5, lastSync: 3, timestamp: 4242, permissions: 'new' }))\n })\n\n it('should clear cache and throw INTERNAL_SERVER_ERROR when update fails', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPathSettings.mockResolvedValue({ id: 5, timestamp: 500, lastSync: 1 })\n syncQueries.updatePathSettings.mockRejectedValue(new Error('db'))\n await expect(service.updatePath({ id: 1 } as any, 'c1', 5, {} as any)).rejects.toMatchObject({\n status: HttpStatus.INTERNAL_SERVER_ERROR,\n message: 'Unable to update path'\n })\n expect(syncQueries.clearCachePathSettings).toHaveBeenCalledWith('c1', 5)\n })\n })\n\n describe('updatePaths', () => {\n beforeEach(() => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'p' })\n })\n\n it('should throw when client id is missing', async () => {\n await expect(service.updatePaths(userWith(undefined) as any, [])).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST,\n message: 'Client id is missing'\n })\n })\n\n it('should throw FORBIDDEN when client does not belong to owner', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(false)\n await expect(service.updatePaths(userWith('c1') as any, [])).rejects.toMatchObject({\n status: HttpStatus.FORBIDDEN\n })\n })\n\n it('should mark client paths as deleted and notify when no corresponding server paths (server remotePath undefined)', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 2, settings: { timestamp: 1, lastSync: 1 }, remotePath: undefined }])\n const clientPaths = [{ id: 1, remotePath: 'SPACES/a', timestamp: 1, lastSync: 1, permissions: 'p' } as any]\n\n const res = await service.updatePaths(userWith('c1') as any, clientPaths)\n expect(res.delete).toEqual([1])\n expect(notificationsManager.create).toHaveBeenCalledTimes(1)\n })\n\n it('should propagate spaceEnv errors as BAD_REQUEST', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 1, settings: { timestamp: 1, lastSync: 1 }, remotePath: 'SPACES/x' }])\n spacesManager.spaceEnv.mockRejectedValue(new Error('boom'))\n await expect(\n service.updatePaths(userWith('c1') as any, [{ id: 1, remotePath: 'SPACES/x', timestamp: 1, lastSync: 1, permissions: 'p' } as any])\n ).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST,\n message: 'boom'\n })\n })\n\n it('should skip server path when space is null and mark client item as deleted', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 2, settings: { timestamp: 1, lastSync: 1 }, remotePath: 'SPACES/x' }])\n spacesManager.spaceEnv.mockResolvedValue(null)\n const res = await service.updatePaths(userWith('c1') as any, [\n { id: 2, remotePath: 'SPACES/x', timestamp: 1, lastSync: 1, permissions: 'p' } as any\n ])\n expect(res.delete).toEqual([2])\n expect(notificationsManager.create).toHaveBeenCalledTimes(1)\n })\n\n it('should add server-only path to client with server permissions', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 3, settings: { timestamp: 1, lastSync: 1 }, remotePath: 'SPACES/x' }])\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'perm-xyz' })\n const res = await service.updatePaths(userWith('c1') as any, [])\n expect(res.add).toHaveLength(1)\n expect(res.add[0]).toEqual(expect.objectContaining({ id: 3, remotePath: 'SPACES/x', permissions: 'perm-xyz' }))\n })\n\n it('should update server settings from client when client is newer (no hasUpdates)', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 5, settings: { timestamp: 1, lastSync: 1, foo: 'server' }, remotePath: 'SPACES/x' }])\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'p' })\n\n const client = [{ id: 5, timestamp: 10, lastSync: 2, remotePath: 'SPACES/x', permissions: 'p', foo: 'client' } as any]\n await service.updatePaths(userWith('c1') as any, client)\n\n expect(syncQueries.updatePathSettings).toHaveBeenCalledWith('c1', 5, expect.objectContaining({ foo: 'client', lastSync: 2 }))\n // No client update instructions because hasUpdates=false and serverNewer=false\n })\n\n it('should push server-newer updates to client and also remotePath/permissions corrections', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 7, settings: { timestamp: 20, lastSync: 5, srv: true }, remotePath: 'SPACES/correct' }])\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'permX' })\n\n const client = [{ id: 7, timestamp: 10, lastSync: 5, remotePath: 'SPACES/wrong', permissions: 'old' } as any]\n const res = await service.updatePaths(userWith('c1') as any, client)\n\n // Should have two client updates: one full server settings + corrections, and one corrections-only\n expect(res.update).toEqual(\n expect.arrayContaining([\n expect.objectContaining({ id: 7, srv: true, remotePath: 'SPACES/correct', permissions: 'permX' }),\n expect.objectContaining({ id: 7, remotePath: 'SPACES/correct', permissions: 'permX' })\n ])\n )\n expect(syncQueries.updatePathSettings).toHaveBeenCalledWith('c1', 7, expect.objectContaining({ lastSync: 5 }))\n // clear cache called for each update instruction\n expect(syncQueries.clearCachePathSettings).toHaveBeenCalledTimes(res.update.length)\n for (const u of res.update) {\n expect(syncQueries.clearCachePathSettings).toHaveBeenCalledWith('c1', u.id)\n }\n })\n\n it('should trigger update when lastSync differs even if timestamps and settings match', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 9, settings: { timestamp: 10, lastSync: 1, flag: 'S' }, remotePath: 'SPACES/x' }])\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'p' })\n\n const client = [{ id: 9, timestamp: 10, lastSync: 2, remotePath: 'SPACES/x', permissions: 'p', flag: 'S' } as any]\n await service.updatePaths(userWith('c1') as any, client)\n expect(syncQueries.updatePathSettings).toHaveBeenCalledWith('c1', 9, expect.objectContaining({ lastSync: 2 }))\n })\n\n it('should perform no changes when client and server are identical (no-op branch)', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 12, settings: { timestamp: 5, lastSync: 7, flag: 'A' }, remotePath: 'SPACES/x' }])\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'p' })\n\n const client = [{ id: 12, timestamp: 5, lastSync: 7, remotePath: 'SPACES/x', permissions: 'p', flag: 'A' } as any]\n const res = await service.updatePaths(userWith('c1') as any, client)\n\n expect(res).toEqual({ add: [], update: [], delete: [] })\n expect(syncQueries.updatePathSettings).not.toHaveBeenCalled()\n })\n\n it('should correct client info while keeping server settings when timestamps are equal (hasUpdates=true)', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n // Server has srv='S', client has wrong remotePath/permissions and extra clientOnly flag\n syncQueries.getPaths.mockResolvedValue([{ id: 13, settings: { timestamp: 5, lastSync: 1, srv: 'S' }, remotePath: 'SPACES/correct' }])\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'permX' })\n\n const client = [{ id: 13, timestamp: 5, lastSync: 1, remotePath: 'SPACES/wrong', permissions: 'old', clientOnly: 'C' } as any]\n const res = await service.updatePaths(userWith('c1') as any, client)\n\n // Server uses its own settings base (srv: 'S') with corrections applied\n expect(syncQueries.updatePathSettings).toHaveBeenCalledWith(\n 'c1',\n 13,\n expect.objectContaining({ srv: 'S', lastSync: 1, remotePath: 'SPACES/correct', permissions: 'permX' })\n )\n // Client should receive corrections for remotePath and permissions\n expect(res.update).toEqual(expect.arrayContaining([expect.objectContaining({ id: 13, remotePath: 'SPACES/correct', permissions: 'permX' })]))\n })\n\n it('should log error when updatePathSettings rejects inside updatePaths', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 11, settings: { timestamp: 1, lastSync: 1 }, remotePath: 'SPACES/x' }])\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'p' })\n // Force client newer to trigger updatePathSettings\n const client = [{ id: 11, timestamp: 10, lastSync: 2, remotePath: 'SPACES/x', permissions: 'p' } as any]\n syncQueries.updatePathSettings.mockRejectedValueOnce(new Error('db-fail'))\n const loggerSpy = jest.spyOn((service as any).logger, 'error').mockImplementation(() => undefined)\n\n await service.updatePaths(userWith('c1') as any, client)\n // wait for microtasks to ensure .catch executed\n await flush()\n\n expect(loggerSpy).toHaveBeenCalled()\n expect(loggerSpy.mock.calls.some(([msg]) => String(msg).includes('updatePaths'))).toBe(true)\n })\n\n it('should catch notify failure at updatePaths level when building notification fails', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n // No server paths: will mark client path as deleted and call notify\n syncQueries.getPaths.mockResolvedValue([])\n const loggerSpy = jest.spyOn((service as any).logger, 'error').mockImplementation(() => undefined)\n // BAD first segment to make notify fail while building URL (before notificationsManager.create)\n const client = [{ id: 1, remotePath: 'BAD/a/b', timestamp: 1, lastSync: 1, permissions: 'p' } as any]\n\n const res = await service.updatePaths(userWith('c1') as any, client)\n await flush()\n\n expect(res.delete).toEqual([1])\n expect(loggerSpy).toHaveBeenCalled()\n expect(loggerSpy.mock.calls.some(([msg]) => String(msg).includes('updatePaths'))).toBe(true)\n // create not called because we failed before reaching it\n expect(notificationsManager.create).not.toHaveBeenCalled()\n })\n\n it('should catch error inside notify when notifications creation fails', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([])\n // Valid remotePath to build URL correctly\n const client = [{ id: 2, remotePath: 'SPACES/a', timestamp: 1, lastSync: 1, permissions: 'p' } as any]\n const loggerSpy = jest.spyOn((service as any).logger, 'error').mockImplementation(() => undefined)\n notificationsManager.create.mockRejectedValueOnce(new Error('notify-fail'))\n\n const res = await service.updatePaths(userWith('c1') as any, client)\n await flush()\n\n expect(res.delete).toEqual([2])\n expect(loggerSpy).toHaveBeenCalled()\n // error comes from notify() catch\n expect(loggerSpy.mock.calls.some(([msg]) => String(msg).includes('notify'))).toBe(true)\n })\n })\n\n describe('getDBProps (private) branches', () => {\n it('should throw BAD_REQUEST for shares list selection', async () => {\n await expect((service as any).getDBProps({ inSharesList: true } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST,\n message: 'Sync all shares is not supported, you must select a sub-directory'\n })\n })\n\n it('should return ownerId only for personal space at root', async () => {\n const res = await (service as any).getDBProps({\n inSharesList: false,\n inPersonalSpace: true,\n paths: [],\n dbFile: { ownerId: 42 }\n } as any)\n expect(res).toEqual({ ownerId: 42 })\n })\n\n it('should return ownerId and fileId for personal space subdir', async () => {\n const getOrCreateFileIdSpy = jest.spyOn<any, any>(service as any, 'getOrCreateFileId').mockResolvedValue(77)\n const res = await (service as any).getDBProps({\n inPersonalSpace: true,\n paths: ['sub'],\n dbFile: { ownerId: 42 }\n } as any)\n expect(res).toEqual({ ownerId: 42, fileId: 77 })\n getOrCreateFileIdSpy.mockRestore()\n })\n\n it('should throw BAD_REQUEST for whole files repository without alias', async () => {\n await expect((service as any).getDBProps({ inFilesRepository: true, root: { alias: null }, paths: [] } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST,\n message: 'Sync all space is not yet supported, you must select a sub-directory'\n })\n })\n\n it('should return spaceId and rootId for files repository root selection', async () => {\n const res = await (service as any).getDBProps({\n inFilesRepository: true,\n id: 5,\n root: { id: 3, alias: 'x' },\n paths: []\n } as any)\n expect(res).toEqual({ spaceId: 5, spaceRootId: 3 })\n })\n\n it('should return spaceId, rootId and fileId for files repository subdir or null root', async () => {\n const getOrCreateFileIdSpy = jest.spyOn<any, any>(service as any, 'getOrCreateFileId').mockResolvedValue(88)\n const res = await (service as any).getDBProps({\n inFilesRepository: true,\n id: 5,\n root: { id: 3, alias: 'x' },\n paths: ['sub']\n } as any)\n expect(res).toEqual({ spaceId: 5, spaceRootId: 3, fileId: 88 })\n getOrCreateFileIdSpy.mockRestore()\n })\n\n it('should return spaceId and null spaceRootId plus fileId when files repository root has no id', async () => {\n const getOrCreateFileIdSpy = jest.spyOn<any, any>(service as any, 'getOrCreateFileId').mockResolvedValue(90)\n const res = await (service as any).getDBProps({\n inFilesRepository: true,\n id: 6,\n root: { id: undefined, alias: 'x' },\n paths: []\n } as any)\n expect(res).toEqual({ spaceId: 6, spaceRootId: null, fileId: 90 })\n getOrCreateFileIdSpy.mockRestore()\n })\n\n it('should return shareId only for shares repository root', async () => {\n const res = await (service as any).getDBProps({\n inSharesList: false,\n inPersonalSpace: false,\n inFilesRepository: false,\n inSharesRepository: true,\n id: 9,\n paths: []\n } as any)\n expect(res).toEqual({ shareId: 9 })\n })\n\n it('should return shareId and fileId for shares repository subdir', async () => {\n const getOrCreateFileIdSpy = jest.spyOn<any, any>(service as any, 'getOrCreateFileId').mockResolvedValue(55)\n const res = await (service as any).getDBProps({\n inSharesList: false,\n inPersonalSpace: false,\n inFilesRepository: false,\n inSharesRepository: true,\n id: 9,\n paths: ['sub']\n } as any)\n expect(res).toEqual({ shareId: 9, fileId: 55 })\n getOrCreateFileIdSpy.mockRestore()\n })\n\n it('should return undefined when no space flags match (no branch taken)', async () => {\n const res = await (service as any).getDBProps({\n inSharesList: false,\n inPersonalSpace: false,\n inFilesRepository: false,\n inSharesRepository: false,\n paths: []\n } as any)\n expect(res).toBeUndefined()\n })\n })\n\n describe('getOrCreateFileId (private) branches', () => {\n it('should return existing file id without creation', async () => {\n ;(getProps as jest.Mock).mockResolvedValue({ name: 'file' })\n filesQueries.getSpaceFileId.mockResolvedValue(101)\n const id = await (service as any).getOrCreateFileId({\n realPath: '/rp',\n dbFile: { path: '.' }\n })\n expect(id).toBe(101)\n expect(filesQueries.getOrCreateSpaceFile).not.toHaveBeenCalled()\n })\n\n it('should create file when not exists and return its id', async () => {\n ;(getProps as jest.Mock).mockResolvedValue({ id: 999, name: 'file' })\n filesQueries.getSpaceFileId.mockResolvedValue(0)\n filesQueries.getOrCreateSpaceFile.mockResolvedValue(202)\n const id = await (service as any).getOrCreateFileId({\n realPath: '/rp',\n dbFile: { path: '.' }\n })\n expect(id).toBe(202)\n expect(filesQueries.getOrCreateSpaceFile).toHaveBeenCalledWith(0, expect.objectContaining({ id: undefined }), { path: '.' })\n })\n })\n})\n"],"names":["jest","mock","currentTimeStamp","fn","isPathExists","isPathIsDir","getProps","sanitizePath","p","getEnvPermissions","SYNC_PATH_REPOSITORY","SPACES","PERSONAL","SHARES","NOTIFICATION_APP","SYNC","NOTIFICATION_APP_EVENT","DELETE","CREATE","UPDATE","describe","SyncPathsManager","name","service","contextManager","spacesManager","usersQueries","filesQueries","notificationsManager","syncQueries","userWith","clientId","id","flush","Promise","r","setImmediate","beforeEach","headerOriginUrl","spaceEnv","getSpaceFileId","getOrCreateSpaceFile","create","mockResolvedValue","undefined","getClient","clientExistsForOwner","createPath","deletePath","getPaths","getPathSettings","updatePathSettings","clearCachePathSettings","mockReset","mockReturnValue","module","Test","createTestingModule","providers","provide","ContextManager","useValue","SpacesManager","UsersQueries","FilesQueries","NotificationsManager","SyncQueries","compile","useLogger","get","it","expect","toBeDefined","baseReq","user","params","space","realPath","quotaIsExceeded","root","alias","inFilesRepository","paths","dbFile","ownerId","path","req","remotePath","rejects","toMatchObject","status","HttpStatus","BAD_REQUEST","message","INSUFFICIENT_STORAGE","each","title","setup","expected","NOT_FOUND","getDBPropsSpy","spyOn","res","permissions","toEqual","toHaveBeenCalledWith","objectContaining","mockRestore","msg","FORBIDDEN","mockRejectedValue","Error","resolves","toBeUndefined","updatePath","timestamp","lastSync","out","INTERNAL_SERVER_ERROR","envPermissions","updatePaths","settings","clientPaths","delete","toHaveBeenCalledTimes","add","toHaveLength","foo","client","srv","update","arrayContaining","length","u","flag","not","toHaveBeenCalled","clientOnly","mockRejectedValueOnce","loggerSpy","logger","mockImplementation","calls","some","String","includes","toBe","getDBProps","inSharesList","inPersonalSpace","getOrCreateFileIdSpy","fileId","spaceId","spaceRootId","inSharesRepository","shareId","getOrCreateFileId"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/sync/services/sync-paths-manager.service.spec.ts"],"sourcesContent":["import { HttpStatus } from '@nestjs/common'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { currentTimeStamp } from '../../../common/shared'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport { FilesQueries } from '../../files/services/files-queries.service'\nimport { getProps, isPathExists, isPathIsDir } from '../../files/utils/files'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { SpacesManager } from '../../spaces/services/spaces-manager.service'\nimport { getEnvPermissions } from '../../spaces/utils/permissions'\nimport { UsersQueries } from '../../users/services/users-queries.service'\nimport { SyncPathsManager } from './sync-paths-manager.service'\nimport { SyncQueries } from './sync-queries.service'\n\n// Mock modules used directly inside SyncPathsManager\njest.mock('../../../common/shared', () => ({\n currentTimeStamp: jest.fn(() => 1000)\n}))\njest.mock('../../files/utils/files', () => ({\n isPathExists: jest.fn(),\n isPathIsDir: jest.fn(),\n getProps: jest.fn(),\n sanitizePath: jest.fn((p: string) => p)\n}))\njest.mock('../../spaces/utils/permissions', () => ({\n getEnvPermissions: jest.fn(() => 'server-perms')\n}))\njest.mock('../constants/sync', () => ({\n SYNC_PATH_REPOSITORY: {\n SPACES: ['spaces'],\n PERSONAL: ['personal'],\n SHARES: ['shares']\n }\n}))\njest.mock('../../notifications/constants/notifications', () => ({\n NOTIFICATION_APP: { SYNC: 'SYNC' },\n NOTIFICATION_APP_EVENT: { SYNC: { DELETE: 'DELETE', CREATE: 'CREATE', UPDATE: 'UPDATE' } }\n}))\n\ndescribe(SyncPathsManager.name, () => {\n let service: SyncPathsManager\n let contextManager: { headerOriginUrl: jest.Mock }\n let spacesManager: { spaceEnv: jest.Mock }\n let usersQueries: Record<string, jest.Mock>\n let filesQueries: { getSpaceFileId: jest.Mock; getOrCreateSpaceFile: jest.Mock }\n let notificationsManager: { create: jest.Mock }\n let syncQueries: {\n getClient: jest.Mock\n clientExistsForOwner: jest.Mock\n createPath: jest.Mock\n deletePath: jest.Mock\n getPaths: jest.Mock\n getPathSettings: jest.Mock\n updatePathSettings: jest.Mock\n clearCachePathSettings: jest.Mock\n }\n\n const userWith = (clientId?: string) => ({ id: 1, clientId })\n const flush = () => new Promise((r) => setImmediate(r))\n\n beforeEach(async () => {\n contextManager = { headerOriginUrl: jest.fn(() => 'http://origin.local') }\n spacesManager = { spaceEnv: jest.fn() }\n usersQueries = {}\n filesQueries = {\n getSpaceFileId: jest.fn(),\n getOrCreateSpaceFile: jest.fn()\n }\n notificationsManager = {\n create: jest.fn().mockResolvedValue(undefined)\n }\n syncQueries = {\n getClient: jest.fn(),\n clientExistsForOwner: jest.fn(),\n createPath: jest.fn(),\n deletePath: jest.fn(),\n getPaths: jest.fn(),\n getPathSettings: jest.fn(),\n updatePathSettings: jest.fn().mockResolvedValue(undefined),\n clearCachePathSettings: jest.fn()\n }\n ;(isPathExists as jest.Mock).mockReset()\n ;(isPathIsDir as jest.Mock).mockReset()\n ;(getProps as jest.Mock).mockReset()\n ;(getEnvPermissions as jest.Mock).mockReset().mockReturnValue('server-perms')\n ;(currentTimeStamp as jest.Mock).mockReset().mockReturnValue(1000)\n\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n SyncPathsManager,\n { provide: ContextManager, useValue: contextManager },\n { provide: SpacesManager, useValue: spacesManager },\n { provide: UsersQueries, useValue: usersQueries },\n { provide: FilesQueries, useValue: filesQueries },\n { provide: NotificationsManager, useValue: notificationsManager },\n { provide: SyncQueries, useValue: syncQueries }\n ]\n }).compile()\n\n module.useLogger(['fatal'])\n service = module.get<SyncPathsManager>(SyncPathsManager)\n })\n\n it('should be defined', () => {\n expect(service).toBeDefined()\n })\n\n describe('createPath', () => {\n const baseReq = () =>\n ({\n user: { id: 1, clientId: 'client-1' },\n params: { '*': 'SPACES/alias/sub' },\n space: {\n realPath: '/real/path',\n quotaIsExceeded: false,\n root: { id: 1, alias: 'alias' },\n inFilesRepository: true,\n paths: ['sub'],\n dbFile: { ownerId: 1, path: '.' },\n id: 10\n }\n }) as any\n\n it('should throw BAD_REQUEST when client id is missing', async () => {\n const req = baseReq()\n req.user.clientId = undefined\n await expect(service.createPath(req, { remotePath: 'x' } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST,\n message: 'Client id is missing'\n })\n })\n\n it('should throw INSUFFICIENT_STORAGE when storage quota is exceeded', async () => {\n const req = baseReq()\n req.space.quotaIsExceeded = true\n await expect(service.createPath(req, { remotePath: 'x' } as any)).rejects.toMatchObject({\n status: HttpStatus.INSUFFICIENT_STORAGE\n })\n })\n\n it.each([\n {\n title: 'NOT_FOUND when remote path does not exist',\n setup: () => (isPathExists as jest.Mock).mockResolvedValue(false),\n expected: { status: HttpStatus.NOT_FOUND, message: 'Remote path not found : client/remote' }\n },\n {\n title: 'BAD_REQUEST when remote path is not a directory',\n setup: () => ((isPathExists as jest.Mock).mockResolvedValue(true), (isPathIsDir as jest.Mock).mockResolvedValue(false)),\n expected: { status: HttpStatus.BAD_REQUEST, message: 'Remote path must be a directory' }\n },\n {\n title: 'NOT_FOUND when client is not found',\n setup: () => (\n (isPathExists as jest.Mock).mockResolvedValue(true),\n (isPathIsDir as jest.Mock).mockResolvedValue(true),\n syncQueries.getClient.mockResolvedValue(null)\n ),\n expected: { status: HttpStatus.NOT_FOUND, message: 'Client not found' }\n }\n ])('should throw $title', async ({ setup, expected }) => {\n const req = baseReq()\n setup()\n await expect(service.createPath(req, { remotePath: 'client/remote' } as any)).rejects.toMatchObject(expected)\n })\n\n it('should create path and return id and permissions, overriding remotePath and permissions', async () => {\n const req = baseReq()\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(isPathIsDir as jest.Mock).mockResolvedValue(true)\n ;(getEnvPermissions as jest.Mock).mockReturnValue('env-perms')\n syncQueries.getClient.mockResolvedValue({ id: 'client-1' })\n // Spy on private getDBProps to simplify\n const getDBPropsSpy = jest.spyOn<any, any>(service as any, 'getDBProps').mockResolvedValue({ ownerId: 1 })\n syncQueries.createPath.mockResolvedValue(123)\n\n const res = await service.createPath(req, { remotePath: 'client/remote', permissions: 'client-perms' } as any)\n expect(res).toEqual({ id: 123, permissions: 'env-perms' })\n expect(syncQueries.createPath).toHaveBeenCalledWith(\n 'client-1',\n { ownerId: 1 },\n expect.objectContaining({ remotePath: 'SPACES/alias/sub', permissions: 'env-perms' })\n )\n\n getDBPropsSpy.mockRestore()\n })\n })\n\n describe('deletePath', () => {\n it.each([\n { user: { id: 1, clientId: undefined } as any, id: 10, status: HttpStatus.BAD_REQUEST, msg: 'Client id is missing' },\n { user: { id: 1, clientId: 'c1' } as any, id: 10, status: HttpStatus.FORBIDDEN }\n ])('should handle errors (status=$status)', async ({ user, id, status, msg }) => {\n if (status === HttpStatus.FORBIDDEN) syncQueries.clientExistsForOwner.mockResolvedValue(false)\n await expect(service.deletePath(user, id)).rejects.toMatchObject(msg ? { status, message: msg } : { status })\n })\n\n it('should catch errors from deletePath and throw BAD_REQUEST', async () => {\n const user: any = { id: 1, clientId: 'c1' }\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.deletePath.mockRejectedValue(new Error('db'))\n await expect(service.deletePath(user, 10)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST,\n message: 'Unable to remove path'\n })\n expect(syncQueries.deletePath).toHaveBeenCalledWith('c1', 10)\n })\n\n it('should delete path successfully when allowed', async () => {\n const user: any = { id: 1, clientId: undefined }\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.deletePath.mockResolvedValue(undefined)\n await expect(service.deletePath(user, 10, 'cX')).resolves.toBeUndefined()\n expect(syncQueries.deletePath).toHaveBeenCalledWith('cX', 10)\n })\n })\n\n describe('updatePath', () => {\n it('should throw FORBIDDEN when client does not belong to owner', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(false)\n await expect(service.updatePath({ id: 1 } as any, 'c1', 5, {} as any)).rejects.toMatchObject({\n status: HttpStatus.FORBIDDEN\n })\n })\n\n it('should throw NOT_FOUND when path settings do not exist', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPathSettings.mockResolvedValue(null)\n await expect(service.updatePath({ id: 1 } as any, 'c1', 5, {} as any)).rejects.toMatchObject({\n status: HttpStatus.NOT_FOUND,\n message: 'Sync path not found'\n })\n })\n\n it('should update path settings, set new timestamp, clear cache and return updated settings', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPathSettings.mockResolvedValue({ id: 5, timestamp: 500, lastSync: 1, remotePath: '/a', permissions: 'p' })\n syncQueries.updatePathSettings.mockResolvedValue(undefined)\n ;(currentTimeStamp as jest.Mock).mockReturnValue(4242)\n\n const out = await service.updatePath({ id: 1 } as any, 'c1', 5, { id: 666, lastSync: 3, permissions: 'new' } as any)\n expect(syncQueries.updatePathSettings).toHaveBeenCalledWith(\n 'c1',\n 5,\n expect.objectContaining({ id: 5, lastSync: 3, timestamp: 4242, permissions: 'new' })\n )\n expect(syncQueries.clearCachePathSettings).toHaveBeenCalledWith('c1', 5)\n expect(out).toEqual(expect.objectContaining({ id: 5, lastSync: 3, timestamp: 4242, permissions: 'new' }))\n })\n\n it('should clear cache and throw INTERNAL_SERVER_ERROR when update fails', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPathSettings.mockResolvedValue({ id: 5, timestamp: 500, lastSync: 1 })\n syncQueries.updatePathSettings.mockRejectedValue(new Error('db'))\n await expect(service.updatePath({ id: 1 } as any, 'c1', 5, {} as any)).rejects.toMatchObject({\n status: HttpStatus.INTERNAL_SERVER_ERROR,\n message: 'Unable to update path'\n })\n expect(syncQueries.clearCachePathSettings).toHaveBeenCalledWith('c1', 5)\n })\n })\n\n describe('updatePaths', () => {\n beforeEach(() => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'p' })\n })\n\n it('should throw when client id is missing', async () => {\n await expect(service.updatePaths(userWith(undefined) as any, [])).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST,\n message: 'Client id is missing'\n })\n })\n\n it('should throw FORBIDDEN when client does not belong to owner', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(false)\n await expect(service.updatePaths(userWith('c1') as any, [])).rejects.toMatchObject({\n status: HttpStatus.FORBIDDEN\n })\n })\n\n it('should mark client paths as deleted and notify when no corresponding server paths (server remotePath undefined)', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 2, settings: { timestamp: 1, lastSync: 1 }, remotePath: undefined }])\n const clientPaths = [{ id: 1, remotePath: 'SPACES/a', timestamp: 1, lastSync: 1, permissions: 'p' } as any]\n\n const res = await service.updatePaths(userWith('c1') as any, clientPaths)\n expect(res.delete).toEqual([1])\n expect(notificationsManager.create).toHaveBeenCalledTimes(1)\n })\n\n it('should propagate spaceEnv errors as BAD_REQUEST', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 1, settings: { timestamp: 1, lastSync: 1 }, remotePath: 'SPACES/x' }])\n spacesManager.spaceEnv.mockRejectedValue(new Error('boom'))\n await expect(\n service.updatePaths(userWith('c1') as any, [{ id: 1, remotePath: 'SPACES/x', timestamp: 1, lastSync: 1, permissions: 'p' } as any])\n ).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST,\n message: 'boom'\n })\n })\n\n it('should skip server path when space is null and mark client item as deleted', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 2, settings: { timestamp: 1, lastSync: 1 }, remotePath: 'SPACES/x' }])\n spacesManager.spaceEnv.mockResolvedValue(null)\n const res = await service.updatePaths(userWith('c1') as any, [\n { id: 2, remotePath: 'SPACES/x', timestamp: 1, lastSync: 1, permissions: 'p' } as any\n ])\n expect(res.delete).toEqual([2])\n expect(notificationsManager.create).toHaveBeenCalledTimes(1)\n })\n\n it('should add server-only path to client with server permissions', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 3, settings: { timestamp: 1, lastSync: 1 }, remotePath: 'SPACES/x' }])\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'perm-xyz' })\n const res = await service.updatePaths(userWith('c1') as any, [])\n expect(res.add).toHaveLength(1)\n expect(res.add[0]).toEqual(expect.objectContaining({ id: 3, remotePath: 'SPACES/x', permissions: 'perm-xyz' }))\n })\n\n it('should update server settings from client when client is newer (no hasUpdates)', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 5, settings: { timestamp: 1, lastSync: 1, foo: 'server' }, remotePath: 'SPACES/x' }])\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'p' })\n\n const client = [{ id: 5, timestamp: 10, lastSync: 2, remotePath: 'SPACES/x', permissions: 'p', foo: 'client' } as any]\n await service.updatePaths(userWith('c1') as any, client)\n\n expect(syncQueries.updatePathSettings).toHaveBeenCalledWith('c1', 5, expect.objectContaining({ foo: 'client', lastSync: 2 }))\n // No client update instructions because hasUpdates=false and serverNewer=false\n })\n\n it('should push server-newer updates to client and also remotePath/permissions corrections', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 7, settings: { timestamp: 20, lastSync: 5, srv: true }, remotePath: 'SPACES/correct' }])\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'permX' })\n\n const client = [{ id: 7, timestamp: 10, lastSync: 5, remotePath: 'SPACES/wrong', permissions: 'old' } as any]\n const res = await service.updatePaths(userWith('c1') as any, client)\n\n // Should have two client updates: one full server settings + corrections, and one corrections-only\n expect(res.update).toEqual(\n expect.arrayContaining([\n expect.objectContaining({ id: 7, srv: true, remotePath: 'SPACES/correct', permissions: 'permX' }),\n expect.objectContaining({ id: 7, remotePath: 'SPACES/correct', permissions: 'permX' })\n ])\n )\n expect(syncQueries.updatePathSettings).toHaveBeenCalledWith('c1', 7, expect.objectContaining({ lastSync: 5 }))\n // clear cache called for each update instruction\n expect(syncQueries.clearCachePathSettings).toHaveBeenCalledTimes(res.update.length)\n for (const u of res.update) {\n expect(syncQueries.clearCachePathSettings).toHaveBeenCalledWith('c1', u.id)\n }\n })\n\n it('should trigger update when lastSync differs even if timestamps and settings match', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 9, settings: { timestamp: 10, lastSync: 1, flag: 'S' }, remotePath: 'SPACES/x' }])\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'p' })\n\n const client = [{ id: 9, timestamp: 10, lastSync: 2, remotePath: 'SPACES/x', permissions: 'p', flag: 'S' } as any]\n await service.updatePaths(userWith('c1') as any, client)\n expect(syncQueries.updatePathSettings).toHaveBeenCalledWith('c1', 9, expect.objectContaining({ lastSync: 2 }))\n })\n\n it('should perform no changes when client and server are identical (no-op branch)', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 12, settings: { timestamp: 5, lastSync: 7, flag: 'A' }, remotePath: 'SPACES/x' }])\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'p' })\n\n const client = [{ id: 12, timestamp: 5, lastSync: 7, remotePath: 'SPACES/x', permissions: 'p', flag: 'A' } as any]\n const res = await service.updatePaths(userWith('c1') as any, client)\n\n expect(res).toEqual({ add: [], update: [], delete: [] })\n expect(syncQueries.updatePathSettings).not.toHaveBeenCalled()\n })\n\n it('should correct client info while keeping server settings when timestamps are equal (hasUpdates=true)', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n // Server has srv='S', client has wrong remotePath/permissions and extra clientOnly flag\n syncQueries.getPaths.mockResolvedValue([{ id: 13, settings: { timestamp: 5, lastSync: 1, srv: 'S' }, remotePath: 'SPACES/correct' }])\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'permX' })\n\n const client = [{ id: 13, timestamp: 5, lastSync: 1, remotePath: 'SPACES/wrong', permissions: 'old', clientOnly: 'C' } as any]\n const res = await service.updatePaths(userWith('c1') as any, client)\n\n // Server uses its own settings base (srv: 'S') with corrections applied\n expect(syncQueries.updatePathSettings).toHaveBeenCalledWith(\n 'c1',\n 13,\n expect.objectContaining({ srv: 'S', lastSync: 1, remotePath: 'SPACES/correct', permissions: 'permX' })\n )\n // Client should receive corrections for remotePath and permissions\n expect(res.update).toEqual(expect.arrayContaining([expect.objectContaining({ id: 13, remotePath: 'SPACES/correct', permissions: 'permX' })]))\n })\n\n it('should log error when updatePathSettings rejects inside updatePaths', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 11, settings: { timestamp: 1, lastSync: 1 }, remotePath: 'SPACES/x' }])\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'p' })\n // Force client newer to trigger updatePathSettings\n const client = [{ id: 11, timestamp: 10, lastSync: 2, remotePath: 'SPACES/x', permissions: 'p' } as any]\n syncQueries.updatePathSettings.mockRejectedValueOnce(new Error('db-fail'))\n const loggerSpy = jest.spyOn((service as any).logger, 'error').mockImplementation(() => undefined)\n\n await service.updatePaths(userWith('c1') as any, client)\n // wait for microtasks to ensure .catch executed\n await flush()\n\n expect(loggerSpy).toHaveBeenCalled()\n expect(loggerSpy.mock.calls.some(([payload]: { tag: string }[]) => payload?.tag === 'updatePaths')).toBe(true)\n })\n\n it('should catch notify failure at updatePaths level when building notification fails', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n // No server paths: will mark client path as deleted and call notify\n syncQueries.getPaths.mockResolvedValue([])\n const loggerSpy = jest.spyOn((service as any).logger, 'error').mockImplementation(() => undefined)\n // BAD first segment to make notify fail while building URL (before notificationsManager.create)\n const client = [{ id: 1, remotePath: 'BAD/a/b', timestamp: 1, lastSync: 1, permissions: 'p' } as any]\n\n const res = await service.updatePaths(userWith('c1') as any, client)\n await flush()\n\n expect(res.delete).toEqual([1])\n expect(loggerSpy).toHaveBeenCalled()\n expect(loggerSpy.mock.calls.some(([payload]: { tag: string }[]) => payload?.tag === 'updatePaths')).toBe(true)\n // create not called because we failed before reaching it\n expect(notificationsManager.create).not.toHaveBeenCalled()\n })\n\n it('should catch error inside notify when notifications creation fails', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([])\n // Valid remotePath to build URL correctly\n const client = [{ id: 2, remotePath: 'SPACES/a', timestamp: 1, lastSync: 1, permissions: 'p' } as any]\n const loggerSpy = jest.spyOn((service as any).logger, 'error').mockImplementation(() => undefined)\n notificationsManager.create.mockRejectedValueOnce(new Error('notify-fail'))\n\n const res = await service.updatePaths(userWith('c1') as any, client)\n await flush()\n\n expect(res.delete).toEqual([2])\n expect(loggerSpy).toHaveBeenCalled()\n // error comes from notify() catch\n expect(loggerSpy.mock.calls.some(([payload]: { tag: string }[]) => payload?.tag === 'notify')).toBe(true)\n })\n })\n\n describe('getDBProps (private) branches', () => {\n it('should throw BAD_REQUEST for shares list selection', async () => {\n await expect((service as any).getDBProps({ inSharesList: true } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST,\n message: 'Syncing all shares is not supported. Please select a subdirectory'\n })\n })\n\n it('should throw BAD_REQUEST for personal space selection', async () => {\n await expect(\n (service as any).getDBProps({\n inSharesList: false,\n inPersonalSpace: true,\n paths: [],\n dbFile: { ownerId: 42 }\n } as any)\n ).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST,\n message: 'Syncing all personal files is not supported. Please select a subdirectory'\n })\n })\n\n it('should return ownerId and fileId for personal space subdir', async () => {\n const getOrCreateFileIdSpy = jest.spyOn<any, any>(service as any, 'getOrCreateFileId').mockResolvedValue(77)\n const res = await (service as any).getDBProps({\n inPersonalSpace: true,\n paths: ['sub'],\n dbFile: { ownerId: 42 }\n } as any)\n expect(res).toEqual({ ownerId: 42, fileId: 77 })\n getOrCreateFileIdSpy.mockRestore()\n })\n\n it('should throw BAD_REQUEST for whole files repository without alias', async () => {\n await expect((service as any).getDBProps({ inFilesRepository: true, root: { alias: null }, paths: [] } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST,\n message: 'Syncing the entire space is not yet supported. Please select a subdirectory'\n })\n })\n\n it('should return spaceId and rootId for files repository root selection', async () => {\n const res = await (service as any).getDBProps({\n inFilesRepository: true,\n id: 5,\n root: { id: 3, alias: 'x' },\n paths: []\n } as any)\n expect(res).toEqual({ spaceId: 5, spaceRootId: 3 })\n })\n\n it('should return spaceId, rootId and fileId for files repository subdir or null root', async () => {\n const getOrCreateFileIdSpy = jest.spyOn<any, any>(service as any, 'getOrCreateFileId').mockResolvedValue(88)\n const res = await (service as any).getDBProps({\n inFilesRepository: true,\n id: 5,\n root: { id: 3, alias: 'x' },\n paths: ['sub']\n } as any)\n expect(res).toEqual({ spaceId: 5, spaceRootId: 3, fileId: 88 })\n getOrCreateFileIdSpy.mockRestore()\n })\n\n it('should return spaceId and null spaceRootId plus fileId when files repository root has no id', async () => {\n const getOrCreateFileIdSpy = jest.spyOn<any, any>(service as any, 'getOrCreateFileId').mockResolvedValue(90)\n const res = await (service as any).getDBProps({\n inFilesRepository: true,\n id: 6,\n root: { id: undefined, alias: 'x' },\n paths: []\n } as any)\n expect(res).toEqual({ spaceId: 6, spaceRootId: null, fileId: 90 })\n getOrCreateFileIdSpy.mockRestore()\n })\n\n it('should return shareId only for shares repository root', async () => {\n const res = await (service as any).getDBProps({\n inSharesList: false,\n inPersonalSpace: false,\n inFilesRepository: false,\n inSharesRepository: true,\n id: 9,\n paths: []\n } as any)\n expect(res).toEqual({ shareId: 9 })\n })\n\n it('should return shareId and fileId for shares repository subdir', async () => {\n const getOrCreateFileIdSpy = jest.spyOn<any, any>(service as any, 'getOrCreateFileId').mockResolvedValue(55)\n const res = await (service as any).getDBProps({\n inSharesList: false,\n inPersonalSpace: false,\n inFilesRepository: false,\n inSharesRepository: true,\n id: 9,\n paths: ['sub']\n } as any)\n expect(res).toEqual({ shareId: 9, fileId: 55 })\n getOrCreateFileIdSpy.mockRestore()\n })\n\n it('should return undefined when no space flags match (no branch taken)', async () => {\n const res = await (service as any).getDBProps({\n inSharesList: false,\n inPersonalSpace: false,\n inFilesRepository: false,\n inSharesRepository: false,\n paths: []\n } as any)\n expect(res).toBeUndefined()\n })\n })\n\n describe('getOrCreateFileId (private) branches', () => {\n it('should return existing file id without creation', async () => {\n ;(getProps as jest.Mock).mockResolvedValue({ name: 'file' })\n filesQueries.getSpaceFileId.mockResolvedValue(101)\n const id = await (service as any).getOrCreateFileId({\n realPath: '/rp',\n dbFile: { path: '.' }\n })\n expect(id).toBe(101)\n expect(filesQueries.getOrCreateSpaceFile).not.toHaveBeenCalled()\n })\n\n it('should create file when not exists and return its id', async () => {\n ;(getProps as jest.Mock).mockResolvedValue({ id: 999, name: 'file' })\n filesQueries.getSpaceFileId.mockResolvedValue(0)\n filesQueries.getOrCreateSpaceFile.mockResolvedValue(202)\n const id = await (service as any).getOrCreateFileId({\n realPath: '/rp',\n dbFile: { path: '.' }\n })\n expect(id).toBe(202)\n expect(filesQueries.getOrCreateSpaceFile).toHaveBeenCalledWith(0, expect.objectContaining({ id: undefined }), { path: '.' })\n })\n })\n})\n"],"names":["jest","mock","currentTimeStamp","fn","isPathExists","isPathIsDir","getProps","sanitizePath","p","getEnvPermissions","SYNC_PATH_REPOSITORY","SPACES","PERSONAL","SHARES","NOTIFICATION_APP","SYNC","NOTIFICATION_APP_EVENT","DELETE","CREATE","UPDATE","describe","SyncPathsManager","name","service","contextManager","spacesManager","usersQueries","filesQueries","notificationsManager","syncQueries","userWith","clientId","id","flush","Promise","r","setImmediate","beforeEach","headerOriginUrl","spaceEnv","getSpaceFileId","getOrCreateSpaceFile","create","mockResolvedValue","undefined","getClient","clientExistsForOwner","createPath","deletePath","getPaths","getPathSettings","updatePathSettings","clearCachePathSettings","mockReset","mockReturnValue","module","Test","createTestingModule","providers","provide","ContextManager","useValue","SpacesManager","UsersQueries","FilesQueries","NotificationsManager","SyncQueries","compile","useLogger","get","it","expect","toBeDefined","baseReq","user","params","space","realPath","quotaIsExceeded","root","alias","inFilesRepository","paths","dbFile","ownerId","path","req","remotePath","rejects","toMatchObject","status","HttpStatus","BAD_REQUEST","message","INSUFFICIENT_STORAGE","each","title","setup","expected","NOT_FOUND","getDBPropsSpy","spyOn","res","permissions","toEqual","toHaveBeenCalledWith","objectContaining","mockRestore","msg","FORBIDDEN","mockRejectedValue","Error","resolves","toBeUndefined","updatePath","timestamp","lastSync","out","INTERNAL_SERVER_ERROR","envPermissions","updatePaths","settings","clientPaths","delete","toHaveBeenCalledTimes","add","toHaveLength","foo","client","srv","update","arrayContaining","length","u","flag","not","toHaveBeenCalled","clientOnly","mockRejectedValueOnce","loggerSpy","logger","mockImplementation","calls","some","payload","tag","toBe","getDBProps","inSharesList","inPersonalSpace","getOrCreateFileIdSpy","fileId","spaceId","spaceRootId","inSharesRepository","shareId","getOrCreateFileId"],"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/sync/services/sync-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, SQL, sql } from 'drizzle-orm'\nimport { alias } from 'drizzle-orm/mysql-core'\nimport crypto from 'node:crypto'\nimport { convertHumanTimeToSeconds } from '../../../common/functions'\nimport { currentTimeStamp } from '../../../common/shared'\nimport { CacheDecorator } from '../../../infrastructure/cache/cache.decorator'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport type { DBSchema } from '../../../infrastructure/database/interfaces/database.interface'\nimport { concatDistinctObjectsInArray, dbCheckAffectedRows, dbGetInsertedId } from '../../../infrastructure/database/utils'\nimport { filePathSQL, files } from '../../files/schemas/files.schema'\nimport { shares } from '../../shares/schemas/shares.schema'\nimport { spacesRoots } from '../../spaces/schemas/spaces-roots.schema'\nimport { spaces } from '../../spaces/schemas/spaces.schema'\nimport type { UserModel } from '../../users/models/user.model'\nimport { CLIENT_TOKEN_EXPIRATION_TIME } from '../constants/auth'\nimport { SYNC_REPOSITORY } from '../constants/sync'\nimport { SyncClientPaths } from '../interfaces/sync-client-paths.interface'\nimport { SyncClientInfo } from '../interfaces/sync-client.interface'\nimport { SyncDBProps, SyncPathSettings } from '../interfaces/sync-path.interface'\nimport { SyncClient } from '../schemas/sync-client.interface'\nimport { syncClients } from '../schemas/sync-clients.schema'\nimport { SyncPath } from '../schemas/sync-path.interface'\nimport { syncPaths } from '../schemas/sync-paths.schema'\n\n@Injectable()\nexport class SyncQueries {\n constructor(\n @Inject(DB_TOKEN_PROVIDER) private readonly db: DBSchema,\n private readonly cache: Cache\n ) {}\n\n async clientExistsForOwner(ownerId: number, clientId: string): Promise<boolean> {\n const [client] = await this.db\n .select({ id: syncClients.id })\n .from(syncClients)\n .where(and(eq(syncClients.ownerId, ownerId), eq(syncClients.id, clientId)))\n .limit(1)\n return !!client?.id\n }\n\n async getOrCreateClient(ownerId: number, clientId: string, info: SyncClientInfo, ip: string): Promise<string> {\n const client = await this.getClient(clientId, ownerId)\n if (client) {\n if (currentTimeStamp() < client.tokenExpiration) {\n return client.token\n }\n // renew token if it has expired\n const token = crypto.randomUUID()\n dbCheckAffectedRows(\n await this.db\n .update(syncClients)\n .set({\n token: token,\n tokenExpiration: currentTimeStamp() + convertHumanTimeToSeconds(CLIENT_TOKEN_EXPIRATION_TIME)\n })\n .where(and(eq(syncClients.ownerId, ownerId), eq(syncClients.id, clientId)))\n .limit(1),\n 1\n )\n return token\n } else {\n // create client\n const token = crypto.randomUUID()\n dbCheckAffectedRows(\n await this.db.insert(syncClients).values({\n id: clientId,\n ownerId: ownerId,\n token: token,\n tokenExpiration: currentTimeStamp() + convertHumanTimeToSeconds(CLIENT_TOKEN_EXPIRATION_TIME),\n info: info,\n currentAccess: new Date(),\n currentIp: ip\n } as SyncClient),\n 1\n )\n return token\n }\n }\n\n async getClient(clientId: string, ownerId?: number, token?: string): Promise<SyncClient> {\n const where: SQL[] = [\n eq(syncClients.id, clientId),\n ...(ownerId ? [eq(syncClients.ownerId, ownerId)] : []),\n ...(token ? [eq(syncClients.token, token)] : [])\n ]\n const [client] = await this.db\n .select({\n id: syncClients.id,\n ownerId: syncClients.ownerId,\n token: syncClients.token,\n tokenExpiration: syncClients.tokenExpiration,\n info: syncClients.info,\n enabled: syncClients.enabled,\n currentAccess: syncClients.currentAccess,\n currentIp: syncClients.currentIp,\n lastAccess: syncClients.lastAccess,\n lastIp: syncClients.lastIp,\n createdAt: syncClients.createdAt\n })\n .from(syncClients)\n .where(and(...where))\n .limit(1)\n return client\n }\n\n async getClients(owner: UserModel): Promise<SyncClientPaths[]> {\n const clientId = owner.clientId || null\n return this.db\n .select({\n id: syncClients.id,\n tokenExpiration: syncClients.tokenExpiration,\n info: syncClients.info,\n enabled: syncClients.enabled,\n currentAccess: syncClients.currentAccess,\n currentIp: syncClients.currentIp,\n lastAccess: syncClients.lastAccess,\n lastIp: syncClients.lastIp,\n createdAt: syncClients.createdAt,\n isCurrentClient: sql<boolean>`IF (${clientId} IS NOT NULL AND ${syncClients.id} = ${clientId}, 1, 0)`.mapWith(Boolean),\n paths: concatDistinctObjectsInArray(syncPaths.id, {\n id: syncPaths.id,\n settings: syncPaths.settings,\n createdAt: syncPaths.createdAt\n })\n })\n .from(syncClients)\n .leftJoin(syncPaths, eq(syncPaths.clientId, syncClients.id))\n .where(eq(syncClients.ownerId, owner.id))\n .groupBy(syncClients.id)\n .orderBy(desc(syncClients.currentAccess))\n }\n\n async deleteClient(ownerId: number, clientId: string) {\n dbCheckAffectedRows(\n await this.db\n .delete(syncClients)\n .where(and(eq(syncClients.ownerId, ownerId), eq(syncClients.id, clientId)))\n .limit(1),\n 1\n )\n }\n\n async renewClientTokenAndExpiration(clientId: string, token: string, expiration: number) {\n dbCheckAffectedRows(await this.db.update(syncClients).set({ token: token, tokenExpiration: expiration }).where(eq(syncClients.id, clientId)), 1)\n }\n\n async updateClientInfo(client: SyncClient, info: SyncClientInfo, ip: string) {\n await this.db\n .update(syncClients)\n .set({\n lastAccess: client.currentAccess,\n currentAccess: new Date(),\n lastIp: client.currentIp,\n currentIp: ip,\n info: info\n } as SyncClient)\n .where(eq(syncClients.id, client.id))\n }\n\n getPaths(clientId: string): Promise<{ id: number; settings: SyncPathSettings; remotePath: string }[]> {\n const shareFile: any = alias(files, 'shareFile')\n const spaceRootFile: any = alias(files, 'spaceRootFile')\n return this.db\n .select({\n id: syncPaths.id,\n remotePath: sql<string>`\n CASE WHEN ${syncPaths.ownerId} IS NOT NULL THEN CONCAT_WS('/', ${SYNC_REPOSITORY.PERSONAL}, ${filePathSQL(files)})\n WHEN ${syncPaths.spaceId} IS NOT NULL THEN CONCAT_WS('/', \n ${SYNC_REPOSITORY.SPACES}, \n ${spaces.alias}, \n CASE WHEN ${syncPaths.spaceRootId} IS NULL \n THEN CONCAT_WS('/', IF (${files.path} = '.', NULL, ${files.path}), ${files.name})\n ELSE\n CASE WHEN ${syncPaths.fileId} IS NULL \n THEN ${spacesRoots.alias}\n ELSE\n IF (${spacesRoots.externalPath} IS NOT NULL, \n CONCAT_WS('/', ${spacesRoots.alias}, IF (${files.path} = '.', NULL, ${files.path}), ${files.name}), \n CONCAT_WS('/', REGEXP_REPLACE(${files.path}, ${filePathSQL(spaceRootFile)}, ${spacesRoots.alias}), ${files.name})\n )\n END\n END\n )\n WHEN ${syncPaths.shareId} IS NOT NULL THEN CONCAT_WS('/',\n ${SYNC_REPOSITORY.SHARES},\n CASE WHEN ${syncPaths.fileId} IS NULL THEN ${shares.alias}\n ELSE \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 END,\n IF (${files.id} = ${shareFile.id}, ${shares.name}, ${files.name})\n )\n ELSE NULL\n END\n `.as('remotePath'),\n settings: syncPaths.settings\n })\n .from(syncPaths)\n .leftJoin(files, eq(files.id, syncPaths.fileId))\n .leftJoin(spaces, eq(spaces.id, syncPaths.spaceId))\n .leftJoin(spacesRoots, eq(spacesRoots.id, syncPaths.spaceRootId))\n .leftJoin(spaceRootFile, eq(spaceRootFile.id, spacesRoots.fileId))\n .leftJoin(shares, eq(shares.id, syncPaths.shareId))\n .leftJoin(shareFile, eq(shareFile.id, shares.fileId))\n .where(eq(syncPaths.clientId, clientId))\n }\n\n @CacheDecorator(900)\n async getPathSettings(clientId: string, pathId: number): Promise<SyncPathSettings> {\n const [path] = await this.db\n .select({\n settings: syncPaths.settings\n })\n .from(syncPaths)\n .where(and(eq(syncPaths.clientId, clientId), eq(syncPaths.id, pathId)))\n .limit(1)\n return path ? path.settings : null\n }\n\n async createPath(clientId: string, dbProps: SyncDBProps, settings: SyncPathSettings): Promise<SyncPath['id']> {\n return dbGetInsertedId(await this.db.insert(syncPaths).values({ clientId: clientId, settings: settings, ...dbProps } as SyncPath))\n }\n\n async deletePath(clientId: string, pathId: number): Promise<void> {\n dbCheckAffectedRows(await this.db.delete(syncPaths).where(and(eq(syncPaths.id, pathId), eq(syncPaths.clientId, clientId))), 1)\n }\n\n async updatePathSettings(clientId: string, pathId: number, settings: SyncPathSettings) {\n dbCheckAffectedRows(\n await this.db\n .update(syncPaths)\n .set({ settings: settings })\n .where(and(eq(syncPaths.id, pathId), eq(syncPaths.clientId, clientId))),\n 1\n )\n }\n\n clearCachePathSettings(clientId: string, pathId: number): void {\n this.cache.del(this.cache.genSlugKey(this.constructor.name, this.getPathSettings.name, clientId, pathId)).catch((e: Error) => console.error(e))\n }\n}\n"],"names":["SyncQueries","clientExistsForOwner","ownerId","clientId","client","db","select","id","syncClients","from","where","and","eq","limit","getOrCreateClient","info","ip","getClient","currentTimeStamp","tokenExpiration","token","crypto","randomUUID","dbCheckAffectedRows","update","set","convertHumanTimeToSeconds","CLIENT_TOKEN_EXPIRATION_TIME","insert","values","currentAccess","Date","currentIp","enabled","lastAccess","lastIp","createdAt","getClients","owner","isCurrentClient","sql","mapWith","Boolean","paths","concatDistinctObjectsInArray","syncPaths","settings","leftJoin","groupBy","orderBy","desc","deleteClient","delete","renewClientTokenAndExpiration","expiration","updateClientInfo","getPaths","shareFile","alias","files","spaceRootFile","remotePath","SYNC_REPOSITORY","PERSONAL","filePathSQL","spaceId","SPACES","spaces","spaceRootId","path","name","fileId","spacesRoots","externalPath","shareId","SHARES","shares","as","getPathSettings","pathId","createPath","dbProps","dbGetInsertedId","deletePath","updatePathSettings","clearCachePathSettings","cache","del","genSlugKey","catch","e","console","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/sync/services/sync-queries.service.ts"],"sourcesContent":["import { Inject, Injectable } from '@nestjs/common'\nimport { and, desc, eq, SQL, sql } from 'drizzle-orm'\nimport { alias } from 'drizzle-orm/mysql-core'\nimport crypto from 'node:crypto'\nimport { convertHumanTimeToSeconds } from '../../../common/functions'\nimport { currentTimeStamp } from '../../../common/shared'\nimport { CacheDecorator } from '../../../infrastructure/cache/cache.decorator'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport type { DBSchema } from '../../../infrastructure/database/interfaces/database.interface'\nimport { concatDistinctObjectsInArray, dbCheckAffectedRows, dbGetInsertedId } from '../../../infrastructure/database/utils'\nimport { filePathSQL, files } from '../../files/schemas/files.schema'\nimport { shares } from '../../shares/schemas/shares.schema'\nimport { spacesRoots } from '../../spaces/schemas/spaces-roots.schema'\nimport { spaces } from '../../spaces/schemas/spaces.schema'\nimport type { UserModel } from '../../users/models/user.model'\nimport { CLIENT_TOKEN_EXPIRATION_TIME } from '../constants/auth'\nimport { SYNC_REPOSITORY } from '../constants/sync'\nimport { SyncClientPaths } from '../interfaces/sync-client-paths.interface'\nimport { SyncClientInfo } from '../interfaces/sync-client.interface'\nimport { SyncDBProps, SyncPathSettings } from '../interfaces/sync-path.interface'\nimport { SyncClient } from '../schemas/sync-client.interface'\nimport { syncClients } from '../schemas/sync-clients.schema'\nimport { SyncPath } from '../schemas/sync-path.interface'\nimport { syncPaths } from '../schemas/sync-paths.schema'\n\n@Injectable()\nexport class SyncQueries {\n constructor(\n @Inject(DB_TOKEN_PROVIDER) private readonly db: DBSchema,\n private readonly cache: Cache\n ) {}\n\n async clientExistsForOwner(ownerId: number, clientId: string): Promise<boolean> {\n const [client] = await this.db\n .select({ id: syncClients.id })\n .from(syncClients)\n .where(and(eq(syncClients.ownerId, ownerId), eq(syncClients.id, clientId)))\n .limit(1)\n return !!client?.id\n }\n\n async getOrCreateClient(ownerId: number, clientId: string, info: SyncClientInfo, ip: string): Promise<string> {\n const client = await this.getClient(clientId, ownerId)\n if (client) {\n if (currentTimeStamp() < client.tokenExpiration) {\n return client.token\n }\n // renew token if it has expired\n const token = crypto.randomUUID()\n dbCheckAffectedRows(\n await this.db\n .update(syncClients)\n .set({\n token: token,\n tokenExpiration: currentTimeStamp() + convertHumanTimeToSeconds(CLIENT_TOKEN_EXPIRATION_TIME)\n })\n .where(and(eq(syncClients.ownerId, ownerId), eq(syncClients.id, clientId)))\n .limit(1),\n 1\n )\n return token\n } else {\n // create client\n const token = crypto.randomUUID()\n dbCheckAffectedRows(\n await this.db.insert(syncClients).values({\n id: clientId,\n ownerId: ownerId,\n token: token,\n tokenExpiration: currentTimeStamp() + convertHumanTimeToSeconds(CLIENT_TOKEN_EXPIRATION_TIME),\n info: info,\n currentAccess: new Date(),\n currentIp: ip\n } as SyncClient),\n 1\n )\n return token\n }\n }\n\n async getClient(clientId: string, ownerId?: number, token?: string): Promise<SyncClient> {\n const where: SQL[] = [\n eq(syncClients.id, clientId),\n ...(ownerId ? [eq(syncClients.ownerId, ownerId)] : []),\n ...(token ? [eq(syncClients.token, token)] : [])\n ]\n const [client] = await this.db\n .select({\n id: syncClients.id,\n ownerId: syncClients.ownerId,\n token: syncClients.token,\n tokenExpiration: syncClients.tokenExpiration,\n info: syncClients.info,\n enabled: syncClients.enabled,\n currentAccess: syncClients.currentAccess,\n currentIp: syncClients.currentIp,\n lastAccess: syncClients.lastAccess,\n lastIp: syncClients.lastIp,\n createdAt: syncClients.createdAt\n })\n .from(syncClients)\n .where(and(...where))\n .limit(1)\n return client\n }\n\n async getClients(owner: UserModel): Promise<SyncClientPaths[]> {\n const clientId = owner.clientId || null\n return this.db\n .select({\n id: syncClients.id,\n tokenExpiration: syncClients.tokenExpiration,\n info: syncClients.info,\n enabled: syncClients.enabled,\n currentAccess: syncClients.currentAccess,\n currentIp: syncClients.currentIp,\n lastAccess: syncClients.lastAccess,\n lastIp: syncClients.lastIp,\n createdAt: syncClients.createdAt,\n isCurrentClient: sql<boolean>`IF (${clientId} IS NOT NULL AND ${syncClients.id} = ${clientId}, 1, 0)`.mapWith(Boolean),\n paths: concatDistinctObjectsInArray(syncPaths.id, {\n id: syncPaths.id,\n settings: syncPaths.settings,\n createdAt: syncPaths.createdAt\n })\n })\n .from(syncClients)\n .leftJoin(syncPaths, eq(syncPaths.clientId, syncClients.id))\n .where(eq(syncClients.ownerId, owner.id))\n .groupBy(syncClients.id)\n .orderBy(desc(syncClients.currentAccess))\n }\n\n async deleteClient(ownerId: number, clientId: string) {\n dbCheckAffectedRows(\n await this.db\n .delete(syncClients)\n .where(and(eq(syncClients.ownerId, ownerId), eq(syncClients.id, clientId)))\n .limit(1),\n 1\n )\n }\n\n async renewClientTokenAndExpiration(clientId: string, token: string, expiration: number) {\n dbCheckAffectedRows(await this.db.update(syncClients).set({ token: token, tokenExpiration: expiration }).where(eq(syncClients.id, clientId)), 1)\n }\n\n async updateClientInfo(client: SyncClient, info: SyncClientInfo, ip: string) {\n await this.db\n .update(syncClients)\n .set({\n lastAccess: client.currentAccess,\n currentAccess: new Date(),\n lastIp: client.currentIp,\n currentIp: ip,\n info: info\n } as SyncClient)\n .where(eq(syncClients.id, client.id))\n }\n\n getPaths(clientId: string): Promise<{ id: number; settings: SyncPathSettings; remotePath: string }[]> {\n const shareFile: any = alias(files, 'shareFile')\n const spaceRootFile: any = alias(files, 'spaceRootFile')\n return this.db\n .select({\n id: syncPaths.id,\n remotePath: sql<string>`\n CASE WHEN ${syncPaths.ownerId} IS NOT NULL THEN CONCAT_WS('/', ${SYNC_REPOSITORY.PERSONAL}, ${filePathSQL(files)})\n WHEN ${syncPaths.spaceId} IS NOT NULL THEN CONCAT_WS('/', \n ${SYNC_REPOSITORY.SPACES}, \n ${spaces.alias}, \n CASE WHEN ${syncPaths.spaceRootId} IS NULL \n THEN CONCAT_WS('/', IF (${files.path} = '.', NULL, ${files.path}), ${files.name})\n ELSE\n CASE WHEN ${syncPaths.fileId} IS NULL \n THEN ${spacesRoots.alias}\n ELSE\n IF (${spacesRoots.externalPath} IS NOT NULL, \n CONCAT_WS('/', ${spacesRoots.alias}, IF (${files.path} = '.', NULL, ${files.path}), ${files.name}), \n CONCAT_WS('/', REGEXP_REPLACE(${files.path}, ${filePathSQL(spaceRootFile)}, ${spacesRoots.alias}), ${files.name})\n )\n END\n END\n )\n WHEN ${syncPaths.shareId} IS NOT NULL THEN CONCAT_WS('/',\n ${SYNC_REPOSITORY.SHARES},\n CASE WHEN ${syncPaths.fileId} IS NULL THEN ${shares.alias}\n ELSE \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 END,\n IF (${files.id} = ${shareFile.id}, ${shares.name}, ${files.name})\n )\n ELSE NULL\n END\n `.as('remotePath'),\n settings: syncPaths.settings\n })\n .from(syncPaths)\n .leftJoin(files, eq(files.id, syncPaths.fileId))\n .leftJoin(spaces, eq(spaces.id, syncPaths.spaceId))\n .leftJoin(spacesRoots, eq(spacesRoots.id, syncPaths.spaceRootId))\n .leftJoin(spaceRootFile, eq(spaceRootFile.id, spacesRoots.fileId))\n .leftJoin(shares, eq(shares.id, syncPaths.shareId))\n .leftJoin(shareFile, eq(shareFile.id, shares.fileId))\n .where(eq(syncPaths.clientId, clientId))\n }\n\n @CacheDecorator(900)\n async getPathSettings(clientId: string, pathId: number): Promise<SyncPathSettings> {\n const [path] = await this.db\n .select({\n settings: syncPaths.settings\n })\n .from(syncPaths)\n .where(and(eq(syncPaths.clientId, clientId), eq(syncPaths.id, pathId)))\n .limit(1)\n return path ? path.settings : null\n }\n\n async createPath(clientId: string, dbProps: SyncDBProps, settings: SyncPathSettings): Promise<SyncPath['id']> {\n return dbGetInsertedId(await this.db.insert(syncPaths).values({ clientId: clientId, settings: settings, ...dbProps } as SyncPath))\n }\n\n async deletePath(clientId: string, pathId: number): Promise<void> {\n dbCheckAffectedRows(await this.db.delete(syncPaths).where(and(eq(syncPaths.id, pathId), eq(syncPaths.clientId, clientId))), 1)\n }\n\n async updatePathSettings(clientId: string, pathId: number, settings: SyncPathSettings) {\n dbCheckAffectedRows(\n await this.db\n .update(syncPaths)\n .set({ settings: settings })\n .where(and(eq(syncPaths.id, pathId), eq(syncPaths.clientId, clientId))),\n 1\n )\n }\n\n clearCachePathSettings(clientId: string, pathId: number): void {\n this.cache.del(this.cache.genSlugKey(this.constructor.name, this.getPathSettings.name, clientId, pathId)).catch((e: Error) => console.error(e))\n }\n}\n"],"names":["SyncQueries","clientExistsForOwner","ownerId","clientId","client","db","select","id","syncClients","from","where","and","eq","limit","getOrCreateClient","info","ip","getClient","currentTimeStamp","tokenExpiration","token","crypto","randomUUID","dbCheckAffectedRows","update","set","convertHumanTimeToSeconds","CLIENT_TOKEN_EXPIRATION_TIME","insert","values","currentAccess","Date","currentIp","enabled","lastAccess","lastIp","createdAt","getClients","owner","isCurrentClient","sql","mapWith","Boolean","paths","concatDistinctObjectsInArray","syncPaths","settings","leftJoin","groupBy","orderBy","desc","deleteClient","delete","renewClientTokenAndExpiration","expiration","updateClientInfo","getPaths","shareFile","alias","files","spaceRootFile","remotePath","SYNC_REPOSITORY","PERSONAL","filePathSQL","spaceId","SPACES","spaces","spaceRootId","path","name","fileId","spacesRoots","externalPath","shareId","SHARES","shares","as","getPathSettings","pathId","createPath","dbProps","dbGetInsertedId","deletePath","updatePathSettings","clearCachePathSettings","cache","del","genSlugKey","catch","e","console","error"],"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/sync/sync.config.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../../../backend/src/applications/sync/sync.config.ts"],"sourcesContent":["import { IsEnum } from 'class-validator'\nimport { APP_STORE_REPOSITORY } from './constants/store'\n\nexport class AppStoreConfig {\n @IsEnum(APP_STORE_REPOSITORY)\n repository: APP_STORE_REPOSITORY = APP_STORE_REPOSITORY.PUBLIC\n}\n"],"names":["AppStoreConfig","repository","APP_STORE_REPOSITORY","PUBLIC"],"mappings":";;;;+BAGaA;;;eAAAA;;;gCAHU;uBACc;;;;;;;;;;AAE9B,IAAA,AAAMA,iBAAN,MAAMA;;aAEXC,aAAmCC,2BAAoB,CAACC,MAAM;;AAChE"}
|
|
@@ -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
|
});
|
|
@@ -15,6 +11,7 @@ Object.defineProperty(exports, "SyncController", {
|
|
|
15
11
|
const _common = require("@nestjs/common");
|
|
16
12
|
const _fastify = require("fastify");
|
|
17
13
|
const _authtokenskipdecorator = require("../../authentication/decorators/auth-token-skip.decorator");
|
|
14
|
+
const _authrequestinterface = require("../../authentication/interfaces/auth-request.interface");
|
|
18
15
|
const _contextinterceptor = require("../../infrastructure/context/interceptors/context.interceptor");
|
|
19
16
|
const _spaceskippermissionsdecorator = require("../spaces/decorators/space-skip-permissions.decorator");
|
|
20
17
|
const _spacerequestinterface = require("../spaces/interfaces/space-request.interface");
|
|
@@ -28,6 +25,7 @@ const _routes = require("./constants/routes");
|
|
|
28
25
|
const _sync = require("./constants/sync");
|
|
29
26
|
const _syncenvironmentdecorator = require("./decorators/sync-environment.decorator");
|
|
30
27
|
const _syncclientauthdto = require("./dtos/sync-client-auth.dto");
|
|
28
|
+
const _syncclientregistrationdto = require("./dtos/sync-client-registration.dto");
|
|
31
29
|
const _syncoperationsdto = require("./dtos/sync-operations.dto");
|
|
32
30
|
const _syncpathdto = require("./dtos/sync-path.dto");
|
|
33
31
|
const _syncuploaddto = require("./dtos/sync-upload.dto");
|
|
@@ -59,10 +57,14 @@ let SyncController = class SyncController {
|
|
|
59
57
|
register(syncClientRegistrationDto, req) {
|
|
60
58
|
return this.syncClientsManager.register(syncClientRegistrationDto, req.ip);
|
|
61
59
|
}
|
|
60
|
+
registerWithAuth(clientAuthenticatedRegistrationDto, req) {
|
|
61
|
+
return this.syncClientsManager.registerWithAuth(clientAuthenticatedRegistrationDto, req);
|
|
62
|
+
}
|
|
62
63
|
unregister(user) {
|
|
63
64
|
return this.syncClientsManager.unregister(user);
|
|
64
65
|
}
|
|
65
66
|
checkAppStore() {
|
|
67
|
+
// This route must be public to allow clients to receive updates
|
|
66
68
|
return this.syncClientsManager.checkAppStore();
|
|
67
69
|
}
|
|
68
70
|
authenticate(type, clientAuthDto, req, res) {
|
|
@@ -139,11 +141,24 @@ _ts_decorate([
|
|
|
139
141
|
_ts_param(1, (0, _common.Req)()),
|
|
140
142
|
_ts_metadata("design:type", Function),
|
|
141
143
|
_ts_metadata("design:paramtypes", [
|
|
142
|
-
typeof SyncClientRegistrationDto === "undefined" ? Object : SyncClientRegistrationDto,
|
|
144
|
+
typeof _syncclientregistrationdto.SyncClientRegistrationDto === "undefined" ? Object : _syncclientregistrationdto.SyncClientRegistrationDto,
|
|
143
145
|
typeof _fastify.FastifyRequest === "undefined" ? Object : _fastify.FastifyRequest
|
|
144
146
|
]),
|
|
145
147
|
_ts_metadata("design:returntype", typeof Promise === "undefined" ? Object : Promise)
|
|
146
148
|
], SyncController.prototype, "register", null);
|
|
149
|
+
_ts_decorate([
|
|
150
|
+
(0, _common.Post)(_routes.SYNC_ROUTE.REGISTER_AUTH),
|
|
151
|
+
(0, _permissionsdecorator.UserHavePermission)(_user.USER_PERMISSION.DESKTOP_APP),
|
|
152
|
+
(0, _common.UseGuards)(_permissionsguard.UserPermissionsGuard),
|
|
153
|
+
_ts_param(0, (0, _common.Body)()),
|
|
154
|
+
_ts_param(1, (0, _common.Req)()),
|
|
155
|
+
_ts_metadata("design:type", Function),
|
|
156
|
+
_ts_metadata("design:paramtypes", [
|
|
157
|
+
typeof _syncclientregistrationdto.SyncClientAuthRegistrationDto === "undefined" ? Object : _syncclientregistrationdto.SyncClientAuthRegistrationDto,
|
|
158
|
+
typeof _authrequestinterface.FastifyAuthenticatedRequest === "undefined" ? Object : _authrequestinterface.FastifyAuthenticatedRequest
|
|
159
|
+
]),
|
|
160
|
+
_ts_metadata("design:returntype", typeof Promise === "undefined" ? Object : Promise)
|
|
161
|
+
], SyncController.prototype, "registerWithAuth", null);
|
|
147
162
|
_ts_decorate([
|
|
148
163
|
(0, _common.Post)(_routes.SYNC_ROUTE.UNREGISTER),
|
|
149
164
|
(0, _permissionsdecorator.UserHavePermission)(_user.USER_PERMISSION.DESKTOP_APP),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../backend/src/applications/sync/sync.controller.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 {\n Body,\n Controller,\n Copy,\n Delete,\n Get,\n HttpException,\n HttpStatus,\n Move,\n Param,\n ParseArrayPipe,\n ParseIntPipe,\n Post,\n Proppatch,\n Put,\n Query,\n Req,\n Res,\n StreamableFile,\n UseGuards,\n UseInterceptors\n} from '@nestjs/common'\nimport { FastifyReply, FastifyRequest } from 'fastify'\nimport { AuthTokenSkip } from '../../authentication/decorators/auth-token-skip.decorator'\nimport { ContextInterceptor } from '../../infrastructure/context/interceptors/context.interceptor'\nimport { SkipSpacePermissionsCheck } from '../spaces/decorators/space-skip-permissions.decorator'\nimport { FastifySpaceRequest } from '../spaces/interfaces/space-request.interface'\nimport { USER_PERMISSION } from '../users/constants/user'\nimport { UserHavePermission } from '../users/decorators/permissions.decorator'\nimport { GetUser } from '../users/decorators/user.decorator'\nimport { UserPermissionsGuard } from '../users/guards/permissions.guard'\nimport { UserModel } from '../users/models/user.model'\nimport { CLIENT_AUTH_TYPE } from './constants/auth'\nimport { SYNC_ROUTE } from './constants/routes'\nimport { CHECK_SERVER_RESP, SYNC_IN_SERVER_AGENT } from './constants/sync'\nimport { SyncEnvironment } from './decorators/sync-environment.decorator'\nimport { SyncClientAuthDto } from './dtos/sync-client-auth.dto'\nimport type { SyncClientRegistrationDto } from './dtos/sync-client-registration.dto'\nimport { SyncCopyMoveDto, SyncDiffDto, SyncMakeDto, SyncPropsDto } from './dtos/sync-operations.dto'\nimport { SyncPathDto, SyncPathUpdateDto } from './dtos/sync-path.dto'\nimport { SyncUploadDto } from './dtos/sync-upload.dto'\nimport { SyncDiffGzipBodyInterceptor } from './interceptors/sync-diff-gzip-body.interceptor'\nimport { AppStoreManifest } from './interfaces/store-manifest.interface'\nimport { ClientAuthCookieDto, ClientAuthTokenDto } from './interfaces/sync-client-auth.interface'\nimport { SyncClientPaths } from './interfaces/sync-client-paths.interface'\nimport { SyncPathSettings } from './interfaces/sync-path.interface'\nimport { SyncClientsManager } from './services/sync-clients-manager.service'\nimport { SyncManager } from './services/sync-manager.service'\nimport { SyncPathsManager } from './services/sync-paths-manager.service'\n\n@Controller(SYNC_ROUTE.BASE)\nexport class SyncController {\n constructor(\n private readonly syncManager: SyncManager,\n private readonly syncClientsManager: SyncClientsManager,\n private readonly syncPathsManager: SyncPathsManager\n ) {}\n\n /* CLIENT */\n\n @Get(SYNC_ROUTE.HANDSHAKE)\n @AuthTokenSkip()\n handshake(@Req() req: FastifyRequest) {\n if ('user-agent' in req.headers && req.headers['user-agent'].startsWith(SYNC_IN_SERVER_AGENT)) {\n return CHECK_SERVER_RESP\n }\n throw new HttpException('Server not found', HttpStatus.NOT_FOUND)\n }\n\n @Post(SYNC_ROUTE.REGISTER)\n @AuthTokenSkip()\n register(@Body() syncClientRegistrationDto: SyncClientRegistrationDto, @Req() req: FastifyRequest): Promise<{ clientToken: string }> {\n return this.syncClientsManager.register(syncClientRegistrationDto, req.ip)\n }\n\n @Post(SYNC_ROUTE.UNREGISTER)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP)\n @UseGuards(UserPermissionsGuard)\n unregister(@GetUser() user: UserModel): Promise<void> {\n return this.syncClientsManager.unregister(user)\n }\n\n @Get(SYNC_ROUTE.APP_STORE)\n @AuthTokenSkip()\n checkAppStore(): Promise<AppStoreManifest> {\n return this.syncClientsManager.checkAppStore()\n }\n\n @Post(`${SYNC_ROUTE.AUTH}/:type`)\n @AuthTokenSkip()\n authenticate(\n @Param('type') type: CLIENT_AUTH_TYPE,\n @Body() clientAuthDto: SyncClientAuthDto,\n @Req() req: FastifyRequest,\n @Res({ passthrough: true }) res: FastifyReply\n ): Promise<ClientAuthCookieDto | ClientAuthTokenDto> {\n return this.syncClientsManager.authenticate(type, clientAuthDto, req.ip, res)\n }\n\n @Get(SYNC_ROUTE.CLIENTS)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP)\n @UseGuards(UserPermissionsGuard)\n getClients(@GetUser() user: UserModel): Promise<SyncClientPaths[]> {\n return this.syncClientsManager.getClients(user)\n }\n\n @Delete(`${SYNC_ROUTE.CLIENTS}/:id`)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP)\n @UseGuards(UserPermissionsGuard)\n deleteClient(@GetUser() user: UserModel, @Param('id') clientId: string): Promise<void> {\n return this.syncClientsManager.deleteClient(user, clientId)\n }\n\n /* PATHS */\n\n @Delete(`${SYNC_ROUTE.CLIENTS}/:id/${SYNC_ROUTE.PATHS}/:pathId`)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP_SYNC)\n @UseGuards(UserPermissionsGuard)\n deleteClientPath(@GetUser() user: UserModel, @Param('id') clientId: string, @Param('pathId', ParseIntPipe) pathId: number): Promise<void> {\n return this.syncPathsManager.deletePath(user, pathId, clientId)\n }\n\n @Put(`${SYNC_ROUTE.CLIENTS}/:id/${SYNC_ROUTE.PATHS}/:pathId`)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP_SYNC)\n @UseGuards(UserPermissionsGuard)\n updatePath(\n @GetUser() user: UserModel,\n @Param('id') clientId: string,\n @Param('pathId', ParseIntPipe) pathId: number,\n @Body() syncPathUpdateDto: SyncPathUpdateDto\n ): Promise<SyncPathSettings> {\n return this.syncPathsManager.updatePath(user, clientId, pathId, syncPathUpdateDto)\n }\n\n @Post(`${SYNC_ROUTE.PATHS}/*`)\n @SkipSpacePermissionsCheck()\n @SyncEnvironment()\n createPath(\n @Req() req: FastifySpaceRequest,\n @Body() syncPathDto: SyncPathDto\n ): Promise<{\n id: number\n permissions: string\n }> {\n return this.syncPathsManager.createPath(req, syncPathDto)\n }\n\n @Delete(`${SYNC_ROUTE.PATHS}/:id`)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP_SYNC)\n @UseGuards(UserPermissionsGuard)\n deletePath(@GetUser() user: UserModel, @Param('id', ParseIntPipe) pathId: number): Promise<void> {\n return this.syncPathsManager.deletePath(user, pathId)\n }\n\n @Put(SYNC_ROUTE.PATHS)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP_SYNC)\n @UseGuards(UserPermissionsGuard)\n @UseInterceptors(ContextInterceptor)\n updatePaths(\n @GetUser() user: UserModel,\n @Body(new ParseArrayPipe({ items: SyncPathDto, whitelist: true })) syncPathsDto: SyncPathDto[]\n ): Promise<{\n add: SyncPathSettings[]\n update: Partial<Record<keyof SyncPathSettings, any>>[]\n delete: number[]\n }> {\n return this.syncPathsManager.updatePaths(user, syncPathsDto)\n }\n\n /* OPERATIONS */\n\n @Post(`${SYNC_ROUTE.OPERATION}/${SYNC_ROUTE.DIFF}/:id`)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP_SYNC)\n @UseGuards(UserPermissionsGuard)\n @UseInterceptors(SyncDiffGzipBodyInterceptor)\n diff(\n @GetUser() user: UserModel,\n @Param('id', ParseIntPipe) pathId: number,\n @Body() syncDiffDto: SyncDiffDto,\n @Res({ passthrough: true }) res: FastifyReply\n ): Promise<void> {\n return this.syncManager.diff(user, pathId, syncDiffDto, res)\n }\n\n @Get(`${SYNC_ROUTE.OPERATION}/*`)\n @SyncEnvironment()\n download(@Req() req: FastifySpaceRequest, @Res({ passthrough: true }) res: FastifyReply): Promise<StreamableFile> {\n return this.syncManager.download(req, res)\n }\n\n @Post(`${SYNC_ROUTE.OPERATION}/*`)\n @SyncEnvironment()\n uploadCreate(@Req() req: FastifySpaceRequest, @Query() syncUploadDto: SyncUploadDto): Promise<{ ino: number }> {\n return this.syncManager.upload(req, syncUploadDto)\n }\n\n @Put(`${SYNC_ROUTE.OPERATION}/*`)\n @SyncEnvironment()\n uploadOverwrite(@Req() req: FastifySpaceRequest, @Query() syncUploadDto: SyncUploadDto): Promise<{ ino: number }> {\n return this.syncManager.upload(req, syncUploadDto)\n }\n\n @Post(`${SYNC_ROUTE.OPERATION}/${SYNC_ROUTE.MAKE}/*`)\n @SyncEnvironment()\n make(@Req() req: FastifySpaceRequest, @Body() syncMakeDto: SyncMakeDto): Promise<{ ino: number }> {\n return this.syncManager.make(req, syncMakeDto)\n }\n\n @Proppatch(`${SYNC_ROUTE.OPERATION}/*`)\n @SyncEnvironment()\n props(@Req() req: FastifySpaceRequest, @Body() syncPropsDto: SyncPropsDto): Promise<void> {\n return this.syncManager.props(req, syncPropsDto)\n }\n\n @Move(`${SYNC_ROUTE.OPERATION}/*`)\n @SyncEnvironment()\n move(@Req() req: FastifySpaceRequest, @Body() syncCopyMoveDto: SyncCopyMoveDto): Promise<void> {\n return this.syncManager.copyMove(req, syncCopyMoveDto, true)\n }\n\n @Copy(`${SYNC_ROUTE.OPERATION}/*`)\n @SyncEnvironment()\n copy(@Req() req: FastifySpaceRequest, @Body() syncCopyMoveDto: SyncCopyMoveDto): Promise<{ ino: number; mtime: number }> {\n return this.syncManager.copyMove(req, syncCopyMoveDto, false)\n }\n\n @Delete(`${SYNC_ROUTE.OPERATION}/*`)\n @SyncEnvironment()\n delete(@Req() req: FastifySpaceRequest): Promise<void> {\n return this.syncManager.delete(req)\n }\n}\n"],"names":["SyncController","handshake","req","headers","startsWith","SYNC_IN_SERVER_AGENT","CHECK_SERVER_RESP","HttpException","HttpStatus","NOT_FOUND","register","syncClientRegistrationDto","syncClientsManager","ip","unregister","user","checkAppStore","authenticate","type","clientAuthDto","res","getClients","deleteClient","clientId","deleteClientPath","pathId","syncPathsManager","deletePath","updatePath","syncPathUpdateDto","createPath","syncPathDto","updatePaths","syncPathsDto","diff","syncDiffDto","syncManager","download","uploadCreate","syncUploadDto","upload","uploadOverwrite","make","syncMakeDto","props","syncPropsDto","move","syncCopyMoveDto","copyMove","copy","delete","HANDSHAKE","REGISTER","UNREGISTER","DESKTOP_APP","APP_STORE","SYNC_ROUTE","AUTH","passthrough","CLIENTS","PATHS","DESKTOP_APP_SYNC","ParseArrayPipe","items","SyncPathDto","whitelist","OPERATION","DIFF","MAKE","BASE"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../backend/src/applications/sync/sync.controller.ts"],"sourcesContent":["import {\n Body,\n Controller,\n Copy,\n Delete,\n Get,\n HttpException,\n HttpStatus,\n Move,\n Param,\n ParseArrayPipe,\n ParseIntPipe,\n Post,\n Proppatch,\n Put,\n Query,\n Req,\n Res,\n StreamableFile,\n UseGuards,\n UseInterceptors\n} from '@nestjs/common'\nimport { FastifyReply, FastifyRequest } from 'fastify'\nimport { AuthTokenSkip } from '../../authentication/decorators/auth-token-skip.decorator'\nimport { FastifyAuthenticatedRequest } from '../../authentication/interfaces/auth-request.interface'\nimport { ContextInterceptor } from '../../infrastructure/context/interceptors/context.interceptor'\nimport { SkipSpacePermissionsCheck } from '../spaces/decorators/space-skip-permissions.decorator'\nimport { FastifySpaceRequest } from '../spaces/interfaces/space-request.interface'\nimport { USER_PERMISSION } from '../users/constants/user'\nimport { UserHavePermission } from '../users/decorators/permissions.decorator'\nimport { GetUser } from '../users/decorators/user.decorator'\nimport { UserPermissionsGuard } from '../users/guards/permissions.guard'\nimport { UserModel } from '../users/models/user.model'\nimport { CLIENT_AUTH_TYPE } from './constants/auth'\nimport { SYNC_ROUTE } from './constants/routes'\nimport { CHECK_SERVER_RESP, SYNC_IN_SERVER_AGENT } from './constants/sync'\nimport { SyncEnvironment } from './decorators/sync-environment.decorator'\nimport { SyncClientAuthDto } from './dtos/sync-client-auth.dto'\nimport { SyncClientAuthRegistrationDto, SyncClientRegistrationDto } from './dtos/sync-client-registration.dto'\nimport { SyncCopyMoveDto, SyncDiffDto, SyncMakeDto, SyncPropsDto } from './dtos/sync-operations.dto'\nimport { SyncPathDto, SyncPathUpdateDto } from './dtos/sync-path.dto'\nimport { SyncUploadDto } from './dtos/sync-upload.dto'\nimport { SyncDiffGzipBodyInterceptor } from './interceptors/sync-diff-gzip-body.interceptor'\nimport { AppStoreManifest } from './interfaces/store-manifest.interface'\nimport { SyncClientAuthCookie, SyncClientAuthRegistration, SyncClientAuthToken } from './interfaces/sync-client-auth.interface'\nimport { SyncClientPaths } from './interfaces/sync-client-paths.interface'\nimport { SyncPathSettings } from './interfaces/sync-path.interface'\nimport { SyncClientsManager } from './services/sync-clients-manager.service'\nimport { SyncManager } from './services/sync-manager.service'\nimport { SyncPathsManager } from './services/sync-paths-manager.service'\n\n@Controller(SYNC_ROUTE.BASE)\nexport class SyncController {\n constructor(\n private readonly syncManager: SyncManager,\n private readonly syncClientsManager: SyncClientsManager,\n private readonly syncPathsManager: SyncPathsManager\n ) {}\n\n /* CLIENT */\n\n @Get(SYNC_ROUTE.HANDSHAKE)\n @AuthTokenSkip()\n handshake(@Req() req: FastifyRequest) {\n if ('user-agent' in req.headers && req.headers['user-agent'].startsWith(SYNC_IN_SERVER_AGENT)) {\n return CHECK_SERVER_RESP\n }\n throw new HttpException('Server not found', HttpStatus.NOT_FOUND)\n }\n\n @Post(SYNC_ROUTE.REGISTER)\n @AuthTokenSkip()\n register(@Body() syncClientRegistrationDto: SyncClientRegistrationDto, @Req() req: FastifyRequest): Promise<SyncClientAuthRegistration> {\n return this.syncClientsManager.register(syncClientRegistrationDto, req.ip)\n }\n\n @Post(SYNC_ROUTE.REGISTER_AUTH)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP)\n @UseGuards(UserPermissionsGuard)\n registerWithAuth(\n @Body() clientAuthenticatedRegistrationDto: SyncClientAuthRegistrationDto,\n @Req() req: FastifyAuthenticatedRequest\n ): Promise<SyncClientAuthRegistration> {\n return this.syncClientsManager.registerWithAuth(clientAuthenticatedRegistrationDto, req)\n }\n\n @Post(SYNC_ROUTE.UNREGISTER)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP)\n @UseGuards(UserPermissionsGuard)\n unregister(@GetUser() user: UserModel): Promise<void> {\n return this.syncClientsManager.unregister(user)\n }\n\n @Get(SYNC_ROUTE.APP_STORE)\n @AuthTokenSkip()\n checkAppStore(): Promise<AppStoreManifest> {\n // This route must be public to allow clients to receive updates\n return this.syncClientsManager.checkAppStore()\n }\n\n @Post(`${SYNC_ROUTE.AUTH}/:type`)\n @AuthTokenSkip()\n authenticate(\n @Param('type') type: CLIENT_AUTH_TYPE,\n @Body() clientAuthDto: SyncClientAuthDto,\n @Req() req: FastifyRequest,\n @Res({ passthrough: true }) res: FastifyReply\n ): Promise<SyncClientAuthCookie | SyncClientAuthToken> {\n return this.syncClientsManager.authenticate(type, clientAuthDto, req.ip, res)\n }\n\n @Get(SYNC_ROUTE.CLIENTS)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP)\n @UseGuards(UserPermissionsGuard)\n getClients(@GetUser() user: UserModel): Promise<SyncClientPaths[]> {\n return this.syncClientsManager.getClients(user)\n }\n\n @Delete(`${SYNC_ROUTE.CLIENTS}/:id`)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP)\n @UseGuards(UserPermissionsGuard)\n deleteClient(@GetUser() user: UserModel, @Param('id') clientId: string): Promise<void> {\n return this.syncClientsManager.deleteClient(user, clientId)\n }\n\n /* PATHS */\n\n @Delete(`${SYNC_ROUTE.CLIENTS}/:id/${SYNC_ROUTE.PATHS}/:pathId`)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP_SYNC)\n @UseGuards(UserPermissionsGuard)\n deleteClientPath(@GetUser() user: UserModel, @Param('id') clientId: string, @Param('pathId', ParseIntPipe) pathId: number): Promise<void> {\n return this.syncPathsManager.deletePath(user, pathId, clientId)\n }\n\n @Put(`${SYNC_ROUTE.CLIENTS}/:id/${SYNC_ROUTE.PATHS}/:pathId`)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP_SYNC)\n @UseGuards(UserPermissionsGuard)\n updatePath(\n @GetUser() user: UserModel,\n @Param('id') clientId: string,\n @Param('pathId', ParseIntPipe) pathId: number,\n @Body() syncPathUpdateDto: SyncPathUpdateDto\n ): Promise<SyncPathSettings> {\n return this.syncPathsManager.updatePath(user, clientId, pathId, syncPathUpdateDto)\n }\n\n @Post(`${SYNC_ROUTE.PATHS}/*`)\n @SkipSpacePermissionsCheck()\n @SyncEnvironment()\n createPath(\n @Req() req: FastifySpaceRequest,\n @Body() syncPathDto: SyncPathDto\n ): Promise<{\n id: number\n permissions: string\n }> {\n return this.syncPathsManager.createPath(req, syncPathDto)\n }\n\n @Delete(`${SYNC_ROUTE.PATHS}/:id`)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP_SYNC)\n @UseGuards(UserPermissionsGuard)\n deletePath(@GetUser() user: UserModel, @Param('id', ParseIntPipe) pathId: number): Promise<void> {\n return this.syncPathsManager.deletePath(user, pathId)\n }\n\n @Put(SYNC_ROUTE.PATHS)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP_SYNC)\n @UseGuards(UserPermissionsGuard)\n @UseInterceptors(ContextInterceptor)\n updatePaths(\n @GetUser() user: UserModel,\n @Body(new ParseArrayPipe({ items: SyncPathDto, whitelist: true })) syncPathsDto: SyncPathDto[]\n ): Promise<{\n add: SyncPathSettings[]\n update: Partial<Record<keyof SyncPathSettings, any>>[]\n delete: number[]\n }> {\n return this.syncPathsManager.updatePaths(user, syncPathsDto)\n }\n\n /* OPERATIONS */\n\n @Post(`${SYNC_ROUTE.OPERATION}/${SYNC_ROUTE.DIFF}/:id`)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP_SYNC)\n @UseGuards(UserPermissionsGuard)\n @UseInterceptors(SyncDiffGzipBodyInterceptor)\n diff(\n @GetUser() user: UserModel,\n @Param('id', ParseIntPipe) pathId: number,\n @Body() syncDiffDto: SyncDiffDto,\n @Res({ passthrough: true }) res: FastifyReply\n ): Promise<void> {\n return this.syncManager.diff(user, pathId, syncDiffDto, res)\n }\n\n @Get(`${SYNC_ROUTE.OPERATION}/*`)\n @SyncEnvironment()\n download(@Req() req: FastifySpaceRequest, @Res({ passthrough: true }) res: FastifyReply): Promise<StreamableFile> {\n return this.syncManager.download(req, res)\n }\n\n @Post(`${SYNC_ROUTE.OPERATION}/*`)\n @SyncEnvironment()\n uploadCreate(@Req() req: FastifySpaceRequest, @Query() syncUploadDto: SyncUploadDto): Promise<{ ino: number }> {\n return this.syncManager.upload(req, syncUploadDto)\n }\n\n @Put(`${SYNC_ROUTE.OPERATION}/*`)\n @SyncEnvironment()\n uploadOverwrite(@Req() req: FastifySpaceRequest, @Query() syncUploadDto: SyncUploadDto): Promise<{ ino: number }> {\n return this.syncManager.upload(req, syncUploadDto)\n }\n\n @Post(`${SYNC_ROUTE.OPERATION}/${SYNC_ROUTE.MAKE}/*`)\n @SyncEnvironment()\n make(@Req() req: FastifySpaceRequest, @Body() syncMakeDto: SyncMakeDto): Promise<{ ino: number }> {\n return this.syncManager.make(req, syncMakeDto)\n }\n\n @Proppatch(`${SYNC_ROUTE.OPERATION}/*`)\n @SyncEnvironment()\n props(@Req() req: FastifySpaceRequest, @Body() syncPropsDto: SyncPropsDto): Promise<void> {\n return this.syncManager.props(req, syncPropsDto)\n }\n\n @Move(`${SYNC_ROUTE.OPERATION}/*`)\n @SyncEnvironment()\n move(@Req() req: FastifySpaceRequest, @Body() syncCopyMoveDto: SyncCopyMoveDto): Promise<void> {\n return this.syncManager.copyMove(req, syncCopyMoveDto, true)\n }\n\n @Copy(`${SYNC_ROUTE.OPERATION}/*`)\n @SyncEnvironment()\n copy(@Req() req: FastifySpaceRequest, @Body() syncCopyMoveDto: SyncCopyMoveDto): Promise<{ ino: number; mtime: number }> {\n return this.syncManager.copyMove(req, syncCopyMoveDto, false)\n }\n\n @Delete(`${SYNC_ROUTE.OPERATION}/*`)\n @SyncEnvironment()\n delete(@Req() req: FastifySpaceRequest): Promise<void> {\n return this.syncManager.delete(req)\n }\n}\n"],"names":["SyncController","handshake","req","headers","startsWith","SYNC_IN_SERVER_AGENT","CHECK_SERVER_RESP","HttpException","HttpStatus","NOT_FOUND","register","syncClientRegistrationDto","syncClientsManager","ip","registerWithAuth","clientAuthenticatedRegistrationDto","unregister","user","checkAppStore","authenticate","type","clientAuthDto","res","getClients","deleteClient","clientId","deleteClientPath","pathId","syncPathsManager","deletePath","updatePath","syncPathUpdateDto","createPath","syncPathDto","updatePaths","syncPathsDto","diff","syncDiffDto","syncManager","download","uploadCreate","syncUploadDto","upload","uploadOverwrite","make","syncMakeDto","props","syncPropsDto","move","syncCopyMoveDto","copyMove","copy","delete","HANDSHAKE","REGISTER","REGISTER_AUTH","DESKTOP_APP","UNREGISTER","APP_STORE","SYNC_ROUTE","AUTH","passthrough","CLIENTS","PATHS","DESKTOP_APP_SYNC","ParseArrayPipe","items","SyncPathDto","whitelist","OPERATION","DIFF","MAKE","BASE"],"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/sync/sync.controller.spec.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../../../backend/src/applications/sync/sync.controller.spec.ts"],"sourcesContent":["import { Test, TestingModule } from '@nestjs/testing'\nimport { ContextManager } from '../../infrastructure/context/services/context-manager.service'\nimport { SpacesManager } from '../spaces/services/spaces-manager.service'\nimport { SyncClientsManager } from './services/sync-clients-manager.service'\nimport { SyncManager } from './services/sync-manager.service'\nimport { SyncPathsManager } from './services/sync-paths-manager.service'\nimport { SyncController } from './sync.controller'\n\ndescribe(SyncController.name, () => {\n let controller: SyncController\n\n beforeAll(async () => {\n const module: TestingModule = await Test.createTestingModule({\n controllers: [SyncController],\n providers: [\n { provide: ContextManager, useValue: {} },\n { provide: SpacesManager, useValue: {} },\n { provide: SyncManager, useValue: {} },\n { provide: SyncClientsManager, useValue: {} },\n { provide: SyncPathsManager, useValue: {} }\n ]\n }).compile()\n\n controller = module.get<SyncController>(SyncController)\n })\n\n it('should be defined', () => {\n expect(controller).toBeDefined()\n })\n})\n"],"names":["describe","SyncController","name","controller","beforeAll","module","Test","createTestingModule","controllers","providers","provide","ContextManager","useValue","SpacesManager","SyncManager","SyncClientsManager","SyncPathsManager","compile","get","it","expect","toBeDefined"],"mappings":";;;;yBAAoC;uCACL;sCACD;2CACK;oCACP;yCACK;gCACF;AAE/BA,SAASC,8BAAc,CAACC,IAAI,EAAE;IAC5B,IAAIC;IAEJC,UAAU;QACR,MAAMC,SAAwB,MAAMC,aAAI,CAACC,mBAAmB,CAAC;YAC3DC,aAAa;gBAACP,8BAAc;aAAC;YAC7BQ,WAAW;gBACT;oBAAEC,SAASC,qCAAc;oBAAEC,UAAU,CAAC;gBAAE;gBACxC;oBAAEF,SAASG,mCAAa;oBAAED,UAAU,CAAC;gBAAE;gBACvC;oBAAEF,SAASI,+BAAW;oBAAEF,UAAU,CAAC;gBAAE;gBACrC;oBAAEF,SAASK,6CAAkB;oBAAEH,UAAU,CAAC;gBAAE;gBAC5C;oBAAEF,SAASM,yCAAgB;oBAAEJ,UAAU,CAAC;gBAAE;aAC3C;QACH,GAAGK,OAAO;QAEVd,aAAaE,OAAOa,GAAG,CAAiBjB,8BAAc;IACxD;IAEAkB,GAAG,qBAAqB;QACtBC,OAAOjB,YAAYkB,WAAW;IAChC;AACF"}
|
|
@@ -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/sync/sync.module.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../../../backend/src/applications/sync/sync.module.ts"],"sourcesContent":["import { Module } from '@nestjs/common'\nimport { SyncDiffGzipBodyInterceptor } from './interceptors/sync-diff-gzip-body.interceptor'\nimport { SyncClientsManager } from './services/sync-clients-manager.service'\nimport { SyncManager } from './services/sync-manager.service'\nimport { SyncPathsManager } from './services/sync-paths-manager.service'\nimport { SyncQueries } from './services/sync-queries.service'\nimport { SyncController } from './sync.controller'\n\n@Module({\n controllers: [SyncController],\n providers: [SyncDiffGzipBodyInterceptor, SyncClientsManager, SyncQueries, SyncPathsManager, SyncManager]\n})\nexport class SyncModule {}\n"],"names":["SyncModule","controllers","SyncController","providers","SyncDiffGzipBodyInterceptor","SyncClientsManager","SyncQueries","SyncPathsManager","SyncManager"],"mappings":";;;;+BAYaA;;;eAAAA;;;wBAZU;6CACqB;2CACT;oCACP;yCACK;oCACL;gCACG;;;;;;;AAMxB,IAAA,AAAMA,aAAN,MAAMA;AAAY;;;QAHvBC,aAAa;YAACC,8BAAc;SAAC;QAC7BC,WAAW;YAACC,wDAA2B;YAAEC,6CAAkB;YAAEC,+BAAW;YAAEC,yCAAgB;YAAEC,+BAAW;SAAC"}
|
|
@@ -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/sync/utils/functions.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/sync/utils/functions.ts"],"sourcesContent":["import path from 'node:path'\nimport { SYNC_FILE_NAME_PREFIX } from '../constants/sync'\n\nexport function getTmpFilePath(rPath: string): string {\n return `${path.dirname(rPath)}/${SYNC_FILE_NAME_PREFIX}${path.basename(rPath)}`\n}\n"],"names":["getTmpFilePath","rPath","path","dirname","SYNC_FILE_NAME_PREFIX","basename"],"mappings":";;;;+BAGgBA;;;eAAAA;;;iEAHC;sBACqB;;;;;;AAE/B,SAASA,eAAeC,KAAa;IAC1C,OAAO,GAAGC,iBAAI,CAACC,OAAO,CAACF,OAAO,CAAC,EAAEG,2BAAqB,GAAGF,iBAAI,CAACG,QAAQ,CAACJ,QAAQ;AACjF"}
|
|
@@ -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
|
});
|