@sync-in/server 1.8.0 → 1.9.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 +64 -10
- package/environment/environment.dist.yaml +29 -26
- package/package.json +18 -17
- package/server/app.bootstrap.js +4 -2
- package/server/app.bootstrap.js.map +1 -1
- package/server/app.constants.js +9 -0
- package/server/app.constants.js.map +1 -1
- package/server/app.module.js +4 -0
- package/server/app.module.js.map +1 -1
- package/server/applications/admin/admin.module.js +6 -1
- package/server/applications/admin/admin.module.js.map +1 -1
- package/server/applications/{notifications/interfaces/user-mail-notification.js → admin/interfaces/check-update.interfaces.js} +1 -1
- package/server/applications/admin/interfaces/check-update.interfaces.js.map +1 -0
- package/server/applications/admin/services/admin-scheduler.service.js +53 -0
- package/server/applications/admin/services/admin-scheduler.service.js.map +1 -0
- package/server/applications/admin/services/admin.service.js +102 -0
- package/server/applications/admin/services/admin.service.js.map +1 -0
- package/server/applications/admin/services/admin.service.spec.js +46 -0
- package/server/applications/admin/services/admin.service.spec.js.map +1 -0
- package/server/applications/admin/utils/check-update.js +28 -0
- package/server/applications/admin/utils/check-update.js.map +1 -0
- package/server/applications/comments/services/comments-manager.service.js +1 -1
- package/server/applications/comments/services/comments-manager.service.js.map +1 -1
- package/server/applications/comments/services/comments-manager.service.spec.js +1 -1
- package/server/applications/comments/services/comments-manager.service.spec.js.map +1 -1
- package/server/applications/comments/services/comments-queries.service.js.map +1 -1
- package/server/applications/files/constants/cache.js +10 -1
- package/server/applications/files/constants/cache.js.map +1 -1
- package/server/applications/files/constants/only-office.js +0 -25
- package/server/applications/files/constants/only-office.js.map +1 -1
- package/server/applications/files/constants/operations.js +20 -3
- package/server/applications/files/constants/operations.js.map +1 -1
- package/server/applications/files/dto/file-operations.dto.js +7 -0
- package/server/applications/files/dto/file-operations.dto.js.map +1 -1
- package/server/applications/files/files-only-office.controller.js +3 -2
- package/server/applications/files/files-only-office.controller.js.map +1 -1
- package/server/applications/files/files-only-office.controller.spec.js +6 -5
- package/server/applications/files/files-only-office.controller.spec.js.map +1 -1
- package/server/applications/files/files.controller.js +100 -12
- package/server/applications/files/files.controller.js.map +1 -1
- package/server/applications/files/files.controller.spec.js +29 -8
- package/server/applications/files/files.controller.spec.js.map +1 -1
- package/server/applications/files/guards/files-only-office.guard.js +6 -0
- package/server/applications/files/guards/files-only-office.guard.js.map +1 -1
- package/server/applications/files/interfaces/file-db-props.interface.js.map +1 -1
- package/server/applications/files/interfaces/file-props.interface.js.map +1 -1
- package/server/applications/files/interfaces/only-office-config.interface.js.map +1 -1
- package/server/applications/files/services/files-content-manager.service.js +3 -3
- package/server/applications/files/services/files-content-manager.service.js.map +1 -1
- package/server/applications/files/services/files-lock-manager.service.js +61 -22
- package/server/applications/files/services/files-lock-manager.service.js.map +1 -1
- package/server/applications/files/services/files-manager.service.js +122 -24
- package/server/applications/files/services/files-manager.service.js.map +1 -1
- package/server/applications/files/services/files-manager.service.spec.js +15 -0
- package/server/applications/files/services/files-manager.service.spec.js.map +1 -1
- package/server/applications/files/services/files-methods.service.js +39 -14
- package/server/applications/files/services/files-methods.service.js.map +1 -1
- package/server/applications/files/services/files-only-office-manager.service.js +12 -12
- package/server/applications/files/services/files-only-office-manager.service.js.map +1 -1
- package/server/applications/files/services/files-parser.service.js +1 -1
- package/server/applications/files/services/files-parser.service.js.map +1 -1
- package/server/applications/files/services/files-queries.service.js +10 -0
- package/server/applications/files/services/files-queries.service.js.map +1 -1
- package/server/applications/files/utils/doc-textify/adapters/pdf.js +5 -16
- package/server/applications/files/utils/doc-textify/adapters/pdf.js.map +1 -1
- package/server/applications/files/utils/files.js +1 -1
- package/server/applications/files/utils/files.js.map +1 -1
- package/server/applications/files/utils/send-file.js +3 -2
- package/server/applications/files/utils/send-file.js.map +1 -1
- package/server/applications/links/services/links-queries.service.js +1 -1
- package/server/applications/links/services/links-queries.service.js.map +1 -1
- package/server/applications/notifications/constants/notifications.js +5 -1
- package/server/applications/notifications/constants/notifications.js.map +1 -1
- package/server/applications/notifications/i18n/de.js +8 -2
- package/server/applications/notifications/i18n/de.js.map +1 -1
- package/server/applications/notifications/i18n/es.js +8 -2
- package/server/applications/notifications/i18n/es.js.map +1 -1
- package/server/applications/notifications/i18n/fr.js +8 -2
- package/server/applications/notifications/i18n/fr.js.map +1 -1
- package/server/applications/notifications/i18n/hi.js +8 -2
- package/server/applications/notifications/i18n/hi.js.map +1 -1
- package/server/applications/notifications/i18n/it.js +8 -2
- package/server/applications/notifications/i18n/it.js.map +1 -1
- package/server/applications/notifications/i18n/ja.js +8 -2
- package/server/applications/notifications/i18n/ja.js.map +1 -1
- package/server/applications/notifications/i18n/ko.js +8 -2
- package/server/applications/notifications/i18n/ko.js.map +1 -1
- package/server/applications/notifications/i18n/pl.js +8 -2
- package/server/applications/notifications/i18n/pl.js.map +1 -1
- package/server/applications/notifications/i18n/pt.js +8 -2
- package/server/applications/notifications/i18n/pt.js.map +1 -1
- package/server/applications/notifications/i18n/pt_br.js +8 -2
- package/server/applications/notifications/i18n/pt_br.js.map +1 -1
- package/server/applications/notifications/i18n/ru.js +8 -2
- package/server/applications/notifications/i18n/ru.js.map +1 -1
- package/server/applications/notifications/i18n/tr.js +8 -2
- package/server/applications/notifications/i18n/tr.js.map +1 -1
- package/server/applications/notifications/i18n/zh.js +8 -2
- package/server/applications/notifications/i18n/zh.js.map +1 -1
- package/server/applications/notifications/interfaces/notification-properties.interface.js.map +1 -1
- package/server/applications/notifications/interfaces/user-mail-notification.interface.js +10 -0
- package/server/applications/notifications/interfaces/user-mail-notification.interface.js.map +1 -0
- package/server/applications/notifications/mails/models.js +38 -3
- package/server/applications/notifications/mails/models.js.map +1 -1
- package/server/applications/notifications/mails/templates.js +1 -1
- package/server/applications/notifications/mails/templates.js.map +1 -1
- package/server/applications/notifications/services/notifications-manager.service.js +8 -1
- package/server/applications/notifications/services/notifications-manager.service.js.map +1 -1
- package/server/applications/notifications/services/notifications-queries.service.js.map +1 -1
- package/server/applications/shares/services/shares-manager.service.js +17 -10
- package/server/applications/shares/services/shares-manager.service.js.map +1 -1
- package/server/applications/shares/services/shares-manager.service.spec.js +10 -3
- package/server/applications/shares/services/shares-manager.service.spec.js.map +1 -1
- package/server/applications/shares/services/shares-queries.service.js +11 -1
- package/server/applications/shares/services/shares-queries.service.js.map +1 -1
- package/server/applications/spaces/guards/space.guard.spec.js +2 -2
- package/server/applications/spaces/guards/space.guard.spec.js.map +1 -1
- package/server/applications/spaces/services/spaces-browser.service.js +31 -11
- package/server/applications/spaces/services/spaces-browser.service.js.map +1 -1
- package/server/applications/spaces/services/spaces-manager.service.js +2 -2
- package/server/applications/spaces/services/spaces-manager.service.js.map +1 -1
- package/server/applications/spaces/services/spaces-queries.service.js +6 -2
- package/server/applications/spaces/services/spaces-queries.service.js.map +1 -1
- package/server/applications/spaces/utils/permissions.js +2 -2
- package/server/applications/spaces/utils/permissions.js.map +1 -1
- package/server/applications/sync/services/sync-manager.service.js +1 -0
- package/server/applications/sync/services/sync-manager.service.js.map +1 -1
- package/server/applications/sync/services/sync-paths-manager.service.js +1 -1
- package/server/applications/sync/services/sync-paths-manager.service.js.map +1 -1
- package/server/applications/sync/services/sync-paths-manager.service.spec.js +1 -1
- package/server/applications/sync/services/sync-paths-manager.service.spec.js.map +1 -1
- package/server/applications/users/constants/user.js +1 -1
- package/server/applications/users/constants/user.js.map +1 -1
- package/server/applications/users/services/admin-users-queries.service.js +8 -0
- package/server/applications/users/services/admin-users-queries.service.js.map +1 -1
- package/server/applications/users/services/users-manager.service.js +1 -2
- package/server/applications/users/services/users-manager.service.js.map +1 -1
- package/server/applications/users/services/users-queries.service.js +67 -68
- package/server/applications/users/services/users-queries.service.js.map +1 -1
- package/server/applications/users/users.gateway.js +6 -0
- package/server/applications/users/users.gateway.js.map +1 -1
- package/server/applications/users/users.module.js +2 -1
- package/server/applications/users/users.module.js.map +1 -1
- package/server/applications/webdav/guards/webdav-protocol.guard.js +4 -4
- package/server/applications/webdav/guards/webdav-protocol.guard.js.map +1 -1
- package/server/applications/webdav/guards/webdav-protocol.guard.spec.js +6 -6
- package/server/applications/webdav/guards/webdav-protocol.guard.spec.js.map +1 -1
- package/server/applications/webdav/services/webdav-methods.service.js +3 -2
- package/server/applications/webdav/services/webdav-methods.service.js.map +1 -1
- package/server/applications/webdav/services/webdav-methods.service.spec.js +2 -2
- package/server/applications/webdav/services/webdav-methods.service.spec.js.map +1 -1
- package/server/authentication/constants/auth-ldap.js +2 -0
- package/server/authentication/constants/auth-ldap.js.map +1 -1
- package/server/authentication/services/auth-methods/auth-method-ldap.service.js +34 -21
- package/server/authentication/services/auth-methods/auth-method-ldap.service.js.map +1 -1
- package/server/common/functions.js +0 -8
- package/server/common/functions.js.map +1 -1
- package/server/common/image.js +63 -58
- package/server/common/image.js.map +1 -1
- package/server/common/shared.js +18 -1
- package/server/common/shared.js.map +1 -1
- package/server/infrastructure/context/services/context-manager.service.js +3 -0
- package/server/infrastructure/context/services/context-manager.service.js.map +1 -1
- package/server/infrastructure/websocket/adapters/cluster.adapter.js +4 -4
- package/server/infrastructure/websocket/adapters/cluster.adapter.js.map +1 -1
- package/static/3rdpartylicenses.txt +1380 -57
- package/static/assets/favicon.svg +2 -25
- package/static/assets/logo-dark.svg +2 -32
- package/static/assets/logo.svg +2 -32
- package/static/assets/mimes/application-sql.svg +29 -1
- package/static/assets/mimes/application-x-sql.svg +29 -0
- package/static/assets/mimes/image-bmp.svg +12 -0
- package/static/assets/pdfjs/build/pdf.mjs +4869 -4454
- package/static/assets/pdfjs/build/pdf.mjs.map +1 -1
- package/static/assets/pdfjs/build/pdf.sandbox.mjs +3 -3
- package/static/assets/pdfjs/build/pdf.sandbox.mjs.map +1 -1
- package/static/assets/pdfjs/build/pdf.worker.mjs +885 -596
- package/static/assets/pdfjs/build/pdf.worker.mjs.map +1 -1
- package/static/assets/pdfjs/version +1 -1
- package/static/assets/pdfjs/web/locale/be/viewer.ftl +40 -0
- package/static/assets/pdfjs/web/locale/bg/viewer.ftl +2 -0
- package/static/assets/pdfjs/web/locale/cs/viewer.ftl +41 -0
- package/static/assets/pdfjs/web/locale/cy/viewer.ftl +43 -0
- package/static/assets/pdfjs/web/locale/da/viewer.ftl +39 -0
- package/static/assets/pdfjs/web/locale/de/viewer.ftl +41 -0
- package/static/assets/pdfjs/web/locale/dsb/viewer.ftl +43 -0
- package/static/assets/pdfjs/web/locale/el/viewer.ftl +39 -0
- package/static/assets/pdfjs/web/locale/en-CA/viewer.ftl +35 -0
- package/static/assets/pdfjs/web/locale/en-GB/viewer.ftl +41 -0
- package/static/assets/pdfjs/web/locale/en-US/viewer.ftl +2 -2
- package/static/assets/pdfjs/web/locale/eo/viewer.ftl +39 -0
- package/static/assets/pdfjs/web/locale/es-AR/viewer.ftl +41 -0
- package/static/assets/pdfjs/web/locale/es-CL/viewer.ftl +39 -0
- package/static/assets/pdfjs/web/locale/es-ES/viewer.ftl +72 -0
- package/static/assets/pdfjs/web/locale/es-MX/viewer.ftl +120 -0
- package/static/assets/pdfjs/web/locale/eu/viewer.ftl +41 -0
- package/static/assets/pdfjs/web/locale/fi/viewer.ftl +41 -0
- package/static/assets/pdfjs/web/locale/fr/viewer.ftl +41 -0
- package/static/assets/pdfjs/web/locale/fur/viewer.ftl +77 -0
- package/static/assets/pdfjs/web/locale/fy-NL/viewer.ftl +41 -0
- package/static/assets/pdfjs/web/locale/gn/viewer.ftl +39 -0
- package/static/assets/pdfjs/web/locale/he/viewer.ftl +41 -0
- package/static/assets/pdfjs/web/locale/hsb/viewer.ftl +43 -0
- package/static/assets/pdfjs/web/locale/hu/viewer.ftl +41 -0
- package/static/assets/pdfjs/web/locale/hy-AM/viewer.ftl +1 -1
- package/static/assets/pdfjs/web/locale/ia/viewer.ftl +41 -0
- package/static/assets/pdfjs/web/locale/it/viewer.ftl +41 -0
- package/static/assets/pdfjs/web/locale/ja/viewer.ftl +32 -0
- package/static/assets/pdfjs/web/locale/ka/viewer.ftl +41 -0
- package/static/assets/pdfjs/web/locale/kab/viewer.ftl +73 -0
- package/static/assets/pdfjs/web/locale/kk/viewer.ftl +21 -0
- package/static/assets/pdfjs/web/locale/ko/viewer.ftl +38 -1
- package/static/assets/pdfjs/web/locale/nb-NO/viewer.ftl +39 -0
- package/static/assets/pdfjs/web/locale/nl/viewer.ftl +41 -0
- package/static/assets/pdfjs/web/locale/nn-NO/viewer.ftl +37 -0
- package/static/assets/pdfjs/web/locale/pa-IN/viewer.ftl +37 -0
- package/static/assets/pdfjs/web/locale/pl/viewer.ftl +39 -0
- package/static/assets/pdfjs/web/locale/pt-BR/viewer.ftl +39 -0
- package/static/assets/pdfjs/web/locale/rm/viewer.ftl +73 -0
- package/static/assets/pdfjs/web/locale/ro/viewer.ftl +41 -0
- package/static/assets/pdfjs/web/locale/ru/viewer.ftl +42 -0
- package/static/assets/pdfjs/web/locale/sc/viewer.ftl +6 -0
- package/static/assets/pdfjs/web/locale/sk/viewer.ftl +43 -0
- package/static/assets/pdfjs/web/locale/sl/viewer.ftl +42 -1
- package/static/assets/pdfjs/web/locale/sq/viewer.ftl +77 -0
- package/static/assets/pdfjs/web/locale/sv-SE/viewer.ftl +41 -0
- package/static/assets/pdfjs/web/locale/tg/viewer.ftl +39 -0
- package/static/assets/pdfjs/web/locale/th/viewer.ftl +35 -0
- package/static/assets/pdfjs/web/locale/tr/viewer.ftl +39 -0
- package/static/assets/pdfjs/web/locale/vi/viewer.ftl +42 -5
- package/static/assets/pdfjs/web/locale/zh-CN/viewer.ftl +35 -0
- package/static/assets/pdfjs/web/locale/zh-TW/viewer.ftl +37 -0
- package/static/assets/pdfjs/web/viewer.css +141 -110
- package/static/assets/pdfjs/web/viewer.html +7 -7
- package/static/assets/pdfjs/web/viewer.mjs +97 -14
- package/static/assets/pdfjs/web/viewer.mjs.map +1 -1
- package/static/chunk-22DWHRCL.js +1 -0
- package/static/chunk-23UUFZSR.js +1 -0
- package/static/{chunk-VM4YX6Q7.js → chunk-24Q7OUU2.js} +1 -1
- package/static/chunk-25QTY2GI.js +1 -0
- package/static/chunk-2E7IJZLL.js +1 -0
- package/static/chunk-2FC5EKS5.js +1 -0
- package/static/chunk-2FOWUJQF.js +1 -0
- package/static/chunk-2XPHUNYN.js +1 -0
- package/static/chunk-32L7RG2G.js +1 -0
- package/static/chunk-3IISSX63.js +1 -0
- package/static/chunk-3OHSTP3R.js +1 -0
- package/static/chunk-42L6C5MT.js +1 -0
- package/static/chunk-4AGQL5GV.js +1 -0
- package/static/chunk-4BPSQMI2.js +1 -0
- package/static/chunk-4FDRWZWT.js +1 -0
- package/static/chunk-4FJUCMEG.js +1 -0
- package/static/chunk-4GCCF6PF.js +1 -0
- package/static/chunk-4ORP3SBY.js +1 -0
- package/static/chunk-4QBOHIC3.js +1 -0
- package/static/chunk-4YT6K5KY.js +1 -0
- package/static/chunk-556I6YIW.js +1 -0
- package/static/chunk-5DPIGJU4.js +1 -0
- package/static/chunk-5HNQLBSW.js +3 -0
- package/static/chunk-5IL7C45D.js +1 -0
- package/static/chunk-5KJXGMKR.js +1 -0
- package/static/chunk-5SPGSHKL.js +1 -0
- package/static/chunk-5WCQBTXW.js +1 -0
- package/static/chunk-5XUIPWOH.js +1 -0
- package/static/chunk-62WT7PI3.js +1 -0
- package/static/chunk-6F6OMQ5H.js +1 -0
- package/static/chunk-6I5BGQHT.js +1 -0
- package/static/chunk-6NOS45DG.js +1 -0
- package/static/chunk-6OKLPRCD.js +1 -0
- package/static/chunk-6VEJCG43.js +1 -0
- package/static/chunk-77SS36Z2.js +1 -0
- package/static/chunk-7AXEPO3G.js +1 -0
- package/static/chunk-7CFSJ4BO.js +1 -0
- package/static/chunk-7CKHC72R.js +1 -0
- package/static/chunk-7DUTYOJG.js +1 -0
- package/static/chunk-7HKFYRPF.js +1 -0
- package/static/chunk-7NZJZATZ.js +1 -0
- package/static/chunk-AADK5D2H.js +1 -0
- package/static/chunk-ACUF7IKP.js +1 -0
- package/static/chunk-AGREZPV4.js +1 -0
- package/static/chunk-ATBJWFA3.js +1 -0
- package/static/chunk-ATXLZN2B.js +1 -0
- package/static/chunk-AZ5TF5Y3.js +1 -0
- package/static/chunk-BBHYIURC.js +1 -0
- package/static/chunk-BHZEPHRI.js +13 -0
- package/static/chunk-BQZWSZNN.js +1 -0
- package/static/chunk-BSB4VROD.js +2 -0
- package/static/chunk-BYWSTP3P.js +1 -0
- package/static/chunk-C3AAEQKW.js +1 -0
- package/static/chunk-CCGGCHGN.js +1 -0
- package/static/chunk-CFTKW432.js +1 -0
- package/static/chunk-CNOVT6KU.js +1 -0
- package/static/chunk-D56H3XE2.js +1 -0
- package/static/chunk-DFOOSIIA.js +1 -0
- package/static/chunk-DHFQIFOF.js +1 -0
- package/static/{chunk-3GMLWAFZ.js → chunk-DIC2MVRI.js} +1 -1
- package/static/chunk-DJDRX53V.js +2 -0
- package/static/chunk-DKGXUMLT.js +1 -0
- package/static/chunk-DRHPEERW.js +2 -0
- package/static/chunk-DWYP6ZGG.js +1 -0
- package/static/chunk-EDJAISWO.js +13 -0
- package/static/chunk-EIYRBM4J.js +1 -0
- package/static/chunk-EKEGRXCV.js +7 -0
- package/static/chunk-EL6QL4TP.js +1 -0
- package/static/chunk-ERDZ7IVF.js +1 -0
- package/static/chunk-EVQKKVUZ.js +1 -0
- package/static/chunk-F2XG7EWI.js +1 -0
- package/static/chunk-F672FY5I.js +1 -0
- package/static/chunk-F6V37MKG.js +1 -0
- package/static/chunk-F7TXTNZC.js +1 -0
- package/static/chunk-FCGTI42I.js +1 -0
- package/static/chunk-FQHOSSCO.js +1 -0
- package/static/chunk-FTSIPHMG.js +1 -0
- package/static/chunk-GAGHHYLF.js +1 -0
- package/static/{chunk-JPT5WEAT.js → chunk-GOJYWL2M.js} +1 -1
- package/static/chunk-H6WOTGQ5.js +1 -0
- package/static/{chunk-CHJ64RJM.js → chunk-H6ZXFINQ.js} +1 -1
- package/static/chunk-HC7F57NA.js +1 -0
- package/static/chunk-HHWXIK2M.js +7 -0
- package/static/chunk-HKRGIRKB.js +3 -0
- package/static/chunk-HNMGPG72.js +1 -0
- package/static/chunk-HS4S6BV3.js +1 -0
- package/static/chunk-IJ7K7ATQ.js +1 -0
- package/static/chunk-IOIBQGHN.js +562 -0
- package/static/chunk-ITVA26X2.js +2 -0
- package/static/chunk-J6YSFHLZ.js +1 -0
- package/static/chunk-JAEJ6IMV.js +1 -0
- package/static/chunk-JB5R6V33.js +1 -0
- package/static/chunk-JF6WIV6M.js +1 -0
- package/static/chunk-JGB4LLUT.js +1 -0
- package/static/chunk-JGXVTKLG.js +1 -0
- package/static/chunk-JMYAD7E2.js +1 -0
- package/static/chunk-JSE63Q5X.js +1 -0
- package/static/chunk-JVV3ZL6L.js +1 -0
- package/static/chunk-JXZCNFW7.js +1 -0
- package/static/chunk-KAVP6UXH.js +1 -0
- package/static/{chunk-WLMNXRBS.js → chunk-KDEEERWZ.js} +1 -1
- package/static/chunk-KHRF67SG.js +1 -0
- package/static/chunk-KLOUBIO4.js +1 -0
- package/static/chunk-KMF3ZRAO.js +1 -0
- package/static/chunk-KNZ3AQPR.js +1 -0
- package/static/chunk-KT3TWCST.js +1 -0
- package/static/chunk-L6SYG23T.js +1 -0
- package/static/chunk-LJSVNPPQ.js +1 -0
- package/static/{chunk-LNTUR3GU.js → chunk-LRDKG274.js} +1 -1
- package/static/chunk-LRQSPCYZ.js +1 -0
- package/static/chunk-LUSVISM6.js +1 -0
- package/static/chunk-LXQGVNU2.js +1 -0
- package/static/{chunk-BIKLW4YS.js → chunk-LYZGJZNP.js} +1 -1
- package/static/chunk-LZKI5P5T.js +1 -0
- package/static/chunk-M4XL3JN5.js +6 -0
- package/static/{chunk-UNCPXHHT.js → chunk-MGWG7OD7.js} +1 -1
- package/static/chunk-MKUUWY6Y.js +1 -0
- package/static/{chunk-HAS5ZOTR.js → chunk-MNNCSSHN.js} +1 -1
- package/static/chunk-MR3U7TKQ.js +1 -0
- package/static/chunk-MRF3CNLZ.js +1 -0
- package/static/chunk-MRMSMTWD.js +1 -0
- package/static/chunk-MVZJSG5R.js +1 -0
- package/static/chunk-MYM43ENO.js +1 -0
- package/static/chunk-N3P6P6GW.js +7 -0
- package/static/chunk-NAH4V2R6.js +2 -0
- package/static/chunk-NBBDVVUF.js +1 -0
- package/static/chunk-NMF2ZFBE.js +1 -0
- package/static/chunk-NN4ONTOT.js +1 -0
- package/static/chunk-NOPACN4F.js +1 -0
- package/static/chunk-NYJPOP4L.js +1 -0
- package/static/chunk-OJCAIKUK.js +1 -0
- package/static/chunk-OQRWXCLY.js +1 -0
- package/static/chunk-PCFH5HCI.js +2 -0
- package/static/chunk-PG54TWBO.js +4 -0
- package/static/chunk-PJF5XUTO.js +1 -0
- package/static/{chunk-FJE6BOFL.js → chunk-PSUAQBYM.js} +1 -1
- package/static/chunk-PTLYIUFW.js +1 -0
- package/static/chunk-PZGLDZZM.js +1 -0
- package/static/chunk-Q4VNZGFI.js +1 -0
- package/static/chunk-Q556XB3S.js +1 -0
- package/static/{chunk-PB4AIT7O.js → chunk-Q7IXRPOO.js} +1 -1
- package/static/chunk-Q7U2VPIS.js +1 -0
- package/static/chunk-QM6CQMEX.js +1 -0
- package/static/chunk-QMHUIHSR.js +1 -0
- package/static/chunk-QNFNXDSX.js +1 -0
- package/static/chunk-QVFPHTOH.js +1 -0
- package/static/chunk-R4MI25E2.js +1 -0
- package/static/chunk-R7JRAR3P.js +1 -0
- package/static/chunk-R7PNKQU2.js +1 -0
- package/static/chunk-RCAORRB7.js +1 -0
- package/static/chunk-RK7XRDNB.js +1 -0
- package/static/chunk-RO7SAOLK.js +1 -0
- package/static/chunk-RQUUINHV.js +1 -0
- package/static/chunk-RT3K6DZR.js +1 -0
- package/static/chunk-RUN556VW.js +1 -0
- package/static/chunk-RX3YQ67K.js +1 -0
- package/static/chunk-S6EVLDHA.js +5 -0
- package/static/chunk-S7S5M3AZ.js +1 -0
- package/static/chunk-SBLNYV74.js +1 -0
- package/static/chunk-SIZCHHUA.js +1 -0
- package/static/chunk-SRBOO7AO.js +1 -0
- package/static/{chunk-PVDHBQRM.js → chunk-STA7NTYL.js} +1 -1
- package/static/chunk-T3YI3BSS.js +1 -0
- package/static/chunk-T74SMT7I.js +1 -0
- package/static/chunk-TAL3RTTQ.js +1 -0
- package/static/chunk-TJZKTNNS.js +1 -0
- package/static/chunk-UJTFWZEC.js +1 -0
- package/static/chunk-UPGVU5LG.js +1 -0
- package/static/chunk-UQ6O3I6W.js +1 -0
- package/static/{chunk-5NMSIIQB.js → chunk-V43RGNXA.js} +1 -1
- package/static/chunk-VWIRXLNE.js +1 -0
- package/static/chunk-VZMVGIVW.js +1 -0
- package/static/chunk-VZPCXSRG.js +2 -0
- package/static/chunk-WR3MA3L3.js +1 -0
- package/static/chunk-XCLK7NJL.js +1 -0
- package/static/{chunk-DSWEWLXJ.js → chunk-XCPDPB5G.js} +1 -1
- package/static/chunk-XEGHEUP5.js +1 -0
- package/static/chunk-XKEBQNQJ.js +1 -0
- package/static/chunk-XOF4UW3S.js +1 -0
- package/static/chunk-XOTKK2NJ.js +1 -0
- package/static/chunk-XX7JXKA6.js +1 -0
- package/static/chunk-Y2I36A4K.js +1 -0
- package/static/chunk-Y44XDRM5.js +1 -0
- package/static/{chunk-QO6BTONN.js → chunk-Y4MAPE2C.js} +1 -1
- package/static/chunk-Y5RLD72B.js +1 -0
- package/static/{chunk-DPUVSXRB.js → chunk-Y5XTRCFK.js} +1 -1
- package/static/chunk-Y63UUJGJ.js +1 -0
- package/static/chunk-YBNAC7QM.js +1 -0
- package/static/chunk-YCTCESL4.js +1 -0
- package/static/chunk-YMAN4LIU.js +1 -0
- package/static/chunk-YTDE6SXT.js +1 -0
- package/static/chunk-YZPIUJB3.js +1 -0
- package/static/chunk-ZCOWBVOT.js +1 -0
- package/static/chunk-ZHRYYMYE.js +1 -0
- package/static/chunk-ZNXTOQFG.js +1 -0
- package/static/{chunk-URHTCJ7G.js → chunk-ZQLBPLXI.js} +1 -1
- package/static/favicon.ico +0 -0
- package/static/index.html +2 -2
- package/static/main-3PLRDZTO.js +11 -0
- package/static/styles-Q4OZOSSK.css +1 -0
- package/server/applications/notifications/interfaces/user-mail-notification.js.map +0 -1
- package/static/assets/codemirror/mode/apl/apl.js +0 -174
- package/static/assets/codemirror/mode/asciiarmor/asciiarmor.js +0 -74
- package/static/assets/codemirror/mode/asn.1/asn.1.js +0 -204
- package/static/assets/codemirror/mode/asterisk/asterisk.js +0 -220
- package/static/assets/codemirror/mode/brainfuck/brainfuck.js +0 -85
- package/static/assets/codemirror/mode/clike/clike.js +0 -942
- package/static/assets/codemirror/mode/clojure/clojure.js +0 -293
- package/static/assets/codemirror/mode/cmake/cmake.js +0 -97
- package/static/assets/codemirror/mode/cobol/cobol.js +0 -255
- package/static/assets/codemirror/mode/coffeescript/coffeescript.js +0 -359
- package/static/assets/codemirror/mode/commonlisp/commonlisp.js +0 -125
- package/static/assets/codemirror/mode/crystal/crystal.js +0 -433
- package/static/assets/codemirror/mode/css/css.js +0 -862
- package/static/assets/codemirror/mode/cypher/cypher.js +0 -152
- package/static/assets/codemirror/mode/d/d.js +0 -223
- package/static/assets/codemirror/mode/dart/dart.js +0 -168
- package/static/assets/codemirror/mode/diff/diff.js +0 -47
- package/static/assets/codemirror/mode/django/django.js +0 -356
- package/static/assets/codemirror/mode/dockerfile/dockerfile.js +0 -211
- package/static/assets/codemirror/mode/dtd/dtd.js +0 -142
- package/static/assets/codemirror/mode/dylan/dylan.js +0 -352
- package/static/assets/codemirror/mode/ebnf/ebnf.js +0 -195
- package/static/assets/codemirror/mode/ecl/ecl.js +0 -206
- package/static/assets/codemirror/mode/eiffel/eiffel.js +0 -160
- package/static/assets/codemirror/mode/elm/elm.js +0 -245
- package/static/assets/codemirror/mode/erlang/erlang.js +0 -619
- package/static/assets/codemirror/mode/factor/factor.js +0 -85
- package/static/assets/codemirror/mode/fcl/fcl.js +0 -173
- package/static/assets/codemirror/mode/forth/forth.js +0 -180
- package/static/assets/codemirror/mode/fortran/fortran.js +0 -188
- package/static/assets/codemirror/mode/gas/gas.js +0 -355
- package/static/assets/codemirror/mode/gfm/gfm.js +0 -129
- package/static/assets/codemirror/mode/gherkin/gherkin.js +0 -194
- package/static/assets/codemirror/mode/go/go.js +0 -187
- package/static/assets/codemirror/mode/groovy/groovy.js +0 -245
- package/static/assets/codemirror/mode/haml/haml.js +0 -161
- package/static/assets/codemirror/mode/handlebars/handlebars.js +0 -70
- package/static/assets/codemirror/mode/haskell/haskell.js +0 -268
- package/static/assets/codemirror/mode/haskell-literate/haskell-literate.js +0 -43
- package/static/assets/codemirror/mode/haxe/haxe.js +0 -515
- package/static/assets/codemirror/mode/htmlembedded/htmlembedded.js +0 -37
- package/static/assets/codemirror/mode/htmlmixed/htmlmixed.js +0 -153
- package/static/assets/codemirror/mode/http/http.js +0 -113
- package/static/assets/codemirror/mode/idl/idl.js +0 -290
- package/static/assets/codemirror/mode/javascript/javascript.js +0 -960
- package/static/assets/codemirror/mode/jinja2/jinja2.js +0 -193
- package/static/assets/codemirror/mode/jsx/jsx.js +0 -149
- package/static/assets/codemirror/mode/julia/julia.js +0 -390
- package/static/assets/codemirror/mode/livescript/livescript.js +0 -280
- package/static/assets/codemirror/mode/lua/lua.js +0 -160
- package/static/assets/codemirror/mode/markdown/markdown.js +0 -886
- package/static/assets/codemirror/mode/mathematica/mathematica.js +0 -176
- package/static/assets/codemirror/mode/mbox/mbox.js +0 -129
- package/static/assets/codemirror/mode/meta.js +0 -221
- package/static/assets/codemirror/mode/mirc/mirc.js +0 -193
- package/static/assets/codemirror/mode/mllike/mllike.js +0 -359
- package/static/assets/codemirror/mode/modelica/modelica.js +0 -245
- package/static/assets/codemirror/mode/mscgen/mscgen.js +0 -175
- package/static/assets/codemirror/mode/mumps/mumps.js +0 -148
- package/static/assets/codemirror/mode/nginx/nginx.js +0 -178
- package/static/assets/codemirror/mode/nsis/nsis.js +0 -95
- package/static/assets/codemirror/mode/ntriples/ntriples.js +0 -195
- package/static/assets/codemirror/mode/octave/octave.js +0 -139
- package/static/assets/codemirror/mode/oz/oz.js +0 -252
- package/static/assets/codemirror/mode/pascal/pascal.js +0 -136
- package/static/assets/codemirror/mode/pegjs/pegjs.js +0 -111
- package/static/assets/codemirror/mode/perl/perl.js +0 -836
- package/static/assets/codemirror/mode/php/php.js +0 -234
- package/static/assets/codemirror/mode/pig/pig.js +0 -178
- package/static/assets/codemirror/mode/powershell/powershell.js +0 -398
- package/static/assets/codemirror/mode/properties/properties.js +0 -78
- package/static/assets/codemirror/mode/protobuf/protobuf.js +0 -72
- package/static/assets/codemirror/mode/pug/pug.js +0 -591
- package/static/assets/codemirror/mode/puppet/puppet.js +0 -220
- package/static/assets/codemirror/mode/python/python.js +0 -402
- package/static/assets/codemirror/mode/q/q.js +0 -139
- package/static/assets/codemirror/mode/r/r.js +0 -190
- package/static/assets/codemirror/mode/rpm/changes/index.html +0 -66
- package/static/assets/codemirror/mode/rpm/rpm.js +0 -109
- package/static/assets/codemirror/mode/rst/rst.js +0 -557
- package/static/assets/codemirror/mode/ruby/ruby.js +0 -303
- package/static/assets/codemirror/mode/rust/rust.js +0 -72
- package/static/assets/codemirror/mode/sas/sas.js +0 -303
- package/static/assets/codemirror/mode/sass/sass.js +0 -459
- package/static/assets/codemirror/mode/scheme/scheme.js +0 -284
- package/static/assets/codemirror/mode/shell/shell.js +0 -168
- package/static/assets/codemirror/mode/sieve/sieve.js +0 -193
- package/static/assets/codemirror/mode/slim/slim.js +0 -575
- package/static/assets/codemirror/mode/smalltalk/smalltalk.js +0 -168
- package/static/assets/codemirror/mode/smarty/smarty.js +0 -225
- package/static/assets/codemirror/mode/solr/solr.js +0 -104
- package/static/assets/codemirror/mode/soy/soy.js +0 -665
- package/static/assets/codemirror/mode/sparql/sparql.js +0 -184
- package/static/assets/codemirror/mode/spreadsheet/spreadsheet.js +0 -112
- package/static/assets/codemirror/mode/sql/sql.js +0 -529
- package/static/assets/codemirror/mode/stex/stex.js +0 -264
- package/static/assets/codemirror/mode/stylus/stylus.js +0 -775
- package/static/assets/codemirror/mode/swift/swift.js +0 -221
- package/static/assets/codemirror/mode/tcl/tcl.js +0 -140
- package/static/assets/codemirror/mode/textile/textile.js +0 -469
- package/static/assets/codemirror/mode/tiddlywiki/tiddlywiki.css +0 -14
- package/static/assets/codemirror/mode/tiddlywiki/tiddlywiki.js +0 -308
- package/static/assets/codemirror/mode/tiki/tiki.css +0 -26
- package/static/assets/codemirror/mode/tiki/tiki.js +0 -312
- package/static/assets/codemirror/mode/toml/toml.js +0 -88
- package/static/assets/codemirror/mode/tornado/tornado.js +0 -68
- package/static/assets/codemirror/mode/troff/troff.js +0 -84
- package/static/assets/codemirror/mode/ttcn/ttcn.js +0 -283
- package/static/assets/codemirror/mode/ttcn-cfg/ttcn-cfg.js +0 -214
- package/static/assets/codemirror/mode/turtle/turtle.js +0 -162
- package/static/assets/codemirror/mode/twig/twig.js +0 -141
- package/static/assets/codemirror/mode/vb/vb.js +0 -275
- package/static/assets/codemirror/mode/vbscript/vbscript.js +0 -350
- package/static/assets/codemirror/mode/velocity/velocity.js +0 -202
- package/static/assets/codemirror/mode/verilog/verilog.js +0 -781
- package/static/assets/codemirror/mode/vhdl/vhdl.js +0 -189
- package/static/assets/codemirror/mode/vue/vue.js +0 -77
- package/static/assets/codemirror/mode/wast/wast.js +0 -132
- package/static/assets/codemirror/mode/webidl/webidl.js +0 -195
- package/static/assets/codemirror/mode/xml/xml.js +0 -417
- package/static/assets/codemirror/mode/xquery/xquery.js +0 -448
- package/static/assets/codemirror/mode/yacas/yacas.js +0 -204
- package/static/assets/codemirror/mode/yaml/yaml.js +0 -120
- package/static/assets/codemirror/mode/yaml-frontmatter/yaml-frontmatter.js +0 -72
- package/static/assets/codemirror/mode/z80/z80.js +0 -116
- package/static/chunk-2KLC4T2Z.js +0 -1
- package/static/chunk-373XVRXW.js +0 -1
- package/static/chunk-3XVM35O2.js +0 -1
- package/static/chunk-3YVRP3VM.js +0 -2
- package/static/chunk-AF24EYXU.js +0 -1
- package/static/chunk-AKQVEHO6.js +0 -2
- package/static/chunk-AY2SZ3G6.js +0 -1
- package/static/chunk-BCVX464U.js +0 -2
- package/static/chunk-C36MW4ME.js +0 -562
- package/static/chunk-DKSEQTMX.js +0 -1
- package/static/chunk-FZ3JPGYZ.js +0 -1
- package/static/chunk-GUGNR5TF.js +0 -3
- package/static/chunk-H6NE33VX.js +0 -1
- package/static/chunk-HNQRZALS.js +0 -1
- package/static/chunk-JSWCNGXJ.js +0 -1
- package/static/chunk-KFJIQIGR.js +0 -1
- package/static/chunk-LVM4QB22.js +0 -1
- package/static/chunk-M3XVNQZQ.js +0 -1
- package/static/chunk-MFLIJH6T.js +0 -1
- package/static/chunk-MSUHTBB2.js +0 -1
- package/static/chunk-N3U6637P.js +0 -1
- package/static/chunk-NNV4OXSB.js +0 -1
- package/static/chunk-NO2LTNW3.js +0 -1
- package/static/chunk-OOGP4WSH.js +0 -2
- package/static/chunk-PCWDQPOM.js +0 -2
- package/static/chunk-PGZZP5W3.js +0 -1
- package/static/chunk-Q5KM7LTX.js +0 -1
- package/static/chunk-QHC6ZPQ4.js +0 -1
- package/static/chunk-QZU2S5CV.js +0 -1
- package/static/chunk-SBZ572Q4.js +0 -2
- package/static/chunk-SHIVUDP3.js +0 -1
- package/static/chunk-SLHTEGRU.js +0 -1
- package/static/chunk-SSFF27P2.js +0 -24
- package/static/chunk-TPYBFZS5.js +0 -1
- package/static/chunk-UEQCWMXD.js +0 -1
- package/static/chunk-UG5DMXYO.js +0 -1
- package/static/chunk-UJPPR4MX.js +0 -1
- package/static/chunk-V3AT2BKP.js +0 -1
- package/static/chunk-VKK5BSLX.js +0 -1
- package/static/chunk-WJW7CT6G.js +0 -27
- package/static/chunk-X5XGK6T7.js +0 -4
- package/static/chunk-YEKR5OPO.js +0 -1
- package/static/chunk-YW57T2PF.js +0 -1
- package/static/chunk-Z5J5F5SX.js +0 -1
- package/static/chunk-ZPF2DSQV.js +0 -1
- package/static/chunk-ZTCRGJ6Y.js +0 -7
- package/static/main-VOL6OMJ5.js +0 -9
- package/static/scripts-WRDOQIU5.js +0 -24
- package/static/styles-2C2UNCNB.css +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../backend/src/applications/spaces/services/spaces-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, Logger } from '@nestjs/common'\nimport { and, countDistinct, eq, isNotNull, isNull, max, SelectedFields, SQL, sql } from 'drizzle-orm'\nimport { alias, union } from 'drizzle-orm/mysql-core'\nimport { MySql2PreparedQuery, MySqlQueryResult } from 'drizzle-orm/mysql2'\nimport { ACTION } from '../../../common/constants'\nimport { popFromObject } 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 { DBSchema } from '../../../infrastructure/database/interfaces/database.interface'\nimport {\n concatDistinctObjectsInArray,\n convertToSelect,\n convertToWhere,\n dateTimeUTC,\n dbCheckAffectedRows,\n dbGetInsertedId\n} from '../../../infrastructure/database/utils'\nimport { fileHasCommentsSubquerySQL } from '../../comments/schemas/comments.schema'\nimport { FileDBProps } from '../../files/interfaces/file-db-props.interface'\nimport { FileProps } from '../../files/interfaces/file-props.interface'\nimport { filePathSQL, files } from '../../files/schemas/files.schema'\nimport { FilesQueries } from '../../files/services/files-queries.service'\nimport { links } from '../../links/schemas/links.schema'\nimport { shares } from '../../shares/schemas/shares.schema'\nimport { syncClients } from '../../sync/schemas/sync-clients.schema'\nimport { syncPaths } from '../../sync/schemas/sync-paths.schema'\nimport { GROUP_TYPE } from '../../users/constants/group'\nimport { MEMBER_TYPE } from '../../users/constants/member'\nimport { USER_ROLE } from '../../users/constants/user'\nimport { Member } from '../../users/interfaces/member.interface'\nimport { groups } from '../../users/schemas/groups.schema'\nimport { usersGroups } from '../../users/schemas/users-groups.schema'\nimport { userFullNameSQL, users } from '../../users/schemas/users.schema'\nimport { SPACE_ROLE } from '../constants/spaces'\nimport { SpaceMemberDto } from '../dto/create-or-update-space.dto'\nimport { SpaceEnv } from '../models/space-env.model'\nimport { SpaceProps } from '../models/space-props.model'\nimport { SpaceRootProps } from '../models/space-root-props.model'\nimport { SpaceMembers } from '../schemas/space-members.interface'\nimport { SpaceRoot } from '../schemas/space-root.interface'\nimport { Space } from '../schemas/space.interface'\nimport { spacesMembers } from '../schemas/spaces-members.schema'\nimport { spacesRoots } from '../schemas/spaces-roots.schema'\nimport { spaceGroupConcatPermissions, spaces } from '../schemas/spaces.schema'\n\n@Injectable()\nexport class SpacesQueries {\n private readonly logger = new Logger(SpacesQueries.name)\n private spacePermissionsQuery: MySql2PreparedQuery<any> = null\n private spaceAndRootPermissionsQuery: MySql2PreparedQuery<any> = null\n private spacesWithDetailsQuery: MySql2PreparedQuery<any> = null\n private spacesQuery: MySql2PreparedQuery<any> = null\n private spaceIdsQuery: MySql2PreparedQuery<any> = null\n private spaceQuery: MySql2PreparedQuery<any> = null\n private spacesWithPermissionsQuery: MySql2PreparedQuery<any> = null\n private spaceFromIdWithPermissionsQuery: MySql2PreparedQuery<any> = null\n private spaceRootFilesQuery: MySql2PreparedQuery<any> = null\n\n constructor(\n @Inject(DB_TOKEN_PROVIDER) private readonly db: DBSchema,\n public readonly cache: Cache,\n private readonly filesQueries: FilesQueries\n ) {}\n\n spaceExistsForAlias(alias: string): any | undefined {\n return this.db.query.spaces.findFirst({ columns: { id: true }, where: eq(spaces.alias, alias) })\n }\n\n spaceRootExistsForAlias(spaceId: number, rootAlias: string): any | undefined {\n return this.db.query.spacesRoots.findFirst({\n columns: { id: true },\n where: and(eq(spacesRoots.spaceId, spaceId), eq(spacesRoots.alias, rootAlias))\n })\n }\n\n selectSpaces(fields: Partial<keyof Space>[] = ['id', 'alias', 'name'], where: SQL[]): Promise<Partial<Space>[]> {\n const select: Record<keyof Space, any> = convertToSelect(spaces, fields)\n return this.db\n .select(select)\n .from(spaces)\n .where(and(...where))\n }\n\n spacesQuotaPaths(spaceId?: number): Promise<(Partial<Space> & { externalPaths: string[] })[]> {\n return this.db\n .select({\n id: spaces.id,\n alias: spaces.alias,\n storageUsage: spaces.storageUsage,\n storageQuota: spaces.storageQuota,\n externalPaths: sql<string[]>`JSON_ARRAYAGG(${spacesRoots.externalPath})`.mapWith(JSON.parse).as('externalPaths')\n })\n .from(spaces)\n .leftJoin(spacesRoots, and(eq(spacesRoots.spaceId, spaces.id), isNotNull(spacesRoots.externalPath)))\n .where(and(...[...(spaceId ? [eq(spaces.id, spaceId)] : [])]))\n .groupBy(spaces.id)\n }\n\n async userIsSpaceManager(userId: number, spaceId: number, shareId?: number): Promise<boolean> {\n /* Check if user is a space manager */\n const q = this.db\n .select({\n userId: spacesMembers.userId,\n spaceId: spacesMembers.spaceId,\n ...(shareId && { shareId: shares.id })\n })\n .from(spacesMembers)\n if (shareId) {\n q.innerJoin(shares, and(eq(shares.id, shareId), eq(shares.spaceId, spaceId)))\n }\n const [r] = await q\n .where(and(eq(spacesMembers.spaceId, spaceId), eq(spacesMembers.userId, userId), eq(spacesMembers.role, SPACE_ROLE.IS_MANAGER)))\n .limit(1)\n return r && r.userId === userId && r.spaceId === spaceId && (shareId ? r.shareId === shareId : true)\n }\n\n async getSpaceAsManager(userId: number, spaceId: number): Promise<SpaceProps> {\n /* User must be the manager of the space */\n // todo: make a condition if current user is an admin\n if (!this.spaceQuery) {\n const otherMembers: any = alias(spacesMembers, 'otherMembers')\n const rootOwner: any = alias(users, 'rootOwner')\n // fileOwner: avoid providing file path information for roots not owned by the current user\n const fileOwner: any = alias(files, 'fileOwner')\n const linkUsers: any = alias(users, 'linkUsers')\n this.spaceQuery = this.db\n .select({\n id: spaces.id,\n name: spaces.name,\n alias: spaces.alias,\n description: spaces.description,\n enabled: spaces.enabled,\n storageUsage: spaces.storageUsage,\n storageQuota: spaces.storageQuota,\n storageIndexing: spaces.storageIndexing,\n createdAt: spaces.createdAt,\n modifiedAt: spaces.modifiedAt,\n disabledAt: spaces.disabledAt,\n roots: concatDistinctObjectsInArray(spacesRoots.id, {\n id: spacesRoots.id,\n name: spacesRoots.name,\n alias: spacesRoots.alias,\n externalPath: spacesRoots.externalPath,\n permissions: spacesRoots.permissions,\n createdAt: dateTimeUTC(spacesRoots.createdAt),\n owner: { id: rootOwner.id, login: rootOwner.login, fullName: userFullNameSQL(rootOwner), email: rootOwner.email },\n // fileOwner: (hide if not owner), files: allow fields\n file: { id: fileOwner.id, path: filePathSQL(fileOwner), mime: files.mime }\n }),\n users: concatDistinctObjectsInArray(users.id, {\n id: users.id,\n login: users.login,\n name: userFullNameSQL(users),\n type: sql`IF (${users.role} = ${USER_ROLE.GUEST}, ${MEMBER_TYPE.GUEST}, ${MEMBER_TYPE.USER})`,\n spaceRole: otherMembers.role,\n description: users.email,\n permissions: otherMembers.permissions,\n createdAt: dateTimeUTC(otherMembers.createdAt)\n }),\n groups: concatDistinctObjectsInArray(groups.id, {\n id: groups.id,\n name: groups.name,\n type: sql`IF (${groups.type} = ${GROUP_TYPE.PERSONAL}, ${MEMBER_TYPE.PGROUP}, ${MEMBER_TYPE.GROUP})`,\n spaceRole: sql`${SPACE_ROLE.IS_MEMBER}`,\n description: groups.description,\n permissions: otherMembers.permissions,\n createdAt: dateTimeUTC(otherMembers.createdAt)\n }),\n links: concatDistinctObjectsInArray(linkUsers.id, {\n id: linkUsers.id,\n linkId: links.id,\n name: links.name,\n type: sql.raw(`'${MEMBER_TYPE.USER}'`),\n spaceRole: sql`${SPACE_ROLE.IS_MEMBER}`,\n description: links.email,\n permissions: otherMembers.permissions,\n createdAt: dateTimeUTC(otherMembers.createdAt)\n })\n } satisfies SpaceProps | SelectedFields<any, any>)\n .from(spacesMembers)\n .innerJoin(\n spaces,\n and(\n eq(spaces.id, spacesMembers.spaceId),\n eq(spacesMembers.spaceId, sql.placeholder('spaceId')),\n eq(spacesMembers.userId, sql.placeholder('userId')),\n eq(spacesMembers.role, SPACE_ROLE.IS_MANAGER)\n )\n )\n .innerJoin(otherMembers, eq(otherMembers.spaceId, spaces.id))\n .leftJoin(users, and(isNull(otherMembers.linkId), eq(otherMembers.userId, users.id)))\n .leftJoin(linkUsers, and(isNotNull(otherMembers.linkId), eq(linkUsers.id, otherMembers.userId)))\n .leftJoin(links, and(eq(links.userId, linkUsers.id), eq(links.id, otherMembers.linkId)))\n .leftJoin(groups, eq(otherMembers.groupId, groups.id))\n .leftJoin(spacesRoots, eq(spacesRoots.spaceId, spaces.id))\n .leftJoin(files, eq(spacesRoots.fileId, files.id))\n .leftJoin(rootOwner, eq(rootOwner.id, files.ownerId))\n .leftJoin(fileOwner, and(eq(fileOwner.id, files.id), eq(fileOwner.ownerId, sql.placeholder('userId'))))\n .groupBy(spaces.id)\n .limit(1)\n .prepare()\n }\n const [space] = await this.spaceQuery.execute({ userId, spaceId })\n if (!space) {\n return null\n }\n // merge members\n space.members = [...popFromObject('users', space), ...popFromObject('groups', space), ...popFromObject('links', space)]\n return new SpaceProps(space, userId)\n }\n\n async createSpace(space: SpaceProps): Promise<number> {\n return dbGetInsertedId(await this.db.insert(spaces).values(space))\n }\n\n async deleteSpace(spaceId: number, deleteNow = false): Promise<boolean> {\n let r: MySqlQueryResult\n if (deleteNow) {\n r = await this.db.delete(spaces).where(eq(spaces.id, spaceId))\n } else {\n r = await this.db\n .update(spaces)\n .set({ enabled: false, disabledAt: new Date() } as Space)\n .where(eq(spaces.id, spaceId))\n }\n return dbCheckAffectedRows(r, 1)\n }\n\n async updateSpace(id: number, set: Partial<Record<keyof Space, any>>): Promise<boolean> {\n try {\n dbCheckAffectedRows(await this.db.update(spaces).set(set).where(eq(spaces.id, id)), 1)\n this.logger.debug(`${this.updateSpace.name} - space (${id}) was updated : ${JSON.stringify(set)}`)\n return true\n } catch (e) {\n this.logger.error(`${this.updateSpace.name} - space (${id}) was not updated : ${JSON.stringify(set)} : ${e}`)\n return false\n }\n }\n\n async spaceRootFiles(\n userId: number,\n spaceId: number,\n options: {\n withShares?: boolean\n withHasComments?: boolean\n withSyncs?: boolean\n }\n ): Promise<FileProps[]> {\n if (!this.spaceRootFilesQuery) {\n const select: FileProps | SelectedFields<any, any> = {\n id: files.id,\n path: filePathSQL(files),\n isDir: files.isDir,\n inTrash: files.inTrash,\n size: files.size,\n ctime: files.ctime,\n mtime: files.mtime,\n mime: files.mime,\n root: {\n id: spacesRoots.id,\n alias: spacesRoots.alias,\n name: spacesRoots.name,\n externalPath: spacesRoots.externalPath,\n permissions: spacesRoots.permissions,\n owner: { login: users.login, email: users.email, fullName: userFullNameSQL(users) }\n },\n shares: sql`IF (${sql.placeholder('withShares')}, ${concatDistinctObjectsInArray(shares.id, {\n id: shares.id,\n alias: shares.alias,\n name: shares.name,\n type: shares.type\n })}, '[]')`.mapWith(JSON.parse),\n syncs: sql`IF (${sql.placeholder('withSyncs')}, ${concatDistinctObjectsInArray(syncPaths.id, {\n id: syncPaths.id,\n clientId: syncClients.id,\n clientName: sql`JSON_VALUE(${syncClients.info}, '$.node')`\n })}, '[]')`.mapWith(JSON.parse),\n hasComments: sql<boolean>`IF (${sql.placeholder('withHasComments')}, ${fileHasCommentsSubquerySQL(files.id)}, 0)`.mapWith(Boolean)\n }\n this.spaceRootFilesQuery = this.db\n .select(select)\n .from(spacesRoots)\n .leftJoin(files, eq(files.id, spacesRoots.fileId))\n .leftJoin(users, eq(users.id, files.ownerId))\n .leftJoin(\n shares,\n and(\n eq(sql.placeholder('withShares'), sql.raw('1')),\n eq(shares.ownerId, sql.placeholder('userId')),\n isNull(shares.fileId),\n isNull(shares.parentId),\n eq(shares.spaceRootId, spacesRoots.id)\n )\n )\n .leftJoin(syncClients, and(eq(sql.placeholder('withSyncs'), sql.raw('1')), eq(syncClients.ownerId, sql.placeholder('userId'))))\n .leftJoin(\n syncPaths,\n and(\n eq(sql.placeholder('withSyncs'), sql.raw('1')),\n eq(syncPaths.clientId, syncClients.id),\n eq(syncPaths.spaceId, sql.placeholder('spaceId')),\n eq(syncPaths.spaceRootId, spacesRoots.id),\n isNull(syncPaths.fileId)\n )\n )\n .where(eq(spacesRoots.spaceId, sql.placeholder('spaceId')))\n .groupBy(files.id, spacesRoots.id)\n .prepare()\n }\n return this.spaceRootFilesQuery.execute({\n userId,\n spaceId,\n withHasComments: +!!options.withHasComments,\n withShares: +!!options.withShares,\n withSyncs: +!!options.withSyncs\n })\n }\n\n async getSpaceRoots(spaceId: number, userId?: number): Promise<SpaceRootProps[]> {\n const where: SQL<any>[] = [eq(spacesRoots.spaceId, spaceId)]\n if (userId) {\n where.push(eq(files.ownerId, userId))\n }\n return (await this.db\n .select({\n id: spacesRoots.id,\n alias: spacesRoots.alias,\n name: spacesRoots.name,\n permissions: spacesRoots.permissions,\n createdAt: spacesRoots.createdAt,\n ...(!userId && { owner: { id: files.ownerId } }),\n file: {\n id: files.id,\n path: filePathSQL(files),\n mime: files.mime\n }\n })\n .from(spacesRoots)\n .leftJoin(files, eq(files.id, spacesRoots.fileId))\n .where(and(...where))) as SpaceRootProps[]\n }\n\n async getSpaceMemberIds(spaceId: number): Promise<{ groupIds: number[]; userIds: number[] }> {\n const members = { userIds: [], groupIds: [] }\n for (const m of await this.db\n .select({\n userId: spacesMembers.userId,\n groupId: spacesMembers.groupId\n })\n .from(spacesMembers)\n .where(eq(spacesMembers.spaceId, spaceId))) {\n if (m.userId) {\n members.userIds.push(m.userId)\n } else {\n members.groupIds.push(m.groupId)\n }\n }\n return members\n }\n\n async updateMembers(\n spaceId: number,\n add: SpaceMemberDto[],\n update: Record<string | 'object', Partial<SpaceMembers> | SpaceMemberDto>[],\n remove: SpaceMemberDto[]\n ): Promise<Record<Exclude<ACTION, ACTION.DELETE_PERMANENTLY>, { userIds: number[]; groupIds: number[] }>> {\n // store status\n const status: Record<Exclude<ACTION, ACTION.DELETE_PERMANENTLY>, { userIds: number[]; groupIds: number[] }> = {\n [ACTION.ADD]: { userIds: [], groupIds: [] },\n [ACTION.UPDATE]: { userIds: [], groupIds: [] },\n [ACTION.DELETE]: { userIds: [], groupIds: [] }\n }\n // add\n for (const m of add) {\n try {\n dbCheckAffectedRows(\n await this.db.insert(spacesMembers).values({\n spaceId: spaceId,\n ...(m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST ? { userId: m.id } : { groupId: m.id }),\n role: m.spaceRole,\n permissions: m.permissions\n } as SpaceMembers),\n 1\n )\n status[ACTION.ADD][`${m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST ? 'userIds' : 'groupIds'}`].push(m.id)\n this.logger.debug(`${this.updateMembers.name} - ${m.type} (${m.id}) added to the space (${spaceId})`)\n } catch (e) {\n this.logger.error(`${this.updateMembers.name} - ${m.type} (${m.id}) was not added to the space ${spaceId} -> : ${e}`)\n }\n }\n // update\n for (const props of update) {\n const m: SpaceMemberDto = popFromObject('object', props)\n const spaceRole = popFromObject('spaceRole', props)\n if (Number.isInteger(spaceRole)) {\n props.role = spaceRole\n }\n try {\n dbCheckAffectedRows(\n await this.db\n .update(spacesMembers)\n .set(props)\n .where(\n and(\n eq(spacesMembers.spaceId, spaceId),\n eq(m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST ? spacesMembers.userId : spacesMembers.groupId, m.id)\n )\n )\n .limit(1),\n 1\n )\n status[ACTION.UPDATE][`${m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST ? 'userIds' : 'groupIds'}`].push(m.id)\n this.logger.debug(`${this.updateMembers.name} - ${m.type} (${m.id}) was updated on space (${spaceId}) : ${JSON.stringify(props)}`)\n } catch (e) {\n this.logger.error(`${this.updateMembers.name} - ${m.type} (${m.id}) was not updated on space (${spaceId}) : ${JSON.stringify(props)} : ${e}`)\n }\n }\n // remove\n for (const m of remove) {\n try {\n dbCheckAffectedRows(\n await this.db\n .delete(spacesMembers)\n .where(\n and(\n eq(spacesMembers.spaceId, spaceId),\n eq(m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST ? spacesMembers.userId : spacesMembers.groupId, m.id)\n )\n ),\n 1\n )\n status[ACTION.DELETE][`${m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST ? 'userIds' : 'groupIds'}`].push(m.id)\n this.logger.debug(`${this.updateMembers.name} - ${m.type} (${m.id}) removed from space (${spaceId})`)\n } catch (e) {\n this.logger.error(`${this.updateMembers.name} - ${m.type} (${m.id}) was not removed from space (${spaceId}) : ${e}`)\n }\n }\n return status\n }\n\n async updateSpaceRoots(\n userId: number,\n spaceId: number,\n add: SpaceRootProps[],\n update: Record<string | 'object', Partial<SpaceRootProps> | SpaceRootProps>[],\n remove: SpaceRootProps[]\n ): Promise<Record<Exclude<ACTION, ACTION.DELETE_PERMANENTLY>, SpaceRootProps[]>> {\n // store status\n const status = {} as Record<Exclude<ACTION, ACTION.DELETE_PERMANENTLY>, SpaceRootProps[]>\n // add\n for (const r of add) {\n if (await this.addRoot(userId, spaceId, r)) {\n ;(status[ACTION.ADD] ||= []).push(r)\n }\n }\n // update\n for (const props of update) {\n const r: SpaceRootProps = popFromObject('object', props)\n if (await this.updateRoot(props, { id: r.id })) {\n ;(status[ACTION.UPDATE] ||= []).push(r)\n }\n }\n // delete\n for (const r of remove) {\n if (await this.removeRoot(r.id)) {\n ;(status[ACTION.DELETE] ||= []).push(r)\n }\n }\n return status\n }\n\n @CacheDecorator()\n async spaceIds(userId: number): Promise<number[]> {\n if (!this.spaceIdsQuery) {\n const unionAlias = this.fromUserAndGroups({ id: spaces.id })\n this.spaceIdsQuery = this.db.select({ id: unionAlias.id }).from(unionAlias).groupBy(unionAlias.id).prepare()\n }\n // `userId` is used in `fromUserAndGroups` function\n return (await this.spaceIdsQuery.execute({ userId })).map((r: { id: number }) => r.id)\n }\n\n @CacheDecorator()\n async spaces(userId: number, withPermissions = false, fromId?: number): Promise<SpaceProps[]> {\n let pQuery: MySql2PreparedQuery<any>\n if (fromId) {\n pQuery = this.spaceFromIdWithPermissionsQuery\n } else if (withPermissions) {\n pQuery = this.spacesWithPermissionsQuery\n } else {\n pQuery = this.spacesQuery\n }\n if (!pQuery) {\n const selectUnion: Space | SelectedFields<any, any> = {\n id: spaces.id,\n alias: spaces.alias,\n name: spaces.name,\n description: spaces.description,\n enabled: spaces.enabled,\n createdAt: spaces.createdAt,\n modifiedAt: spaces.modifiedAt,\n ...(withPermissions && { permissions: spacesMembers.permissions, role: spacesMembers.role })\n }\n const unionAlias = this.fromUserAndGroups(selectUnion)\n const select: Space | SelectedFields<any, any> = {\n id: unionAlias.id,\n alias: unionAlias.alias,\n name: unionAlias.name,\n description: unionAlias.description,\n enabled: unionAlias.enabled,\n createdAt: unionAlias.createdAt,\n modifiedAt: unionAlias.modifiedAt,\n ...(withPermissions && {\n permissions: spaceGroupConcatPermissions(unionAlias.permissions),\n role: max(unionAlias.role)\n })\n }\n if (fromId) {\n pQuery = this.db\n .select(select)\n .from(unionAlias)\n .where(eq(unionAlias.id, sql.placeholder('fromId')))\n .limit(1)\n .prepare()\n this.spaceFromIdWithPermissionsQuery = pQuery\n } else {\n pQuery = this.db.select(select).from(unionAlias).groupBy(unionAlias.id).prepare()\n if (withPermissions) {\n this.spacesWithPermissionsQuery = pQuery\n } else {\n this.spacesQuery = pQuery\n }\n }\n }\n // SpaceProps instance is required, if the user is a space manager, he must have all permissions\n // `userId` is used in `fromUserAndGroups` function\n return (await pQuery.execute({ userId, fromId })).map((s: Partial<SpaceProps>) => new SpaceProps(s))\n }\n\n async spacesWithDetails(userId: number): Promise<SpaceProps[]> {\n if (!this.spacesWithDetailsQuery) {\n const selectUnion: Space | SelectedFields<any, any> = {\n id: spaces.id,\n alias: spaces.alias,\n name: spaces.name,\n description: spaces.description,\n enabled: spaces.enabled,\n permissions: spacesMembers.permissions,\n role: spacesMembers.role,\n createdAt: spaces.createdAt,\n modifiedAt: spaces.modifiedAt,\n disabledAt: spaces.disabledAt\n }\n const unionAlias = this.fromUserAndGroups(selectUnion)\n const managers: any = alias(users, 'managers')\n const select: Space | SelectedFields<any, any> = {\n id: unionAlias.id,\n alias: unionAlias.alias,\n name: unionAlias.name,\n description: unionAlias.description,\n enabled: unionAlias.enabled,\n permissions: spaceGroupConcatPermissions(unionAlias.permissions),\n role: max(unionAlias.role),\n modifiedAt: unionAlias.modifiedAt,\n createdAt: unionAlias.createdAt,\n disabledAt: unionAlias.disabledAt,\n members: concatDistinctObjectsInArray(managers.id, {\n id: managers.id,\n login: managers.login,\n name: userFullNameSQL(managers),\n description: managers.email,\n type: sql.raw(`'${MEMBER_TYPE.USER}'`),\n spaceRole: spacesMembers.role,\n permissions: sql<string>`''`,\n createdAt: dateTimeUTC(spacesMembers.createdAt)\n } satisfies Record<keyof Pick<Member, 'id' | 'name' | 'login' | 'description' | 'type' | 'permissions' | 'spaceRole' | 'createdAt'>, any>),\n counts: {\n users: sql`COUNT(DISTINCT(CASE WHEN ${spacesMembers.userId} IS NOT NULL AND ${spacesMembers.linkId} IS NULL THEN ${spacesMembers.userId} END))`,\n groups: countDistinct(spacesMembers.groupId),\n links: sql`COUNT(DISTINCT(CASE WHEN ${spacesMembers.linkId} IS NOT NULL THEN ${spacesMembers.linkId} END))`,\n roots: countDistinct(files.id),\n shares: sql`COUNT(DISTINCT(CASE WHEN ${shares.id} IS NOT NULL THEN ${shares.id} END))`\n }\n }\n this.spacesWithDetailsQuery = this.db\n .select(select)\n .from(unionAlias)\n .leftJoin(spacesMembers, eq(spacesMembers.spaceId, unionAlias.id))\n .leftJoin(users, eq(users.id, spacesMembers.userId))\n .leftJoin(groups, eq(groups.id, spacesMembers.groupId))\n .leftJoin(managers, and(eq(spacesMembers.userId, managers.id), eq(spacesMembers.role, SPACE_ROLE.IS_MANAGER)))\n .leftJoin(spacesRoots, eq(spacesRoots.spaceId, unionAlias.id))\n .leftJoin(files, and(eq(files.id, spacesRoots.fileId), eq(files.ownerId, sql.placeholder('userId'))))\n .leftJoin(shares, and(eq(unionAlias.role, 1), eq(shares.spaceId, unionAlias.id), isNotNull(shares.spaceId)))\n .groupBy(unionAlias.id)\n .prepare()\n }\n const r: MySqlQueryResult = await this.spacesWithDetailsQuery.execute({ userId })\n return r.length ? r.map((s: Partial<SpaceProps>) => new SpaceProps(s)) : []\n }\n\n @CacheDecorator()\n async permissions(userId: number, spaceAlias: string, rootAlias: string): Promise<Partial<SpaceEnv>> {\n if (rootAlias) {\n return await this.spaceAndRootPermissions(userId, spaceAlias, rootAlias)\n }\n return await this.spacePermissions(userId, spaceAlias)\n }\n\n async addRoot(userId: number, spaceId: number, root: SpaceRootProps): Promise<boolean> {\n const r: Partial<SpaceRoot> = { name: root.name, alias: root.alias, permissions: root.permissions, spaceId: spaceId }\n if (root.externalPath) {\n r.externalPath = root.externalPath\n } else {\n r.fileId = await this.getOrCreateUserFile(userId, root.file)\n }\n try {\n dbCheckAffectedRows(await this.db.insert(spacesRoots).values(r as SpaceRoot), 1)\n this.logger.debug(`${this.addRoot.name} - *${root.alias}* (${root.id}) added`)\n return true\n } catch (e) {\n this.logger.error(`${this.addRoot.name} - *${root.alias}* (${root.id}) was not added : ${JSON.stringify(root)} : ${e}`)\n return false\n }\n }\n\n async updateRoot(set: Partial<Record<keyof SpaceRoot, any>>, filters: Partial<Record<keyof SpaceRoot, any>>): Promise<boolean> {\n const where: SQL[] = convertToWhere(spacesRoots, filters)\n try {\n dbCheckAffectedRows(\n await this.db\n .update(spacesRoots)\n .set(set)\n .where(and(...where))\n .limit(1),\n 1\n )\n this.logger.debug(`${this.updateRoot.name} - ${JSON.stringify(filters)} was updated : ${JSON.stringify(set)}`)\n return true\n } catch (e) {\n this.logger.error(`${this.updateRoot.name} - ${JSON.stringify(filters)} was not updated : ${JSON.stringify(set)} : ${e}`)\n return false\n }\n }\n\n async getOrCreateUserFile(userId: number, file: FileProps): Promise<number> {\n return this.filesQueries.getOrCreateUserFile(userId, file)\n }\n\n async getOrCreateSpaceFile(fileId: number, file: FileProps, dbFile: FileDBProps): Promise<number> {\n return this.filesQueries.getOrCreateSpaceFile(fileId, file, dbFile)\n }\n\n async clearCachePermissions(spaceAlias: string, rootAliases?: string[], userIds?: number[]) {\n const uIds = userIds ?? ['*']\n for (const uid of uIds) {\n const basePattern = [this.constructor.name, this.permissions.name, uid, spaceAlias]\n const patterns: string[] = []\n if (rootAliases?.length) {\n // clear cache on space root\n rootAliases.forEach((rAlias: string) => patterns.push(this.cache.genSlugKey(...basePattern, rAlias)))\n } else {\n // clear cache on spaces list\n patterns.push(this.cache.genSlugKey(...[this.constructor.name, this.spaces.name, uid, '*']))\n // clear cache on spaces and roots\n patterns.push(this.cache.genSlugKey(...basePattern), this.cache.genSlugKey(...basePattern, '*'))\n }\n for (const p of patterns) {\n const keys = await this.cache.keys(p)\n if (keys.length) {\n this.logger.verbose(`${this.clearCachePermissions.name} - ${JSON.stringify(keys)}`)\n this.cache.mdel(keys).catch((e: Error) => this.logger.error(`${this.clearCachePermissions.name} - ${e}`))\n }\n }\n }\n }\n\n private async removeRoot(id: number): Promise<boolean> {\n try {\n dbCheckAffectedRows(await this.db.delete(spacesRoots).where(eq(spacesRoots.id, id)), 1)\n this.logger.debug(`${this.removeRoot.name} - root (${id}) removed`)\n return true\n } catch (e) {\n this.logger.error(`${this.removeRoot.name} - root (${id}) was not deleted : ${e}`)\n return false\n }\n }\n\n private async spacePermissions(userId: number, spaceAlias: string): Promise<Partial<SpaceEnv>> {\n if (!this.spacePermissionsQuery) {\n const selectUnion: SpaceEnv | SelectedFields<any, any> = {\n id: spaces.id,\n alias: spaces.alias,\n name: spaces.name,\n enabled: spaces.enabled,\n permissions: spacesMembers.permissions,\n role: spacesMembers.role\n }\n const filters: SQL[] = [eq(spaces.alias, sql.placeholder('spaceAlias'))]\n const unionAlias = this.fromUserAndGroups(selectUnion, filters)\n const select: SpaceEnv | SelectedFields<any, any> = {\n id: unionAlias.id,\n alias: unionAlias.alias,\n name: unionAlias.name,\n enabled: unionAlias.enabled,\n permissions: spaceGroupConcatPermissions(unionAlias.permissions),\n role: max(unionAlias.role)\n }\n this.spacePermissionsQuery = this.db.select(select).from(unionAlias).groupBy(unionAlias.id).limit(1).prepare()\n }\n // `userId` is used in `fromUserAndGroups` function\n const r: MySqlQueryResult = await this.spacePermissionsQuery.execute({ userId, spaceAlias })\n return r.length ? r.at(0) : null\n }\n\n private async spaceAndRootPermissions(userId: number, spaceAlias: string, rootAlias: string): Promise<Partial<SpaceEnv>> {\n if (!this.spaceAndRootPermissionsQuery) {\n const selectUnion: SpaceEnv | SelectedFields<any, any> = {\n id: spaces.id,\n alias: spaces.alias,\n name: spaces.name,\n enabled: spaces.enabled,\n permissions: spacesMembers.permissions,\n role: spacesMembers.role,\n rootId: sql`${spacesRoots.id}`.as('rootId'),\n rootAlias: sql`${spacesRoots.alias}`.as('rootAlias'),\n rootName: sql`${spacesRoots.name}`.as('rootName'),\n rootPermissions: sql`${spacesRoots.permissions}`.as('rootPermissions'),\n rootOwnerId: files.ownerId,\n rootOwnerLogin: users.login,\n rootFileId: sql`${files.id}`.as('rootFileId'),\n rootFilePath: filePathSQL(files).as('rootFilePath'),\n rootFileInTrash: files.inTrash,\n rootExternalPath: spacesRoots.externalPath\n }\n const filters: SQL[] = [eq(spaces.alias, sql.placeholder('spaceAlias'))]\n const fromUser = this.fromUserQuery(selectUnion, filters).$dynamic()\n const fromGroups = this.fromGroupsQuery(selectUnion, filters).$dynamic()\n for (const q of [fromUser, fromGroups]) {\n q.leftJoin(spacesRoots, and(eq(spacesRoots.spaceId, spacesMembers.spaceId), eq(spacesRoots.alias, sql.placeholder('rootAlias'))))\n .leftJoin(files, eq(files.id, spacesRoots.fileId))\n .leftJoin(users, eq(users.id, files.ownerId))\n }\n const unionAlias = union(fromUser, fromGroups).as('union_alias')\n const select: SpaceEnv | SelectedFields<any, any> = {\n id: unionAlias.id,\n alias: unionAlias.alias,\n name: unionAlias.name,\n enabled: unionAlias.enabled,\n permissions: spaceGroupConcatPermissions(unionAlias.permissions),\n role: sql<SPACE_ROLE>`MAX(${unionAlias.role})`,\n root: {\n id: unionAlias.rootId,\n alias: unionAlias.rootAlias,\n name: unionAlias.rootName,\n permissions: unionAlias.rootPermissions,\n owner: { id: unionAlias.rootOwnerId, login: unionAlias.rootOwnerLogin },\n file: { id: unionAlias.rootFileId, path: unionAlias.rootFilePath, inTrash: unionAlias.rootFileInTrash },\n externalPath: unionAlias.rootExternalPath\n }\n }\n this.spaceAndRootPermissionsQuery = this.db.select(select).from(unionAlias).groupBy(unionAlias.id).limit(1).prepare()\n }\n // `userId` is used in `fromUserQuery` and `fromGroupsQuery` function\n const r: MySqlQueryResult = await this.spaceAndRootPermissionsQuery.execute({ userId, spaceAlias, rootAlias })\n return r.length ? r.at(0) : null\n }\n\n private fromUserAndGroups(select: SelectedFields<any, any>, filters: SQL[] = []) {\n return union(this.fromUserQuery(select, filters), this.fromGroupsQuery(select, filters)).as('union_alias')\n }\n\n private fromUserQuery(select: SelectedFields<any, any>, filters: SQL[] = []) {\n const where = [eq(spacesMembers.userId, sql.placeholder('userId')), ...filters]\n return this.db\n .select(select)\n .from(spacesMembers)\n .innerJoin(spaces, eq(spacesMembers.spaceId, spaces.id))\n .where(and(...where))\n }\n\n private fromGroupsQuery(select: SelectedFields<any, any>, filters: SQL[] = []) {\n const where = [eq(spacesMembers.groupId, usersGroups.groupId), ...filters]\n return this.db\n .select(select)\n .from(spacesMembers)\n .innerJoin(usersGroups, eq(usersGroups.userId, sql.placeholder('userId')))\n .innerJoin(spaces, eq(spacesMembers.spaceId, spaces.id))\n .where(and(...where))\n }\n}\n"],"names":["SpacesQueries","spaceExistsForAlias","alias","db","query","spaces","findFirst","columns","id","where","eq","spaceRootExistsForAlias","spaceId","rootAlias","spacesRoots","and","selectSpaces","fields","select","convertToSelect","from","spacesQuotaPaths","storageUsage","storageQuota","externalPaths","sql","externalPath","mapWith","JSON","parse","as","leftJoin","isNotNull","groupBy","userIsSpaceManager","userId","shareId","q","spacesMembers","shares","innerJoin","r","role","SPACE_ROLE","IS_MANAGER","limit","getSpaceAsManager","spaceQuery","otherMembers","rootOwner","users","fileOwner","files","linkUsers","name","description","enabled","storageIndexing","createdAt","modifiedAt","disabledAt","roots","concatDistinctObjectsInArray","permissions","dateTimeUTC","owner","login","fullName","userFullNameSQL","email","file","path","filePathSQL","mime","type","USER_ROLE","GUEST","MEMBER_TYPE","USER","spaceRole","groups","GROUP_TYPE","PERSONAL","PGROUP","GROUP","IS_MEMBER","links","linkId","raw","placeholder","isNull","groupId","fileId","ownerId","prepare","space","execute","members","popFromObject","SpaceProps","createSpace","dbGetInsertedId","insert","values","deleteSpace","deleteNow","delete","update","set","Date","dbCheckAffectedRows","updateSpace","logger","debug","stringify","e","error","spaceRootFiles","options","spaceRootFilesQuery","isDir","inTrash","size","ctime","mtime","root","syncs","syncPaths","clientId","syncClients","clientName","info","hasComments","fileHasCommentsSubquerySQL","Boolean","parentId","spaceRootId","withHasComments","withShares","withSyncs","getSpaceRoots","push","getSpaceMemberIds","userIds","groupIds","m","updateMembers","add","remove","status","ACTION","ADD","UPDATE","DELETE","props","Number","isInteger","updateSpaceRoots","addRoot","updateRoot","removeRoot","spaceIds","spaceIdsQuery","unionAlias","fromUserAndGroups","map","withPermissions","fromId","pQuery","spaceFromIdWithPermissionsQuery","spacesWithPermissionsQuery","spacesQuery","selectUnion","spaceGroupConcatPermissions","max","s","spacesWithDetails","spacesWithDetailsQuery","managers","counts","countDistinct","length","spaceAlias","spaceAndRootPermissions","spacePermissions","getOrCreateUserFile","filters","convertToWhere","filesQueries","getOrCreateSpaceFile","dbFile","clearCachePermissions","rootAliases","uIds","uid","basePattern","patterns","forEach","rAlias","cache","genSlugKey","p","keys","verbose","mdel","catch","spacePermissionsQuery","at","spaceAndRootPermissionsQuery","rootId","rootName","rootPermissions","rootOwnerId","rootOwnerLogin","rootFileId","rootFilePath","rootFileInTrash","rootExternalPath","fromUser","fromUserQuery","$dynamic","fromGroups","fromGroupsQuery","union","usersGroups","Logger"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/spaces/services/spaces-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, Logger } from '@nestjs/common'\nimport { and, countDistinct, eq, isNotNull, isNull, max, SelectedFields, SQL, sql } from 'drizzle-orm'\nimport { alias, union } from 'drizzle-orm/mysql-core'\nimport { MySql2PreparedQuery, MySqlQueryResult } from 'drizzle-orm/mysql2'\nimport { ACTION } from '../../../common/constants'\nimport { popFromObject } 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 { DBSchema } from '../../../infrastructure/database/interfaces/database.interface'\nimport {\n concatDistinctObjectsInArray,\n convertToSelect,\n convertToWhere,\n dateTimeUTC,\n dbCheckAffectedRows,\n dbGetInsertedId\n} from '../../../infrastructure/database/utils'\nimport { fileHasCommentsSubquerySQL } from '../../comments/schemas/comments.schema'\nimport { FileDBProps } from '../../files/interfaces/file-db-props.interface'\nimport { FileProps } from '../../files/interfaces/file-props.interface'\nimport { File } from '../../files/schemas/file.interface'\nimport { filePathSQL, files } from '../../files/schemas/files.schema'\nimport { FilesQueries } from '../../files/services/files-queries.service'\nimport { links } from '../../links/schemas/links.schema'\nimport { shares } from '../../shares/schemas/shares.schema'\nimport { syncClients } from '../../sync/schemas/sync-clients.schema'\nimport { syncPaths } from '../../sync/schemas/sync-paths.schema'\nimport { GROUP_TYPE } from '../../users/constants/group'\nimport { MEMBER_TYPE } from '../../users/constants/member'\nimport { USER_ROLE } from '../../users/constants/user'\nimport { Member } from '../../users/interfaces/member.interface'\nimport { groups } from '../../users/schemas/groups.schema'\nimport { usersGroups } from '../../users/schemas/users-groups.schema'\nimport { userFullNameSQL, users } from '../../users/schemas/users.schema'\nimport { SPACE_ROLE } from '../constants/spaces'\nimport { SpaceMemberDto } from '../dto/create-or-update-space.dto'\nimport { SpaceEnv } from '../models/space-env.model'\nimport { SpaceProps } from '../models/space-props.model'\nimport { SpaceRootProps } from '../models/space-root-props.model'\nimport { SpaceMembers } from '../schemas/space-members.interface'\nimport { SpaceRoot } from '../schemas/space-root.interface'\nimport { Space } from '../schemas/space.interface'\nimport { spacesMembers } from '../schemas/spaces-members.schema'\nimport { spacesRoots } from '../schemas/spaces-roots.schema'\nimport { spaceGroupConcatPermissions, spaces } from '../schemas/spaces.schema'\n\n@Injectable()\nexport class SpacesQueries {\n private readonly logger = new Logger(SpacesQueries.name)\n private spacePermissionsQuery: MySql2PreparedQuery<any> = null\n private spaceAndRootPermissionsQuery: MySql2PreparedQuery<any> = null\n private spacesWithDetailsQuery: MySql2PreparedQuery<any> = null\n private spacesQuery: MySql2PreparedQuery<any> = null\n private spaceIdsQuery: MySql2PreparedQuery<any> = null\n private spaceQuery: MySql2PreparedQuery<any> = null\n private spacesWithPermissionsQuery: MySql2PreparedQuery<any> = null\n private spaceFromIdWithPermissionsQuery: MySql2PreparedQuery<any> = null\n private spaceRootFilesQuery: MySql2PreparedQuery<any> = null\n\n constructor(\n @Inject(DB_TOKEN_PROVIDER) private readonly db: DBSchema,\n public readonly cache: Cache,\n private readonly filesQueries: FilesQueries\n ) {}\n\n spaceExistsForAlias(alias: string): any | undefined {\n return this.db.query.spaces.findFirst({ columns: { id: true }, where: eq(spaces.alias, alias) })\n }\n\n spaceRootExistsForAlias(spaceId: number, rootAlias: string): any | undefined {\n return this.db.query.spacesRoots.findFirst({\n columns: { id: true },\n where: and(eq(spacesRoots.spaceId, spaceId), eq(spacesRoots.alias, rootAlias))\n })\n }\n\n selectSpaces(fields: Partial<keyof Space>[] = ['id', 'alias', 'name'], where: SQL[]): Promise<Partial<Space>[]> {\n const select: Record<keyof Space, any> = convertToSelect(spaces, fields)\n return this.db\n .select(select)\n .from(spaces)\n .where(and(...where))\n }\n\n spacesQuotaPaths(spaceId?: number): Promise<(Partial<Space> & { externalPaths: string[] })[]> {\n return this.db\n .select({\n id: spaces.id,\n alias: spaces.alias,\n storageUsage: spaces.storageUsage,\n storageQuota: spaces.storageQuota,\n externalPaths: sql<string[]>`JSON_ARRAYAGG(${spacesRoots.externalPath})`.mapWith(JSON.parse).as('externalPaths')\n })\n .from(spaces)\n .leftJoin(spacesRoots, and(eq(spacesRoots.spaceId, spaces.id), isNotNull(spacesRoots.externalPath)))\n .where(and(...[...(spaceId ? [eq(spaces.id, spaceId)] : [])]))\n .groupBy(spaces.id)\n }\n\n async userIsSpaceManager(userId: number, spaceId: number, shareId?: number): Promise<boolean> {\n /* Check if user is a space manager */\n const q = this.db\n .select({\n userId: spacesMembers.userId,\n spaceId: spacesMembers.spaceId,\n ...(shareId && { shareId: shares.id })\n })\n .from(spacesMembers)\n if (shareId) {\n q.innerJoin(shares, and(eq(shares.id, shareId), eq(shares.spaceId, spaceId)))\n }\n const [r] = await q\n .where(and(eq(spacesMembers.spaceId, spaceId), eq(spacesMembers.userId, userId), eq(spacesMembers.role, SPACE_ROLE.IS_MANAGER)))\n .limit(1)\n return r && r.userId === userId && r.spaceId === spaceId && (shareId ? r.shareId === shareId : true)\n }\n\n async getSpaceAsManager(userId: number, spaceId: number): Promise<SpaceProps> {\n /* User must be the manager of the space */\n // todo: make a condition if current user is an admin\n if (!this.spaceQuery) {\n const otherMembers: any = alias(spacesMembers, 'otherMembers')\n const rootOwner: any = alias(users, 'rootOwner')\n // fileOwner: avoid providing file path information for roots not owned by the current user\n const fileOwner: any = alias(files, 'fileOwner')\n const linkUsers: any = alias(users, 'linkUsers')\n this.spaceQuery = this.db\n .select({\n id: spaces.id,\n name: spaces.name,\n alias: spaces.alias,\n description: spaces.description,\n enabled: spaces.enabled,\n storageUsage: spaces.storageUsage,\n storageQuota: spaces.storageQuota,\n storageIndexing: spaces.storageIndexing,\n createdAt: spaces.createdAt,\n modifiedAt: spaces.modifiedAt,\n disabledAt: spaces.disabledAt,\n roots: concatDistinctObjectsInArray(spacesRoots.id, {\n id: spacesRoots.id,\n name: spacesRoots.name,\n alias: spacesRoots.alias,\n externalPath: spacesRoots.externalPath,\n permissions: spacesRoots.permissions,\n createdAt: dateTimeUTC(spacesRoots.createdAt),\n owner: { id: rootOwner.id, login: rootOwner.login, fullName: userFullNameSQL(rootOwner), email: rootOwner.email },\n // fileOwner: (hide if not owner), files: allow fields\n file: { id: fileOwner.id, path: filePathSQL(fileOwner), mime: files.mime }\n }),\n users: concatDistinctObjectsInArray(users.id, {\n id: users.id,\n login: users.login,\n name: userFullNameSQL(users),\n type: sql`IF (${users.role} = ${USER_ROLE.GUEST}, ${MEMBER_TYPE.GUEST}, ${MEMBER_TYPE.USER})`,\n spaceRole: otherMembers.role,\n description: users.email,\n permissions: otherMembers.permissions,\n createdAt: dateTimeUTC(otherMembers.createdAt)\n }),\n groups: concatDistinctObjectsInArray(groups.id, {\n id: groups.id,\n name: groups.name,\n type: sql`IF (${groups.type} = ${GROUP_TYPE.PERSONAL}, ${MEMBER_TYPE.PGROUP}, ${MEMBER_TYPE.GROUP})`,\n spaceRole: sql`${SPACE_ROLE.IS_MEMBER}`,\n description: groups.description,\n permissions: otherMembers.permissions,\n createdAt: dateTimeUTC(otherMembers.createdAt)\n }),\n links: concatDistinctObjectsInArray(linkUsers.id, {\n id: linkUsers.id,\n linkId: links.id,\n name: links.name,\n type: sql.raw(`'${MEMBER_TYPE.USER}'`),\n spaceRole: sql`${SPACE_ROLE.IS_MEMBER}`,\n description: links.email,\n permissions: otherMembers.permissions,\n createdAt: dateTimeUTC(otherMembers.createdAt)\n })\n } satisfies SpaceProps | SelectedFields<any, any>)\n .from(spacesMembers)\n .innerJoin(\n spaces,\n and(\n eq(spaces.id, spacesMembers.spaceId),\n eq(spacesMembers.spaceId, sql.placeholder('spaceId')),\n eq(spacesMembers.userId, sql.placeholder('userId')),\n eq(spacesMembers.role, SPACE_ROLE.IS_MANAGER)\n )\n )\n .innerJoin(otherMembers, eq(otherMembers.spaceId, spaces.id))\n .leftJoin(users, and(isNull(otherMembers.linkId), eq(otherMembers.userId, users.id)))\n .leftJoin(linkUsers, and(isNotNull(otherMembers.linkId), eq(linkUsers.id, otherMembers.userId)))\n .leftJoin(links, and(eq(links.userId, linkUsers.id), eq(links.id, otherMembers.linkId)))\n .leftJoin(groups, eq(otherMembers.groupId, groups.id))\n .leftJoin(spacesRoots, eq(spacesRoots.spaceId, spaces.id))\n .leftJoin(files, eq(spacesRoots.fileId, files.id))\n .leftJoin(rootOwner, eq(rootOwner.id, files.ownerId))\n .leftJoin(fileOwner, and(eq(fileOwner.id, files.id), eq(fileOwner.ownerId, sql.placeholder('userId'))))\n .groupBy(spaces.id)\n .limit(1)\n .prepare()\n }\n const [space] = await this.spaceQuery.execute({ userId, spaceId })\n if (!space) {\n return null\n }\n // merge members\n space.members = [...popFromObject('users', space), ...popFromObject('groups', space), ...popFromObject('links', space)]\n return new SpaceProps(space, userId)\n }\n\n async createSpace(space: SpaceProps): Promise<number> {\n return dbGetInsertedId(await this.db.insert(spaces).values(space))\n }\n\n async deleteSpace(spaceId: number, deleteNow = false): Promise<boolean> {\n let r: MySqlQueryResult\n if (deleteNow) {\n r = await this.db.delete(spaces).where(eq(spaces.id, spaceId))\n } else {\n r = await this.db\n .update(spaces)\n .set({ enabled: false, disabledAt: new Date() } as Space)\n .where(eq(spaces.id, spaceId))\n }\n return dbCheckAffectedRows(r, 1)\n }\n\n async updateSpace(id: number, set: Partial<Record<keyof Space, any>>): Promise<boolean> {\n try {\n dbCheckAffectedRows(await this.db.update(spaces).set(set).where(eq(spaces.id, id)), 1)\n this.logger.debug(`${this.updateSpace.name} - space (${id}) was updated : ${JSON.stringify(set)}`)\n return true\n } catch (e) {\n this.logger.error(`${this.updateSpace.name} - space (${id}) was not updated : ${JSON.stringify(set)} : ${e}`)\n return false\n }\n }\n\n async spaceRootFiles(\n userId: number,\n spaceId: number,\n options: {\n withShares?: boolean\n withHasComments?: boolean\n withSyncs?: boolean\n }\n ): Promise<FileProps[]> {\n if (!this.spaceRootFilesQuery) {\n const select: FileProps | SelectedFields<any, any> = {\n id: files.id,\n path: filePathSQL(files),\n isDir: files.isDir,\n inTrash: files.inTrash,\n size: files.size,\n ctime: files.ctime,\n mtime: files.mtime,\n mime: files.mime,\n root: {\n id: spacesRoots.id,\n alias: spacesRoots.alias,\n name: spacesRoots.name,\n externalPath: spacesRoots.externalPath,\n permissions: spacesRoots.permissions,\n owner: { id: users.id, login: users.login, email: users.email, fullName: userFullNameSQL(users) }\n },\n shares: sql`IF (${sql.placeholder('withShares')}, ${concatDistinctObjectsInArray(shares.id, {\n id: shares.id,\n alias: shares.alias,\n name: shares.name,\n type: shares.type\n })}, '[]')`.mapWith(JSON.parse),\n syncs: sql`IF (${sql.placeholder('withSyncs')}, ${concatDistinctObjectsInArray(syncPaths.id, {\n id: syncPaths.id,\n clientId: syncClients.id,\n clientName: sql`JSON_VALUE(${syncClients.info}, '$.node')`\n })}, '[]')`.mapWith(JSON.parse),\n hasComments: sql<boolean>`IF (${sql.placeholder('withHasComments')}, ${fileHasCommentsSubquerySQL(files.id)}, 0)`.mapWith(Boolean)\n }\n this.spaceRootFilesQuery = this.db\n .select(select)\n .from(spacesRoots)\n .leftJoin(files, eq(files.id, spacesRoots.fileId))\n .leftJoin(users, eq(users.id, files.ownerId))\n .leftJoin(\n shares,\n and(\n eq(sql.placeholder('withShares'), sql.raw('1')),\n eq(shares.ownerId, sql.placeholder('userId')),\n isNull(shares.fileId),\n isNull(shares.parentId),\n eq(shares.spaceRootId, spacesRoots.id)\n )\n )\n .leftJoin(syncClients, and(eq(sql.placeholder('withSyncs'), sql.raw('1')), eq(syncClients.ownerId, sql.placeholder('userId'))))\n .leftJoin(\n syncPaths,\n and(\n eq(sql.placeholder('withSyncs'), sql.raw('1')),\n eq(syncPaths.clientId, syncClients.id),\n eq(syncPaths.spaceId, sql.placeholder('spaceId')),\n eq(syncPaths.spaceRootId, spacesRoots.id),\n isNull(syncPaths.fileId)\n )\n )\n .where(eq(spacesRoots.spaceId, sql.placeholder('spaceId')))\n .groupBy(files.id, spacesRoots.id)\n .prepare()\n }\n return this.spaceRootFilesQuery.execute({\n userId,\n spaceId,\n withHasComments: +!!options.withHasComments,\n withShares: +!!options.withShares,\n withSyncs: +!!options.withSyncs\n })\n }\n\n async getSpaceRoots(spaceId: number, userId?: number): Promise<SpaceRootProps[]> {\n const where: SQL<any>[] = [eq(spacesRoots.spaceId, spaceId)]\n if (userId) {\n where.push(eq(files.ownerId, userId))\n }\n return (await this.db\n .select({\n id: spacesRoots.id,\n alias: spacesRoots.alias,\n name: spacesRoots.name,\n permissions: spacesRoots.permissions,\n createdAt: spacesRoots.createdAt,\n ...(!userId && { owner: { id: files.ownerId } }),\n file: {\n id: files.id,\n path: filePathSQL(files),\n mime: files.mime\n }\n })\n .from(spacesRoots)\n .leftJoin(files, eq(files.id, spacesRoots.fileId))\n .where(and(...where))) as SpaceRootProps[]\n }\n\n async getSpaceMemberIds(spaceId: number): Promise<{ groupIds: number[]; userIds: number[] }> {\n const members = { userIds: [], groupIds: [] }\n for (const m of await this.db\n .select({\n userId: spacesMembers.userId,\n groupId: spacesMembers.groupId\n })\n .from(spacesMembers)\n .where(eq(spacesMembers.spaceId, spaceId))) {\n if (m.userId) {\n members.userIds.push(m.userId)\n } else {\n members.groupIds.push(m.groupId)\n }\n }\n return members\n }\n\n async updateMembers(\n spaceId: number,\n add: SpaceMemberDto[],\n update: Record<string | 'object', Partial<SpaceMembers> | SpaceMemberDto>[],\n remove: SpaceMemberDto[]\n ): Promise<Record<Exclude<ACTION, ACTION.DELETE_PERMANENTLY>, { userIds: number[]; groupIds: number[] }>> {\n // store status\n const status: Record<Exclude<ACTION, ACTION.DELETE_PERMANENTLY>, { userIds: number[]; groupIds: number[] }> = {\n [ACTION.ADD]: { userIds: [], groupIds: [] },\n [ACTION.UPDATE]: { userIds: [], groupIds: [] },\n [ACTION.DELETE]: { userIds: [], groupIds: [] }\n }\n // add\n for (const m of add) {\n try {\n dbCheckAffectedRows(\n await this.db.insert(spacesMembers).values({\n spaceId: spaceId,\n ...(m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST ? { userId: m.id } : { groupId: m.id }),\n role: m.spaceRole,\n permissions: m.permissions\n } as SpaceMembers),\n 1\n )\n status[ACTION.ADD][`${m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST ? 'userIds' : 'groupIds'}`].push(m.id)\n this.logger.debug(`${this.updateMembers.name} - ${m.type} (${m.id}) added to the space (${spaceId})`)\n } catch (e) {\n this.logger.error(`${this.updateMembers.name} - ${m.type} (${m.id}) was not added to the space ${spaceId} -> : ${e}`)\n }\n }\n // update\n for (const props of update) {\n const m: SpaceMemberDto = popFromObject('object', props)\n const spaceRole = popFromObject('spaceRole', props)\n if (Number.isInteger(spaceRole)) {\n props.role = spaceRole\n }\n try {\n dbCheckAffectedRows(\n await this.db\n .update(spacesMembers)\n .set(props)\n .where(\n and(\n eq(spacesMembers.spaceId, spaceId),\n eq(m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST ? spacesMembers.userId : spacesMembers.groupId, m.id)\n )\n )\n .limit(1),\n 1\n )\n status[ACTION.UPDATE][`${m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST ? 'userIds' : 'groupIds'}`].push(m.id)\n this.logger.debug(`${this.updateMembers.name} - ${m.type} (${m.id}) was updated on space (${spaceId}) : ${JSON.stringify(props)}`)\n } catch (e) {\n this.logger.error(`${this.updateMembers.name} - ${m.type} (${m.id}) was not updated on space (${spaceId}) : ${JSON.stringify(props)} : ${e}`)\n }\n }\n // remove\n for (const m of remove) {\n try {\n dbCheckAffectedRows(\n await this.db\n .delete(spacesMembers)\n .where(\n and(\n eq(spacesMembers.spaceId, spaceId),\n eq(m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST ? spacesMembers.userId : spacesMembers.groupId, m.id)\n )\n ),\n 1\n )\n status[ACTION.DELETE][`${m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST ? 'userIds' : 'groupIds'}`].push(m.id)\n this.logger.debug(`${this.updateMembers.name} - ${m.type} (${m.id}) removed from space (${spaceId})`)\n } catch (e) {\n this.logger.error(`${this.updateMembers.name} - ${m.type} (${m.id}) was not removed from space (${spaceId}) : ${e}`)\n }\n }\n return status\n }\n\n async updateSpaceRoots(\n userId: number,\n spaceId: number,\n add: SpaceRootProps[],\n update: Record<string | 'object', Partial<SpaceRootProps> | SpaceRootProps>[],\n remove: SpaceRootProps[]\n ): Promise<Record<Exclude<ACTION, ACTION.DELETE_PERMANENTLY>, SpaceRootProps[]>> {\n // store status\n const status = {} as Record<Exclude<ACTION, ACTION.DELETE_PERMANENTLY>, SpaceRootProps[]>\n // add\n for (const r of add) {\n if (await this.addRoot(userId, spaceId, r)) {\n ;(status[ACTION.ADD] ||= []).push(r)\n }\n }\n // update\n for (const props of update) {\n const r: SpaceRootProps = popFromObject('object', props)\n if (await this.updateRoot(props, { id: r.id })) {\n ;(status[ACTION.UPDATE] ||= []).push(r)\n }\n }\n // delete\n for (const r of remove) {\n if (await this.removeRoot(r.id)) {\n ;(status[ACTION.DELETE] ||= []).push(r)\n }\n }\n return status\n }\n\n @CacheDecorator()\n async spaceIds(userId: number): Promise<number[]> {\n if (!this.spaceIdsQuery) {\n const unionAlias = this.fromUserAndGroups({ id: spaces.id })\n this.spaceIdsQuery = this.db.select({ id: unionAlias.id }).from(unionAlias).groupBy(unionAlias.id).prepare()\n }\n // `userId` is used in `fromUserAndGroups` function\n return (await this.spaceIdsQuery.execute({ userId })).map((r: { id: number }) => r.id)\n }\n\n @CacheDecorator()\n async spaces(userId: number, withPermissions = false, fromId?: number): Promise<SpaceProps[]> {\n let pQuery: MySql2PreparedQuery<any>\n if (fromId) {\n pQuery = this.spaceFromIdWithPermissionsQuery\n } else if (withPermissions) {\n pQuery = this.spacesWithPermissionsQuery\n } else {\n pQuery = this.spacesQuery\n }\n if (!pQuery) {\n const selectUnion: Space | SelectedFields<any, any> = {\n id: spaces.id,\n alias: spaces.alias,\n name: spaces.name,\n description: spaces.description,\n enabled: spaces.enabled,\n createdAt: spaces.createdAt,\n modifiedAt: spaces.modifiedAt,\n ...(withPermissions && { permissions: spacesMembers.permissions, role: spacesMembers.role })\n }\n const unionAlias = this.fromUserAndGroups(selectUnion)\n const select: Space | SelectedFields<any, any> = {\n id: unionAlias.id,\n alias: unionAlias.alias,\n name: unionAlias.name,\n description: unionAlias.description,\n enabled: unionAlias.enabled,\n createdAt: unionAlias.createdAt,\n modifiedAt: unionAlias.modifiedAt,\n ...(withPermissions && {\n permissions: spaceGroupConcatPermissions(unionAlias.permissions),\n role: max(unionAlias.role)\n })\n }\n if (fromId) {\n pQuery = this.db\n .select(select)\n .from(unionAlias)\n .where(eq(unionAlias.id, sql.placeholder('fromId')))\n .limit(1)\n .prepare()\n this.spaceFromIdWithPermissionsQuery = pQuery\n } else {\n pQuery = this.db.select(select).from(unionAlias).groupBy(unionAlias.id).prepare()\n if (withPermissions) {\n this.spacesWithPermissionsQuery = pQuery\n } else {\n this.spacesQuery = pQuery\n }\n }\n }\n // SpaceProps instance is required, if the user is a space manager, he must have all permissions\n // `userId` is used in `fromUserAndGroups` function\n return (await pQuery.execute({ userId, fromId })).map((s: Partial<SpaceProps>) => new SpaceProps(s))\n }\n\n async spacesWithDetails(userId: number): Promise<SpaceProps[]> {\n if (!this.spacesWithDetailsQuery) {\n const selectUnion: Space | SelectedFields<any, any> = {\n id: spaces.id,\n alias: spaces.alias,\n name: spaces.name,\n description: spaces.description,\n enabled: spaces.enabled,\n permissions: spacesMembers.permissions,\n role: spacesMembers.role,\n createdAt: spaces.createdAt,\n modifiedAt: spaces.modifiedAt,\n disabledAt: spaces.disabledAt\n }\n const unionAlias = this.fromUserAndGroups(selectUnion)\n const managers: any = alias(users, 'managers')\n const select: Space | SelectedFields<any, any> = {\n id: unionAlias.id,\n alias: unionAlias.alias,\n name: unionAlias.name,\n description: unionAlias.description,\n enabled: unionAlias.enabled,\n permissions: spaceGroupConcatPermissions(unionAlias.permissions),\n role: max(unionAlias.role),\n modifiedAt: unionAlias.modifiedAt,\n createdAt: unionAlias.createdAt,\n disabledAt: unionAlias.disabledAt,\n members: concatDistinctObjectsInArray(managers.id, {\n id: managers.id,\n login: managers.login,\n name: userFullNameSQL(managers),\n description: managers.email,\n type: sql.raw(`'${MEMBER_TYPE.USER}'`),\n spaceRole: spacesMembers.role,\n permissions: sql<string>`''`,\n createdAt: dateTimeUTC(spacesMembers.createdAt)\n } satisfies Record<keyof Pick<Member, 'id' | 'name' | 'login' | 'description' | 'type' | 'permissions' | 'spaceRole' | 'createdAt'>, any>),\n counts: {\n users: sql`COUNT(DISTINCT(CASE WHEN ${spacesMembers.userId} IS NOT NULL AND ${spacesMembers.linkId} IS NULL THEN ${spacesMembers.userId} END))`,\n groups: countDistinct(spacesMembers.groupId),\n links: sql`COUNT(DISTINCT(CASE WHEN ${spacesMembers.linkId} IS NOT NULL THEN ${spacesMembers.linkId} END))`,\n roots: countDistinct(files.id),\n shares: sql`COUNT(DISTINCT(CASE WHEN ${shares.id} IS NOT NULL THEN ${shares.id} END))`\n }\n }\n this.spacesWithDetailsQuery = this.db\n .select(select)\n .from(unionAlias)\n .leftJoin(spacesMembers, eq(spacesMembers.spaceId, unionAlias.id))\n .leftJoin(users, eq(users.id, spacesMembers.userId))\n .leftJoin(groups, eq(groups.id, spacesMembers.groupId))\n .leftJoin(managers, and(eq(spacesMembers.userId, managers.id), eq(spacesMembers.role, SPACE_ROLE.IS_MANAGER)))\n .leftJoin(spacesRoots, eq(spacesRoots.spaceId, unionAlias.id))\n .leftJoin(files, and(eq(files.id, spacesRoots.fileId), eq(files.ownerId, sql.placeholder('userId'))))\n .leftJoin(shares, and(eq(unionAlias.role, 1), eq(shares.spaceId, unionAlias.id), isNotNull(shares.spaceId)))\n .groupBy(unionAlias.id)\n .prepare()\n }\n const r: MySqlQueryResult = await this.spacesWithDetailsQuery.execute({ userId })\n return r.length ? r.map((s: Partial<SpaceProps>) => new SpaceProps(s)) : []\n }\n\n @CacheDecorator()\n async permissions(userId: number, spaceAlias: string, rootAlias: string): Promise<Partial<SpaceEnv>> {\n if (rootAlias) {\n return await this.spaceAndRootPermissions(userId, spaceAlias, rootAlias)\n }\n return await this.spacePermissions(userId, spaceAlias)\n }\n\n async addRoot(userId: number, spaceId: number, root: SpaceRootProps): Promise<boolean> {\n const r: Partial<SpaceRoot> = { name: root.name, alias: root.alias, permissions: root.permissions, spaceId: spaceId }\n if (root.externalPath) {\n r.externalPath = root.externalPath\n } else {\n r.fileId = await this.getOrCreateUserFile(userId, root.file)\n }\n try {\n dbCheckAffectedRows(await this.db.insert(spacesRoots).values(r as SpaceRoot), 1)\n this.logger.debug(`${this.addRoot.name} - *${root.alias}* (${root.id}) added`)\n return true\n } catch (e) {\n this.logger.error(`${this.addRoot.name} - *${root.alias}* (${root.id}) was not added : ${JSON.stringify(root)} : ${e}`)\n return false\n }\n }\n\n async updateRoot(set: Partial<Record<keyof SpaceRoot, any>>, filters: Partial<Record<keyof SpaceRoot, any>>): Promise<boolean> {\n const where: SQL[] = convertToWhere(spacesRoots, filters)\n try {\n dbCheckAffectedRows(\n await this.db\n .update(spacesRoots)\n .set(set)\n .where(and(...where))\n .limit(1),\n 1\n )\n this.logger.debug(`${this.updateRoot.name} - ${JSON.stringify(filters)} was updated : ${JSON.stringify(set)}`)\n return true\n } catch (e) {\n this.logger.error(`${this.updateRoot.name} - ${JSON.stringify(filters)} was not updated : ${JSON.stringify(set)} : ${e}`)\n return false\n }\n }\n\n getUserFile(userId: number, fileId: number): Promise<Pick<File, 'id' | 'path'>> {\n return this.filesQueries.getUserFile(userId, fileId)\n }\n\n getOrCreateUserFile(userId: number, file: FileProps): Promise<number> {\n return this.filesQueries.getOrCreateUserFile(userId, file)\n }\n\n getOrCreateSpaceFile(fileId: number, file: FileProps, dbFile: FileDBProps): Promise<number> {\n return this.filesQueries.getOrCreateSpaceFile(fileId, file, dbFile)\n }\n\n async clearCachePermissions(spaceAlias: string, rootAliases?: string[], userIds?: number[]) {\n const uIds = userIds ?? ['*']\n for (const uid of uIds) {\n const basePattern = [this.constructor.name, this.permissions.name, uid, spaceAlias]\n const patterns: string[] = []\n if (rootAliases?.length) {\n // clear cache on space root\n rootAliases.forEach((rAlias: string) => patterns.push(this.cache.genSlugKey(...basePattern, rAlias)))\n } else {\n // clear cache on spaces list\n patterns.push(this.cache.genSlugKey(...[this.constructor.name, this.spaces.name, uid, '*']))\n // clear cache on spaces and roots\n patterns.push(this.cache.genSlugKey(...basePattern), this.cache.genSlugKey(...basePattern, '*'))\n }\n for (const p of patterns) {\n const keys = await this.cache.keys(p)\n if (keys.length) {\n this.logger.verbose(`${this.clearCachePermissions.name} - ${JSON.stringify(keys)}`)\n this.cache.mdel(keys).catch((e: Error) => this.logger.error(`${this.clearCachePermissions.name} - ${e}`))\n }\n }\n }\n }\n\n private async removeRoot(id: number): Promise<boolean> {\n try {\n dbCheckAffectedRows(await this.db.delete(spacesRoots).where(eq(spacesRoots.id, id)), 1)\n this.logger.debug(`${this.removeRoot.name} - root (${id}) removed`)\n return true\n } catch (e) {\n this.logger.error(`${this.removeRoot.name} - root (${id}) was not deleted : ${e}`)\n return false\n }\n }\n\n private async spacePermissions(userId: number, spaceAlias: string): Promise<Partial<SpaceEnv>> {\n if (!this.spacePermissionsQuery) {\n const selectUnion: SpaceEnv | SelectedFields<any, any> = {\n id: spaces.id,\n alias: spaces.alias,\n name: spaces.name,\n enabled: spaces.enabled,\n permissions: spacesMembers.permissions,\n role: spacesMembers.role\n }\n const filters: SQL[] = [eq(spaces.alias, sql.placeholder('spaceAlias'))]\n const unionAlias = this.fromUserAndGroups(selectUnion, filters)\n const select: SpaceEnv | SelectedFields<any, any> = {\n id: unionAlias.id,\n alias: unionAlias.alias,\n name: unionAlias.name,\n enabled: unionAlias.enabled,\n permissions: spaceGroupConcatPermissions(unionAlias.permissions),\n role: max(unionAlias.role)\n }\n this.spacePermissionsQuery = this.db.select(select).from(unionAlias).groupBy(unionAlias.id).limit(1).prepare()\n }\n // `userId` is used in `fromUserAndGroups` function\n const r: MySqlQueryResult = await this.spacePermissionsQuery.execute({ userId, spaceAlias })\n return r.length ? r.at(0) : null\n }\n\n private async spaceAndRootPermissions(userId: number, spaceAlias: string, rootAlias: string): Promise<Partial<SpaceEnv>> {\n if (!this.spaceAndRootPermissionsQuery) {\n const selectUnion: SpaceEnv | SelectedFields<any, any> = {\n id: spaces.id,\n alias: spaces.alias,\n name: spaces.name,\n enabled: spaces.enabled,\n permissions: spacesMembers.permissions,\n role: spacesMembers.role,\n rootId: sql`${spacesRoots.id}`.as('rootId'),\n rootAlias: sql`${spacesRoots.alias}`.as('rootAlias'),\n rootName: sql`${spacesRoots.name}`.as('rootName'),\n rootPermissions: sql`${spacesRoots.permissions}`.as('rootPermissions'),\n rootOwnerId: files.ownerId,\n rootOwnerLogin: users.login,\n rootFileId: sql`${files.id}`.as('rootFileId'),\n rootFilePath: filePathSQL(files).as('rootFilePath'),\n rootFileInTrash: files.inTrash,\n rootExternalPath: spacesRoots.externalPath\n }\n const filters: SQL[] = [eq(spaces.alias, sql.placeholder('spaceAlias'))]\n const fromUser = this.fromUserQuery(selectUnion, filters).$dynamic()\n const fromGroups = this.fromGroupsQuery(selectUnion, filters).$dynamic()\n for (const q of [fromUser, fromGroups]) {\n q.leftJoin(spacesRoots, and(eq(spacesRoots.spaceId, spacesMembers.spaceId), eq(spacesRoots.alias, sql.placeholder('rootAlias'))))\n .leftJoin(files, eq(files.id, spacesRoots.fileId))\n .leftJoin(users, eq(users.id, files.ownerId))\n }\n const unionAlias = union(fromUser, fromGroups).as('union_alias')\n const select: SpaceEnv | SelectedFields<any, any> = {\n id: unionAlias.id,\n alias: unionAlias.alias,\n name: unionAlias.name,\n enabled: unionAlias.enabled,\n permissions: spaceGroupConcatPermissions(unionAlias.permissions),\n role: sql<SPACE_ROLE>`MAX(${unionAlias.role})`,\n root: {\n id: unionAlias.rootId,\n alias: unionAlias.rootAlias,\n name: unionAlias.rootName,\n permissions: unionAlias.rootPermissions,\n owner: { id: unionAlias.rootOwnerId, login: unionAlias.rootOwnerLogin },\n file: { id: unionAlias.rootFileId, path: unionAlias.rootFilePath, inTrash: unionAlias.rootFileInTrash },\n externalPath: unionAlias.rootExternalPath\n }\n }\n this.spaceAndRootPermissionsQuery = this.db.select(select).from(unionAlias).groupBy(unionAlias.id).limit(1).prepare()\n }\n // `userId` is used in `fromUserQuery` and `fromGroupsQuery` function\n const r: MySqlQueryResult = await this.spaceAndRootPermissionsQuery.execute({ userId, spaceAlias, rootAlias })\n return r.length ? r.at(0) : null\n }\n\n private fromUserAndGroups(select: SelectedFields<any, any>, filters: SQL[] = []) {\n return union(this.fromUserQuery(select, filters), this.fromGroupsQuery(select, filters)).as('union_alias')\n }\n\n private fromUserQuery(select: SelectedFields<any, any>, filters: SQL[] = []) {\n const where = [eq(spacesMembers.userId, sql.placeholder('userId')), ...filters]\n return this.db\n .select(select)\n .from(spacesMembers)\n .innerJoin(spaces, eq(spacesMembers.spaceId, spaces.id))\n .where(and(...where))\n }\n\n private fromGroupsQuery(select: SelectedFields<any, any>, filters: SQL[] = []) {\n const where = [eq(spacesMembers.groupId, usersGroups.groupId), ...filters]\n return this.db\n .select(select)\n .from(spacesMembers)\n .innerJoin(usersGroups, eq(usersGroups.userId, sql.placeholder('userId')))\n .innerJoin(spaces, eq(spacesMembers.spaceId, spaces.id))\n .where(and(...where))\n }\n}\n"],"names":["SpacesQueries","spaceExistsForAlias","alias","db","query","spaces","findFirst","columns","id","where","eq","spaceRootExistsForAlias","spaceId","rootAlias","spacesRoots","and","selectSpaces","fields","select","convertToSelect","from","spacesQuotaPaths","storageUsage","storageQuota","externalPaths","sql","externalPath","mapWith","JSON","parse","as","leftJoin","isNotNull","groupBy","userIsSpaceManager","userId","shareId","q","spacesMembers","shares","innerJoin","r","role","SPACE_ROLE","IS_MANAGER","limit","getSpaceAsManager","spaceQuery","otherMembers","rootOwner","users","fileOwner","files","linkUsers","name","description","enabled","storageIndexing","createdAt","modifiedAt","disabledAt","roots","concatDistinctObjectsInArray","permissions","dateTimeUTC","owner","login","fullName","userFullNameSQL","email","file","path","filePathSQL","mime","type","USER_ROLE","GUEST","MEMBER_TYPE","USER","spaceRole","groups","GROUP_TYPE","PERSONAL","PGROUP","GROUP","IS_MEMBER","links","linkId","raw","placeholder","isNull","groupId","fileId","ownerId","prepare","space","execute","members","popFromObject","SpaceProps","createSpace","dbGetInsertedId","insert","values","deleteSpace","deleteNow","delete","update","set","Date","dbCheckAffectedRows","updateSpace","logger","debug","stringify","e","error","spaceRootFiles","options","spaceRootFilesQuery","isDir","inTrash","size","ctime","mtime","root","syncs","syncPaths","clientId","syncClients","clientName","info","hasComments","fileHasCommentsSubquerySQL","Boolean","parentId","spaceRootId","withHasComments","withShares","withSyncs","getSpaceRoots","push","getSpaceMemberIds","userIds","groupIds","m","updateMembers","add","remove","status","ACTION","ADD","UPDATE","DELETE","props","Number","isInteger","updateSpaceRoots","addRoot","updateRoot","removeRoot","spaceIds","spaceIdsQuery","unionAlias","fromUserAndGroups","map","withPermissions","fromId","pQuery","spaceFromIdWithPermissionsQuery","spacesWithPermissionsQuery","spacesQuery","selectUnion","spaceGroupConcatPermissions","max","s","spacesWithDetails","spacesWithDetailsQuery","managers","counts","countDistinct","length","spaceAlias","spaceAndRootPermissions","spacePermissions","getOrCreateUserFile","filters","convertToWhere","getUserFile","filesQueries","getOrCreateSpaceFile","dbFile","clearCachePermissions","rootAliases","uIds","uid","basePattern","patterns","forEach","rAlias","cache","genSlugKey","p","keys","verbose","mdel","catch","spacePermissionsQuery","at","spaceAndRootPermissionsQuery","rootId","rootName","rootPermissions","rootOwnerId","rootOwnerLogin","rootFileId","rootFilePath","rootFileInTrash","rootExternalPath","fromUser","fromUserQuery","$dynamic","fromGroups","fromGroupsQuery","union","usersGroups","Logger"],"mappings":"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"}
|
|
@@ -35,7 +35,7 @@ _export(exports, {
|
|
|
35
35
|
return removePermissions;
|
|
36
36
|
}
|
|
37
37
|
});
|
|
38
|
-
const
|
|
38
|
+
const _shared = require("../../../common/shared");
|
|
39
39
|
const _user = require("../../users/constants/user");
|
|
40
40
|
const _spaces = require("../constants/spaces");
|
|
41
41
|
function havePermission(currentPermissions, mustHavePermission) {
|
|
@@ -52,7 +52,7 @@ function haveSpacePermission(space, permission) {
|
|
|
52
52
|
}
|
|
53
53
|
function getEnvPermissions(space, root) {
|
|
54
54
|
/* In a root space, we have to intersect the space & the root permissions */ if (root?.id && typeof root?.permissions === 'string') {
|
|
55
|
-
return (0,
|
|
55
|
+
return (0, _shared.intersectPermissions)(space.permissions, root.permissions);
|
|
56
56
|
} else {
|
|
57
57
|
return space.permissions;
|
|
58
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../backend/src/applications/spaces/utils/permissions.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 { intersectPermissions } from '../../../common/
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/spaces/utils/permissions.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 { intersectPermissions } from '../../../common/shared'\nimport { USER_PERMISSION } from '../../users/constants/user'\nimport type { UserModel } from '../../users/models/user.model'\nimport { SPACE_ALIAS, SPACE_OPERATION, SPACE_PERMS_SEP, SPACE_REPOSITORY } from '../constants/spaces'\nimport type { SpaceEnv } from '../models/space-env.model'\nimport type { SpaceProps } from '../models/space-props.model'\nimport type { SpaceRoot } from '../schemas/space-root.interface'\n\nexport function havePermission(currentPermissions: string, mustHavePermission: SPACE_OPERATION): boolean {\n return currentPermissions.indexOf(mustHavePermission) > -1\n}\n\nexport function haveSpaceEnvPermissions(space: SpaceEnv, permission: SPACE_OPERATION): boolean {\n if (permission) {\n return havePermission(space.envPermissions, permission)\n }\n return true\n}\n\nexport function haveSpacePermission(space: Partial<SpaceProps>, permission: SPACE_OPERATION): boolean {\n return havePermission(space.permissions, permission)\n}\n\nexport function getEnvPermissions(space: SpaceEnv, root: Partial<SpaceRoot>): string {\n /* In a root space, we have to intersect the space & the root permissions */\n if (root?.id && typeof root?.permissions === 'string') {\n return intersectPermissions(space.permissions, root.permissions)\n } else {\n return space.permissions\n }\n}\n\nexport function removePermissions(permissions: string, rmPermissions: SPACE_OPERATION[]): string {\n return permissions\n .split(SPACE_PERMS_SEP)\n .filter((p: SPACE_OPERATION) => rmPermissions.indexOf(p) === -1)\n .sort()\n .join(SPACE_PERMS_SEP)\n}\n\nexport function canAccessToSpaceUrl(user: UserModel, urlSegments: string[]): boolean {\n if (urlSegments[1] === SPACE_ALIAS.PERSONAL && (urlSegments[0] === SPACE_REPOSITORY.FILES || urlSegments[0] === SPACE_REPOSITORY.TRASH)) {\n return user.havePermission(USER_PERMISSION.PERSONAL_SPACE)\n } else if (urlSegments[0] === SPACE_REPOSITORY.FILES) {\n return user.havePermission(USER_PERMISSION.SPACES)\n } else if (urlSegments[0] === SPACE_REPOSITORY.SHARES) {\n return user.havePermission(USER_PERMISSION.SHARES)\n } else if (urlSegments[0] === SPACE_REPOSITORY.TRASH) {\n return user.havePermission(USER_PERMISSION.SPACES) || user.havePermission(USER_PERMISSION.PERSONAL_SPACE)\n }\n return false\n}\n\nexport function canAccessToSpace(user: UserModel, space: SpaceEnv): boolean {\n if (space.inPersonalSpace) {\n return user.havePermission(USER_PERMISSION.PERSONAL_SPACE)\n } else if (space.inFilesRepository) {\n return user.havePermission(USER_PERMISSION.SPACES)\n } else if (space.inSharesRepository) {\n return user.havePermission(USER_PERMISSION.SHARES)\n } else if (space.inTrashRepository) {\n return user.havePermission(USER_PERMISSION.SPACES) || user.havePermission(USER_PERMISSION.PERSONAL_SPACE)\n }\n return false\n}\n"],"names":["canAccessToSpace","canAccessToSpaceUrl","getEnvPermissions","havePermission","haveSpaceEnvPermissions","haveSpacePermission","removePermissions","currentPermissions","mustHavePermission","indexOf","space","permission","envPermissions","permissions","root","id","intersectPermissions","rmPermissions","split","SPACE_PERMS_SEP","filter","p","sort","join","user","urlSegments","SPACE_ALIAS","PERSONAL","SPACE_REPOSITORY","FILES","TRASH","USER_PERMISSION","PERSONAL_SPACE","SPACES","SHARES","inPersonalSpace","inFilesRepository","inSharesRepository","inTrashRepository"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAuDeA;eAAAA;;QAbAC;eAAAA;;QAjBAC;eAAAA;;QAfAC;eAAAA;;QAIAC;eAAAA;;QAOAC;eAAAA;;QAaAC;eAAAA;;;wBAhCqB;sBACL;wBAEgD;AAKzE,SAASH,eAAeI,kBAA0B,EAAEC,kBAAmC;IAC5F,OAAOD,mBAAmBE,OAAO,CAACD,sBAAsB,CAAC;AAC3D;AAEO,SAASJ,wBAAwBM,KAAe,EAAEC,UAA2B;IAClF,IAAIA,YAAY;QACd,OAAOR,eAAeO,MAAME,cAAc,EAAED;IAC9C;IACA,OAAO;AACT;AAEO,SAASN,oBAAoBK,KAA0B,EAAEC,UAA2B;IACzF,OAAOR,eAAeO,MAAMG,WAAW,EAAEF;AAC3C;AAEO,SAAST,kBAAkBQ,KAAe,EAAEI,IAAwB;IACzE,0EAA0E,GAC1E,IAAIA,MAAMC,MAAM,OAAOD,MAAMD,gBAAgB,UAAU;QACrD,OAAOG,IAAAA,4BAAoB,EAACN,MAAMG,WAAW,EAAEC,KAAKD,WAAW;IACjE,OAAO;QACL,OAAOH,MAAMG,WAAW;IAC1B;AACF;AAEO,SAASP,kBAAkBO,WAAmB,EAAEI,aAAgC;IACrF,OAAOJ,YACJK,KAAK,CAACC,uBAAe,EACrBC,MAAM,CAAC,CAACC,IAAuBJ,cAAcR,OAAO,CAACY,OAAO,CAAC,GAC7DC,IAAI,GACJC,IAAI,CAACJ,uBAAe;AACzB;AAEO,SAASlB,oBAAoBuB,IAAe,EAAEC,WAAqB;IACxE,IAAIA,WAAW,CAAC,EAAE,KAAKC,mBAAW,CAACC,QAAQ,IAAKF,CAAAA,WAAW,CAAC,EAAE,KAAKG,wBAAgB,CAACC,KAAK,IAAIJ,WAAW,CAAC,EAAE,KAAKG,wBAAgB,CAACE,KAAK,AAAD,GAAI;QACvI,OAAON,KAAKrB,cAAc,CAAC4B,qBAAe,CAACC,cAAc;IAC3D,OAAO,IAAIP,WAAW,CAAC,EAAE,KAAKG,wBAAgB,CAACC,KAAK,EAAE;QACpD,OAAOL,KAAKrB,cAAc,CAAC4B,qBAAe,CAACE,MAAM;IACnD,OAAO,IAAIR,WAAW,CAAC,EAAE,KAAKG,wBAAgB,CAACM,MAAM,EAAE;QACrD,OAAOV,KAAKrB,cAAc,CAAC4B,qBAAe,CAACG,MAAM;IACnD,OAAO,IAAIT,WAAW,CAAC,EAAE,KAAKG,wBAAgB,CAACE,KAAK,EAAE;QACpD,OAAON,KAAKrB,cAAc,CAAC4B,qBAAe,CAACE,MAAM,KAAKT,KAAKrB,cAAc,CAAC4B,qBAAe,CAACC,cAAc;IAC1G;IACA,OAAO;AACT;AAEO,SAAShC,iBAAiBwB,IAAe,EAAEd,KAAe;IAC/D,IAAIA,MAAMyB,eAAe,EAAE;QACzB,OAAOX,KAAKrB,cAAc,CAAC4B,qBAAe,CAACC,cAAc;IAC3D,OAAO,IAAItB,MAAM0B,iBAAiB,EAAE;QAClC,OAAOZ,KAAKrB,cAAc,CAAC4B,qBAAe,CAACE,MAAM;IACnD,OAAO,IAAIvB,MAAM2B,kBAAkB,EAAE;QACnC,OAAOb,KAAKrB,cAAc,CAAC4B,qBAAe,CAACG,MAAM;IACnD,OAAO,IAAIxB,MAAM4B,iBAAiB,EAAE;QAClC,OAAOd,KAAKrB,cAAc,CAAC4B,qBAAe,CAACE,MAAM,KAAKT,KAAKrB,cAAc,CAAC4B,qBAAe,CAACC,cAAc;IAC1G;IACA,OAAO;AACT"}
|
|
@@ -272,6 +272,7 @@ let SyncManager = class SyncManager {
|
|
|
272
272
|
}
|
|
273
273
|
handleError(space, action, e, dstSpace) {
|
|
274
274
|
this.logger.error(`unable to ${action} ${space.url}${dstSpace?.url ? ` -> ${dstSpace.url}` : ''} : ${e}`);
|
|
275
|
+
// Remove the last part to avoid exposing the path
|
|
275
276
|
const errorMsg = e.message.split(',')[0];
|
|
276
277
|
if (e instanceof _filelockerror.LockConflict) {
|
|
277
278
|
throw new _common.HttpException('The file is locked', _common.HttpStatus.LOCKED);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../backend/src/applications/sync/services/sync-manager.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { HttpException, HttpStatus, Injectable, Logger, StreamableFile } from '@nestjs/common'\nimport { FastifyReply } from 'fastify'\nimport fs from 'fs/promises'\nimport { Dirent, Stats } from 'node:fs'\nimport path from 'node:path'\nimport { regExpPathPattern } from '../../../common/functions'\nimport { FILE_OPERATION } from '../../files/constants/operations'\nimport { FileError } from '../../files/models/file-error'\nimport { LockConflict } from '../../files/models/file-lock-error'\nimport { FilesManager } from '../../files/services/files-manager.service'\nimport { checksumFile, isPathExists, isPathIsDir, removeFiles, touchFile } from '../../files/utils/files'\nimport { SendFile } from '../../files/utils/send-file'\nimport { ParseDiffContext } from '../../spaces/interfaces/space-diff.interface'\nimport { FastifySpaceRequest } from '../../spaces/interfaces/space-request.interface'\nimport { SpaceEnv } from '../../spaces/models/space-env.model'\nimport { SpacesManager } from '../../spaces/services/spaces-manager.service'\nimport { UserModel } from '../../users/models/user.model'\nimport { F_SPECIAL_STAT, F_STAT, SYNC_CHECKSUM_ALG, SYNC_DIFF_DONE } from '../constants/sync'\nimport { SyncCopyMoveDto, SyncDiffDto, SyncMakeDto, SyncPropsDto } from '../dtos/sync-operations.dto'\nimport { SyncUploadDto } from '../dtos/sync-upload.dto'\nimport { SyncFileSpecialStats, SyncFileStats } from '../interfaces/sync-diff.interface'\nimport { SyncPathSettings } from '../interfaces/sync-path.interface'\nimport { getTmpFilePath } from '../utils/functions'\nimport { SYNC_PATH_TO_SPACE_SEGMENTS } from '../utils/routes'\nimport { SyncQueries } from './sync-queries.service'\n\n@Injectable()\nexport class SyncManager {\n private readonly logger = new Logger(SyncManager.name)\n\n constructor(\n private readonly spacesManager: SpacesManager,\n private readonly filesManager: FilesManager,\n private readonly syncQueries: SyncQueries\n ) {}\n\n async download(req: FastifySpaceRequest, res: FastifyReply): Promise<StreamableFile> {\n const sendFile: SendFile = this.filesManager.sendFileFromSpace(req.space)\n try {\n await sendFile.checks()\n return await sendFile.stream(req, res)\n } catch (e) {\n this.handleError(req.space, req.method, e)\n }\n }\n\n async upload(req: FastifySpaceRequest, syncUploadDto: SyncUploadDto): Promise<{ ino: number }> {\n const tmpPath = getTmpFilePath(req.space.realPath)\n try {\n if (syncUploadDto.checksum) {\n const checksum = await this.filesManager.saveStream(req.user, req.space, req, { tmpPath: tmpPath, checksumAlg: SYNC_CHECKSUM_ALG })\n if (checksum !== syncUploadDto.checksum) {\n await removeFiles(tmpPath)\n this.handleError(req.space, req.method, new FileError(HttpStatus.BAD_REQUEST, 'checksums are not identical'))\n }\n } else {\n await this.filesManager.saveStream(req.user, req.space, req, { tmpPath: tmpPath })\n }\n const fileStats = await fs.stat(req.space.realPath)\n if (fileStats.size !== syncUploadDto.size) {\n await removeFiles(tmpPath)\n this.handleError(\n req.space,\n req.method,\n new FileError(HttpStatus.BAD_REQUEST, `sizes are not identical : ${fileStats.size} != ${syncUploadDto.size}`)\n )\n }\n // update mtime\n await touchFile(req.space.realPath, syncUploadDto.mtime)\n // return inode number\n return { ino: fileStats.ino }\n } catch (e) {\n this.handleError(req.space, req.method, e)\n }\n }\n\n async delete(req: FastifySpaceRequest): Promise<void> {\n try {\n return await this.filesManager.delete(req.user, req.space)\n } catch (e) {\n this.handleError(req.space, FILE_OPERATION.DELETE, e)\n }\n }\n\n async props(req: FastifySpaceRequest, syncPropsDto: SyncPropsDto): Promise<void> {\n try {\n await this.filesManager.touch(req.user, req.space, syncPropsDto.mtime, false)\n } catch (e) {\n this.handleError(req.space, FILE_OPERATION.TOUCH, e)\n }\n }\n\n async make(req: FastifySpaceRequest, syncMakeDto: SyncMakeDto): Promise<{ ino: number }> {\n try {\n if (syncMakeDto.type === 'directory') {\n await this.filesManager.mkDir(req.user, req.space, true)\n } else {\n await this.filesManager.mkFile(req.user, req.space, true)\n }\n await touchFile(req.space.realPath, syncMakeDto.mtime)\n return { ino: (await fs.stat(req.space.realPath)).ino }\n } catch (e) {\n this.handleError(req.space, `${FILE_OPERATION.MAKE} ${syncMakeDto.type}`, e)\n }\n }\n\n async copyMove(req: FastifySpaceRequest, syncCopyMoveDto: SyncCopyMoveDto, isMove: true): Promise<void>\n async copyMove(req: FastifySpaceRequest, syncCopyMoveDto: SyncCopyMoveDto, isMove: false): Promise<{ ino: number; mtime: number }>\n async copyMove(req: FastifySpaceRequest, syncCopyMoveDto: SyncCopyMoveDto, isMove: boolean): Promise<void | { ino: number; mtime: number }> {\n const dstSpace: SpaceEnv = await this.spacesManager.spaceEnv(req.user, SYNC_PATH_TO_SPACE_SEGMENTS(syncCopyMoveDto.destination))\n try {\n await this.filesManager.copyMove(req.user, req.space, dstSpace, isMove, true, true)\n if (!isMove) {\n if (syncCopyMoveDto.mtime) {\n // update mtime\n await touchFile(dstSpace.realPath, syncCopyMoveDto.mtime)\n }\n // return inode & mtime\n const stats = await fs.stat(dstSpace.realPath)\n return { ino: stats.ino, mtime: Math.floor(stats.mtime.getTime() / 1000) }\n }\n } catch (e) {\n this.handleError(req.space, isMove ? FILE_OPERATION.MOVE : FILE_OPERATION.COPY, e, dstSpace)\n }\n }\n\n async diff(user: UserModel, pathId: number, syncDiff: SyncDiffDto, res: FastifyReply): Promise<void> {\n if (!user.clientId) {\n throw new HttpException('Client id is missing', HttpStatus.BAD_REQUEST)\n }\n const syncPathSettings: SyncPathSettings = await this.syncQueries.getPathSettings(user.clientId, pathId)\n if (!syncPathSettings) {\n throw new HttpException('Path not found', HttpStatus.NOT_FOUND)\n }\n let space: SpaceEnv\n try {\n space = await this.spacesManager.spaceEnv(user, SYNC_PATH_TO_SPACE_SEGMENTS(syncPathSettings.remotePath))\n } catch (e) {\n throw new HttpException(e.message, HttpStatus.BAD_REQUEST)\n }\n if (!space) {\n throw new HttpException('Space not found', HttpStatus.NOT_FOUND)\n }\n if (space.quotaIsExceeded) {\n throw new HttpException('Storage quota exceeded', HttpStatus.INSUFFICIENT_STORAGE)\n }\n if (!(await isPathExists(space.realPath))) {\n throw new HttpException(`Remote path not found : ${syncPathSettings.remotePath}`, HttpStatus.NOT_FOUND)\n }\n if (!(await isPathIsDir(space.realPath))) {\n throw new HttpException('Remote path must be a directory', HttpStatus.BAD_REQUEST)\n }\n // start\n res.raw.writeHead(200, {\n 'Content-Type': 'text/plain; charset=utf-8',\n 'Transfer-Encoding': 'chunked'\n })\n try {\n for await (const f of this.parseSyncPath(space, syncDiff)) {\n res.raw.write(`${JSON.stringify(f)}\\n`)\n }\n res.raw.write(SYNC_DIFF_DONE)\n } catch (e) {\n this.logger.error(`${this.diff.name} : ${e.message}`)\n res.raw.write(`${e.message}\\n`)\n res.status(HttpStatus.INTERNAL_SERVER_ERROR)\n }\n res.raw.end()\n }\n\n private async *parseSyncPath(space: SpaceEnv, syncDiff: SyncDiffDto): AsyncGenerator<Record<string, SyncFileStats | SyncFileSpecialStats>> {\n const context: ParseDiffContext = {\n regexBasePath: regExpPathPattern(space.realPath),\n syncDiff: syncDiff\n }\n yield* this.parseFiles(space.realPath, context)\n }\n\n private async *parseFiles(dir: string, ctx: ParseDiffContext): AsyncGenerator<Record<string, SyncFileStats | SyncFileSpecialStats>> {\n try {\n for (const entry of await fs.readdir(dir, { withFileTypes: true })) {\n const realPath = path.join(entry.parentPath, entry.name)\n if (!entry.isDirectory() && !entry.isFile()) {\n this.logger.log(`${this.parseFiles.name} - ignore special file: ${realPath}`)\n continue\n }\n if (entry.isDirectory()) {\n const dirStats: Record<string, SyncFileStats | SyncFileSpecialStats> = await this.analyzeFile(entry, ctx)\n if (dirStats !== null) {\n yield dirStats\n }\n yield* this.parseFiles(realPath, ctx)\n } else {\n const fileStats: Record<string, SyncFileStats | SyncFileSpecialStats> = await this.analyzeFile(entry, ctx)\n if (fileStats !== null) {\n yield fileStats\n }\n }\n }\n } catch (e) {\n this.logger.error(`${this.parseFiles.name} - unable to parse directory : ${dir} : ${e}`)\n throw new Error('Unable to parse path')\n }\n }\n\n private async analyzeFile(entry: Dirent, ctx: ParseDiffContext): Promise<Record<string, SyncFileStats | SyncFileSpecialStats>> {\n if (ctx.syncDiff.defaultFilters.has(entry.name)) {\n return null\n }\n\n const realPath = path.join(entry.parentPath, entry.name)\n const filePath = realPath.replace(ctx.regexBasePath, '')\n\n let stats: Stats\n try {\n stats = await fs.stat(realPath)\n } catch (e) {\n this.logger.warn(`${this.analyzeFile.name} - unable to get file stats : ${realPath} : ${e}`)\n return { [filePath]: [F_SPECIAL_STAT.ERROR, e.toString()] }\n }\n\n if (ctx.syncDiff.pathFilters && ctx.syncDiff.pathFilters.test(filePath)) {\n this.logger.verbose(`${this.analyzeFile.name} - ignore filtered file : ${realPath}`)\n return { [filePath]: [F_SPECIAL_STAT.FILTERED, stats.isDirectory()] }\n }\n\n const fileStats: SyncFileStats = [\n stats.isDirectory(),\n stats.isDirectory() ? 0 : stats.size,\n Math.floor(stats.mtime.getTime() / 1000),\n stats.ino,\n null\n ]\n if (ctx.syncDiff.secureDiff && !fileStats[F_STAT.IS_DIR]) {\n try {\n await this.checkSumFile(ctx, filePath, realPath, fileStats)\n } catch (e) {\n this.logger.error(`${this.analyzeFile.name} - file error : ${realPath} - ${e}`)\n return { [filePath]: [F_SPECIAL_STAT.ERROR, e.toString()] }\n }\n }\n return { [filePath]: fileStats }\n }\n\n private async checkSumFile(ctx: ParseDiffContext, filePath: string, realPath: string, fileStats: SyncFileStats): Promise<void> {\n if (!ctx.syncDiff.firstSync && ctx.syncDiff.snapshot.has(filePath)) {\n const snapFileStats: SyncFileStats = ctx.syncDiff.snapshot.get(filePath)\n if (\n snapFileStats[F_STAT.CHECKSUM] &&\n snapFileStats[F_STAT.MTIME] == fileStats[F_STAT.MTIME] &&\n snapFileStats[F_STAT.SIZE] == fileStats[F_STAT.SIZE] &&\n snapFileStats[F_STAT.INO] == fileStats[F_STAT.INO]\n ) {\n fileStats[F_STAT.CHECKSUM] = snapFileStats[F_STAT.CHECKSUM]\n return\n }\n }\n fileStats[F_STAT.CHECKSUM] = await checksumFile(realPath, SYNC_CHECKSUM_ALG)\n }\n\n private handleError(space: SpaceEnv, action: string, e: any, dstSpace?: SpaceEnv) {\n this.logger.error(`unable to ${action} ${space.url}${dstSpace?.url ? ` -> ${dstSpace.url}` : ''} : ${e}`)\n const errorMsg = e.message.split(',')[0]\n if (e instanceof LockConflict) {\n throw new HttpException('The file is locked', HttpStatus.LOCKED)\n } else if (e instanceof FileError) {\n throw new HttpException(errorMsg, e.httpCode)\n }\n throw new HttpException(errorMsg, HttpStatus.INTERNAL_SERVER_ERROR)\n }\n}\n"],"names":["SyncManager","download","req","res","sendFile","filesManager","sendFileFromSpace","space","checks","stream","e","handleError","method","upload","syncUploadDto","tmpPath","getTmpFilePath","realPath","checksum","saveStream","user","checksumAlg","SYNC_CHECKSUM_ALG","removeFiles","FileError","HttpStatus","BAD_REQUEST","fileStats","fs","stat","size","touchFile","mtime","ino","delete","FILE_OPERATION","DELETE","props","syncPropsDto","touch","TOUCH","make","syncMakeDto","type","mkDir","mkFile","MAKE","copyMove","syncCopyMoveDto","isMove","dstSpace","spacesManager","spaceEnv","SYNC_PATH_TO_SPACE_SEGMENTS","destination","stats","Math","floor","getTime","MOVE","COPY","diff","pathId","syncDiff","clientId","HttpException","syncPathSettings","syncQueries","getPathSettings","NOT_FOUND","remotePath","message","quotaIsExceeded","INSUFFICIENT_STORAGE","isPathExists","isPathIsDir","raw","writeHead","f","parseSyncPath","write","JSON","stringify","SYNC_DIFF_DONE","logger","error","name","status","INTERNAL_SERVER_ERROR","end","context","regexBasePath","regExpPathPattern","parseFiles","dir","ctx","entry","readdir","withFileTypes","path","join","parentPath","isDirectory","isFile","log","dirStats","analyzeFile","Error","defaultFilters","has","filePath","replace","warn","F_SPECIAL_STAT","ERROR","toString","pathFilters","test","verbose","FILTERED","secureDiff","F_STAT","IS_DIR","checkSumFile","firstSync","snapshot","snapFileStats","get","CHECKSUM","MTIME","SIZE","INO","checksumFile","action","url","errorMsg","split","LockConflict","LOCKED","httpCode","Logger"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/sync/services/sync-manager.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { HttpException, HttpStatus, Injectable, Logger, StreamableFile } from '@nestjs/common'\nimport { FastifyReply } from 'fastify'\nimport fs from 'fs/promises'\nimport { Dirent, Stats } from 'node:fs'\nimport path from 'node:path'\nimport { regExpPathPattern } from '../../../common/functions'\nimport { FILE_OPERATION } from '../../files/constants/operations'\nimport { FileError } from '../../files/models/file-error'\nimport { LockConflict } from '../../files/models/file-lock-error'\nimport { FilesManager } from '../../files/services/files-manager.service'\nimport { checksumFile, isPathExists, isPathIsDir, removeFiles, touchFile } from '../../files/utils/files'\nimport { SendFile } from '../../files/utils/send-file'\nimport { ParseDiffContext } from '../../spaces/interfaces/space-diff.interface'\nimport { FastifySpaceRequest } from '../../spaces/interfaces/space-request.interface'\nimport { SpaceEnv } from '../../spaces/models/space-env.model'\nimport { SpacesManager } from '../../spaces/services/spaces-manager.service'\nimport { UserModel } from '../../users/models/user.model'\nimport { F_SPECIAL_STAT, F_STAT, SYNC_CHECKSUM_ALG, SYNC_DIFF_DONE } from '../constants/sync'\nimport { SyncCopyMoveDto, SyncDiffDto, SyncMakeDto, SyncPropsDto } from '../dtos/sync-operations.dto'\nimport { SyncUploadDto } from '../dtos/sync-upload.dto'\nimport { SyncFileSpecialStats, SyncFileStats } from '../interfaces/sync-diff.interface'\nimport { SyncPathSettings } from '../interfaces/sync-path.interface'\nimport { getTmpFilePath } from '../utils/functions'\nimport { SYNC_PATH_TO_SPACE_SEGMENTS } from '../utils/routes'\nimport { SyncQueries } from './sync-queries.service'\n\n@Injectable()\nexport class SyncManager {\n private readonly logger = new Logger(SyncManager.name)\n\n constructor(\n private readonly spacesManager: SpacesManager,\n private readonly filesManager: FilesManager,\n private readonly syncQueries: SyncQueries\n ) {}\n\n async download(req: FastifySpaceRequest, res: FastifyReply): Promise<StreamableFile> {\n const sendFile: SendFile = this.filesManager.sendFileFromSpace(req.space)\n try {\n await sendFile.checks()\n return await sendFile.stream(req, res)\n } catch (e) {\n this.handleError(req.space, req.method, e)\n }\n }\n\n async upload(req: FastifySpaceRequest, syncUploadDto: SyncUploadDto): Promise<{ ino: number }> {\n const tmpPath = getTmpFilePath(req.space.realPath)\n try {\n if (syncUploadDto.checksum) {\n const checksum = await this.filesManager.saveStream(req.user, req.space, req, { tmpPath: tmpPath, checksumAlg: SYNC_CHECKSUM_ALG })\n if (checksum !== syncUploadDto.checksum) {\n await removeFiles(tmpPath)\n this.handleError(req.space, req.method, new FileError(HttpStatus.BAD_REQUEST, 'checksums are not identical'))\n }\n } else {\n await this.filesManager.saveStream(req.user, req.space, req, { tmpPath: tmpPath })\n }\n const fileStats = await fs.stat(req.space.realPath)\n if (fileStats.size !== syncUploadDto.size) {\n await removeFiles(tmpPath)\n this.handleError(\n req.space,\n req.method,\n new FileError(HttpStatus.BAD_REQUEST, `sizes are not identical : ${fileStats.size} != ${syncUploadDto.size}`)\n )\n }\n // update mtime\n await touchFile(req.space.realPath, syncUploadDto.mtime)\n // return inode number\n return { ino: fileStats.ino }\n } catch (e) {\n this.handleError(req.space, req.method, e)\n }\n }\n\n async delete(req: FastifySpaceRequest): Promise<void> {\n try {\n return await this.filesManager.delete(req.user, req.space)\n } catch (e) {\n this.handleError(req.space, FILE_OPERATION.DELETE, e)\n }\n }\n\n async props(req: FastifySpaceRequest, syncPropsDto: SyncPropsDto): Promise<void> {\n try {\n await this.filesManager.touch(req.user, req.space, syncPropsDto.mtime, false)\n } catch (e) {\n this.handleError(req.space, FILE_OPERATION.TOUCH, e)\n }\n }\n\n async make(req: FastifySpaceRequest, syncMakeDto: SyncMakeDto): Promise<{ ino: number }> {\n try {\n if (syncMakeDto.type === 'directory') {\n await this.filesManager.mkDir(req.user, req.space, true)\n } else {\n await this.filesManager.mkFile(req.user, req.space, true)\n }\n await touchFile(req.space.realPath, syncMakeDto.mtime)\n return { ino: (await fs.stat(req.space.realPath)).ino }\n } catch (e) {\n this.handleError(req.space, `${FILE_OPERATION.MAKE} ${syncMakeDto.type}`, e)\n }\n }\n\n async copyMove(req: FastifySpaceRequest, syncCopyMoveDto: SyncCopyMoveDto, isMove: true): Promise<void>\n async copyMove(req: FastifySpaceRequest, syncCopyMoveDto: SyncCopyMoveDto, isMove: false): Promise<{ ino: number; mtime: number }>\n async copyMove(req: FastifySpaceRequest, syncCopyMoveDto: SyncCopyMoveDto, isMove: boolean): Promise<void | { ino: number; mtime: number }> {\n const dstSpace: SpaceEnv = await this.spacesManager.spaceEnv(req.user, SYNC_PATH_TO_SPACE_SEGMENTS(syncCopyMoveDto.destination))\n try {\n await this.filesManager.copyMove(req.user, req.space, dstSpace, isMove, true, true)\n if (!isMove) {\n if (syncCopyMoveDto.mtime) {\n // update mtime\n await touchFile(dstSpace.realPath, syncCopyMoveDto.mtime)\n }\n // return inode & mtime\n const stats = await fs.stat(dstSpace.realPath)\n return { ino: stats.ino, mtime: Math.floor(stats.mtime.getTime() / 1000) }\n }\n } catch (e) {\n this.handleError(req.space, isMove ? FILE_OPERATION.MOVE : FILE_OPERATION.COPY, e, dstSpace)\n }\n }\n\n async diff(user: UserModel, pathId: number, syncDiff: SyncDiffDto, res: FastifyReply): Promise<void> {\n if (!user.clientId) {\n throw new HttpException('Client id is missing', HttpStatus.BAD_REQUEST)\n }\n const syncPathSettings: SyncPathSettings = await this.syncQueries.getPathSettings(user.clientId, pathId)\n if (!syncPathSettings) {\n throw new HttpException('Path not found', HttpStatus.NOT_FOUND)\n }\n let space: SpaceEnv\n try {\n space = await this.spacesManager.spaceEnv(user, SYNC_PATH_TO_SPACE_SEGMENTS(syncPathSettings.remotePath))\n } catch (e) {\n throw new HttpException(e.message, HttpStatus.BAD_REQUEST)\n }\n if (!space) {\n throw new HttpException('Space not found', HttpStatus.NOT_FOUND)\n }\n if (space.quotaIsExceeded) {\n throw new HttpException('Storage quota exceeded', HttpStatus.INSUFFICIENT_STORAGE)\n }\n if (!(await isPathExists(space.realPath))) {\n throw new HttpException(`Remote path not found : ${syncPathSettings.remotePath}`, HttpStatus.NOT_FOUND)\n }\n if (!(await isPathIsDir(space.realPath))) {\n throw new HttpException('Remote path must be a directory', HttpStatus.BAD_REQUEST)\n }\n // start\n res.raw.writeHead(200, {\n 'Content-Type': 'text/plain; charset=utf-8',\n 'Transfer-Encoding': 'chunked'\n })\n try {\n for await (const f of this.parseSyncPath(space, syncDiff)) {\n res.raw.write(`${JSON.stringify(f)}\\n`)\n }\n res.raw.write(SYNC_DIFF_DONE)\n } catch (e) {\n this.logger.error(`${this.diff.name} : ${e.message}`)\n res.raw.write(`${e.message}\\n`)\n res.status(HttpStatus.INTERNAL_SERVER_ERROR)\n }\n res.raw.end()\n }\n\n private async *parseSyncPath(space: SpaceEnv, syncDiff: SyncDiffDto): AsyncGenerator<Record<string, SyncFileStats | SyncFileSpecialStats>> {\n const context: ParseDiffContext = {\n regexBasePath: regExpPathPattern(space.realPath),\n syncDiff: syncDiff\n }\n yield* this.parseFiles(space.realPath, context)\n }\n\n private async *parseFiles(dir: string, ctx: ParseDiffContext): AsyncGenerator<Record<string, SyncFileStats | SyncFileSpecialStats>> {\n try {\n for (const entry of await fs.readdir(dir, { withFileTypes: true })) {\n const realPath = path.join(entry.parentPath, entry.name)\n if (!entry.isDirectory() && !entry.isFile()) {\n this.logger.log(`${this.parseFiles.name} - ignore special file: ${realPath}`)\n continue\n }\n if (entry.isDirectory()) {\n const dirStats: Record<string, SyncFileStats | SyncFileSpecialStats> = await this.analyzeFile(entry, ctx)\n if (dirStats !== null) {\n yield dirStats\n }\n yield* this.parseFiles(realPath, ctx)\n } else {\n const fileStats: Record<string, SyncFileStats | SyncFileSpecialStats> = await this.analyzeFile(entry, ctx)\n if (fileStats !== null) {\n yield fileStats\n }\n }\n }\n } catch (e) {\n this.logger.error(`${this.parseFiles.name} - unable to parse directory : ${dir} : ${e}`)\n throw new Error('Unable to parse path')\n }\n }\n\n private async analyzeFile(entry: Dirent, ctx: ParseDiffContext): Promise<Record<string, SyncFileStats | SyncFileSpecialStats>> {\n if (ctx.syncDiff.defaultFilters.has(entry.name)) {\n return null\n }\n\n const realPath = path.join(entry.parentPath, entry.name)\n const filePath = realPath.replace(ctx.regexBasePath, '')\n\n let stats: Stats\n try {\n stats = await fs.stat(realPath)\n } catch (e) {\n this.logger.warn(`${this.analyzeFile.name} - unable to get file stats : ${realPath} : ${e}`)\n return { [filePath]: [F_SPECIAL_STAT.ERROR, e.toString()] }\n }\n\n if (ctx.syncDiff.pathFilters && ctx.syncDiff.pathFilters.test(filePath)) {\n this.logger.verbose(`${this.analyzeFile.name} - ignore filtered file : ${realPath}`)\n return { [filePath]: [F_SPECIAL_STAT.FILTERED, stats.isDirectory()] }\n }\n\n const fileStats: SyncFileStats = [\n stats.isDirectory(),\n stats.isDirectory() ? 0 : stats.size,\n Math.floor(stats.mtime.getTime() / 1000),\n stats.ino,\n null\n ]\n if (ctx.syncDiff.secureDiff && !fileStats[F_STAT.IS_DIR]) {\n try {\n await this.checkSumFile(ctx, filePath, realPath, fileStats)\n } catch (e) {\n this.logger.error(`${this.analyzeFile.name} - file error : ${realPath} - ${e}`)\n return { [filePath]: [F_SPECIAL_STAT.ERROR, e.toString()] }\n }\n }\n return { [filePath]: fileStats }\n }\n\n private async checkSumFile(ctx: ParseDiffContext, filePath: string, realPath: string, fileStats: SyncFileStats): Promise<void> {\n if (!ctx.syncDiff.firstSync && ctx.syncDiff.snapshot.has(filePath)) {\n const snapFileStats: SyncFileStats = ctx.syncDiff.snapshot.get(filePath)\n if (\n snapFileStats[F_STAT.CHECKSUM] &&\n snapFileStats[F_STAT.MTIME] == fileStats[F_STAT.MTIME] &&\n snapFileStats[F_STAT.SIZE] == fileStats[F_STAT.SIZE] &&\n snapFileStats[F_STAT.INO] == fileStats[F_STAT.INO]\n ) {\n fileStats[F_STAT.CHECKSUM] = snapFileStats[F_STAT.CHECKSUM]\n return\n }\n }\n fileStats[F_STAT.CHECKSUM] = await checksumFile(realPath, SYNC_CHECKSUM_ALG)\n }\n\n private handleError(space: SpaceEnv, action: string, e: any, dstSpace?: SpaceEnv) {\n this.logger.error(`unable to ${action} ${space.url}${dstSpace?.url ? ` -> ${dstSpace.url}` : ''} : ${e}`)\n // Remove the last part to avoid exposing the path\n const errorMsg = e.message.split(',')[0]\n if (e instanceof LockConflict) {\n throw new HttpException('The file is locked', HttpStatus.LOCKED)\n } else if (e instanceof FileError) {\n throw new HttpException(errorMsg, e.httpCode)\n }\n throw new HttpException(errorMsg, HttpStatus.INTERNAL_SERVER_ERROR)\n }\n}\n"],"names":["SyncManager","download","req","res","sendFile","filesManager","sendFileFromSpace","space","checks","stream","e","handleError","method","upload","syncUploadDto","tmpPath","getTmpFilePath","realPath","checksum","saveStream","user","checksumAlg","SYNC_CHECKSUM_ALG","removeFiles","FileError","HttpStatus","BAD_REQUEST","fileStats","fs","stat","size","touchFile","mtime","ino","delete","FILE_OPERATION","DELETE","props","syncPropsDto","touch","TOUCH","make","syncMakeDto","type","mkDir","mkFile","MAKE","copyMove","syncCopyMoveDto","isMove","dstSpace","spacesManager","spaceEnv","SYNC_PATH_TO_SPACE_SEGMENTS","destination","stats","Math","floor","getTime","MOVE","COPY","diff","pathId","syncDiff","clientId","HttpException","syncPathSettings","syncQueries","getPathSettings","NOT_FOUND","remotePath","message","quotaIsExceeded","INSUFFICIENT_STORAGE","isPathExists","isPathIsDir","raw","writeHead","f","parseSyncPath","write","JSON","stringify","SYNC_DIFF_DONE","logger","error","name","status","INTERNAL_SERVER_ERROR","end","context","regexBasePath","regExpPathPattern","parseFiles","dir","ctx","entry","readdir","withFileTypes","path","join","parentPath","isDirectory","isFile","log","dirStats","analyzeFile","Error","defaultFilters","has","filePath","replace","warn","F_SPECIAL_STAT","ERROR","toString","pathFilters","test","verbose","FILTERED","secureDiff","F_STAT","IS_DIR","checkSumFile","firstSync","snapshot","snapFileStats","get","CHECKSUM","MTIME","SIZE","INO","checksumFile","action","url","errorMsg","split","LockConflict","LOCKED","httpCode","Logger"],"mappings":"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"}
|
|
@@ -262,7 +262,7 @@ let SyncPathsManager = class SyncPathsManager {
|
|
|
262
262
|
this.notificationsManager.create([
|
|
263
263
|
userId
|
|
264
264
|
], notification, {
|
|
265
|
-
currentUrl: this.contextManager.
|
|
265
|
+
currentUrl: this.contextManager.headerOriginUrl(),
|
|
266
266
|
action: action
|
|
267
267
|
}).catch((e)=>this.logger.error(`${this.notify.name} - ${e}`));
|
|
268
268
|
}
|