@sync-in/server 1.8.1 → 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 +56 -11
- package/environment/environment.dist.yaml +29 -26
- package/package.json +15 -15
- 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 +88 -8
- package/server/applications/files/files.controller.js.map +1 -1
- package/server/applications/files/files.controller.spec.js +11 -4
- 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 +38 -8
- 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/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-queries.service.js +67 -68
- package/server/applications/users/services/users-queries.service.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 +1 -0
- 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 +1393 -44
- 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-MTVSJTIW.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-3R74L4UU.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-LVSNIS5P.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-VJTXJ43D.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-2VMSXRCB.js +0 -12
- package/static/chunk-3OHSRRKH.js +0 -4
- package/static/chunk-3R4WKOHQ.js +0 -1
- package/static/chunk-3XVM35O2.js +0 -1
- package/static/chunk-3YVRP3VM.js +0 -2
- package/static/chunk-5UKZLU5H.js +0 -1
- package/static/chunk-AF24EYXU.js +0 -1
- package/static/chunk-AKQVEHO6.js +0 -2
- package/static/chunk-BCVX464U.js +0 -2
- package/static/chunk-BQV4FRM6.js +0 -1
- package/static/chunk-CETH7UYS.js +0 -1
- package/static/chunk-DIT6W7VM.js +0 -562
- package/static/chunk-DKSEQTMX.js +0 -1
- package/static/chunk-FZ3JPGYZ.js +0 -1
- package/static/chunk-IQSKQXC3.js +0 -1
- package/static/chunk-ITUFI2BJ.js +0 -1
- package/static/chunk-LCTZJ537.js +0 -1
- package/static/chunk-LK2UCQJ6.js +0 -1
- package/static/chunk-LP5TBXEN.js +0 -7
- package/static/chunk-N3U6637P.js +0 -1
- package/static/chunk-NNV4OXSB.js +0 -1
- package/static/chunk-O6FYXVHI.js +0 -1
- package/static/chunk-OOGP4WSH.js +0 -2
- package/static/chunk-PCWDQPOM.js +0 -2
- package/static/chunk-PNR6M34W.js +0 -1
- package/static/chunk-Q5KM7LTX.js +0 -1
- package/static/chunk-QHC6ZPQ4.js +0 -1
- package/static/chunk-QMRBZHE4.js +0 -1
- package/static/chunk-QSJRY3TF.js +0 -1
- package/static/chunk-QUUIRSYT.js +0 -1
- package/static/chunk-RFH46UW3.js +0 -1
- package/static/chunk-RSXHRKM5.js +0 -1
- package/static/chunk-RV3VZJPZ.js +0 -1
- package/static/chunk-S7HNXVRB.js +0 -1
- package/static/chunk-SBZ572Q4.js +0 -2
- package/static/chunk-SJR5R3Y4.js +0 -1
- package/static/chunk-SLHTEGRU.js +0 -1
- package/static/chunk-SSFF27P2.js +0 -24
- package/static/chunk-V3LHHZYN.js +0 -1
- package/static/chunk-VQQKMY2C.js +0 -1
- package/static/chunk-WSSU2HXE.js +0 -1
- package/static/chunk-XDZGW64M.js +0 -3
- package/static/chunk-XTRDKGKG.js +0 -1
- package/static/chunk-YLWTEC3X.js +0 -1
- package/static/chunk-Z5J5F5SX.js +0 -1
- package/static/main-4H5BJY3J.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-manager.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common'\nimport { eq, isNotNull, lte } from 'drizzle-orm'\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\nimport { ACTION } from '../../../common/constants'\nimport { convertDiffUpdate, diffCollection, differencePermissions } from '../../../common/functions'\nimport type { Entries, StorageQuota } from '../../../common/interfaces'\nimport { createSlug, regExpNumberSuffix } from '../../../common/shared'\nimport { configuration } from '../../../configuration/config.environment'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport { FileError } from '../../files/models/file-error'\nimport { dirListFileNames, dirSize, getProps, isPathExists, moveFiles, removeFiles } from '../../files/utils/files'\nimport { LINK_TYPE } from '../../links/constants/links'\nimport { NOTIFICATION_APP, NOTIFICATION_APP_EVENT } from '../../notifications/constants/notifications'\nimport { NotificationContent } from '../../notifications/interfaces/notification-properties.interface'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { CreateOrUpdateShareDto } from '../../shares/dto/create-or-update-share.dto'\nimport type { ShareLink } from '../../shares/interfaces/share-link.interface'\nimport type { ShareProps } from '../../shares/interfaces/share-props.interface'\nimport type { ShareChild } from '../../shares/models/share-child.model'\nimport { SharesManager } from '../../shares/services/shares-manager.service'\nimport { MEMBER_TYPE } from '../../users/constants/member'\nimport { USER_ROLE } from '../../users/constants/user'\nimport { UserModel } from '../../users/models/user.model'\nimport type { User } from '../../users/schemas/user.interface'\nimport { users } from '../../users/schemas/users.schema'\nimport { UsersQueries } from '../../users/services/users-queries.service'\nimport { CACHE_QUOTA_SPACE_PREFIX, CACHE_QUOTA_TTL, CACHE_QUOTA_USER_PREFIX } from '../constants/cache'\nimport {\n SPACE_ALIAS,\n SPACE_ALL_OPERATIONS,\n SPACE_MAX_DISABLED_DAYS,\n SPACE_OPERATION,\n SPACE_PERSONAL,\n SPACE_REPOSITORY,\n SPACE_ROLE,\n SPACE_SHARES\n} from '../constants/spaces'\nimport { CreateOrUpdateSpaceDto, SpaceMemberDto } from '../dto/create-or-update-space.dto'\nimport { DeleteSpaceDto } from '../dto/delete-space.dto'\nimport { SearchSpaceDto } from '../dto/search-space.dto'\nimport { SpaceTrash } from '../interfaces/space-trash.interface'\nimport { SpaceEnv } from '../models/space-env.model'\nimport { SpaceProps } from '../models/space-props.model'\nimport type { SpaceRootProps } from '../models/space-root-props.model'\nimport { SpaceModel } from '../models/space.model'\nimport type { SpaceRoot } from '../schemas/space-root.interface'\nimport type { Space } from '../schemas/space.interface'\nimport { spaces } from '../schemas/spaces.schema'\nimport { quotaKeyFromSpace } from '../utils/paths'\nimport { haveSpacePermission } from '../utils/permissions'\nimport { SpacesQueries } from './spaces-queries.service'\n\n@Injectable()\nexport class SpacesManager {\n private readonly logger = new Logger(SpacesManager.name)\n\n constructor(\n private readonly contextManager: ContextManager,\n private readonly spacesQueries: SpacesQueries,\n private readonly usersQueries: UsersQueries,\n private readonly sharesManager: SharesManager,\n private readonly notificationsManager: NotificationsManager\n ) {}\n\n listSpaces(userId: number): Promise<Partial<SpaceProps>[]> {\n return this.spacesQueries.spaces(userId)\n }\n\n spacesWithDetails(userId: number): Promise<SpaceProps[]> {\n return this.spacesQueries.spacesWithDetails(userId)\n }\n\n uniqueRootName(name: string, names: string[]) {\n if (names.find((fName: string) => name.toLowerCase() === fName.toLowerCase())) {\n const nameExtension = path.extname(name)\n const nameWithoutExtension = path.basename(name, nameExtension)\n const originalName = nameWithoutExtension.replace(regExpNumberSuffix, '')\n let count = 1\n let newName = `${originalName}-${count}${nameExtension}`\n while (names.find((fName: string) => newName.toLowerCase() === fName.toLowerCase())) {\n count += 1\n newName = `${originalName}-${count}${nameExtension}`\n }\n return newName\n }\n return null\n }\n\n async spaceEnv(user: UserModel, urlSegments: string[], skipEndpointProtection = false): Promise<SpaceEnv> {\n /* SpaceEnv builder */\n let [repository, spaceAlias, rootAlias, ...paths] = urlSegments\n\n if (\n !repository ||\n (!spaceAlias && repository !== SPACE_REPOSITORY.SHARES) ||\n Object.values(SPACE_REPOSITORY).indexOf(repository as SPACE_REPOSITORY) === -1\n ) {\n throw new Error(`Space path is not valid : ${urlSegments}`)\n }\n\n let space: SpaceEnv\n if (spaceAlias === SPACE_ALIAS.PERSONAL) {\n /* Personal Space (static) */\n if (rootAlias) {\n // there is no root in a personal space\n paths.unshift(rootAlias)\n rootAlias = null\n }\n space = new SpaceEnv(SPACE_PERSONAL, rootAlias, false)\n } else if (repository === SPACE_REPOSITORY.SHARES) {\n if (spaceAlias) {\n /* Share */\n const spacePermissions: Partial<SpaceEnv> = await this.sharesManager.permissions(user, spaceAlias)\n if (spacePermissions) {\n space = new SpaceEnv(spacePermissions, null, false)\n }\n } else {\n /* Shares List (static) */\n space = new SpaceEnv(SPACE_SHARES, null, false)\n }\n } else {\n /* Space */\n if (repository === SPACE_REPOSITORY.TRASH && rootAlias) {\n // there is no root in a trash space\n paths.unshift(rootAlias)\n rootAlias = null\n }\n const spacePermissions: Partial<SpaceEnv> = await this.spacesQueries.permissions(user.id, spaceAlias, rootAlias)\n if (spacePermissions) {\n space = new SpaceEnv(spacePermissions, rootAlias || '')\n }\n }\n if (!space) return null\n try {\n space.setup(user, repository as SPACE_REPOSITORY, rootAlias, paths, urlSegments, skipEndpointProtection)\n await this.setQuotaExceeded(user, space)\n return space\n } catch (e) {\n this.logger.warn(`${this.spaceEnv.name} - *${space.alias}* : ${e}`)\n throw new HttpException(e.message, e instanceof FileError ? e.httpCode : HttpStatus.BAD_REQUEST)\n }\n }\n\n async searchSpaces(userId: number, searchSpaceDto: SearchSpaceDto): Promise<SpaceProps[]> {\n const sps: SpaceProps[] = []\n for (const s of await this.spacesQueries.spaces(userId, true)) {\n if (searchSpaceDto.shareInsidePermission && !haveSpacePermission(s, SPACE_OPERATION.SHARE_INSIDE)) {\n continue\n }\n if (!searchSpaceDto.search || `${s.name} ${s.alias} ${s.description || ''}`.toLowerCase().indexOf(searchSpaceDto.search) > -1) {\n sps.push(s)\n }\n if (sps.length >= searchSpaceDto.limit) {\n break\n }\n }\n return sps\n }\n\n async listSpacesWithPermissions(user: UserModel): Promise<SpaceEnv[]> {\n return Promise.all(\n (await this.spacesQueries.spaces(user.id, true)).map(async (s) => {\n const space = new SpaceEnv(s)\n await this.setQuotaExceeded(user, space)\n return space\n })\n )\n }\n\n async listTrashes(user: UserModel): Promise<SpaceTrash[]> {\n const trashes: SpaceTrash[] = []\n // todo: store 'Personal files' as const somewhere (used in frontend too)\n const personalTrash: SpaceTrash = { id: 0, name: 'Personal files', alias: SPACE_ALIAS.PERSONAL, nb: 0, mtime: 0, ctime: 0 }\n for (const space of [...(await this.listSpaces(user.id)), personalTrash] as SpaceTrash[]) {\n const rPath = space.alias === SPACE_ALIAS.PERSONAL ? user.trashPath : SpaceModel.getTrashPath(space.alias)\n try {\n space.nb = (await fs.readdir(rPath)).filter((f) => configuration.applications.files.showHiddenFiles || f[0] !== '.').length\n if (space.nb) {\n const stats = await fs.stat(rPath)\n space.mtime = stats.mtime.getTime()\n space.ctime = stats.birthtime.getTime()\n trashes.push(space)\n }\n } catch (e) {\n this.logger.error(`${this.listTrashes.name} - ${e}`)\n }\n }\n return trashes\n }\n\n async getSpace(user: UserModel, spaceId: number): Promise<SpaceProps> {\n const space: SpaceProps = await this.userCanAccessSpace(user.id, spaceId, true)\n if (space.roots?.length && !user.isAdmin) {\n // remove external path if the current user is not an administrator\n for (const root of space.roots) {\n root.externalPath = null\n }\n }\n return space\n }\n\n async createSpace(user: UserModel, createOrUpdateSpaceDto: CreateOrUpdateSpaceDto): Promise<SpaceProps> {\n /* only users with admin space role can create a space */\n // create space\n const space: SpaceProps = new SpaceProps({\n name: createOrUpdateSpaceDto.name,\n alias: await this.uniqueSpaceAlias(createOrUpdateSpaceDto.name, true),\n description: createOrUpdateSpaceDto.description,\n enabled: createOrUpdateSpaceDto.enabled,\n storageQuota: createOrUpdateSpaceDto.storageQuota,\n storageIndexing: createOrUpdateSpaceDto.storageIndexing,\n disabledAt: createOrUpdateSpaceDto.enabled ? null : new Date()\n })\n try {\n space.id = await this.spacesQueries.createSpace(space)\n } catch (e) {\n this.logger.error(`${this.createSpace.name} - unable to create space *${space.alias}* : ${e}`)\n throw new HttpException('Unable to create space', e)\n }\n // create space paths\n await SpaceModel.makePaths(space.alias)\n // add roots\n await this.updateRoots(user, space, space.roots, createOrUpdateSpaceDto.roots, [], [])\n // add members\n await this.updateMembers(user, space, createOrUpdateSpaceDto.members.concat(createOrUpdateSpaceDto.managers))\n // create links after members, user must be a space manager to create links\n await this.sharesManager.createOrUpdateLinksAsMembers(user, space, LINK_TYPE.SPACE, createOrUpdateSpaceDto.links)\n return this.spacesQueries.getSpaceAsManager(user.id, space.id)\n }\n\n async updateSpace(user: UserModel, spaceId: number, createOrUpdateSpaceDto: CreateOrUpdateSpaceDto): Promise<SpaceProps> {\n /* only managers of the space can update it */\n const space: SpaceProps = await this.userCanAccessSpace(user.id, spaceId, true)\n // check and update space info\n const spaceDiffProps: Partial<SpaceProps> = { modifiedAt: new Date() }\n const props: (keyof CreateOrUpdateSpaceDto)[] = ['name', 'description', 'enabled', 'storageQuota', 'storageIndexing']\n for (const prop of props) {\n if (createOrUpdateSpaceDto[prop] !== space[prop]) {\n spaceDiffProps[prop] = createOrUpdateSpaceDto[prop]\n if (prop === 'name') {\n spaceDiffProps.alias = await this.uniqueSpaceAlias(spaceDiffProps.name, true)\n if (space.alias !== spaceDiffProps.alias) {\n // must move the space to match the new alias\n const spaceLocationWasRenamed: boolean = await this.renameSpaceLocation(space.alias, spaceDiffProps.alias)\n if (!spaceLocationWasRenamed) {\n throw new HttpException('Unable to rename space', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n space.alias = spaceDiffProps.alias\n }\n } else if (prop === 'enabled') {\n spaceDiffProps.disabledAt = spaceDiffProps[prop] ? null : new Date()\n }\n }\n }\n // updates in db\n this.spacesQueries.updateSpace(spaceId, spaceDiffProps).catch((e: Error) => this.logger.error(`${this.updateSpace.name} - ${e}`))\n // checks & updates members\n const linkMembers: SpaceMemberDto[] = await this.sharesManager.createOrUpdateLinksAsMembers(\n user,\n space,\n LINK_TYPE.SPACE,\n createOrUpdateSpaceDto.links\n )\n const rootOwnerIds: number[] = await this.updateMembers(user, space, [\n ...createOrUpdateSpaceDto.members,\n ...createOrUpdateSpaceDto.managers,\n ...linkMembers\n ])\n if (rootOwnerIds.length) {\n // removes the roots of removed members or those no longer having the `share inside` permission\n createOrUpdateSpaceDto.roots = createOrUpdateSpaceDto.roots.filter((r) => rootOwnerIds.indexOf(r.owner.id) === -1)\n }\n // checks & updates roots\n const aliases: string[] = space.roots.map((r) => r.alias)\n const names: string[] = [...(await dirListFileNames(SpaceModel.getFilesPath(space.alias))), ...space.roots.map((r) => r.name)]\n await this.updateRoots(user, space, space.roots, createOrUpdateSpaceDto.roots, aliases, names)\n if (rootOwnerIds.indexOf(user.id) > -1) {\n // current manager was removed\n return null\n } else {\n return this.spacesQueries.getSpaceAsManager(user.id, spaceId)\n }\n }\n\n async deleteSpace(user: UserModel, spaceId: number, deleteSpaceDto?: DeleteSpaceDto) {\n /* only managers of the space can disable it */\n const space: SpaceProps = await this.userCanAccessSpace(user.id, spaceId, true)\n // only admin can delete the space data, managers can only disable the space for 30 days\n const deleteNow: boolean = user.isAdmin && !!deleteSpaceDto?.deleteNow\n try {\n if (deleteNow) {\n await this.sharesManager.deleteAllLinkMembers(spaceId, LINK_TYPE.SPACE)\n }\n await this.deleteOrDisableSpace(space, deleteNow)\n this.logger.log(`${this.deleteSpace.name} - *${space.alias}* (${space.id}) was ${deleteNow ? 'deleted' : 'disabled'}`)\n } catch (e) {\n this.logger.error(`${this.deleteSpace.name} - *${space.alias}* (${space.id}) was not ${deleteNow ? 'deleted' : 'disabled'} : ${e}`)\n throw new HttpException('Unable to delete space', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async getUserRoots(user: UserModel, spaceId: number): Promise<SpaceRootProps[]> {\n /* if user has no permissions on the space an empty array will be returned */\n return this.spacesQueries.getSpaceRoots(spaceId, user.id)\n }\n\n async updateUserRoots(user: UserModel, spaceId: number, userRoots: SpaceRootProps[], addOnly: boolean = false): Promise<SpaceRootProps[]> {\n const space: Partial<SpaceProps> = await this.userCanAccessSpace(user.id, spaceId)\n if (space.role !== SPACE_ROLE.IS_MANAGER && !haveSpacePermission(space, SPACE_OPERATION.SHARE_INSIDE)) {\n this.logger.warn(`is not allowed to share inside on this space : *${space.alias}* (${space.id})`)\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n // current states\n const spaceRoots: SpaceRootProps[] = await this.spacesQueries.getSpaceRoots(spaceId)\n const aliases = spaceRoots.map((r) => r.alias)\n const names = [...(await dirListFileNames(SpaceModel.getFilesPath(space.alias))), ...spaceRoots.map((r) => r.name)]\n // force owner.id on new user roots (owner is optional and required for the next steps)\n userRoots.forEach((r: SpaceRootProps) => (r.owner = { id: user.id }))\n if (addOnly) {\n // short circuit the `updateRoots` function\n // we need to provide all space roots to avoid collisions on aliases and names for new user roots\n const toAdd: SpaceRootProps[] = await this.validateNewRoots(user, space, spaceRoots, userRoots, aliases, names)\n const status: Record<Exclude<ACTION, ACTION.DELETE_PERMANENTLY>, SpaceRootProps[]> = await this.spacesQueries.updateSpaceRoots(\n user.id,\n space.id,\n toAdd,\n [],\n []\n )\n Object.entries(status).forEach(([action, roots]: [ACTION, SpaceRootProps[]]) =>\n this.clearCachePermissionsAndOrNotify(space, action, user, null, roots).catch((e: Error) =>\n this.logger.error(`${this.updateUserRoots.name} - ${e}`)\n )\n )\n return this.getUserRoots(user, spaceId)\n } else {\n const currentUserRoots: SpaceRootProps[] = spaceRoots.filter((r) => r.owner?.id === user.id)\n await this.updateRoots(user, space, currentUserRoots, userRoots, aliases, names)\n return this.spacesQueries.getSpaceRoots(spaceId, user.id)\n }\n }\n\n async uniqueRootAlias(spaceId: number, alias: string, aliasesAndNames: string[], replaceCount = false): Promise<string> {\n /* for some webdav clients the root alias is displayed instead of the file name.\n * This is why a root alias must be unique for files too */\n if (aliasesAndNames.find((fName: string) => alias.toLowerCase() === fName.toLowerCase())) {\n const aliasExtension = path.extname(alias)\n const aliasWithoutExtension = path.basename(alias, aliasExtension)\n const originalAlias = createSlug(aliasWithoutExtension, replaceCount)\n let count = 1\n let newAlias = `${originalAlias}-${count}${aliasExtension}`\n while (await this.spacesQueries.spaceRootExistsForAlias(spaceId, newAlias)) {\n count += 1\n newAlias = `${originalAlias}-${count}${aliasExtension}`\n }\n return newAlias\n }\n return null\n }\n\n async updatePersonalSpacesQuota(forUser?: UserModel) {\n const props: (keyof User)[] = ['id', 'login', 'storageUsage', 'storageQuota']\n for (const user of await this.usersQueries.selectUsers(props, [\n lte(users.role, USER_ROLE.USER),\n ...(forUser ? [eq(users.id, forUser.id)] : [])\n ])) {\n const userPath = UserModel.getHomePath(user.login)\n if (!(await isPathExists(userPath))) {\n this.logger.warn(`${this.updatePersonalSpacesQuota.name} - *${user.login}* home path does not exist`)\n continue\n }\n const [size, errors] = await dirSize(userPath)\n for (const [path, error] of Object.entries(errors)) {\n this.logger.warn(`${this.updatePersonalSpacesQuota.name} - unable to get size for *${user.login}* on ${path} : ${error}`)\n }\n const spaceQuota: StorageQuota = { storageUsage: size, storageQuota: user.storageQuota }\n this.spacesQueries.cache\n .set(`${CACHE_QUOTA_USER_PREFIX}-${user.id}`, spaceQuota, CACHE_QUOTA_TTL)\n .catch((e: Error) => this.logger.error(`${this.updatePersonalSpacesQuota.name} - ${e}`))\n if (user.storageUsage !== spaceQuota.storageUsage) {\n this.logger.log(\n `${this.updatePersonalSpacesQuota.name} - user *${user.login}* (${user.id}) : storage usage updated : ${spaceQuota.storageUsage}`\n )\n await this.usersQueries.updateUserOrGuest(user.id, { storageUsage: spaceQuota.storageUsage })\n }\n }\n }\n\n async updateSpacesQuota(spaceId?: number) {\n for (const space of await this.spacesQueries.spacesQuotaPaths(spaceId)) {\n const spacePath = SpaceModel.getHomePath(space.alias)\n if (!(await isPathExists(spacePath))) {\n this.logger.warn(`${this.updateSpacesQuota.name} - *${space.alias}* home path does not exist`)\n continue\n }\n let size = 0\n for (const rPath of [spacePath, ...space.externalPaths.filter(Boolean)]) {\n const [rPathSize, errors] = await dirSize(rPath)\n size += rPathSize\n for (const [path, error] of Object.entries(errors)) {\n this.logger.warn(`${this.updateSpacesQuota.name} - unable to get size for *${space.alias}* on ${path} : ${error}`)\n }\n }\n const spaceQuota: StorageQuota = { storageUsage: size, storageQuota: space.storageQuota }\n this.spacesQueries.cache\n .set(`${CACHE_QUOTA_SPACE_PREFIX}-${space.id}`, spaceQuota, CACHE_QUOTA_TTL)\n .catch((e: Error) => this.logger.error(`${this.updateSpacesQuota.name} - ${e}`))\n if (space.storageUsage !== spaceQuota.storageUsage) {\n this.logger.log(`${this.updateSpacesQuota.name} - space *${space.alias}* (${space.id}) : storage usage updated : ${spaceQuota.storageUsage}`)\n await this.spacesQueries.updateSpace(space.id, { storageUsage: spaceQuota.storageUsage })\n }\n }\n }\n\n async deleteExpiredSpaces() {\n /* Removes spaces that have been disabled for more than 30 days */\n const props: (keyof Space)[] = ['id', 'name', 'alias', 'disabledAt']\n for (const space of await this.spacesQueries.selectSpaces(props, [eq(spaces.enabled, false), isNotNull(spaces.disabledAt)])) {\n const disabled = new Date(space.disabledAt)\n disabled.setDate(disabled.getDate() + SPACE_MAX_DISABLED_DAYS)\n if (new Date() > disabled) {\n try {\n await this.sharesManager.deleteAllLinkMembers(space.id, LINK_TYPE.SPACE)\n await this.deleteOrDisableSpace(space, true)\n this.logger.log(`${this.deleteExpiredSpaces.name} - space *${space.alias}* (${space.id}) was deleted`)\n } catch (e) {\n this.logger.error(`${this.deleteExpiredSpaces.name} - space *${space.alias}* (${space.id}) was not deleted : ${e}`)\n }\n }\n }\n }\n\n async listSpaceShares(user: UserModel, spaceId: number): Promise<ShareChild[]> {\n if (await this.userIsSpaceManager(user, spaceId)) {\n return this.sharesManager.listSpaceShares(spaceId)\n }\n }\n\n async getSpaceShare(user: UserModel, spaceId: number, shareId: number): Promise<ShareProps> {\n if (await this.userIsSpaceManager(user, spaceId, shareId)) {\n return this.sharesManager.getShareWithMembers(user, shareId, true)\n }\n }\n\n async updateSpaceShare(user: UserModel, spaceId: number, shareId: number, createOrUpdateShareDto: CreateOrUpdateShareDto): Promise<ShareProps> {\n if (await this.userIsSpaceManager(user, spaceId, shareId)) {\n return this.sharesManager.updateShare(user, shareId, createOrUpdateShareDto, true)\n }\n }\n\n async deleteSpaceShare(user: UserModel, spaceId: number, shareId: number): Promise<void> {\n if (await this.userIsSpaceManager(user, spaceId, shareId)) {\n return this.sharesManager.deleteShare(user, shareId, true)\n }\n }\n\n async getSpaceShareLink(user: UserModel, spaceId: number, shareId: number): Promise<ShareLink> {\n if (await this.userIsSpaceManager(user, spaceId, shareId)) {\n return this.sharesManager.getShareLink(user, shareId, true)\n }\n }\n\n private async updateMembers(user: UserModel, space: SpaceProps, currentMembers: SpaceMemberDto[]): Promise<number[]> {\n if (space.members.length === 0 && currentMembers.length === 0) {\n return\n }\n // diff\n const [add, update, remove]: [SpaceMemberDto[], Record<string | 'object', { old: any; new: any } | SpaceMemberDto>[], SpaceMemberDto[]] =\n diffCollection(space.members, currentMembers, ['permissions', 'spaceRole'], ['id', 'type'])\n\n // check members whitelists\n let toAdd: SpaceMemberDto[] = []\n if (add.length) {\n const [userIdsWhitelist, groupIdsWhitelist] = await Promise.all([\n this.usersQueries.usersWhitelist(user.id),\n this.usersQueries.groupsWhitelist(user.id)\n ])\n toAdd = add.filter((m) => {\n if (\n ((m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST) && !m.linkId && userIdsWhitelist.indexOf(m.id) === -1) ||\n ((m.type === MEMBER_TYPE.GROUP || m.type === MEMBER_TYPE.PGROUP) && groupIdsWhitelist.indexOf(m.id) === -1)\n ) {\n this.logger.warn(\n `${this.updateMembers.name} - cannot add ${m.type} (${m.id}) to space *${space.alias}* (${space.id}) : not in the members whitelist`\n )\n return false\n }\n return true\n })\n }\n\n // filter links\n const toRemove: SpaceMemberDto[] = remove.filter((m) => !m.linkId)\n // do remove links\n this.sharesManager.deleteLinkMembers(remove.filter((m) => !!m.linkId)).catch((e: Error) => this.logger.error(`${this.updateMembers.name} - ${e}`))\n // do update members\n const status: Record<\n Exclude<ACTION, ACTION.DELETE_PERMANENTLY>,\n {\n groupIds: number[]\n userIds: number[]\n }\n > = await this.spacesQueries.updateMembers(space.id, toAdd, convertDiffUpdate(update), toRemove)\n\n // lists deleted and updated members as potential share or space roots owners\n const [rmShareOwners, upShareOwners, rmRootOwners]: [\n SpaceMemberDto[],\n {\n object: SpaceMemberDto\n rmPermissions: SPACE_OPERATION[]\n }[],\n number[]\n ] = [[], [], []]\n\n for (const [action, members] of Object.entries(status) as Entries<typeof status>) {\n if (!members.userIds.length && !members.groupIds.length) continue\n if (action === ACTION.DELETE) {\n // stores the removed members who might own shares created from the current space\n rmShareOwners.push(\n ...toRemove.filter(\n (m) =>\n ((m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST) && members.userIds.indexOf(m.id) > -1) ||\n ((m.type === MEMBER_TYPE.GROUP || m.type === MEMBER_TYPE.PGROUP) && members.groupIds.indexOf(m.id) > -1)\n )\n )\n // stores ids of removed members that might have space roots\n rmRootOwners.push(...members.userIds)\n } else if (action === ACTION.UPDATE) {\n // stores permissions updates and members who might own shares created from the current space\n // ignore space managers (they have all permissions)\n for (const m of update as {\n object: SpaceMemberDto\n permissions?: { old: string; new: string }\n spaceRole?: { old: number; new: number }\n }[]) {\n if (\n ((m.object.type === MEMBER_TYPE.USER || m.object.type === MEMBER_TYPE.GUEST) &&\n m.object.spaceRole !== SPACE_ROLE.IS_MANAGER &&\n members.userIds.indexOf(m.object.id) > -1) ||\n ((m.object.type === MEMBER_TYPE.GROUP || m.object.type === MEMBER_TYPE.PGROUP) && members.groupIds.indexOf(m.object.id) > -1)\n ) {\n // special case, the manager was moved to members without permissions change\n if (!m.permissions && m.spaceRole.new === SPACE_ROLE.IS_MEMBER) {\n m.permissions = { old: SPACE_ALL_OPERATIONS, new: m.object.permissions }\n }\n // `share inside` permission is only used for spaces\n const diffPermissions = differencePermissions(m.permissions.old, m.permissions.new).filter((p) => p !== SPACE_OPERATION.SHARE_INSIDE)\n if (diffPermissions.length) {\n upShareOwners.push({ object: m.object, rmPermissions: diffPermissions as SPACE_OPERATION[] })\n }\n }\n }\n }\n // clear cache &|| notify\n this.onSpaceActionForMembers(space, action, members, user).catch((e: Error) => this.logger.error(`${this.updateMembers.name} - ${e}`))\n }\n // do updates\n // remove or update potential shares\n this.sharesManager\n .updateSharesFromSpace(space.id, currentMembers, rmShareOwners, upShareOwners)\n .catch((e: Error) => this.logger.error(`${this.updateMembers.name} - ${e}`))\n // return potential root owner ids\n return rmRootOwners\n }\n\n private async updateRoots(\n user: UserModel,\n space: Partial<SpaceProps>,\n curRoots: SpaceRootProps[],\n newRoots: SpaceRootProps[],\n aliases: string[],\n names: string[]\n ) {\n // diff\n const [add, toUpdate, toRemove]: [\n SpaceRootProps[],\n Record<\n string | 'object',\n | {\n old: any\n new: any\n }\n | SpaceRootProps\n | any\n >[],\n SpaceRootProps[]\n ] = diffCollection(curRoots, newRoots, ['name', 'alias', 'permissions'])\n\n // update\n for (const props of toUpdate) {\n if ('alias' in props) {\n props.alias.new = (await this.uniqueRootAlias(space.id, props.alias.new, aliases.concat(names), true)) || props.alias.new\n // remove from space cache permissions\n this.spacesQueries\n .clearCachePermissions(space.alias, [props.alias.old, props.alias.new])\n .catch((e: Error) => this.logger.error(`${this.updateRoots.name} - ${e}`))\n // update aliases list for next roots\n aliases.push(props.alias.new)\n }\n if ('name' in props) {\n props.name.new = this.uniqueRootName(props.name.new, names) || props.name.new\n // update names list for next roots\n names.push(props.name.new)\n }\n }\n\n // format actions\n const toAdd = await this.validateNewRoots(user, space, curRoots, add, aliases, names)\n\n // remove a root implies that all shares with a reference to root.id will be deleted in cascade\n // however, it is \"cleaner\" to warn users about the deletion of these shares and to clear the permission caches before the cascade deletion\n // it must be assumed that the deletion and modifications of space roots will be successful\n const [rmRoots, rmRootPermissions]: [\n SpaceRoot['id'][],\n {\n id: SpaceRoot['id']\n rmPermissions: SPACE_OPERATION[]\n }[]\n ] = [\n toRemove.map((r) => r.id),\n (toUpdate as any).reduce((acc: typeof rmRootPermissions, r: any): typeof rmRootPermissions => {\n if (r.permissions !== undefined) {\n const diffPermissions = differencePermissions(r.permissions.old, r.permissions.new) as SPACE_OPERATION[]\n if (diffPermissions.length) {\n acc.push({ id: r.object.id, rmPermissions: diffPermissions })\n }\n }\n return acc\n }, [])\n ]\n // do share updates\n await this.sharesManager.updateSharesFromSpaceRoots(space.id, rmRoots, rmRootPermissions)\n\n // do root updates\n const status: Record<Exclude<ACTION, ACTION.DELETE_PERMANENTLY>, SpaceRootProps[]> = await this.spacesQueries.updateSpaceRoots(\n user.id,\n space.id,\n toAdd,\n convertDiffUpdate(toUpdate),\n toRemove\n )\n Object.entries(status).forEach(([action, roots]: [ACTION, SpaceRootProps[]]) =>\n this.clearCachePermissionsAndOrNotify(space, action, user, null, roots).catch((e: Error) =>\n this.logger.error(`${this.updateRoots.name} - ${e}`)\n )\n )\n }\n\n private async validateNewRoots(\n user: UserModel,\n space: Partial<SpaceProps>,\n curRoots: SpaceRootProps[],\n newRoots: SpaceRootProps[],\n aliases: string[],\n names: string[]\n ): Promise<SpaceRootProps[]> {\n const toAdd: SpaceRootProps[] = []\n for (const r of newRoots) {\n if (r.externalPath && !user.isAdmin) {\n this.logger.warn(`ignore new root *${r.alias}* (${r.externalPath}) : adding an external path requires the admin role`)\n continue\n }\n const rPath = r.externalPath || path.join(user.filesPath, r.file.path)\n if (!(await isPathExists(rPath))) {\n this.logger.warn(`ignore new root *${r.alias}* (${r.file.path}) : *${rPath}* does not exist`)\n continue\n }\n // check if a parent exists for an externalPath or if the file (or parent) is already anchored\n let rExists: SpaceRootProps\n if (r.externalPath) {\n rExists = curRoots.find((cr) => cr.externalPath && r.externalPath.startsWith(cr.externalPath))\n } else {\n rExists = curRoots.find(\n (cr) => cr.file?.id === r.file.id || (cr.owner?.id === r.owner.id && cr.file?.path && r.file.path.startsWith(cr.file.path))\n )\n }\n if (rExists) {\n this.logger.warn(`ignore new root *${r.alias}* (${r.externalPath || r.file.path}) (${r.file?.id}) : parent or file already exists in roots`)\n continue\n }\n // keep the file id (maybe already in db)\n if (!r.externalPath) {\n r.file = { ...(await getProps(rPath, r.file.path)), id: r.file.id }\n }\n r.alias = (await this.uniqueRootAlias(space.id, r.alias, aliases.concat(names), true)) || r.alias\n // update aliases list for next roots\n aliases.push(r.alias)\n r.name = this.uniqueRootName(r.name, names) || r.name\n // update names list for next roots\n names.push(r.name)\n // reset id\n r.id = 0\n toAdd.push(r)\n }\n return toAdd\n }\n\n private async deleteOrDisableSpace(space: Partial<SpaceProps>, deleteNow: boolean = false) {\n if (deleteNow) {\n // clear cache &|| notify\n const memberIds: { groupIds: number[]; userIds: number[] } = await this.spacesQueries.getSpaceMemberIds(space.id)\n this.onSpaceActionForMembers(space, ACTION.DELETE_PERMANENTLY, memberIds).catch((e: Error) =>\n this.logger.error(`${this.deleteOrDisableSpace.name} - ${e}`)\n )\n // remove all shares related to the space\n await this.sharesManager.removeSharesFromSpace(space.id)\n }\n await this.spacesQueries.deleteSpace(space.id, deleteNow)\n if (deleteNow) {\n this.spacesQueries.cache\n .del(`${CACHE_QUOTA_SPACE_PREFIX}-${space.id}`)\n .catch((e: Error) => this.logger.error(`${this.deleteOrDisableSpace.name} - ${e}`))\n await this.deleteSpaceLocation(space.alias)\n }\n }\n\n private async deleteSpaceLocation(spaceAlias: string) {\n const spaceLocation = SpaceModel.getHomePath(spaceAlias)\n if (await isPathExists(spaceLocation)) {\n await removeFiles(spaceLocation)\n this.logger.warn(`${this.deleteSpaceLocation.name} - space *${spaceAlias}* location was deleted`)\n } else {\n this.logger.warn(`${this.deleteSpaceLocation.name} - space *${spaceAlias}* location does not exist : ${spaceLocation}`)\n }\n }\n\n private async renameSpaceLocation(oldSpaceAlias: string, newSpaceAlias: string): Promise<boolean> {\n const currentSpaceLocation: string = SpaceModel.getHomePath(oldSpaceAlias)\n if (await isPathExists(currentSpaceLocation)) {\n const newSpaceLocation: string = SpaceModel.getHomePath(newSpaceAlias)\n if (await isPathExists(newSpaceLocation)) {\n this.logger.warn(`${this.renameSpaceLocation.name} - *${newSpaceAlias}* home path already exists : ${newSpaceLocation}`)\n return false\n } else {\n try {\n await moveFiles(currentSpaceLocation, newSpaceLocation)\n return true\n } catch (e) {\n // try to restore\n await moveFiles(newSpaceLocation, currentSpaceLocation, true)\n this.logger.error(\n `${this.renameSpaceLocation.name} - unable to rename space location from *${currentSpaceLocation}* to *${newSpaceLocation}* : ${e}`\n )\n return false\n }\n }\n } else {\n this.logger.warn(`${this.renameSpaceLocation.name} - *${oldSpaceAlias}* space location does not exist : ${currentSpaceLocation}`)\n return false\n }\n }\n\n private async uniqueSpaceAlias(name: string, replaceCount = false): Promise<string> {\n let alias = createSlug(name, replaceCount)\n let count = 0\n // Personal space name is reserved\n if (alias === SPACE_ALIAS.PERSONAL) {\n count += 1\n alias = `${name}-${count}`\n }\n while (await this.spacesQueries.spaceExistsForAlias(alias)) {\n count += 1\n alias = `${name}-${count}`\n }\n return alias\n }\n\n private async userCanAccessSpace(userId: number, spaceId: number, asManager: true): Promise<SpaceProps>\n private async userCanAccessSpace(userId: number, spaceId: number, asManager?: false): Promise<Partial<SpaceProps>>\n private async userCanAccessSpace(userId: number, spaceId: number, asManager: boolean = false): Promise<Partial<SpaceProps>> {\n if (asManager) {\n // Get all space details if user is a manager\n const space: SpaceProps = await this.spacesQueries.getSpaceAsManager(userId, spaceId)\n if (!space) {\n this.logger.warn(`space (${spaceId}) not found or not authorized for user (${userId})`)\n throw new HttpException('Not authorized', HttpStatus.FORBIDDEN)\n }\n return space\n } else {\n const [space]: SpaceProps[] = await this.spacesQueries.spaces(userId, true, spaceId)\n if (!space) {\n this.logger.warn(`space (${spaceId}) not found or not authorized for user (${userId})`)\n throw new HttpException('Space not found', HttpStatus.NOT_FOUND)\n }\n return space\n }\n }\n\n private async userIsSpaceManager(user: UserModel, spaceId: number, shareId?: number): Promise<boolean> {\n if (!(await this.spacesQueries.userIsSpaceManager(user.id, spaceId, shareId))) {\n this.logger.warn(`space (${spaceId}) not found or not authorized for user (${user.id})`)\n throw new HttpException('Not authorized', HttpStatus.FORBIDDEN)\n }\n return true\n }\n\n private async setQuotaExceeded(user: UserModel, space: SpaceEnv) {\n /* extract quota from spaces|shares|roots */\n if (space.inSharesList) {\n return\n }\n const cacheQuotaKey = quotaKeyFromSpace(user.id, space)\n if (!cacheQuotaKey) {\n this.logger.verbose(`${this.setQuotaExceeded.name} - quota was ignored for space : *${space.alias}* (${space.id})`)\n return\n }\n let quota: StorageQuota = await this.spacesQueries.cache.get(cacheQuotaKey)\n if (!quota) {\n // the quota scheduler has not started yet or the cache has been cleared\n if (space.inPersonalSpace) {\n await this.updatePersonalSpacesQuota(user)\n } else if (space.inSharesRepository) {\n // Shares with external paths\n await this.sharesManager.updateSharesExternalPathQuota(space.id)\n } else {\n await this.updateSpacesQuota(space.id)\n }\n quota = await this.spacesQueries.cache.get(cacheQuotaKey)\n }\n if (quota) {\n space.storageUsage = quota.storageUsage\n space.storageQuota = quota.storageQuota\n space.quotaIsExceeded = quota.storageQuota !== null && quota.storageUsage >= quota.storageQuota\n } else {\n this.logger.verbose(`${this.setQuotaExceeded.name} - quota not found for space : *${space.alias}* (${space.id})`)\n }\n }\n\n private async onSpaceActionForMembers(\n space: Partial<SpaceProps>,\n action: ACTION,\n members: {\n groupIds: number[]\n userIds: number[]\n },\n user?: UserModel\n ) {\n this.clearCachePermissionsAndOrNotify(\n space,\n action,\n user,\n Array.from(new Set([...(await this.usersQueries.allUserIdsFromGroupsAndSubGroups(members.groupIds)), ...members.userIds])).filter(\n (uid) => uid !== user?.id\n )\n ).catch((e: Error) => this.logger.error(`${this.onSpaceActionForMembers.name} - ${e}`))\n }\n\n private async clearCachePermissionsAndOrNotify(\n space: Partial<SpaceProps>,\n action: ACTION,\n user?: UserModel,\n memberIds?: number[],\n roots?: SpaceRootProps[]\n ): Promise<void> {\n if (memberIds?.length) {\n // clear permissions for space members\n if (action === ACTION.DELETE_PERMANENTLY) {\n this.logger.verbose(`${this.clearCachePermissionsAndOrNotify.name} - space:${space.alias} ${action}`)\n this.spacesQueries\n .clearCachePermissions(space.alias)\n .catch((e: Error) => this.logger.error(`${this.clearCachePermissionsAndOrNotify.name} - ${e}`))\n } else {\n // update space members cache\n this.logger.verbose(`${this.clearCachePermissionsAndOrNotify.name} - space:${space.alias} ${action} members:${JSON.stringify(memberIds)}`)\n this.spacesQueries\n .clearCachePermissions(space.alias, undefined, memberIds)\n .catch((e: Error) => this.logger.error(`${this.clearCachePermissionsAndOrNotify.name} - ${e}`))\n }\n // notify\n if (action !== ACTION.UPDATE) {\n // notify the members who have joined or left the space\n const notification: NotificationContent = {\n app: NOTIFICATION_APP.SPACES,\n event: NOTIFICATION_APP_EVENT.SPACES[action],\n element: space.name,\n url: ''\n }\n this.notificationsManager\n .create(memberIds, notification, {\n currentUrl: this.contextManager.get('headerOriginUrl'),\n action: action\n })\n .catch((e: Error) => this.logger.error(`${this.clearCachePermissionsAndOrNotify.name} - ${e}`))\n }\n } else if (roots?.length) {\n // clear permissions for space roots\n const rootAliases: string[] = roots.map((r) => r.alias)\n this.logger.verbose(`${this.clearCachePermissionsAndOrNotify.name} - space:${space.alias} ${action} roots:${JSON.stringify(rootAliases)}`)\n if (action !== ACTION.ADD) {\n this.spacesQueries\n .clearCachePermissions(space.alias, rootAliases)\n .catch((e: Error) => this.logger.error(`${this.clearCachePermissionsAndOrNotify.name} - ${e}`))\n }\n // notify\n if (action !== ACTION.UPDATE) {\n // notify the space members that a new root was anchored / unanchored\n const spaceMembers = await this.spacesQueries.getSpaceMemberIds(space.id)\n const spaceUserIds = Array.from(\n new Set([...(await this.usersQueries.allUserIdsFromGroupsAndSubGroups(spaceMembers.groupIds)), ...spaceMembers.userIds])\n ).filter((uid) => uid !== user?.id)\n if (!spaceUserIds.length) {\n return\n }\n for (const r of roots) {\n const notification: NotificationContent = {\n app: NOTIFICATION_APP.SPACE_ROOTS,\n event: NOTIFICATION_APP_EVENT.SPACE_ROOTS[action],\n element: r.name,\n url: `${SPACE_REPOSITORY.FILES}/${space.name}`\n }\n this.notificationsManager\n .create(spaceUserIds, notification, {\n currentUrl: this.contextManager.get('headerOriginUrl'),\n author: user,\n action: action\n })\n .catch((e: Error) => this.logger.error(`${this.clearCachePermissionsAndOrNotify.name} - ${e}`))\n }\n }\n }\n }\n}\n"],"names":["SpacesManager","listSpaces","userId","spacesQueries","spaces","spacesWithDetails","uniqueRootName","name","names","find","fName","toLowerCase","nameExtension","path","extname","nameWithoutExtension","basename","originalName","replace","regExpNumberSuffix","count","newName","spaceEnv","user","urlSegments","skipEndpointProtection","repository","spaceAlias","rootAlias","paths","SPACE_REPOSITORY","SHARES","Object","values","indexOf","Error","space","SPACE_ALIAS","PERSONAL","unshift","SpaceEnv","SPACE_PERSONAL","spacePermissions","sharesManager","permissions","SPACE_SHARES","TRASH","id","setup","setQuotaExceeded","e","logger","warn","alias","HttpException","message","FileError","httpCode","HttpStatus","BAD_REQUEST","searchSpaces","searchSpaceDto","sps","s","shareInsidePermission","haveSpacePermission","SPACE_OPERATION","SHARE_INSIDE","search","description","push","length","limit","listSpacesWithPermissions","Promise","all","map","listTrashes","trashes","personalTrash","nb","mtime","ctime","rPath","trashPath","SpaceModel","getTrashPath","fs","readdir","filter","f","configuration","applications","files","showHiddenFiles","stats","stat","getTime","birthtime","error","getSpace","spaceId","userCanAccessSpace","roots","isAdmin","root","externalPath","createSpace","createOrUpdateSpaceDto","SpaceProps","uniqueSpaceAlias","enabled","storageQuota","storageIndexing","disabledAt","Date","makePaths","updateRoots","updateMembers","members","concat","managers","createOrUpdateLinksAsMembers","LINK_TYPE","SPACE","links","getSpaceAsManager","updateSpace","spaceDiffProps","modifiedAt","props","prop","spaceLocationWasRenamed","renameSpaceLocation","INTERNAL_SERVER_ERROR","catch","linkMembers","rootOwnerIds","r","owner","aliases","dirListFileNames","getFilesPath","deleteSpace","deleteSpaceDto","deleteNow","deleteAllLinkMembers","deleteOrDisableSpace","log","getUserRoots","getSpaceRoots","updateUserRoots","userRoots","addOnly","role","SPACE_ROLE","IS_MANAGER","FORBIDDEN","spaceRoots","forEach","toAdd","validateNewRoots","status","updateSpaceRoots","entries","action","clearCachePermissionsAndOrNotify","currentUserRoots","uniqueRootAlias","aliasesAndNames","replaceCount","aliasExtension","aliasWithoutExtension","originalAlias","createSlug","newAlias","spaceRootExistsForAlias","updatePersonalSpacesQuota","forUser","usersQueries","selectUsers","lte","users","USER_ROLE","USER","eq","userPath","UserModel","getHomePath","login","isPathExists","size","errors","dirSize","spaceQuota","storageUsage","cache","set","CACHE_QUOTA_USER_PREFIX","CACHE_QUOTA_TTL","updateUserOrGuest","updateSpacesQuota","spacesQuotaPaths","spacePath","externalPaths","Boolean","rPathSize","CACHE_QUOTA_SPACE_PREFIX","deleteExpiredSpaces","selectSpaces","isNotNull","disabled","setDate","getDate","SPACE_MAX_DISABLED_DAYS","listSpaceShares","userIsSpaceManager","getSpaceShare","shareId","getShareWithMembers","updateSpaceShare","createOrUpdateShareDto","updateShare","deleteSpaceShare","deleteShare","getSpaceShareLink","getShareLink","currentMembers","add","update","remove","diffCollection","userIdsWhitelist","groupIdsWhitelist","usersWhitelist","groupsWhitelist","m","type","MEMBER_TYPE","GUEST","linkId","GROUP","PGROUP","toRemove","deleteLinkMembers","convertDiffUpdate","rmShareOwners","upShareOwners","rmRootOwners","userIds","groupIds","ACTION","DELETE","UPDATE","object","spaceRole","new","IS_MEMBER","old","SPACE_ALL_OPERATIONS","diffPermissions","differencePermissions","p","rmPermissions","onSpaceActionForMembers","updateSharesFromSpace","curRoots","newRoots","toUpdate","clearCachePermissions","rmRoots","rmRootPermissions","reduce","acc","undefined","updateSharesFromSpaceRoots","join","filesPath","file","rExists","cr","startsWith","getProps","memberIds","getSpaceMemberIds","DELETE_PERMANENTLY","removeSharesFromSpace","del","deleteSpaceLocation","spaceLocation","removeFiles","oldSpaceAlias","newSpaceAlias","currentSpaceLocation","newSpaceLocation","moveFiles","spaceExistsForAlias","asManager","NOT_FOUND","inSharesList","cacheQuotaKey","quotaKeyFromSpace","verbose","quota","get","inPersonalSpace","inSharesRepository","updateSharesExternalPathQuota","quotaIsExceeded","Array","from","Set","allUserIdsFromGroupsAndSubGroups","uid","JSON","stringify","notification","app","NOTIFICATION_APP","SPACES","event","NOTIFICATION_APP_EVENT","element","url","notificationsManager","create","currentUrl","contextManager","rootAliases","ADD","spaceMembers","spaceUserIds","SPACE_ROOTS","FILES","author","Logger"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/spaces/services/spaces-manager.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common'\nimport { eq, isNotNull, lte } from 'drizzle-orm'\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\nimport { ACTION } from '../../../common/constants'\nimport { convertDiffUpdate, diffCollection, differencePermissions } from '../../../common/functions'\nimport type { Entries, StorageQuota } from '../../../common/interfaces'\nimport { createSlug, regExpNumberSuffix } from '../../../common/shared'\nimport { configuration } from '../../../configuration/config.environment'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport { FileError } from '../../files/models/file-error'\nimport { dirListFileNames, dirSize, getProps, isPathExists, moveFiles, removeFiles } from '../../files/utils/files'\nimport { LINK_TYPE } from '../../links/constants/links'\nimport { NOTIFICATION_APP, NOTIFICATION_APP_EVENT } from '../../notifications/constants/notifications'\nimport { NotificationContent } from '../../notifications/interfaces/notification-properties.interface'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { CreateOrUpdateShareDto } from '../../shares/dto/create-or-update-share.dto'\nimport type { ShareLink } from '../../shares/interfaces/share-link.interface'\nimport type { ShareProps } from '../../shares/interfaces/share-props.interface'\nimport type { ShareChild } from '../../shares/models/share-child.model'\nimport { SharesManager } from '../../shares/services/shares-manager.service'\nimport { MEMBER_TYPE } from '../../users/constants/member'\nimport { USER_ROLE } from '../../users/constants/user'\nimport { UserModel } from '../../users/models/user.model'\nimport type { User } from '../../users/schemas/user.interface'\nimport { users } from '../../users/schemas/users.schema'\nimport { UsersQueries } from '../../users/services/users-queries.service'\nimport { CACHE_QUOTA_SPACE_PREFIX, CACHE_QUOTA_TTL, CACHE_QUOTA_USER_PREFIX } from '../constants/cache'\nimport {\n SPACE_ALIAS,\n SPACE_ALL_OPERATIONS,\n SPACE_MAX_DISABLED_DAYS,\n SPACE_OPERATION,\n SPACE_PERSONAL,\n SPACE_REPOSITORY,\n SPACE_ROLE,\n SPACE_SHARES\n} from '../constants/spaces'\nimport { CreateOrUpdateSpaceDto, SpaceMemberDto } from '../dto/create-or-update-space.dto'\nimport { DeleteSpaceDto } from '../dto/delete-space.dto'\nimport { SearchSpaceDto } from '../dto/search-space.dto'\nimport { SpaceTrash } from '../interfaces/space-trash.interface'\nimport { SpaceEnv } from '../models/space-env.model'\nimport { SpaceProps } from '../models/space-props.model'\nimport type { SpaceRootProps } from '../models/space-root-props.model'\nimport { SpaceModel } from '../models/space.model'\nimport type { SpaceRoot } from '../schemas/space-root.interface'\nimport type { Space } from '../schemas/space.interface'\nimport { spaces } from '../schemas/spaces.schema'\nimport { quotaKeyFromSpace } from '../utils/paths'\nimport { haveSpacePermission } from '../utils/permissions'\nimport { SpacesQueries } from './spaces-queries.service'\n\n@Injectable()\nexport class SpacesManager {\n private readonly logger = new Logger(SpacesManager.name)\n\n constructor(\n private readonly contextManager: ContextManager,\n private readonly spacesQueries: SpacesQueries,\n private readonly usersQueries: UsersQueries,\n private readonly sharesManager: SharesManager,\n private readonly notificationsManager: NotificationsManager\n ) {}\n\n listSpaces(userId: number): Promise<Partial<SpaceProps>[]> {\n return this.spacesQueries.spaces(userId)\n }\n\n spacesWithDetails(userId: number): Promise<SpaceProps[]> {\n return this.spacesQueries.spacesWithDetails(userId)\n }\n\n uniqueRootName(name: string, names: string[]) {\n if (names.find((fName: string) => name.toLowerCase() === fName.toLowerCase())) {\n const nameExtension = path.extname(name)\n const nameWithoutExtension = path.basename(name, nameExtension)\n const originalName = nameWithoutExtension.replace(regExpNumberSuffix, '')\n let count = 1\n let newName = `${originalName}-${count}${nameExtension}`\n while (names.find((fName: string) => newName.toLowerCase() === fName.toLowerCase())) {\n count += 1\n newName = `${originalName}-${count}${nameExtension}`\n }\n return newName\n }\n return null\n }\n\n async spaceEnv(user: UserModel, urlSegments: string[], skipEndpointProtection = false): Promise<SpaceEnv> {\n /* SpaceEnv builder */\n let [repository, spaceAlias, rootAlias, ...paths] = urlSegments\n\n if (\n !repository ||\n (!spaceAlias && repository !== SPACE_REPOSITORY.SHARES) ||\n Object.values(SPACE_REPOSITORY).indexOf(repository as SPACE_REPOSITORY) === -1\n ) {\n throw new Error(`Space path is not valid : ${urlSegments}`)\n }\n\n let space: SpaceEnv\n if (spaceAlias === SPACE_ALIAS.PERSONAL) {\n /* Personal Space (static) */\n if (rootAlias) {\n // there is no root in a personal space\n paths.unshift(rootAlias)\n rootAlias = null\n }\n space = new SpaceEnv(SPACE_PERSONAL, rootAlias, false)\n } else if (repository === SPACE_REPOSITORY.SHARES) {\n if (spaceAlias) {\n /* Share */\n const spacePermissions: Partial<SpaceEnv> = await this.sharesManager.permissions(user, spaceAlias)\n if (spacePermissions) {\n space = new SpaceEnv(spacePermissions, null, false)\n }\n } else {\n /* Shares List (static) */\n space = new SpaceEnv(SPACE_SHARES, null, false)\n }\n } else {\n /* Space */\n if (repository === SPACE_REPOSITORY.TRASH && rootAlias) {\n // there is no root in a trash space\n paths.unshift(rootAlias)\n rootAlias = null\n }\n const spacePermissions: Partial<SpaceEnv> = await this.spacesQueries.permissions(user.id, spaceAlias, rootAlias)\n if (spacePermissions) {\n space = new SpaceEnv(spacePermissions, rootAlias || '')\n }\n }\n if (!space) return null\n try {\n space.setup(user, repository as SPACE_REPOSITORY, rootAlias, paths, urlSegments, skipEndpointProtection)\n await this.setQuotaExceeded(user, space)\n return space\n } catch (e) {\n this.logger.warn(`${this.spaceEnv.name} - *${space.alias}* : ${e}`)\n throw new HttpException(e.message, e instanceof FileError ? e.httpCode : HttpStatus.BAD_REQUEST)\n }\n }\n\n async searchSpaces(userId: number, searchSpaceDto: SearchSpaceDto): Promise<SpaceProps[]> {\n const sps: SpaceProps[] = []\n for (const s of await this.spacesQueries.spaces(userId, true)) {\n if (searchSpaceDto.shareInsidePermission && !haveSpacePermission(s, SPACE_OPERATION.SHARE_INSIDE)) {\n continue\n }\n if (!searchSpaceDto.search || `${s.name} ${s.alias} ${s.description || ''}`.toLowerCase().indexOf(searchSpaceDto.search) > -1) {\n sps.push(s)\n }\n if (sps.length >= searchSpaceDto.limit) {\n break\n }\n }\n return sps\n }\n\n async listSpacesWithPermissions(user: UserModel): Promise<SpaceEnv[]> {\n return Promise.all(\n (await this.spacesQueries.spaces(user.id, true)).map(async (s) => {\n const space = new SpaceEnv(s)\n await this.setQuotaExceeded(user, space)\n return space\n })\n )\n }\n\n async listTrashes(user: UserModel): Promise<SpaceTrash[]> {\n const trashes: SpaceTrash[] = []\n // todo: store 'Personal files' as const somewhere (used in frontend too)\n const personalTrash: SpaceTrash = { id: 0, name: 'Personal files', alias: SPACE_ALIAS.PERSONAL, nb: 0, mtime: 0, ctime: 0 }\n for (const space of [...(await this.listSpaces(user.id)), personalTrash] as SpaceTrash[]) {\n const rPath = space.alias === SPACE_ALIAS.PERSONAL ? user.trashPath : SpaceModel.getTrashPath(space.alias)\n try {\n space.nb = (await fs.readdir(rPath)).filter((f) => configuration.applications.files.showHiddenFiles || f[0] !== '.').length\n if (space.nb) {\n const stats = await fs.stat(rPath)\n space.mtime = stats.mtime.getTime()\n space.ctime = stats.birthtime.getTime()\n trashes.push(space)\n }\n } catch (e) {\n this.logger.error(`${this.listTrashes.name} - ${e}`)\n }\n }\n return trashes\n }\n\n async getSpace(user: UserModel, spaceId: number): Promise<SpaceProps> {\n const space: SpaceProps = await this.userCanAccessSpace(user.id, spaceId, true)\n if (space.roots?.length && !user.isAdmin) {\n // remove external path if the current user is not an administrator\n for (const root of space.roots) {\n root.externalPath = null\n }\n }\n return space\n }\n\n async createSpace(user: UserModel, createOrUpdateSpaceDto: CreateOrUpdateSpaceDto): Promise<SpaceProps> {\n /* only users with admin space role can create a space */\n // create space\n const space: SpaceProps = new SpaceProps({\n name: createOrUpdateSpaceDto.name,\n alias: await this.uniqueSpaceAlias(createOrUpdateSpaceDto.name, true),\n description: createOrUpdateSpaceDto.description,\n enabled: createOrUpdateSpaceDto.enabled,\n storageQuota: createOrUpdateSpaceDto.storageQuota,\n storageIndexing: createOrUpdateSpaceDto.storageIndexing,\n disabledAt: createOrUpdateSpaceDto.enabled ? null : new Date()\n })\n try {\n space.id = await this.spacesQueries.createSpace(space)\n } catch (e) {\n this.logger.error(`${this.createSpace.name} - unable to create space *${space.alias}* : ${e}`)\n throw new HttpException('Unable to create space', e)\n }\n // create space paths\n await SpaceModel.makePaths(space.alias)\n // add roots\n await this.updateRoots(user, space, space.roots, createOrUpdateSpaceDto.roots, [], [])\n // add members\n await this.updateMembers(user, space, createOrUpdateSpaceDto.members.concat(createOrUpdateSpaceDto.managers))\n // create links after members, user must be a space manager to create links\n await this.sharesManager.createOrUpdateLinksAsMembers(user, space, LINK_TYPE.SPACE, createOrUpdateSpaceDto.links)\n return this.spacesQueries.getSpaceAsManager(user.id, space.id)\n }\n\n async updateSpace(user: UserModel, spaceId: number, createOrUpdateSpaceDto: CreateOrUpdateSpaceDto): Promise<SpaceProps> {\n /* only managers of the space can update it */\n const space: SpaceProps = await this.userCanAccessSpace(user.id, spaceId, true)\n // check and update space info\n const spaceDiffProps: Partial<SpaceProps> = { modifiedAt: new Date() }\n const props: (keyof CreateOrUpdateSpaceDto)[] = ['name', 'description', 'enabled', 'storageQuota', 'storageIndexing']\n for (const prop of props) {\n if (createOrUpdateSpaceDto[prop] !== space[prop]) {\n spaceDiffProps[prop] = createOrUpdateSpaceDto[prop]\n if (prop === 'name') {\n spaceDiffProps.alias = await this.uniqueSpaceAlias(spaceDiffProps.name, true)\n if (space.alias !== spaceDiffProps.alias) {\n // must move the space to match the new alias\n const spaceLocationWasRenamed: boolean = await this.renameSpaceLocation(space.alias, spaceDiffProps.alias)\n if (!spaceLocationWasRenamed) {\n throw new HttpException('Unable to rename space', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n space.alias = spaceDiffProps.alias\n }\n } else if (prop === 'enabled') {\n spaceDiffProps.disabledAt = spaceDiffProps[prop] ? null : new Date()\n }\n }\n }\n // updates in db\n this.spacesQueries.updateSpace(spaceId, spaceDiffProps).catch((e: Error) => this.logger.error(`${this.updateSpace.name} - ${e}`))\n // checks & updates members\n const linkMembers: SpaceMemberDto[] = await this.sharesManager.createOrUpdateLinksAsMembers(\n user,\n space,\n LINK_TYPE.SPACE,\n createOrUpdateSpaceDto.links\n )\n const rootOwnerIds: number[] = await this.updateMembers(user, space, [\n ...createOrUpdateSpaceDto.members,\n ...createOrUpdateSpaceDto.managers,\n ...linkMembers\n ])\n if (rootOwnerIds.length) {\n // removes the roots of removed members or those no longer having the `share inside` permission\n createOrUpdateSpaceDto.roots = createOrUpdateSpaceDto.roots.filter((r) => rootOwnerIds.indexOf(r.owner.id) === -1)\n }\n // checks & updates roots\n const aliases: string[] = space.roots.map((r) => r.alias)\n const names: string[] = [...(await dirListFileNames(SpaceModel.getFilesPath(space.alias))), ...space.roots.map((r) => r.name)]\n await this.updateRoots(user, space, space.roots, createOrUpdateSpaceDto.roots, aliases, names)\n if (rootOwnerIds.indexOf(user.id) > -1) {\n // current manager was removed\n return null\n } else {\n return this.spacesQueries.getSpaceAsManager(user.id, spaceId)\n }\n }\n\n async deleteSpace(user: UserModel, spaceId: number, deleteSpaceDto?: DeleteSpaceDto) {\n /* only managers of the space can disable it */\n const space: SpaceProps = await this.userCanAccessSpace(user.id, spaceId, true)\n // only admin can delete the space data, managers can only disable the space for 30 days\n const deleteNow: boolean = user.isAdmin && !!deleteSpaceDto?.deleteNow\n try {\n if (deleteNow) {\n await this.sharesManager.deleteAllLinkMembers(spaceId, LINK_TYPE.SPACE)\n }\n await this.deleteOrDisableSpace(space, deleteNow)\n this.logger.log(`${this.deleteSpace.name} - *${space.alias}* (${space.id}) was ${deleteNow ? 'deleted' : 'disabled'}`)\n } catch (e) {\n this.logger.error(`${this.deleteSpace.name} - *${space.alias}* (${space.id}) was not ${deleteNow ? 'deleted' : 'disabled'} : ${e}`)\n throw new HttpException('Unable to delete space', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async getUserRoots(user: UserModel, spaceId: number): Promise<SpaceRootProps[]> {\n /* if user has no permissions on the space an empty array will be returned */\n return this.spacesQueries.getSpaceRoots(spaceId, user.id)\n }\n\n async updateUserRoots(user: UserModel, spaceId: number, userRoots: SpaceRootProps[], addOnly: boolean = false): Promise<SpaceRootProps[]> {\n const space: Partial<SpaceProps> = await this.userCanAccessSpace(user.id, spaceId)\n if (space.role !== SPACE_ROLE.IS_MANAGER && !haveSpacePermission(space, SPACE_OPERATION.SHARE_INSIDE)) {\n this.logger.warn(`is not allowed to share inside on this space : *${space.alias}* (${space.id})`)\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n // current states\n const spaceRoots: SpaceRootProps[] = await this.spacesQueries.getSpaceRoots(spaceId)\n const aliases = spaceRoots.map((r) => r.alias)\n const names = [...(await dirListFileNames(SpaceModel.getFilesPath(space.alias))), ...spaceRoots.map((r) => r.name)]\n // force owner.id on new user roots (owner is optional and required for the next steps)\n userRoots.forEach((r: SpaceRootProps) => (r.owner = { id: user.id }))\n if (addOnly) {\n // short circuit the `updateRoots` function\n // we need to provide all space roots to avoid collisions on aliases and names for new user roots\n const toAdd: SpaceRootProps[] = await this.validateNewRoots(user, space, spaceRoots, userRoots, aliases, names)\n const status: Record<Exclude<ACTION, ACTION.DELETE_PERMANENTLY>, SpaceRootProps[]> = await this.spacesQueries.updateSpaceRoots(\n user.id,\n space.id,\n toAdd,\n [],\n []\n )\n Object.entries(status).forEach(([action, roots]: [ACTION, SpaceRootProps[]]) =>\n this.clearCachePermissionsAndOrNotify(space, action, user, null, roots).catch((e: Error) =>\n this.logger.error(`${this.updateUserRoots.name} - ${e}`)\n )\n )\n return this.getUserRoots(user, spaceId)\n } else {\n const currentUserRoots: SpaceRootProps[] = spaceRoots.filter((r) => r.owner?.id === user.id)\n await this.updateRoots(user, space, currentUserRoots, userRoots, aliases, names)\n return this.spacesQueries.getSpaceRoots(spaceId, user.id)\n }\n }\n\n async uniqueRootAlias(spaceId: number, alias: string, aliasesAndNames: string[], replaceCount = false): Promise<string> {\n /* for some webdav clients the root alias is displayed instead of the file name.\n * This is why a root alias must be unique for files too */\n if (aliasesAndNames.find((fName: string) => alias.toLowerCase() === fName.toLowerCase())) {\n const aliasExtension = path.extname(alias)\n const aliasWithoutExtension = path.basename(alias, aliasExtension)\n const originalAlias = createSlug(aliasWithoutExtension, replaceCount)\n let count = 1\n let newAlias = `${originalAlias}-${count}${aliasExtension}`\n while (await this.spacesQueries.spaceRootExistsForAlias(spaceId, newAlias)) {\n count += 1\n newAlias = `${originalAlias}-${count}${aliasExtension}`\n }\n return newAlias\n }\n return null\n }\n\n async updatePersonalSpacesQuota(forUser?: UserModel) {\n const props: (keyof User)[] = ['id', 'login', 'storageUsage', 'storageQuota']\n for (const user of await this.usersQueries.selectUsers(props, [\n lte(users.role, USER_ROLE.USER),\n ...(forUser ? [eq(users.id, forUser.id)] : [])\n ])) {\n const userPath = UserModel.getHomePath(user.login)\n if (!(await isPathExists(userPath))) {\n this.logger.warn(`${this.updatePersonalSpacesQuota.name} - *${user.login}* home path does not exist`)\n continue\n }\n const [size, errors] = await dirSize(userPath)\n for (const [path, error] of Object.entries(errors)) {\n this.logger.warn(`${this.updatePersonalSpacesQuota.name} - unable to get size for *${user.login}* on ${path} : ${error}`)\n }\n const spaceQuota: StorageQuota = { storageUsage: size, storageQuota: user.storageQuota }\n this.spacesQueries.cache\n .set(`${CACHE_QUOTA_USER_PREFIX}-${user.id}`, spaceQuota, CACHE_QUOTA_TTL)\n .catch((e: Error) => this.logger.error(`${this.updatePersonalSpacesQuota.name} - ${e}`))\n if (user.storageUsage !== spaceQuota.storageUsage) {\n this.logger.log(\n `${this.updatePersonalSpacesQuota.name} - user *${user.login}* (${user.id}) : storage usage updated : ${spaceQuota.storageUsage}`\n )\n await this.usersQueries.updateUserOrGuest(user.id, { storageUsage: spaceQuota.storageUsage })\n }\n }\n }\n\n async updateSpacesQuota(spaceId?: number) {\n for (const space of await this.spacesQueries.spacesQuotaPaths(spaceId)) {\n const spacePath = SpaceModel.getHomePath(space.alias)\n if (!(await isPathExists(spacePath))) {\n this.logger.warn(`${this.updateSpacesQuota.name} - *${space.alias}* home path does not exist`)\n continue\n }\n let size = 0\n for (const rPath of [spacePath, ...space.externalPaths.filter(Boolean)]) {\n const [rPathSize, errors] = await dirSize(rPath)\n size += rPathSize\n for (const [path, error] of Object.entries(errors)) {\n this.logger.warn(`${this.updateSpacesQuota.name} - unable to get size for *${space.alias}* on ${path} : ${error}`)\n }\n }\n const spaceQuota: StorageQuota = { storageUsage: size, storageQuota: space.storageQuota }\n this.spacesQueries.cache\n .set(`${CACHE_QUOTA_SPACE_PREFIX}-${space.id}`, spaceQuota, CACHE_QUOTA_TTL)\n .catch((e: Error) => this.logger.error(`${this.updateSpacesQuota.name} - ${e}`))\n if (space.storageUsage !== spaceQuota.storageUsage) {\n this.logger.log(`${this.updateSpacesQuota.name} - space *${space.alias}* (${space.id}) : storage usage updated : ${spaceQuota.storageUsage}`)\n await this.spacesQueries.updateSpace(space.id, { storageUsage: spaceQuota.storageUsage })\n }\n }\n }\n\n async deleteExpiredSpaces() {\n /* Removes spaces that have been disabled for more than 30 days */\n const props: (keyof Space)[] = ['id', 'name', 'alias', 'disabledAt']\n for (const space of await this.spacesQueries.selectSpaces(props, [eq(spaces.enabled, false), isNotNull(spaces.disabledAt)])) {\n const disabled = new Date(space.disabledAt)\n disabled.setDate(disabled.getDate() + SPACE_MAX_DISABLED_DAYS)\n if (new Date() > disabled) {\n try {\n await this.sharesManager.deleteAllLinkMembers(space.id, LINK_TYPE.SPACE)\n await this.deleteOrDisableSpace(space, true)\n this.logger.log(`${this.deleteExpiredSpaces.name} - space *${space.alias}* (${space.id}) was deleted`)\n } catch (e) {\n this.logger.error(`${this.deleteExpiredSpaces.name} - space *${space.alias}* (${space.id}) was not deleted : ${e}`)\n }\n }\n }\n }\n\n async listSpaceShares(user: UserModel, spaceId: number): Promise<ShareChild[]> {\n if (await this.userIsSpaceManager(user, spaceId)) {\n return this.sharesManager.listSpaceShares(spaceId)\n }\n }\n\n async getSpaceShare(user: UserModel, spaceId: number, shareId: number): Promise<ShareProps> {\n if (await this.userIsSpaceManager(user, spaceId, shareId)) {\n return this.sharesManager.getShareWithMembers(user, shareId, true)\n }\n }\n\n async updateSpaceShare(user: UserModel, spaceId: number, shareId: number, createOrUpdateShareDto: CreateOrUpdateShareDto): Promise<ShareProps> {\n if (await this.userIsSpaceManager(user, spaceId, shareId)) {\n return this.sharesManager.updateShare(user, shareId, createOrUpdateShareDto, true)\n }\n }\n\n async deleteSpaceShare(user: UserModel, spaceId: number, shareId: number): Promise<void> {\n if (await this.userIsSpaceManager(user, spaceId, shareId)) {\n return this.sharesManager.deleteShare(user, shareId, true)\n }\n }\n\n async getSpaceShareLink(user: UserModel, spaceId: number, shareId: number): Promise<ShareLink> {\n if (await this.userIsSpaceManager(user, spaceId, shareId)) {\n return this.sharesManager.getShareLink(user, shareId, true)\n }\n }\n\n private async updateMembers(user: UserModel, space: SpaceProps, currentMembers: SpaceMemberDto[]): Promise<number[]> {\n if (space.members.length === 0 && currentMembers.length === 0) {\n return\n }\n // diff\n const [add, update, remove]: [SpaceMemberDto[], Record<string | 'object', { old: any; new: any } | SpaceMemberDto>[], SpaceMemberDto[]] =\n diffCollection(space.members, currentMembers, ['permissions', 'spaceRole'], ['id', 'type'])\n\n // check members whitelists\n let toAdd: SpaceMemberDto[] = []\n if (add.length) {\n const [userIdsWhitelist, groupIdsWhitelist] = await Promise.all([\n this.usersQueries.usersWhitelist(user.id),\n this.usersQueries.groupsWhitelist(user.id)\n ])\n toAdd = add.filter((m) => {\n if (\n ((m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST) && !m.linkId && userIdsWhitelist.indexOf(m.id) === -1) ||\n ((m.type === MEMBER_TYPE.GROUP || m.type === MEMBER_TYPE.PGROUP) && groupIdsWhitelist.indexOf(m.id) === -1)\n ) {\n this.logger.warn(\n `${this.updateMembers.name} - cannot add ${m.type} (${m.id}) to space *${space.alias}* (${space.id}) : not in the members whitelist`\n )\n return false\n }\n return true\n })\n }\n\n // filter links\n const toRemove: SpaceMemberDto[] = remove.filter((m) => !m.linkId)\n // do remove links\n this.sharesManager.deleteLinkMembers(remove.filter((m) => !!m.linkId)).catch((e: Error) => this.logger.error(`${this.updateMembers.name} - ${e}`))\n // do update members\n const status: Record<\n Exclude<ACTION, ACTION.DELETE_PERMANENTLY>,\n {\n groupIds: number[]\n userIds: number[]\n }\n > = await this.spacesQueries.updateMembers(space.id, toAdd, convertDiffUpdate(update), toRemove)\n\n // lists deleted and updated members as potential share or space roots owners\n const [rmShareOwners, upShareOwners, rmRootOwners]: [\n SpaceMemberDto[],\n {\n object: SpaceMemberDto\n rmPermissions: SPACE_OPERATION[]\n }[],\n number[]\n ] = [[], [], []]\n\n for (const [action, members] of Object.entries(status) as Entries<typeof status>) {\n if (!members.userIds.length && !members.groupIds.length) continue\n if (action === ACTION.DELETE) {\n // stores the removed members who might own shares created from the current space\n rmShareOwners.push(\n ...toRemove.filter(\n (m) =>\n ((m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST) && members.userIds.indexOf(m.id) > -1) ||\n ((m.type === MEMBER_TYPE.GROUP || m.type === MEMBER_TYPE.PGROUP) && members.groupIds.indexOf(m.id) > -1)\n )\n )\n // stores ids of removed members that might have space roots\n rmRootOwners.push(...members.userIds)\n } else if (action === ACTION.UPDATE) {\n // stores permissions updates and members who might own shares created from the current space\n // ignore space managers (they have all permissions)\n for (const m of update as {\n object: SpaceMemberDto\n permissions?: { old: string; new: string }\n spaceRole?: { old: number; new: number }\n }[]) {\n if (\n ((m.object.type === MEMBER_TYPE.USER || m.object.type === MEMBER_TYPE.GUEST) &&\n m.object.spaceRole !== SPACE_ROLE.IS_MANAGER &&\n members.userIds.indexOf(m.object.id) > -1) ||\n ((m.object.type === MEMBER_TYPE.GROUP || m.object.type === MEMBER_TYPE.PGROUP) && members.groupIds.indexOf(m.object.id) > -1)\n ) {\n // special case, the manager was moved to members without permissions change\n if (!m.permissions && m.spaceRole.new === SPACE_ROLE.IS_MEMBER) {\n m.permissions = { old: SPACE_ALL_OPERATIONS, new: m.object.permissions }\n }\n // `share inside` permission is only used for spaces\n const diffPermissions = differencePermissions(m.permissions.old, m.permissions.new).filter((p) => p !== SPACE_OPERATION.SHARE_INSIDE)\n if (diffPermissions.length) {\n upShareOwners.push({ object: m.object, rmPermissions: diffPermissions as SPACE_OPERATION[] })\n }\n }\n }\n }\n // clear cache &|| notify\n this.onSpaceActionForMembers(space, action, members, user).catch((e: Error) => this.logger.error(`${this.updateMembers.name} - ${e}`))\n }\n // do updates\n // remove or update potential shares\n this.sharesManager\n .updateSharesFromSpace(space.id, currentMembers, rmShareOwners, upShareOwners)\n .catch((e: Error) => this.logger.error(`${this.updateMembers.name} - ${e}`))\n // return potential root owner ids\n return rmRootOwners\n }\n\n private async updateRoots(\n user: UserModel,\n space: Partial<SpaceProps>,\n curRoots: SpaceRootProps[],\n newRoots: SpaceRootProps[],\n aliases: string[],\n names: string[]\n ) {\n // diff\n const [add, toUpdate, toRemove]: [\n SpaceRootProps[],\n Record<\n string | 'object',\n | {\n old: any\n new: any\n }\n | SpaceRootProps\n | any\n >[],\n SpaceRootProps[]\n ] = diffCollection(curRoots, newRoots, ['name', 'alias', 'permissions'])\n\n // update\n for (const props of toUpdate) {\n if ('alias' in props) {\n props.alias.new = (await this.uniqueRootAlias(space.id, props.alias.new, aliases.concat(names), true)) || props.alias.new\n // remove from space cache permissions\n this.spacesQueries\n .clearCachePermissions(space.alias, [props.alias.old, props.alias.new])\n .catch((e: Error) => this.logger.error(`${this.updateRoots.name} - ${e}`))\n // update aliases list for next roots\n aliases.push(props.alias.new)\n }\n if ('name' in props) {\n props.name.new = this.uniqueRootName(props.name.new, names) || props.name.new\n // update names list for next roots\n names.push(props.name.new)\n }\n }\n\n // format actions\n const toAdd = await this.validateNewRoots(user, space, curRoots, add, aliases, names)\n\n // remove a root implies that all shares with a reference to root.id will be deleted in cascade\n // however, it is \"cleaner\" to warn users about the deletion of these shares and to clear the permission caches before the cascade deletion\n // it must be assumed that the deletion and modifications of space roots will be successful\n const [rmRoots, rmRootPermissions]: [\n SpaceRoot['id'][],\n {\n id: SpaceRoot['id']\n rmPermissions: SPACE_OPERATION[]\n }[]\n ] = [\n toRemove.map((r) => r.id),\n (toUpdate as any).reduce((acc: typeof rmRootPermissions, r: any): typeof rmRootPermissions => {\n if (r.permissions !== undefined) {\n const diffPermissions = differencePermissions(r.permissions.old, r.permissions.new) as SPACE_OPERATION[]\n if (diffPermissions.length) {\n acc.push({ id: r.object.id, rmPermissions: diffPermissions })\n }\n }\n return acc\n }, [])\n ]\n // do share updates\n await this.sharesManager.updateSharesFromSpaceRoots(space.id, rmRoots, rmRootPermissions)\n\n // do root updates\n const status: Record<Exclude<ACTION, ACTION.DELETE_PERMANENTLY>, SpaceRootProps[]> = await this.spacesQueries.updateSpaceRoots(\n user.id,\n space.id,\n toAdd,\n convertDiffUpdate(toUpdate),\n toRemove\n )\n Object.entries(status).forEach(([action, roots]: [ACTION, SpaceRootProps[]]) =>\n this.clearCachePermissionsAndOrNotify(space, action, user, null, roots).catch((e: Error) =>\n this.logger.error(`${this.updateRoots.name} - ${e}`)\n )\n )\n }\n\n private async validateNewRoots(\n user: UserModel,\n space: Partial<SpaceProps>,\n curRoots: SpaceRootProps[],\n newRoots: SpaceRootProps[],\n aliases: string[],\n names: string[]\n ): Promise<SpaceRootProps[]> {\n const toAdd: SpaceRootProps[] = []\n for (const r of newRoots) {\n if (r.externalPath && !user.isAdmin) {\n this.logger.warn(`ignore new root *${r.alias}* (${r.externalPath}) : adding an external path requires the admin role`)\n continue\n }\n const rPath = r.externalPath || path.join(user.filesPath, r.file.path)\n if (!(await isPathExists(rPath))) {\n this.logger.warn(`ignore new root *${r.alias}* (${r.file.path}) : *${rPath}* does not exist`)\n continue\n }\n // check if a parent exists for an externalPath or if the file (or parent) is already anchored\n let rExists: SpaceRootProps\n if (r.externalPath) {\n rExists = curRoots.find((cr) => cr.externalPath && r.externalPath.startsWith(cr.externalPath))\n } else {\n rExists = curRoots.find(\n (cr) => cr.file?.id === r.file.id || (cr.owner?.id === r.owner.id && cr.file?.path && r.file.path.startsWith(cr.file.path))\n )\n }\n if (rExists) {\n this.logger.warn(`ignore new root *${r.alias}* (${r.externalPath || r.file.path}) (${r.file?.id}) : parent or file already exists in roots`)\n continue\n }\n // keep the file id (maybe already in db)\n if (!r.externalPath) {\n r.file = { ...(await getProps(rPath, r.file.path)), id: r.file.id }\n }\n r.alias = (await this.uniqueRootAlias(space.id, r.alias, aliases.concat(names), true)) || r.alias\n // update aliases list for next roots\n aliases.push(r.alias)\n r.name = this.uniqueRootName(r.name, names) || r.name\n // update names list for next roots\n names.push(r.name)\n // reset id\n r.id = 0\n toAdd.push(r)\n }\n return toAdd\n }\n\n private async deleteOrDisableSpace(space: Partial<SpaceProps>, deleteNow: boolean = false) {\n if (deleteNow) {\n // clear cache &|| notify\n const memberIds: { groupIds: number[]; userIds: number[] } = await this.spacesQueries.getSpaceMemberIds(space.id)\n this.onSpaceActionForMembers(space, ACTION.DELETE_PERMANENTLY, memberIds).catch((e: Error) =>\n this.logger.error(`${this.deleteOrDisableSpace.name} - ${e}`)\n )\n // remove all shares related to the space\n await this.sharesManager.removeSharesFromSpace(space.id)\n }\n await this.spacesQueries.deleteSpace(space.id, deleteNow)\n if (deleteNow) {\n this.spacesQueries.cache\n .del(`${CACHE_QUOTA_SPACE_PREFIX}-${space.id}`)\n .catch((e: Error) => this.logger.error(`${this.deleteOrDisableSpace.name} - ${e}`))\n await this.deleteSpaceLocation(space.alias)\n }\n }\n\n private async deleteSpaceLocation(spaceAlias: string) {\n const spaceLocation = SpaceModel.getHomePath(spaceAlias)\n if (await isPathExists(spaceLocation)) {\n await removeFiles(spaceLocation)\n this.logger.warn(`${this.deleteSpaceLocation.name} - space *${spaceAlias}* location was deleted`)\n } else {\n this.logger.warn(`${this.deleteSpaceLocation.name} - space *${spaceAlias}* location does not exist : ${spaceLocation}`)\n }\n }\n\n private async renameSpaceLocation(oldSpaceAlias: string, newSpaceAlias: string): Promise<boolean> {\n const currentSpaceLocation: string = SpaceModel.getHomePath(oldSpaceAlias)\n if (await isPathExists(currentSpaceLocation)) {\n const newSpaceLocation: string = SpaceModel.getHomePath(newSpaceAlias)\n if (await isPathExists(newSpaceLocation)) {\n this.logger.warn(`${this.renameSpaceLocation.name} - *${newSpaceAlias}* home path already exists : ${newSpaceLocation}`)\n return false\n } else {\n try {\n await moveFiles(currentSpaceLocation, newSpaceLocation)\n return true\n } catch (e) {\n // try to restore\n await moveFiles(newSpaceLocation, currentSpaceLocation, true)\n this.logger.error(\n `${this.renameSpaceLocation.name} - unable to rename space location from *${currentSpaceLocation}* to *${newSpaceLocation}* : ${e}`\n )\n return false\n }\n }\n } else {\n this.logger.warn(`${this.renameSpaceLocation.name} - *${oldSpaceAlias}* space location does not exist : ${currentSpaceLocation}`)\n return false\n }\n }\n\n private async uniqueSpaceAlias(name: string, replaceCount = false): Promise<string> {\n let alias = createSlug(name, replaceCount)\n let count = 0\n // Personal space name is reserved\n if (alias === SPACE_ALIAS.PERSONAL) {\n count += 1\n alias = `${name}-${count}`\n }\n while (await this.spacesQueries.spaceExistsForAlias(alias)) {\n count += 1\n alias = `${name}-${count}`\n }\n return alias\n }\n\n private async userCanAccessSpace(userId: number, spaceId: number, asManager: true): Promise<SpaceProps>\n private async userCanAccessSpace(userId: number, spaceId: number, asManager?: false): Promise<Partial<SpaceProps>>\n private async userCanAccessSpace(userId: number, spaceId: number, asManager: boolean = false): Promise<Partial<SpaceProps>> {\n if (asManager) {\n // Get all space details if user is a manager\n const space: SpaceProps = await this.spacesQueries.getSpaceAsManager(userId, spaceId)\n if (!space) {\n this.logger.warn(`space (${spaceId}) not found or not authorized for user (${userId})`)\n throw new HttpException('Not authorized', HttpStatus.FORBIDDEN)\n }\n return space\n } else {\n const [space]: SpaceProps[] = await this.spacesQueries.spaces(userId, true, spaceId)\n if (!space) {\n this.logger.warn(`space (${spaceId}) not found or not authorized for user (${userId})`)\n throw new HttpException('Space not found', HttpStatus.NOT_FOUND)\n }\n return space\n }\n }\n\n private async userIsSpaceManager(user: UserModel, spaceId: number, shareId?: number): Promise<boolean> {\n if (!(await this.spacesQueries.userIsSpaceManager(user.id, spaceId, shareId))) {\n this.logger.warn(`space (${spaceId}) not found or not authorized for user (${user.id})`)\n throw new HttpException('Not authorized', HttpStatus.FORBIDDEN)\n }\n return true\n }\n\n private async setQuotaExceeded(user: UserModel, space: SpaceEnv) {\n /* extract quota from spaces|shares|roots */\n if (space.inSharesList) {\n return\n }\n const cacheQuotaKey = quotaKeyFromSpace(user.id, space)\n if (!cacheQuotaKey) {\n this.logger.verbose(`${this.setQuotaExceeded.name} - quota was ignored for space : *${space.alias}* (${space.id})`)\n return\n }\n let quota: StorageQuota = await this.spacesQueries.cache.get(cacheQuotaKey)\n if (!quota) {\n // the quota scheduler has not started yet or the cache has been cleared\n if (space.inPersonalSpace) {\n await this.updatePersonalSpacesQuota(user)\n } else if (space.inSharesRepository) {\n // Shares with external paths\n await this.sharesManager.updateSharesExternalPathQuota(space.id)\n } else {\n await this.updateSpacesQuota(space.id)\n }\n quota = await this.spacesQueries.cache.get(cacheQuotaKey)\n }\n if (quota) {\n space.storageUsage = quota.storageUsage\n space.storageQuota = quota.storageQuota\n space.quotaIsExceeded = quota.storageQuota !== null && quota.storageUsage >= quota.storageQuota\n } else {\n this.logger.verbose(`${this.setQuotaExceeded.name} - quota not found for space : *${space.alias}* (${space.id})`)\n }\n }\n\n private async onSpaceActionForMembers(\n space: Partial<SpaceProps>,\n action: ACTION,\n members: {\n groupIds: number[]\n userIds: number[]\n },\n user?: UserModel\n ) {\n this.clearCachePermissionsAndOrNotify(\n space,\n action,\n user,\n Array.from(new Set([...(await this.usersQueries.allUserIdsFromGroupsAndSubGroups(members.groupIds)), ...members.userIds])).filter(\n (uid) => uid !== user?.id\n )\n ).catch((e: Error) => this.logger.error(`${this.onSpaceActionForMembers.name} - ${e}`))\n }\n\n private async clearCachePermissionsAndOrNotify(\n space: Partial<SpaceProps>,\n action: ACTION,\n user?: UserModel,\n memberIds?: number[],\n roots?: SpaceRootProps[]\n ): Promise<void> {\n if (memberIds?.length) {\n // clear permissions for space members\n if (action === ACTION.DELETE_PERMANENTLY) {\n this.logger.verbose(`${this.clearCachePermissionsAndOrNotify.name} - space:${space.alias} ${action}`)\n this.spacesQueries\n .clearCachePermissions(space.alias)\n .catch((e: Error) => this.logger.error(`${this.clearCachePermissionsAndOrNotify.name} - ${e}`))\n } else {\n // update space members cache\n this.logger.verbose(`${this.clearCachePermissionsAndOrNotify.name} - space:${space.alias} ${action} members:${JSON.stringify(memberIds)}`)\n this.spacesQueries\n .clearCachePermissions(space.alias, undefined, memberIds)\n .catch((e: Error) => this.logger.error(`${this.clearCachePermissionsAndOrNotify.name} - ${e}`))\n }\n // notify\n if (action !== ACTION.UPDATE) {\n // notify the members who have joined or left the space\n const notification: NotificationContent = {\n app: NOTIFICATION_APP.SPACES,\n event: NOTIFICATION_APP_EVENT.SPACES[action],\n element: space.name,\n url: ''\n }\n this.notificationsManager\n .create(memberIds, notification, {\n currentUrl: this.contextManager.headerOriginUrl(),\n action: action\n })\n .catch((e: Error) => this.logger.error(`${this.clearCachePermissionsAndOrNotify.name} - ${e}`))\n }\n } else if (roots?.length) {\n // clear permissions for space roots\n const rootAliases: string[] = roots.map((r) => r.alias)\n this.logger.verbose(`${this.clearCachePermissionsAndOrNotify.name} - space:${space.alias} ${action} roots:${JSON.stringify(rootAliases)}`)\n if (action !== ACTION.ADD) {\n this.spacesQueries\n .clearCachePermissions(space.alias, rootAliases)\n .catch((e: Error) => this.logger.error(`${this.clearCachePermissionsAndOrNotify.name} - ${e}`))\n }\n // notify\n if (action !== ACTION.UPDATE) {\n // notify the space members that a new root was anchored / unanchored\n const spaceMembers = await this.spacesQueries.getSpaceMemberIds(space.id)\n const spaceUserIds = Array.from(\n new Set([...(await this.usersQueries.allUserIdsFromGroupsAndSubGroups(spaceMembers.groupIds)), ...spaceMembers.userIds])\n ).filter((uid) => uid !== user?.id)\n if (!spaceUserIds.length) {\n return\n }\n for (const r of roots) {\n const notification: NotificationContent = {\n app: NOTIFICATION_APP.SPACE_ROOTS,\n event: NOTIFICATION_APP_EVENT.SPACE_ROOTS[action],\n element: r.name,\n url: `${SPACE_REPOSITORY.FILES}/${space.name}`\n }\n this.notificationsManager\n .create(spaceUserIds, notification, {\n currentUrl: this.contextManager.headerOriginUrl(),\n author: user,\n action: action\n })\n .catch((e: Error) => this.logger.error(`${this.clearCachePermissionsAndOrNotify.name} - ${e}`))\n }\n }\n }\n }\n}\n"],"names":["SpacesManager","listSpaces","userId","spacesQueries","spaces","spacesWithDetails","uniqueRootName","name","names","find","fName","toLowerCase","nameExtension","path","extname","nameWithoutExtension","basename","originalName","replace","regExpNumberSuffix","count","newName","spaceEnv","user","urlSegments","skipEndpointProtection","repository","spaceAlias","rootAlias","paths","SPACE_REPOSITORY","SHARES","Object","values","indexOf","Error","space","SPACE_ALIAS","PERSONAL","unshift","SpaceEnv","SPACE_PERSONAL","spacePermissions","sharesManager","permissions","SPACE_SHARES","TRASH","id","setup","setQuotaExceeded","e","logger","warn","alias","HttpException","message","FileError","httpCode","HttpStatus","BAD_REQUEST","searchSpaces","searchSpaceDto","sps","s","shareInsidePermission","haveSpacePermission","SPACE_OPERATION","SHARE_INSIDE","search","description","push","length","limit","listSpacesWithPermissions","Promise","all","map","listTrashes","trashes","personalTrash","nb","mtime","ctime","rPath","trashPath","SpaceModel","getTrashPath","fs","readdir","filter","f","configuration","applications","files","showHiddenFiles","stats","stat","getTime","birthtime","error","getSpace","spaceId","userCanAccessSpace","roots","isAdmin","root","externalPath","createSpace","createOrUpdateSpaceDto","SpaceProps","uniqueSpaceAlias","enabled","storageQuota","storageIndexing","disabledAt","Date","makePaths","updateRoots","updateMembers","members","concat","managers","createOrUpdateLinksAsMembers","LINK_TYPE","SPACE","links","getSpaceAsManager","updateSpace","spaceDiffProps","modifiedAt","props","prop","spaceLocationWasRenamed","renameSpaceLocation","INTERNAL_SERVER_ERROR","catch","linkMembers","rootOwnerIds","r","owner","aliases","dirListFileNames","getFilesPath","deleteSpace","deleteSpaceDto","deleteNow","deleteAllLinkMembers","deleteOrDisableSpace","log","getUserRoots","getSpaceRoots","updateUserRoots","userRoots","addOnly","role","SPACE_ROLE","IS_MANAGER","FORBIDDEN","spaceRoots","forEach","toAdd","validateNewRoots","status","updateSpaceRoots","entries","action","clearCachePermissionsAndOrNotify","currentUserRoots","uniqueRootAlias","aliasesAndNames","replaceCount","aliasExtension","aliasWithoutExtension","originalAlias","createSlug","newAlias","spaceRootExistsForAlias","updatePersonalSpacesQuota","forUser","usersQueries","selectUsers","lte","users","USER_ROLE","USER","eq","userPath","UserModel","getHomePath","login","isPathExists","size","errors","dirSize","spaceQuota","storageUsage","cache","set","CACHE_QUOTA_USER_PREFIX","CACHE_QUOTA_TTL","updateUserOrGuest","updateSpacesQuota","spacesQuotaPaths","spacePath","externalPaths","Boolean","rPathSize","CACHE_QUOTA_SPACE_PREFIX","deleteExpiredSpaces","selectSpaces","isNotNull","disabled","setDate","getDate","SPACE_MAX_DISABLED_DAYS","listSpaceShares","userIsSpaceManager","getSpaceShare","shareId","getShareWithMembers","updateSpaceShare","createOrUpdateShareDto","updateShare","deleteSpaceShare","deleteShare","getSpaceShareLink","getShareLink","currentMembers","add","update","remove","diffCollection","userIdsWhitelist","groupIdsWhitelist","usersWhitelist","groupsWhitelist","m","type","MEMBER_TYPE","GUEST","linkId","GROUP","PGROUP","toRemove","deleteLinkMembers","convertDiffUpdate","rmShareOwners","upShareOwners","rmRootOwners","userIds","groupIds","ACTION","DELETE","UPDATE","object","spaceRole","new","IS_MEMBER","old","SPACE_ALL_OPERATIONS","diffPermissions","differencePermissions","p","rmPermissions","onSpaceActionForMembers","updateSharesFromSpace","curRoots","newRoots","toUpdate","clearCachePermissions","rmRoots","rmRootPermissions","reduce","acc","undefined","updateSharesFromSpaceRoots","join","filesPath","file","rExists","cr","startsWith","getProps","memberIds","getSpaceMemberIds","DELETE_PERMANENTLY","removeSharesFromSpace","del","deleteSpaceLocation","spaceLocation","removeFiles","oldSpaceAlias","newSpaceAlias","currentSpaceLocation","newSpaceLocation","moveFiles","spaceExistsForAlias","asManager","NOT_FOUND","inSharesList","cacheQuotaKey","quotaKeyFromSpace","verbose","quota","get","inPersonalSpace","inSharesRepository","updateSharesExternalPathQuota","quotaIsExceeded","Array","from","Set","allUserIdsFromGroupsAndSubGroups","uid","JSON","stringify","notification","app","NOTIFICATION_APP","SPACES","event","NOTIFICATION_APP_EVENT","element","url","notificationsManager","create","currentUrl","contextManager","headerOriginUrl","rootAliases","ADD","spaceMembers","spaceUserIds","SPACE_ROOTS","FILES","author","Logger"],"mappings":"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"}
|
|
@@ -235,6 +235,7 @@ let SpacesQueries = class SpacesQueries {
|
|
|
235
235
|
externalPath: _spacesrootsschema.spacesRoots.externalPath,
|
|
236
236
|
permissions: _spacesrootsschema.spacesRoots.permissions,
|
|
237
237
|
owner: {
|
|
238
|
+
id: _usersschema.users.id,
|
|
238
239
|
login: _usersschema.users.login,
|
|
239
240
|
email: _usersschema.users.email,
|
|
240
241
|
fullName: (0, _usersschema.userFullNameSQL)(_usersschema.users)
|
|
@@ -556,10 +557,13 @@ let SpacesQueries = class SpacesQueries {
|
|
|
556
557
|
return false;
|
|
557
558
|
}
|
|
558
559
|
}
|
|
559
|
-
|
|
560
|
+
getUserFile(userId, fileId) {
|
|
561
|
+
return this.filesQueries.getUserFile(userId, fileId);
|
|
562
|
+
}
|
|
563
|
+
getOrCreateUserFile(userId, file) {
|
|
560
564
|
return this.filesQueries.getOrCreateUserFile(userId, file);
|
|
561
565
|
}
|
|
562
|
-
|
|
566
|
+
getOrCreateSpaceFile(fileId, file, dbFile) {
|
|
563
567
|
return this.filesQueries.getOrCreateSpaceFile(fileId, file, dbFile);
|
|
564
568
|
}
|
|
565
569
|
async clearCachePermissions(spaceAlias, rootAliases, userIds) {
|