@sync-in/server 1.7.0 → 1.8.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 +164 -58
- package/environment/environment.dist.yaml +6 -3
- package/migrations/0003_giant_luckman.sql +6 -0
- package/migrations/meta/0003_snapshot.json +2463 -0
- package/migrations/meta/_journal.json +7 -0
- package/package.json +16 -15
- package/server/app.bootstrap.js +1 -0
- package/server/app.bootstrap.js.map +1 -1
- package/server/app.constants.js +0 -4
- package/server/app.constants.js.map +1 -1
- package/server/app.service.js +7 -6
- package/server/app.service.js.map +1 -1
- package/server/applications/files/constants/only-office.js +12 -0
- package/server/applications/files/constants/only-office.js.map +1 -1
- package/server/applications/files/files.config.js +5 -0
- package/server/applications/files/files.config.js.map +1 -1
- package/server/applications/files/services/files-content-manager.service.js +6 -6
- package/server/applications/files/services/files-content-manager.service.js.map +1 -1
- package/server/applications/files/services/files-manager.service.js +4 -4
- package/server/applications/files/services/files-manager.service.js.map +1 -1
- package/server/applications/files/services/files-methods.service.js +5 -3
- package/server/applications/files/services/files-methods.service.js.map +1 -1
- package/server/applications/files/services/files-only-office-manager.service.js +2 -2
- package/server/applications/files/services/files-only-office-manager.service.js.map +1 -1
- package/server/applications/files/services/files-parser.service.js +6 -3
- package/server/applications/files/services/files-parser.service.js.map +1 -1
- package/server/applications/files/services/files-scheduler.service.js +51 -3
- package/server/applications/files/services/files-scheduler.service.js.map +1 -1
- package/server/applications/files/services/files-search-manager.service.js +4 -0
- package/server/applications/files/services/files-search-manager.service.js.map +1 -1
- package/server/applications/files/utils/doc-textify/adapters/pdf.js +10 -1
- package/server/applications/files/utils/doc-textify/adapters/pdf.js.map +1 -1
- package/server/applications/notifications/i18n/de.js +56 -0
- package/server/applications/notifications/i18n/de.js.map +1 -0
- package/server/applications/notifications/i18n/es.js +52 -0
- package/server/applications/notifications/i18n/es.js.map +1 -0
- package/server/applications/notifications/i18n/hi.js +52 -0
- package/server/applications/notifications/i18n/hi.js.map +1 -0
- package/server/applications/notifications/i18n/index.js +73 -8
- package/server/applications/notifications/i18n/index.js.map +1 -1
- package/server/applications/notifications/i18n/it.js +52 -0
- package/server/applications/notifications/i18n/it.js.map +1 -0
- package/server/applications/notifications/i18n/ja.js +52 -0
- package/server/applications/notifications/i18n/ja.js.map +1 -0
- package/server/applications/notifications/i18n/ko.js +52 -0
- package/server/applications/notifications/i18n/ko.js.map +1 -0
- package/server/applications/notifications/i18n/pl.js +52 -0
- package/server/applications/notifications/i18n/pl.js.map +1 -0
- package/server/applications/notifications/i18n/pt.js +52 -0
- package/server/applications/notifications/i18n/pt.js.map +1 -0
- package/server/applications/notifications/i18n/pt_br.js +52 -0
- package/server/applications/notifications/i18n/pt_br.js.map +1 -0
- package/server/applications/notifications/i18n/ru.js +52 -0
- package/server/applications/notifications/i18n/ru.js.map +1 -0
- package/server/applications/notifications/i18n/tr.js +52 -0
- package/server/applications/notifications/i18n/tr.js.map +1 -0
- package/server/applications/notifications/i18n/zh.js +52 -0
- package/server/applications/notifications/i18n/zh.js.map +1 -0
- package/server/applications/notifications/mails/models.js +6 -7
- package/server/applications/notifications/mails/models.js.map +1 -1
- package/server/applications/notifications/services/notifications-manager.service.js.map +1 -1
- package/server/applications/shares/dto/create-or-update-share.dto.js +11 -0
- package/server/applications/shares/dto/create-or-update-share.dto.js.map +1 -1
- package/server/applications/shares/interfaces/share-props.interface.js.map +1 -1
- package/server/applications/shares/schemas/share.interface.js.map +1 -1
- package/server/applications/shares/schemas/shares.schema.js +9 -0
- package/server/applications/shares/schemas/shares.schema.js.map +1 -1
- package/server/applications/shares/services/shares-manager.service.js +46 -17
- package/server/applications/shares/services/shares-manager.service.js.map +1 -1
- package/server/applications/shares/services/shares-queries.service.js +24 -5
- package/server/applications/shares/services/shares-queries.service.js.map +1 -1
- package/server/applications/spaces/constants/cache.js +4 -0
- package/server/applications/spaces/constants/cache.js.map +1 -1
- package/server/applications/spaces/dto/create-or-update-space.dto.js +5 -0
- package/server/applications/spaces/dto/create-or-update-space.dto.js.map +1 -1
- package/server/applications/spaces/guards/space.guard.js +3 -3
- package/server/applications/spaces/guards/space.guard.js.map +1 -1
- package/server/applications/spaces/models/space-props.model.js.map +1 -1
- package/server/applications/spaces/models/space.model.js.map +1 -1
- package/server/applications/spaces/schemas/space.interface.js.map +1 -1
- package/server/applications/spaces/schemas/spaces.schema.js +1 -0
- package/server/applications/spaces/schemas/spaces.schema.js.map +1 -1
- package/server/applications/spaces/services/spaces-browser.service.js.map +1 -1
- package/server/applications/spaces/services/spaces-manager.service.js +34 -31
- package/server/applications/spaces/services/spaces-manager.service.js.map +1 -1
- package/server/applications/spaces/services/spaces-queries.service.js +23 -7
- package/server/applications/spaces/services/spaces-queries.service.js.map +1 -1
- package/server/applications/spaces/services/spaces-scheduler.service.js +21 -20
- package/server/applications/spaces/services/spaces-scheduler.service.js.map +1 -1
- package/server/applications/spaces/spaces.controller.js +4 -2
- package/server/applications/spaces/spaces.controller.js.map +1 -1
- package/server/applications/spaces/utils/paths.js +14 -16
- package/server/applications/spaces/utils/paths.js.map +1 -1
- package/server/applications/sync/services/sync-manager.service.js +4 -3
- 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/sync/sync.controller.js +2 -1
- package/server/applications/sync/sync.controller.js.map +1 -1
- package/server/applications/users/constants/routes.js +5 -0
- package/server/applications/users/constants/routes.js.map +1 -1
- package/server/applications/users/constants/user.js +0 -16
- package/server/applications/users/constants/user.js.map +1 -1
- package/server/applications/users/dto/user-properties.dto.js +10 -0
- package/server/applications/users/dto/user-properties.dto.js.map +1 -1
- package/server/applications/users/models/user.model.js.map +1 -1
- package/server/applications/users/schemas/user.interface.js.map +1 -1
- package/server/applications/users/schemas/users.schema.js +3 -2
- package/server/applications/users/schemas/users.schema.js.map +1 -1
- package/server/applications/users/services/admin-users-manager.service.js +1 -0
- package/server/applications/users/services/admin-users-manager.service.js.map +1 -1
- package/server/applications/users/services/admin-users-manager.service.spec.js +2 -1
- package/server/applications/users/services/admin-users-manager.service.spec.js.map +1 -1
- package/server/applications/users/services/users-manager.service.js +8 -2
- package/server/applications/users/services/users-manager.service.js.map +1 -1
- package/server/applications/users/services/users-manager.service.spec.js +1 -0
- package/server/applications/users/services/users-manager.service.spec.js.map +1 -1
- package/server/applications/users/services/users-queries.service.js +18 -4
- package/server/applications/users/services/users-queries.service.js.map +1 -1
- package/server/applications/users/users.controller.js +15 -0
- package/server/applications/users/users.controller.js.map +1 -1
- package/server/applications/users/utils/test.js +2 -2
- package/server/applications/users/utils/test.js.map +1 -1
- package/server/applications/webdav/constants/routes.js +2 -2
- package/server/applications/webdav/constants/routes.js.map +1 -1
- package/server/applications/webdav/constants/webdav.js +2 -2
- package/server/applications/webdav/constants/webdav.js.map +1 -1
- package/server/applications/webdav/filters/webdav.filter.js +2 -2
- package/server/applications/webdav/filters/webdav.filter.js.map +1 -1
- package/server/applications/webdav/filters/webdav.filter.spec.js +2 -2
- package/server/applications/webdav/filters/webdav.filter.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/utils/webdav.js +1 -2
- package/server/applications/webdav/utils/webdav.js.map +1 -1
- package/server/authentication/auth.config.js +2 -2
- package/server/authentication/auth.config.js.map +1 -1
- package/server/authentication/guards/auth-basic.strategy.js +2 -2
- package/server/authentication/guards/auth-basic.strategy.js.map +1 -1
- package/server/common/i18n.js +52 -0
- package/server/common/i18n.js.map +1 -0
- package/server/common/image.js +49 -33
- package/server/common/image.js.map +1 -1
- package/server/common/interfaces.js.map +1 -1
- package/server/common/shared.js +5 -2
- package/server/common/shared.js.map +1 -1
- package/server/configuration/config.validation.js +3 -3
- package/server/configuration/config.validation.js.map +1 -1
- package/server/infrastructure/cache/adapters/mysql-cache.adapter.js +8 -6
- package/server/infrastructure/cache/adapters/mysql-cache.adapter.js.map +1 -1
- package/server/infrastructure/cache/adapters/redis-cache.adapter.js +22 -17
- package/server/infrastructure/cache/adapters/redis-cache.adapter.js.map +1 -1
- package/server/infrastructure/cache/cache.e2e-spec.js +1 -0
- package/server/infrastructure/cache/cache.e2e-spec.js.map +1 -1
- package/server/infrastructure/cache/cache.module.js +1 -14
- package/server/infrastructure/cache/cache.module.js.map +1 -1
- package/server/infrastructure/cache/services/cache.service.js.map +1 -1
- package/server/infrastructure/database/database.module.js +20 -1
- package/server/infrastructure/database/database.module.js.map +1 -1
- package/server/infrastructure/database/utils.js +48 -0
- package/server/infrastructure/database/utils.js.map +1 -1
- package/server/infrastructure/scheduler/scheduler.module.js +1 -1
- package/server/infrastructure/scheduler/scheduler.module.js.map +1 -1
- package/server/infrastructure/websocket/adapters/cluster.adapter.js +1 -3
- package/server/infrastructure/websocket/adapters/cluster.adapter.js.map +1 -1
- package/static/3rdpartylicenses.txt +137 -137
- package/static/chunk-2KLC4T2Z.js +1 -0
- package/static/chunk-373XVRXW.js +1 -0
- package/static/chunk-3GMLWAFZ.js +1 -0
- package/static/chunk-3XVM35O2.js +1 -0
- package/static/chunk-3YVRP3VM.js +2 -0
- package/static/chunk-5NMSIIQB.js +1 -0
- package/static/chunk-AF24EYXU.js +1 -0
- package/static/chunk-AKQVEHO6.js +2 -0
- package/static/{chunk-PTGDOWV3.js → chunk-AY2SZ3G6.js} +1 -1
- package/static/chunk-BCVX464U.js +2 -0
- package/static/{chunk-IPAC4VAF.js → chunk-BIKLW4YS.js} +1 -1
- package/static/chunk-C36MW4ME.js +562 -0
- package/static/chunk-CHJ64RJM.js +1 -0
- package/static/chunk-DKSEQTMX.js +1 -0
- package/static/chunk-DM4NXKEP.js +1 -0
- package/static/chunk-DPUVSXRB.js +1 -0
- package/static/chunk-DSWEWLXJ.js +1 -0
- package/static/chunk-FJE6BOFL.js +1 -0
- package/static/chunk-FZ3JPGYZ.js +1 -0
- package/static/chunk-GUGNR5TF.js +3 -0
- package/static/chunk-H6NE33VX.js +1 -0
- package/static/{chunk-DJYJ66UF.js → chunk-HAS5ZOTR.js} +1 -1
- package/static/chunk-HNQRZALS.js +1 -0
- package/static/chunk-JPT5WEAT.js +1 -0
- package/static/{chunk-QNJFQVYI.js → chunk-JSWCNGXJ.js} +1 -1
- package/static/chunk-KFJIQIGR.js +1 -0
- package/static/chunk-LNTUR3GU.js +1 -0
- package/static/chunk-LVM4QB22.js +1 -0
- package/static/chunk-M3XVNQZQ.js +1 -0
- package/static/{chunk-EVIE5F2U.js → chunk-MFLIJH6T.js} +1 -1
- package/static/{chunk-IQOALFYU.js → chunk-MSUHTBB2.js} +1 -1
- package/static/chunk-N3U6637P.js +1 -0
- package/static/chunk-NNV4OXSB.js +1 -0
- package/static/chunk-NO2LTNW3.js +1 -0
- package/static/chunk-OOGP4WSH.js +2 -0
- package/static/chunk-PB4AIT7O.js +1 -0
- package/static/chunk-PCWDQPOM.js +2 -0
- package/static/chunk-PGZZP5W3.js +1 -0
- package/static/chunk-PVDHBQRM.js +1 -0
- package/static/chunk-Q5KM7LTX.js +1 -0
- package/static/chunk-QHC6ZPQ4.js +1 -0
- package/static/chunk-QO6BTONN.js +1 -0
- package/static/chunk-QZU2S5CV.js +1 -0
- package/static/chunk-SBZ572Q4.js +2 -0
- package/static/chunk-SHIVUDP3.js +1 -0
- package/static/chunk-SLHTEGRU.js +1 -0
- package/static/{chunk-SH5EVL4E.js → chunk-SSFF27P2.js} +1 -1
- package/static/chunk-TPYBFZS5.js +1 -0
- package/static/chunk-UEQCWMXD.js +1 -0
- package/static/chunk-UG5DMXYO.js +1 -0
- package/static/chunk-UJPPR4MX.js +1 -0
- package/static/chunk-UNCPXHHT.js +1 -0
- package/static/chunk-URHTCJ7G.js +1 -0
- package/static/chunk-V3AT2BKP.js +1 -0
- package/static/chunk-VKK5BSLX.js +1 -0
- package/static/{chunk-SIPE37PA.js → chunk-VM4YX6Q7.js} +1 -1
- package/static/chunk-WJW7CT6G.js +27 -0
- package/static/{chunk-7ITZXYYJ.js → chunk-WLMNXRBS.js} +1 -1
- package/static/chunk-X5XGK6T7.js +4 -0
- package/static/chunk-YEKR5OPO.js +1 -0
- package/static/chunk-YW57T2PF.js +1 -0
- package/static/chunk-Z5J5F5SX.js +1 -0
- package/static/chunk-ZIJQRARU.js +1 -0
- package/static/chunk-ZPF2DSQV.js +1 -0
- package/static/chunk-ZTCRGJ6Y.js +7 -0
- package/static/index.html +2 -2
- package/static/main-VOL6OMJ5.js +9 -0
- package/static/scripts-WRDOQIU5.js +24 -0
- package/static/{styles-A5VYX3CE.css → styles-2C2UNCNB.css} +1 -1
- package/server/applications/spaces/interfaces/space-quota.interface.js +0 -10
- package/server/applications/spaces/interfaces/space-quota.interface.js.map +0 -1
- package/static/chunk-22EANI6R.js +0 -1
- package/static/chunk-3GFGJYMK.js +0 -1
- package/static/chunk-4YGJGZZZ.js +0 -1
- package/static/chunk-5K7HEX3C.js +0 -27
- package/static/chunk-5KLMS6A4.js +0 -1
- package/static/chunk-ATP3BFHV.js +0 -562
- package/static/chunk-BB4G55KE.js +0 -1
- package/static/chunk-EWKSX76T.js +0 -1
- package/static/chunk-FHLACA7V.js +0 -1
- package/static/chunk-GCATNU55.js +0 -1
- package/static/chunk-GYODPCIE.js +0 -1
- package/static/chunk-HZTFYLM5.js +0 -1
- package/static/chunk-JSUKJT6Z.js +0 -1
- package/static/chunk-JXZCNFW7.js +0 -1
- package/static/chunk-LTGFCQR7.js +0 -1
- package/static/chunk-LV3PYKWO.js +0 -1
- package/static/chunk-N2WFNW6M.js +0 -7
- package/static/chunk-ORMRCEGT.js +0 -1
- package/static/chunk-OUTBJSMW.js +0 -1
- package/static/chunk-RS2PX32L.js +0 -1
- package/static/chunk-RSSWH3S2.js +0 -1
- package/static/chunk-RTRJ3KFH.js +0 -1
- package/static/chunk-TKTCBDOG.js +0 -1
- package/static/chunk-V6K2N46L.js +0 -1
- package/static/chunk-XLCCZSQL.js +0 -4
- package/static/chunk-YPEH66GG.js +0 -1
- package/static/chunk-YPOIUQ57.js +0 -1
- package/static/chunk-ZKCFO2OA.js +0 -4
- package/static/main-MZ7HWZXO.js +0 -9
- package/static/scripts-VZVAP2P4.js +0 -30
|
@@ -456,10 +456,24 @@ let UsersQueries = class UsersQueries {
|
|
|
456
456
|
return JSON.parse(r[0].ids) || [];
|
|
457
457
|
}
|
|
458
458
|
clearWhiteListCaches(userIds) {
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
459
|
+
if (userIds === '*') {
|
|
460
|
+
// means all entries
|
|
461
|
+
for (const pattern of [
|
|
462
|
+
this.cache.genSlugKey(this.constructor.name, this.usersWhitelist.name, userIds),
|
|
463
|
+
this.cache.genSlugKey(this.constructor.name, this.groupsWhitelist.name, userIds)
|
|
464
|
+
]){
|
|
465
|
+
this.cache.keys(pattern).then((keys)=>{
|
|
466
|
+
if (!keys.length) return;
|
|
467
|
+
this.logger.verbose(`${this.clearWhiteListCaches.name} - ${JSON.stringify(keys)}`);
|
|
468
|
+
this.cache.mdel(keys).catch((e)=>this.logger.error(`${this.clearWhiteListCaches.name} - ${e}`));
|
|
469
|
+
}).catch((e)=>this.logger.error(`${this.clearWhiteListCaches.name} - ${e}`));
|
|
470
|
+
}
|
|
471
|
+
} else {
|
|
472
|
+
this.cache.mdel([
|
|
473
|
+
...userIds.map((id)=>this.cache.genSlugKey(this.constructor.name, this.usersWhitelist.name, id)),
|
|
474
|
+
...userIds.map((id)=>this.cache.genSlugKey(this.constructor.name, this.groupsWhitelist.name, id))
|
|
475
|
+
]).catch((e)=>this.logger.error(`${this.clearWhiteListCaches.name} - ${e}`));
|
|
476
|
+
}
|
|
463
477
|
}
|
|
464
478
|
async allUserIdsFromGroupsAndSubGroups(groupIds) {
|
|
465
479
|
if (!groupIds.length) return [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../backend/src/applications/users/services/users-queries.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Inject, Injectable, Logger } from '@nestjs/common'\nimport { and, countDistinct, eq, inArray, like, lte, ne, notInArray, or, SelectedFields, SQL, sql } from 'drizzle-orm'\nimport { alias } from 'drizzle-orm/mysql-core'\nimport { MySql2PreparedQuery, MySqlQueryResult } from 'drizzle-orm/mysql2'\nimport { anonymizePassword, comparePassword, uniquePermissions } from '../../../common/functions'\nimport { CacheDecorator } from '../../../infrastructure/cache/cache.decorator'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport { DBSchema } from '../../../infrastructure/database/interfaces/database.interface'\nimport {\n concatDistinctObjectsInArray,\n convertToSelect,\n dateTimeUTC,\n dbCheckAffectedRows,\n dbGetInsertedId\n} from '../../../infrastructure/database/utils'\nimport { GROUP_TYPE, GROUP_VISIBILITY } from '../constants/group'\nimport { MEMBER_TYPE } from '../constants/member'\nimport { USER_GROUP_ROLE, USER_ONLINE_STATUS, USER_PERMS_SEP, USER_ROLE } from '../constants/user'\nimport { UserCreateOrUpdateGroupDto } from '../dto/create-or-update-group.dto'\nimport { CreateUserDto } from '../dto/create-or-update-user.dto'\nimport { SearchMembersDto } from '../dto/search-members.dto'\nimport { GroupMember, GroupWithMembers } from '../interfaces/group-member'\nimport { GuestUser } from '../interfaces/guest-user.interface'\nimport { Member } from '../interfaces/member.interface'\nimport { UserSecrets } from '../interfaces/user-secrets.interface'\nimport { UserOnline } from '../interfaces/websocket.interface'\nimport { UserModel } from '../models/user.model'\nimport { Group } from '../schemas/group.interface'\nimport { groups } from '../schemas/groups.schema'\nimport { UserGroup } from '../schemas/user-group.interface'\nimport { User } from '../schemas/user.interface'\nimport { usersGroups } from '../schemas/users-groups.schema'\nimport { usersGuests } from '../schemas/users-guests.schema'\nimport { userFullNameSQL, users } from '../schemas/users.schema'\n\n@Injectable()\nexport class UsersQueries {\n private readonly logger = new Logger(UsersQueries.name)\n private fromLoginOrEmailPermissionsQuery: MySql2PreparedQuery<any> = null\n private fromIdPermissionsQuery: MySql2PreparedQuery<any> = null\n\n constructor(\n @Inject(DB_TOKEN_PROVIDER) private readonly db: DBSchema,\n private readonly cache: Cache\n ) {}\n\n checkUserExists(login?: string, email?: string): Promise<{ login?: string; email?: string }> {\n if (!login && !email) {\n throw new Error('login or email must be specified')\n }\n const columns: { login?: boolean; email?: boolean } = {}\n const where: SQL[] = []\n if (login) {\n columns.login = true\n where.push(eq(users.login, login))\n }\n if (email) {\n columns.email = true\n where.push(eq(users.email, email))\n }\n const operator = login && email ? or : and\n return this.db.query.users.findFirst({\n columns: columns,\n where: operator(...where)\n })\n }\n\n setOnlineStatus(userId: number, onlineStatus: USER_ONLINE_STATUS): Promise<boolean> {\n return this.updateUserOrGuest(userId, { onlineStatus: onlineStatus })\n }\n\n getOnlineUsers(userIds: number[]): Promise<UserOnline[]> {\n return this.db\n .select({\n id: users.id,\n login: users.login,\n email: users.email,\n fullName: userFullNameSQL(users),\n onlineStatus: users.onlineStatus\n } satisfies UserOnline | SelectedFields<any, any>)\n .from(users)\n .where(inArray(users.id, userIds))\n }\n\n async checkGroupNameExists(groupName: string): Promise<boolean> {\n const [group] = await this.db.select({ name: groups.name }).from(groups).where(eq(groups.name, groupName)).limit(1)\n return !!group?.name\n }\n\n async compareUserPassword(userId: number, password: string): Promise<boolean> {\n const [hash] = (await this.selectUsers(['password'], [eq(users.id, userId)])) as { password: string }[]\n if (!hash) return false\n return comparePassword(password, hash.password)\n }\n\n async from(userId?: number, loginOrEmail?: string): Promise<User> {\n // retrieve user with application permissions\n let pQuery: MySql2PreparedQuery<any> = userId ? this.fromIdPermissionsQuery : this.fromLoginOrEmailPermissionsQuery\n if (!pQuery) {\n const where = userId\n ? eq(users.id, sql.placeholder('userId'))\n : or(eq(users.login, sql.placeholder('loginOrEmail')), eq(users.email, sql.placeholder('loginOrEmail')))\n pQuery = this.db\n .select({\n user: users,\n groupsPermissions: sql`GROUP_CONCAT(DISTINCT (${groups.permissions}) SEPARATOR ${USER_PERMS_SEP})`\n })\n .from(users)\n .leftJoin(usersGroups, eq(usersGroups.userId, users.id))\n .leftJoin(groups, and(eq(groups.id, usersGroups.groupId), ne(groups.permissions, '')))\n .where(where)\n .groupBy(users.id)\n .limit(1)\n .prepare()\n if (userId) {\n this.fromIdPermissionsQuery = pQuery\n } else {\n this.fromLoginOrEmailPermissionsQuery = pQuery\n }\n }\n const r = await pQuery.execute(userId ? { userId } : { loginOrEmail })\n if (!r.length) return null\n const [user, groupsPermissions] = [r[0].user, r[0].groupsPermissions]\n // merge user and groups permissions\n user.permissions = uniquePermissions(`${user.permissions},${groupsPermissions}`, USER_PERMS_SEP)\n return user\n }\n\n async getUserSecrets(userId: number): Promise<UserSecrets> {\n const [r]: { secrets: UserSecrets }[] = await this.db.select({ secrets: users.secrets }).from(users).where(eq(users.id, userId)).limit(1)\n return r.secrets || {}\n }\n\n selectUsers(fields: Partial<keyof User>[] = ['id', 'login', 'email'], where: SQL[]): Promise<Partial<User>[]> {\n const select: Record<keyof User, any> = convertToSelect(users, fields)\n return this.db\n .select(select)\n .from(users)\n .where(and(...where))\n }\n\n async selectUserProperties(userId: number, fields: Partial<keyof User>[]): Promise<Partial<User>> {\n const select: Record<keyof User, any> = convertToSelect(users, fields)\n const [r]: Record<string, any>[] = await this.db.select(select).from(users).where(eq(users.id, userId)).limit(1)\n return r\n }\n\n async createUserOrGuest(createUserDto: CreateUserDto, userRole: USER_ROLE): Promise<User['id']> {\n const userId: number = dbGetInsertedId(await this.db.insert(users).values({ ...createUserDto, role: userRole } as User))\n if (userRole === USER_ROLE.USER && createUserDto.groups?.length) {\n await this.db.insert(usersGroups).values(createUserDto.groups.map((gid: number) => ({ userId: userId, groupId: gid })))\n }\n if (userRole === USER_ROLE.GUEST && createUserDto.managers?.length) {\n await this.db.insert(usersGuests).values(createUserDto.managers.map((uid: number) => ({ guestId: userId, userId: uid })))\n }\n return userId\n }\n\n async updateUserOrGuest(userId: number, set: Partial<Record<keyof User, any>>, userRole?: USER_ROLE): Promise<boolean> {\n try {\n dbCheckAffectedRows(\n await this.db\n .update(users)\n .set({ ...set, ...(userRole && { role: userRole }) } as User)\n .where(eq(users.id, userId)),\n 1\n )\n this.logger.verbose(`${this.updateUserOrGuest.name} - user (${userId}) was updated : ${JSON.stringify(anonymizePassword(set))}`)\n return true\n } catch (e) {\n this.logger.error(`${this.updateUserOrGuest.name} - user (${userId}) was not updated : ${JSON.stringify(anonymizePassword(set))} : ${e}`)\n return false\n }\n }\n\n async deleteGuestLink(userId: number): Promise<void> {\n dbCheckAffectedRows(await this.db.delete(users).where(and(eq(users.id, userId), eq(users.role, USER_ROLE.LINK))), 1)\n }\n\n async searchUsersOrGroups(searchMembersDto: SearchMembersDto, userId?: number): Promise<Member[]> {\n const limit = searchMembersDto.onlyUsers || searchMembersDto.onlyGroups ? 6 : 3\n const members: Member[] = []\n if (!searchMembersDto.onlyGroups) {\n for (const u of await this.searchUsers(searchMembersDto, userId, limit)) {\n members.push({\n id: u.id,\n login: u.login,\n name: u.fullName,\n description: u.email,\n type: u.role === USER_ROLE.GUEST ? MEMBER_TYPE.GUEST : MEMBER_TYPE.USER,\n permissions: searchMembersDto.withPermissions ? u.permissions : undefined\n })\n }\n }\n if (!searchMembersDto.onlyUsers) {\n for (const g of await this.searchGroups(searchMembersDto, userId, limit)) {\n members.push({\n id: g.id,\n name: g.name,\n description: g.description,\n type: g.type === GROUP_TYPE.USER ? MEMBER_TYPE.GROUP : MEMBER_TYPE.PGROUP,\n permissions: searchMembersDto.withPermissions ? g.permissions : undefined\n })\n }\n }\n return members\n }\n\n async groupFromName(userId: number, name: string): Promise<Pick<Group, 'id' | 'name' | 'type'> & { role: UserGroup['role'] }> {\n const [group] = await this.db\n .select({\n id: groups.id,\n name: groups.name,\n type: groups.type,\n role: usersGroups.role\n } satisfies (Pick<Group, 'id' | 'name' | 'type'> & { role: UserGroup['role'] }) | SelectedFields<any, any>)\n .from(usersGroups)\n .innerJoin(groups, eq(groups.id, usersGroups.groupId))\n .where(and(eq(usersGroups.userId, userId), eq(groups.name, name)))\n .limit(1)\n return group\n }\n\n async browseRootGroups(userId: number): Promise<Member[]> {\n const members = alias(usersGroups, 'members')\n return this.db\n .select({\n id: groups.id,\n name: groups.name,\n description: groups.description,\n createdAt: groups.createdAt,\n modifiedAt: groups.modifiedAt,\n type: sql<MEMBER_TYPE>`IF(${groups.type} = ${GROUP_TYPE.USER}, ${MEMBER_TYPE.GROUP}, ${MEMBER_TYPE.PGROUP})`,\n groupRole: sql<USER_GROUP_ROLE>`${usersGroups.role}`,\n counts: { users: countDistinct(members.userId) }\n } satisfies Member | SelectedFields<any, any>)\n .from(usersGroups)\n .innerJoin(groups, and(eq(groups.id, usersGroups.groupId), eq(usersGroups.userId, userId)))\n .leftJoin(members, eq(members.groupId, groups.id))\n .groupBy(groups.id)\n }\n\n async browseGroupMembers(groupId: number): Promise<Member[]> {\n return this.db\n .select({\n id: users.id,\n login: users.login,\n name: userFullNameSQL(users).as('name'),\n description: users.email,\n createdAt: usersGroups.createdAt,\n type: sql<MEMBER_TYPE>`${MEMBER_TYPE.USER}`,\n groupRole: sql<USER_GROUP_ROLE>`${usersGroups.role}`\n } satisfies Member | SelectedFields<any, any>)\n .from(groups)\n .innerJoin(usersGroups, and(eq(usersGroups.groupId, groups.id), eq(usersGroups.groupId, groupId)))\n .leftJoin(users, eq(users.id, usersGroups.userId))\n .groupBy(users.id)\n }\n\n async canDeletePersonalGroup(userId: number, groupId: number): Promise<boolean> {\n const [group] = await this.db\n .select({ id: usersGroups.groupId })\n .from(usersGroups)\n .innerJoin(groups, and(eq(groups.id, usersGroups.groupId)))\n .where(\n and(\n eq(groups.type, GROUP_TYPE.PERSONAL),\n eq(usersGroups.userId, userId),\n eq(usersGroups.groupId, groupId),\n eq(usersGroups.role, USER_GROUP_ROLE.MANAGER)\n )\n )\n .limit(1)\n return !!group?.id\n }\n\n async getGroup(userId: number, groupId: number, asAdmin = false): Promise<GroupMember> {\n const [group] = await this.db\n .select({\n id: groups.id,\n name: groups.name,\n description: groups.description,\n createdAt: groups.createdAt,\n modifiedAt: groups.modifiedAt,\n type: sql<MEMBER_TYPE>`IF(${groups.type} = ${GROUP_TYPE.USER}, ${MEMBER_TYPE.GROUP}, ${MEMBER_TYPE.PGROUP})`\n })\n .from(usersGroups)\n .innerJoin(groups, and(eq(groups.id, usersGroups.groupId)))\n .where(\n and(\n eq(usersGroups.groupId, groupId),\n sql`IF(${+asAdmin} = 0, ${usersGroups.userId} = ${userId} AND ${usersGroups.role} = ${USER_GROUP_ROLE.MANAGER}, 1)`\n )\n )\n .limit(1)\n return group\n }\n\n async getGroupWithMembers(userId: number, groupId: number, asAdmin = false): Promise<GroupWithMembers> {\n const usersGroupsAlias: any = alias(usersGroups, 'usersFromGroups')\n const [group] = await this.db\n .select({\n id: groups.id,\n name: groups.name,\n description: groups.description,\n createdAt: groups.createdAt,\n modifiedAt: groups.modifiedAt,\n type: sql<MEMBER_TYPE>`IF(${groups.type} = ${GROUP_TYPE.USER}, ${sql.raw(`'${MEMBER_TYPE.GROUP}'`)}, ${sql.raw(`'${MEMBER_TYPE.PGROUP}'`)})`,\n members: concatDistinctObjectsInArray(users.id, {\n id: users.id,\n login: users.login,\n name: userFullNameSQL(users),\n description: users.email,\n type: sql.raw(`'${MEMBER_TYPE.USER}'`),\n groupRole: usersGroupsAlias.role,\n createdAt: dateTimeUTC(usersGroupsAlias.createdAt)\n } satisfies Record<keyof Pick<Member, 'id' | 'name' | 'login' | 'description' | 'type' | 'groupRole' | 'createdAt'>, any>)\n } satisfies GroupWithMembers | SelectedFields<any, any>)\n .from(usersGroups)\n .innerJoin(groups, eq(groups.id, usersGroups.groupId))\n .leftJoin(usersGroupsAlias, and(eq(usersGroupsAlias.groupId, groups.id)))\n .leftJoin(users, eq(users.id, usersGroupsAlias.userId))\n .where(\n and(\n eq(usersGroups.groupId, groupId),\n sql`IF(${+asAdmin} = 0, ${usersGroups.userId} = ${userId} AND ${usersGroups.role} = ${USER_GROUP_ROLE.MANAGER}, 1)`\n )\n )\n .groupBy(groups.id)\n .limit(1)\n return group\n }\n\n async deletePersonalGroup(groupId: number): Promise<boolean> {\n return dbCheckAffectedRows(\n await this.db\n .delete(groups)\n .where(and(eq(groups.id, groupId), eq(groups.type, GROUP_TYPE.PERSONAL)))\n .limit(1),\n 1,\n false\n )\n }\n\n async createPersonalGroup(managerId: number, userCreateOrUpdateGroupDto: UserCreateOrUpdateGroupDto): Promise<Group['id']> {\n const groupId: number = dbGetInsertedId(\n await this.db.insert(groups).values({\n ...userCreateOrUpdateGroupDto,\n type: GROUP_TYPE.PERSONAL,\n visibility: GROUP_VISIBILITY.PRIVATE\n } as Group)\n )\n await this.db.insert(usersGroups).values({ userId: managerId, groupId: groupId, role: USER_GROUP_ROLE.MANAGER } as UserGroup)\n return groupId\n }\n\n async updateGroup(groupId: number, set: Partial<Record<keyof Group, any>>) {\n if (Object.keys(set).length) {\n try {\n await this.db.update(groups).set(set).where(eq(groups.id, groupId))\n this.logger.log(`${this.updateGroup.name} - group (${groupId}) was updated : ${JSON.stringify(set)}`)\n } catch (e) {\n this.logger.error(`${this.updateGroup.name} - group (${groupId}) was not updated : ${JSON.stringify(set)} : ${e}`)\n throw new Error('Group was not updated')\n }\n }\n }\n\n async updateGroupMembers(\n groupId: number,\n members: {\n add?: Pick<Member, 'id' | 'groupRole'>[]\n remove?: UserGroup['userId'][]\n }\n ): Promise<void> {\n if (members?.add?.length) {\n try {\n await this.db.insert(usersGroups).values(members.add.map((m) => ({ userId: m.id, groupId: groupId, role: m.groupRole })))\n // clear cache\n this.clearWhiteListCaches(members.add.map((m) => m.id))\n this.logger.log(`${this.updateGroupMembers.name} - users ${JSON.stringify(members.add.map((m) => m.id))} was added to group (${groupId})`)\n } catch (e) {\n this.logger.error(\n `${this.updateGroupMembers.name} - users ${JSON.stringify(members.add.map((m) => m.id))} was not added to group (${groupId}) : ${e}`\n )\n throw new Error('Group members was not added')\n }\n }\n if (members?.remove?.length) {\n try {\n await this.db\n .delete(usersGroups)\n .where(and(eq(usersGroups.groupId, groupId), inArray(usersGroups.userId, members.remove)))\n .limit(members.remove.length)\n // clear cache\n this.clearWhiteListCaches(members.remove)\n this.logger.log(`${this.updateGroupMembers.name} - users ${JSON.stringify(members.remove)} was removed from group (${groupId})`)\n } catch (e) {\n this.logger.error(`${this.updateGroupMembers.name} - users ${JSON.stringify(members.remove)} was not removed from group (${groupId}) : ${e}`)\n throw new Error('Group members was not removed')\n }\n }\n }\n\n async listGuests(guestId: null, managerId?: number, asAdmin?: boolean): Promise<GuestUser[]>\n async listGuests(guestId: number, managerId?: number, asAdmin?: boolean): Promise<GuestUser>\n async listGuests(guestId: number | null, managerId?: number, asAdmin = false): Promise<GuestUser | GuestUser[]> {\n const where: SQL[] = [...(guestId ? [eq(usersGuests.guestId, guestId)] : []), ...(asAdmin ? [] : [eq(usersGuests.userId, managerId)])]\n const managersGuestAlias: any = alias(usersGuests, 'managersGuestAlias')\n const managersAlias: any = alias(users, 'managersAlias')\n const guests = await this.db\n .select({\n id: users.id,\n login: users.login,\n email: users.email,\n firstName: users.firstName,\n lastName: users.lastName,\n fullName: userFullNameSQL(users),\n role: users.role,\n isActive: users.isActive,\n passwordAttempts: users.passwordAttempts,\n language: users.language,\n notification: users.notification,\n currentAccess: users.currentAccess,\n lastAccess: users.lastAccess,\n currentIp: users.currentIp,\n lastIp: users.lastIp,\n createdAt: users.createdAt,\n managers: concatDistinctObjectsInArray(managersAlias.id, {\n id: managersAlias.id,\n login: managersAlias.login,\n name: userFullNameSQL(managersAlias),\n type: sql.raw(`'${MEMBER_TYPE.USER}'`),\n description: managersAlias.email,\n createdAt: dateTimeUTC(managersGuestAlias.createdAt)\n } satisfies Record<keyof Pick<Member, 'id' | 'name' | 'login' | 'description' | 'type' | 'createdAt'>, any>)\n } satisfies GuestUser | SelectedFields<any, any>)\n .from(usersGuests)\n .innerJoin(users, and(eq(users.id, usersGuests.guestId), eq(users.role, USER_ROLE.GUEST)))\n .leftJoin(managersGuestAlias, eq(managersGuestAlias.guestId, users.id))\n .leftJoin(managersAlias, eq(managersAlias.id, managersGuestAlias.userId))\n .where(and(...where))\n .groupBy(users.id)\n .limit(guestId ? 1 : undefined)\n return guestId ? guests[0] : guests\n }\n\n async isGuestManager(managerId: number, guestId: number): Promise<{ id: number; login: string } | undefined> {\n const [guest] = await this.db\n .select({ id: usersGuests.guestId, login: users.login })\n .from(usersGuests)\n .innerJoin(users, eq(users.id, usersGuests.guestId))\n .where(and(eq(usersGuests.userId, managerId), eq(usersGuests.guestId, guestId), eq(users.role, USER_ROLE.GUEST)))\n .limit(1)\n return guest\n }\n\n @CacheDecorator(900)\n async usersWhitelist(userId: number, lowerOrEqualUserRole: USER_ROLE = USER_ROLE.GUEST): Promise<number[]> {\n /* Get the list of user ids allowed to the current user\n - all users with no groups (except link users)\n - all users who are members of the current user's groups (excluding link users and members of isolated groups)\n - all guests managed by the current user\n - all managers who manage the current guest\n */\n const usersAlias: any = alias(users, 'usersAlias')\n const groupsAlias: any = alias(groups, 'groupsAlias')\n const userIds: any = sql`\n WITH RECURSIVE children (id, parentId) AS\n (SELECT ${groups.id},\n ${groups.parentId}\n FROM ${groups}\n WHERE (${groups.id} IN (SELECT ${usersGroups.groupId}\n FROM ${usersGroups}\n WHERE ${usersGroups.userId} = ${userId}\n AND ${groups.visibility} != ${GROUP_VISIBILITY.ISOLATED}))\n UNION\n SELECT ${groupsAlias.id},\n ${groupsAlias.parentId}\n FROM ${groups} AS groupsAlias\n INNER JOIN children cs ON ${groupsAlias.parentId} = cs.id AND ${groupsAlias.visibility} = ${sql.raw(`${GROUP_VISIBILITY.VISIBLE}`)})\n SELECT JSON_ARRAYAGG(id) AS ids\n FROM (\n -- Users from visible child groups\n SELECT ${users.id} AS id\n FROM children\n INNER JOIN ${usersGroups} ON ${usersGroups.groupId} = children.id\n INNER JOIN ${users} ON ${usersGroups.userId} = ${users.id} AND ${users.role} <= ${sql.raw(`${lowerOrEqualUserRole}`)}\n\n UNION\n -- Users visible but not assigned to groups\n SELECT ${usersAlias.id} AS id\n FROM ${users} AS usersAlias\n INNER JOIN ${users} ON ${users.id} = ${usersAlias.id} AND ${users.role} <= ${sql.raw(`${lowerOrEqualUserRole}`)}\n WHERE NOT EXISTS (SELECT ${usersGroups.userId} FROM ${usersGroups} WHERE ${usersGroups.userId} = ${usersAlias.id})\n UNION\n -- Users or guests that are manager/managed\n SELECT CASE\n WHEN ${usersGuests.userId} = ${userId} THEN ${usersGuests.guestId}\n WHEN ${usersGuests.guestId} = ${userId} THEN ${usersGuests.userId}\n END AS id\n FROM ${usersGuests}\n WHERE ${usersGuests.userId} = ${userId}\n OR ${usersGuests.guestId} = ${userId}) AS usersUnion\n `\n const [r] = await this.db.execute(userIds)\n return JSON.parse(r[0].ids) || []\n }\n\n @CacheDecorator(900)\n async groupsWhitelist(userId: number): Promise<number[]> {\n /* Get the list of groups ids allowed to the current user\n - all parent groups for which the user is a member (includes personal groups, excludes isolated groups)\n - all subgroups inherited from parent groups\n */\n const groupsAlias: any = alias(groups, 'groupsAlias')\n const groupIds: any = sql`\n WITH RECURSIVE children (id, parentId, type) AS\n (SELECT ${groups.id},\n ${groups.parentId},\n ${groups.type}\n FROM ${groups}\n WHERE (${groups.id} IN (SELECT ${usersGroups.groupId}\n FROM ${usersGroups}\n WHERE ${usersGroups.userId} = ${userId}\n AND ${groups.visibility} != ${GROUP_VISIBILITY.ISOLATED}))\n UNION\n SELECT ${groupsAlias.id},\n ${groupsAlias.parentId},\n ${groupsAlias.type}\n FROM ${groups} AS groupsAlias\n INNER JOIN children cs ON ${groupsAlias.parentId} = cs.id AND ${groupsAlias.visibility} = ${GROUP_VISIBILITY.VISIBLE})\n SELECT JSON_ARRAYAGG(children.id) as ids\n FROM children\n `\n const [r] = await this.db.execute(groupIds)\n return JSON.parse(r[0].ids) || []\n }\n\n clearWhiteListCaches(userIds: number[]) {\n this.cache\n .mdel([\n ...userIds.map((id) => this.cache.genSlugKey(this.constructor.name, this.usersWhitelist.name, id)),\n ...userIds.map((id) => this.cache.genSlugKey(this.constructor.name, this.groupsWhitelist.name, id))\n ])\n .catch((e: Error) => this.logger.error(`${this.clearWhiteListCaches.name} - ${e}`))\n }\n\n async allUserIdsFromGroupsAndSubGroups(groupIds: number[]): Promise<number[]> {\n if (!groupIds.length) return []\n const subGroup: any = alias(groups, 'subGroup')\n const withChildren: any = sql`\n WITH RECURSIVE child (id, parentId) AS\n (SELECT ${groups.id}, ${groups.parentId}\n FROM ${groups}\n WHERE ${inArray(groups.id, groupIds)}\n UNION\n SELECT ${subGroup.id},\n ${subGroup.parentId}\n FROM ${groups} AS subGroup\n INNER JOIN child AS cs ON ${subGroup.parentId} = cs.id)\n SELECT DISTINCT ${usersGroups.userId} as userId\n FROM child\n INNER JOIN ${usersGroups} ON child.id = ${usersGroups.groupId}\n `\n const [r]: { userId: number }[][] = (await this.db.execute(withChildren)) as MySqlQueryResult\n return r.length ? r.map((r) => r.userId) : []\n }\n\n private async searchGroups(\n searchMembersDto: SearchMembersDto,\n userId?: number,\n limit = 3\n ): Promise<Pick<Group, 'id' | 'name' | 'description' | 'type' | 'permissions'>[]> {\n /* Search for groups */\n const where: SQL[] = [like(groups.name, `%${searchMembersDto.search}%`)]\n if (userId) {\n let idsWhitelist: number[] = await this.groupsWhitelist(userId)\n if (searchMembersDto.ignoreGroupIds?.length) {\n idsWhitelist = idsWhitelist.filter((id) => searchMembersDto.ignoreGroupIds.indexOf(id) === -1)\n }\n where.unshift(inArray(groups.id, idsWhitelist))\n } else if (searchMembersDto.ignoreGroupIds?.length) {\n where.unshift(notInArray(groups.id, searchMembersDto.ignoreGroupIds))\n }\n if (searchMembersDto.excludePersonalGroups) {\n where.unshift(eq(groups.type, GROUP_TYPE.USER))\n }\n return this.db\n .select({ id: groups.id, name: groups.name, description: groups.description, type: groups.type, permissions: groups.permissions })\n .from(groups)\n .where(and(...where))\n .limit(limit)\n }\n\n private async searchUsers(\n searchMembersDto: SearchMembersDto,\n userId?: number,\n limit = 3\n ): Promise<Pick<UserModel, 'id' | 'login' | 'email' | 'fullName' | 'role' | 'permissions'>[]> {\n /* Search for users */\n const where: SQL[] = [\n ne(users.role, USER_ROLE.LINK),\n or(like(sql`CONCAT_WS('-', ${users.login}, ${users.email}, ${users.firstName}, ${users.lastName})`, `%${searchMembersDto.search}%`))\n ]\n if (userId) {\n let idsWhitelist: number[] = await this.usersWhitelist(userId)\n if (searchMembersDto.ignoreUserIds?.length) {\n idsWhitelist = idsWhitelist.filter((id) => searchMembersDto.ignoreUserIds.indexOf(id) === -1)\n }\n where.unshift(inArray(users.id, idsWhitelist))\n } else {\n if (searchMembersDto.ignoreUserIds?.length) {\n where.unshift(notInArray(users.id, searchMembersDto.ignoreUserIds))\n }\n }\n if (typeof searchMembersDto.usersRole !== 'undefined') {\n if (searchMembersDto.usersRole === USER_ROLE.USER) {\n // allow admin users\n where.unshift(lte(users.role, searchMembersDto.usersRole))\n } else {\n where.unshift(eq(users.role, searchMembersDto.usersRole))\n }\n }\n return this.db\n .select({\n id: users.id,\n login: users.login,\n email: users.email,\n fullName: userFullNameSQL(users),\n role: users.role,\n permissions: users.permissions\n })\n .from(users)\n .where(and(...where))\n .limit(limit)\n }\n}\n"],"names":["UsersQueries","checkUserExists","login","email","Error","columns","where","push","eq","users","operator","or","and","db","query","findFirst","setOnlineStatus","userId","onlineStatus","updateUserOrGuest","getOnlineUsers","userIds","select","id","fullName","userFullNameSQL","from","inArray","checkGroupNameExists","groupName","group","name","groups","limit","compareUserPassword","password","hash","selectUsers","comparePassword","loginOrEmail","pQuery","fromIdPermissionsQuery","fromLoginOrEmailPermissionsQuery","sql","placeholder","user","groupsPermissions","permissions","USER_PERMS_SEP","leftJoin","usersGroups","groupId","ne","groupBy","prepare","r","execute","length","uniquePermissions","getUserSecrets","secrets","fields","convertToSelect","selectUserProperties","createUserOrGuest","createUserDto","userRole","dbGetInsertedId","insert","values","role","USER_ROLE","USER","map","gid","GUEST","managers","usersGuests","uid","guestId","set","dbCheckAffectedRows","update","logger","verbose","JSON","stringify","anonymizePassword","e","error","deleteGuestLink","delete","LINK","searchUsersOrGroups","searchMembersDto","onlyUsers","onlyGroups","members","u","searchUsers","description","type","MEMBER_TYPE","withPermissions","undefined","g","searchGroups","GROUP_TYPE","GROUP","PGROUP","groupFromName","innerJoin","browseRootGroups","alias","createdAt","modifiedAt","groupRole","counts","countDistinct","browseGroupMembers","as","canDeletePersonalGroup","PERSONAL","USER_GROUP_ROLE","MANAGER","getGroup","asAdmin","getGroupWithMembers","usersGroupsAlias","raw","concatDistinctObjectsInArray","dateTimeUTC","deletePersonalGroup","createPersonalGroup","managerId","userCreateOrUpdateGroupDto","visibility","GROUP_VISIBILITY","PRIVATE","updateGroup","Object","keys","log","updateGroupMembers","add","m","clearWhiteListCaches","remove","listGuests","managersGuestAlias","managersAlias","guests","firstName","lastName","isActive","passwordAttempts","language","notification","currentAccess","lastAccess","currentIp","lastIp","isGuestManager","guest","usersWhitelist","lowerOrEqualUserRole","usersAlias","groupsAlias","parentId","ISOLATED","VISIBLE","parse","ids","groupsWhitelist","groupIds","cache","mdel","genSlugKey","catch","allUserIdsFromGroupsAndSubGroups","subGroup","withChildren","like","search","idsWhitelist","ignoreGroupIds","filter","indexOf","unshift","notInArray","excludePersonalGroups","ignoreUserIds","usersRole","lte","Logger"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/users/services/users-queries.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Inject, Injectable, Logger } from '@nestjs/common'\nimport { and, countDistinct, eq, inArray, like, lte, ne, notInArray, or, SelectedFields, SQL, sql } from 'drizzle-orm'\nimport { alias } from 'drizzle-orm/mysql-core'\nimport { MySql2PreparedQuery, MySqlQueryResult } from 'drizzle-orm/mysql2'\nimport { anonymizePassword, comparePassword, uniquePermissions } from '../../../common/functions'\nimport { CacheDecorator } from '../../../infrastructure/cache/cache.decorator'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport { DBSchema } from '../../../infrastructure/database/interfaces/database.interface'\nimport {\n concatDistinctObjectsInArray,\n convertToSelect,\n dateTimeUTC,\n dbCheckAffectedRows,\n dbGetInsertedId\n} from '../../../infrastructure/database/utils'\nimport { GROUP_TYPE, GROUP_VISIBILITY } from '../constants/group'\nimport { MEMBER_TYPE } from '../constants/member'\nimport { USER_GROUP_ROLE, USER_ONLINE_STATUS, USER_PERMS_SEP, USER_ROLE } from '../constants/user'\nimport { UserCreateOrUpdateGroupDto } from '../dto/create-or-update-group.dto'\nimport { CreateUserDto } from '../dto/create-or-update-user.dto'\nimport { SearchMembersDto } from '../dto/search-members.dto'\nimport { GroupMember, GroupWithMembers } from '../interfaces/group-member'\nimport { GuestUser } from '../interfaces/guest-user.interface'\nimport { Member } from '../interfaces/member.interface'\nimport { UserSecrets } from '../interfaces/user-secrets.interface'\nimport { UserOnline } from '../interfaces/websocket.interface'\nimport { UserModel } from '../models/user.model'\nimport { Group } from '../schemas/group.interface'\nimport { groups } from '../schemas/groups.schema'\nimport { UserGroup } from '../schemas/user-group.interface'\nimport { User } from '../schemas/user.interface'\nimport { usersGroups } from '../schemas/users-groups.schema'\nimport { usersGuests } from '../schemas/users-guests.schema'\nimport { userFullNameSQL, users } from '../schemas/users.schema'\n\n@Injectable()\nexport class UsersQueries {\n private readonly logger = new Logger(UsersQueries.name)\n private fromLoginOrEmailPermissionsQuery: MySql2PreparedQuery<any> = null\n private fromIdPermissionsQuery: MySql2PreparedQuery<any> = null\n\n constructor(\n @Inject(DB_TOKEN_PROVIDER) private readonly db: DBSchema,\n private readonly cache: Cache\n ) {}\n\n checkUserExists(login?: string, email?: string): Promise<{ login?: string; email?: string }> {\n if (!login && !email) {\n throw new Error('login or email must be specified')\n }\n const columns: { login?: boolean; email?: boolean } = {}\n const where: SQL[] = []\n if (login) {\n columns.login = true\n where.push(eq(users.login, login))\n }\n if (email) {\n columns.email = true\n where.push(eq(users.email, email))\n }\n const operator = login && email ? or : and\n return this.db.query.users.findFirst({\n columns: columns,\n where: operator(...where)\n })\n }\n\n setOnlineStatus(userId: number, onlineStatus: USER_ONLINE_STATUS): Promise<boolean> {\n return this.updateUserOrGuest(userId, { onlineStatus: onlineStatus })\n }\n\n getOnlineUsers(userIds: number[]): Promise<UserOnline[]> {\n return this.db\n .select({\n id: users.id,\n login: users.login,\n email: users.email,\n fullName: userFullNameSQL(users),\n onlineStatus: users.onlineStatus\n } satisfies UserOnline | SelectedFields<any, any>)\n .from(users)\n .where(inArray(users.id, userIds))\n }\n\n async checkGroupNameExists(groupName: string): Promise<boolean> {\n const [group] = await this.db.select({ name: groups.name }).from(groups).where(eq(groups.name, groupName)).limit(1)\n return !!group?.name\n }\n\n async compareUserPassword(userId: number, password: string): Promise<boolean> {\n const [hash] = (await this.selectUsers(['password'], [eq(users.id, userId)])) as { password: string }[]\n if (!hash) return false\n return comparePassword(password, hash.password)\n }\n\n async from(userId?: number, loginOrEmail?: string): Promise<User> {\n // retrieve user with application permissions\n let pQuery: MySql2PreparedQuery<any> = userId ? this.fromIdPermissionsQuery : this.fromLoginOrEmailPermissionsQuery\n if (!pQuery) {\n const where = userId\n ? eq(users.id, sql.placeholder('userId'))\n : or(eq(users.login, sql.placeholder('loginOrEmail')), eq(users.email, sql.placeholder('loginOrEmail')))\n pQuery = this.db\n .select({\n user: users,\n groupsPermissions: sql`GROUP_CONCAT(DISTINCT (${groups.permissions}) SEPARATOR ${USER_PERMS_SEP})`\n })\n .from(users)\n .leftJoin(usersGroups, eq(usersGroups.userId, users.id))\n .leftJoin(groups, and(eq(groups.id, usersGroups.groupId), ne(groups.permissions, '')))\n .where(where)\n .groupBy(users.id)\n .limit(1)\n .prepare()\n if (userId) {\n this.fromIdPermissionsQuery = pQuery\n } else {\n this.fromLoginOrEmailPermissionsQuery = pQuery\n }\n }\n const r = await pQuery.execute(userId ? { userId } : { loginOrEmail })\n if (!r.length) return null\n const [user, groupsPermissions] = [r[0].user, r[0].groupsPermissions]\n // merge user and groups permissions\n user.permissions = uniquePermissions(`${user.permissions},${groupsPermissions}`, USER_PERMS_SEP)\n return user\n }\n\n async getUserSecrets(userId: number): Promise<UserSecrets> {\n const [r]: { secrets: UserSecrets }[] = await this.db.select({ secrets: users.secrets }).from(users).where(eq(users.id, userId)).limit(1)\n return r.secrets || {}\n }\n\n selectUsers(fields: Partial<keyof User>[] = ['id', 'login', 'email'], where: SQL[]): Promise<Partial<User>[]> {\n const select: Record<keyof User, any> = convertToSelect(users, fields)\n return this.db\n .select(select)\n .from(users)\n .where(and(...where))\n }\n\n async selectUserProperties(userId: number, fields: Partial<keyof User>[]): Promise<Partial<User>> {\n const select: Record<keyof User, any> = convertToSelect(users, fields)\n const [r]: Record<string, any>[] = await this.db.select(select).from(users).where(eq(users.id, userId)).limit(1)\n return r\n }\n\n async createUserOrGuest(createUserDto: CreateUserDto, userRole: USER_ROLE): Promise<User['id']> {\n const userId: number = dbGetInsertedId(await this.db.insert(users).values({ ...createUserDto, role: userRole } as User))\n if (userRole === USER_ROLE.USER && createUserDto.groups?.length) {\n await this.db.insert(usersGroups).values(createUserDto.groups.map((gid: number) => ({ userId: userId, groupId: gid })))\n }\n if (userRole === USER_ROLE.GUEST && createUserDto.managers?.length) {\n await this.db.insert(usersGuests).values(createUserDto.managers.map((uid: number) => ({ guestId: userId, userId: uid })))\n }\n return userId\n }\n\n async updateUserOrGuest(userId: number, set: Partial<Record<keyof User, any>>, userRole?: USER_ROLE): Promise<boolean> {\n try {\n dbCheckAffectedRows(\n await this.db\n .update(users)\n .set({ ...set, ...(userRole && { role: userRole }) } as User)\n .where(eq(users.id, userId)),\n 1\n )\n this.logger.verbose(`${this.updateUserOrGuest.name} - user (${userId}) was updated : ${JSON.stringify(anonymizePassword(set))}`)\n return true\n } catch (e) {\n this.logger.error(`${this.updateUserOrGuest.name} - user (${userId}) was not updated : ${JSON.stringify(anonymizePassword(set))} : ${e}`)\n return false\n }\n }\n\n async deleteGuestLink(userId: number): Promise<void> {\n dbCheckAffectedRows(await this.db.delete(users).where(and(eq(users.id, userId), eq(users.role, USER_ROLE.LINK))), 1)\n }\n\n async searchUsersOrGroups(searchMembersDto: SearchMembersDto, userId?: number): Promise<Member[]> {\n const limit = searchMembersDto.onlyUsers || searchMembersDto.onlyGroups ? 6 : 3\n const members: Member[] = []\n if (!searchMembersDto.onlyGroups) {\n for (const u of await this.searchUsers(searchMembersDto, userId, limit)) {\n members.push({\n id: u.id,\n login: u.login,\n name: u.fullName,\n description: u.email,\n type: u.role === USER_ROLE.GUEST ? MEMBER_TYPE.GUEST : MEMBER_TYPE.USER,\n permissions: searchMembersDto.withPermissions ? u.permissions : undefined\n })\n }\n }\n if (!searchMembersDto.onlyUsers) {\n for (const g of await this.searchGroups(searchMembersDto, userId, limit)) {\n members.push({\n id: g.id,\n name: g.name,\n description: g.description,\n type: g.type === GROUP_TYPE.USER ? MEMBER_TYPE.GROUP : MEMBER_TYPE.PGROUP,\n permissions: searchMembersDto.withPermissions ? g.permissions : undefined\n })\n }\n }\n return members\n }\n\n async groupFromName(userId: number, name: string): Promise<Pick<Group, 'id' | 'name' | 'type'> & { role: UserGroup['role'] }> {\n const [group] = await this.db\n .select({\n id: groups.id,\n name: groups.name,\n type: groups.type,\n role: usersGroups.role\n } satisfies (Pick<Group, 'id' | 'name' | 'type'> & { role: UserGroup['role'] }) | SelectedFields<any, any>)\n .from(usersGroups)\n .innerJoin(groups, eq(groups.id, usersGroups.groupId))\n .where(and(eq(usersGroups.userId, userId), eq(groups.name, name)))\n .limit(1)\n return group\n }\n\n async browseRootGroups(userId: number): Promise<Member[]> {\n const members = alias(usersGroups, 'members')\n return this.db\n .select({\n id: groups.id,\n name: groups.name,\n description: groups.description,\n createdAt: groups.createdAt,\n modifiedAt: groups.modifiedAt,\n type: sql<MEMBER_TYPE>`IF(${groups.type} = ${GROUP_TYPE.USER}, ${MEMBER_TYPE.GROUP}, ${MEMBER_TYPE.PGROUP})`,\n groupRole: sql<USER_GROUP_ROLE>`${usersGroups.role}`,\n counts: { users: countDistinct(members.userId) }\n } satisfies Member | SelectedFields<any, any>)\n .from(usersGroups)\n .innerJoin(groups, and(eq(groups.id, usersGroups.groupId), eq(usersGroups.userId, userId)))\n .leftJoin(members, eq(members.groupId, groups.id))\n .groupBy(groups.id)\n }\n\n async browseGroupMembers(groupId: number): Promise<Member[]> {\n return this.db\n .select({\n id: users.id,\n login: users.login,\n name: userFullNameSQL(users).as('name'),\n description: users.email,\n createdAt: usersGroups.createdAt,\n type: sql<MEMBER_TYPE>`${MEMBER_TYPE.USER}`,\n groupRole: sql<USER_GROUP_ROLE>`${usersGroups.role}`\n } satisfies Member | SelectedFields<any, any>)\n .from(groups)\n .innerJoin(usersGroups, and(eq(usersGroups.groupId, groups.id), eq(usersGroups.groupId, groupId)))\n .leftJoin(users, eq(users.id, usersGroups.userId))\n .groupBy(users.id)\n }\n\n async canDeletePersonalGroup(userId: number, groupId: number): Promise<boolean> {\n const [group] = await this.db\n .select({ id: usersGroups.groupId })\n .from(usersGroups)\n .innerJoin(groups, and(eq(groups.id, usersGroups.groupId)))\n .where(\n and(\n eq(groups.type, GROUP_TYPE.PERSONAL),\n eq(usersGroups.userId, userId),\n eq(usersGroups.groupId, groupId),\n eq(usersGroups.role, USER_GROUP_ROLE.MANAGER)\n )\n )\n .limit(1)\n return !!group?.id\n }\n\n async getGroup(userId: number, groupId: number, asAdmin = false): Promise<GroupMember> {\n const [group] = await this.db\n .select({\n id: groups.id,\n name: groups.name,\n description: groups.description,\n createdAt: groups.createdAt,\n modifiedAt: groups.modifiedAt,\n type: sql<MEMBER_TYPE>`IF(${groups.type} = ${GROUP_TYPE.USER}, ${MEMBER_TYPE.GROUP}, ${MEMBER_TYPE.PGROUP})`\n })\n .from(usersGroups)\n .innerJoin(groups, and(eq(groups.id, usersGroups.groupId)))\n .where(\n and(\n eq(usersGroups.groupId, groupId),\n sql`IF(${+asAdmin} = 0, ${usersGroups.userId} = ${userId} AND ${usersGroups.role} = ${USER_GROUP_ROLE.MANAGER}, 1)`\n )\n )\n .limit(1)\n return group\n }\n\n async getGroupWithMembers(userId: number, groupId: number, asAdmin = false): Promise<GroupWithMembers> {\n const usersGroupsAlias: any = alias(usersGroups, 'usersFromGroups')\n const [group] = await this.db\n .select({\n id: groups.id,\n name: groups.name,\n description: groups.description,\n createdAt: groups.createdAt,\n modifiedAt: groups.modifiedAt,\n type: sql<MEMBER_TYPE>`IF(${groups.type} = ${GROUP_TYPE.USER}, ${sql.raw(`'${MEMBER_TYPE.GROUP}'`)}, ${sql.raw(`'${MEMBER_TYPE.PGROUP}'`)})`,\n members: concatDistinctObjectsInArray(users.id, {\n id: users.id,\n login: users.login,\n name: userFullNameSQL(users),\n description: users.email,\n type: sql.raw(`'${MEMBER_TYPE.USER}'`),\n groupRole: usersGroupsAlias.role,\n createdAt: dateTimeUTC(usersGroupsAlias.createdAt)\n } satisfies Record<keyof Pick<Member, 'id' | 'name' | 'login' | 'description' | 'type' | 'groupRole' | 'createdAt'>, any>)\n } satisfies GroupWithMembers | SelectedFields<any, any>)\n .from(usersGroups)\n .innerJoin(groups, eq(groups.id, usersGroups.groupId))\n .leftJoin(usersGroupsAlias, and(eq(usersGroupsAlias.groupId, groups.id)))\n .leftJoin(users, eq(users.id, usersGroupsAlias.userId))\n .where(\n and(\n eq(usersGroups.groupId, groupId),\n sql`IF(${+asAdmin} = 0, ${usersGroups.userId} = ${userId} AND ${usersGroups.role} = ${USER_GROUP_ROLE.MANAGER}, 1)`\n )\n )\n .groupBy(groups.id)\n .limit(1)\n return group\n }\n\n async deletePersonalGroup(groupId: number): Promise<boolean> {\n return dbCheckAffectedRows(\n await this.db\n .delete(groups)\n .where(and(eq(groups.id, groupId), eq(groups.type, GROUP_TYPE.PERSONAL)))\n .limit(1),\n 1,\n false\n )\n }\n\n async createPersonalGroup(managerId: number, userCreateOrUpdateGroupDto: UserCreateOrUpdateGroupDto): Promise<Group['id']> {\n const groupId: number = dbGetInsertedId(\n await this.db.insert(groups).values({\n ...userCreateOrUpdateGroupDto,\n type: GROUP_TYPE.PERSONAL,\n visibility: GROUP_VISIBILITY.PRIVATE\n } as Group)\n )\n await this.db.insert(usersGroups).values({ userId: managerId, groupId: groupId, role: USER_GROUP_ROLE.MANAGER } as UserGroup)\n return groupId\n }\n\n async updateGroup(groupId: number, set: Partial<Record<keyof Group, any>>) {\n if (Object.keys(set).length) {\n try {\n await this.db.update(groups).set(set).where(eq(groups.id, groupId))\n this.logger.log(`${this.updateGroup.name} - group (${groupId}) was updated : ${JSON.stringify(set)}`)\n } catch (e) {\n this.logger.error(`${this.updateGroup.name} - group (${groupId}) was not updated : ${JSON.stringify(set)} : ${e}`)\n throw new Error('Group was not updated')\n }\n }\n }\n\n async updateGroupMembers(\n groupId: number,\n members: {\n add?: Pick<Member, 'id' | 'groupRole'>[]\n remove?: UserGroup['userId'][]\n }\n ): Promise<void> {\n if (members?.add?.length) {\n try {\n await this.db.insert(usersGroups).values(members.add.map((m) => ({ userId: m.id, groupId: groupId, role: m.groupRole })))\n // clear cache\n this.clearWhiteListCaches(members.add.map((m) => m.id))\n this.logger.log(`${this.updateGroupMembers.name} - users ${JSON.stringify(members.add.map((m) => m.id))} was added to group (${groupId})`)\n } catch (e) {\n this.logger.error(\n `${this.updateGroupMembers.name} - users ${JSON.stringify(members.add.map((m) => m.id))} was not added to group (${groupId}) : ${e}`\n )\n throw new Error('Group members was not added')\n }\n }\n if (members?.remove?.length) {\n try {\n await this.db\n .delete(usersGroups)\n .where(and(eq(usersGroups.groupId, groupId), inArray(usersGroups.userId, members.remove)))\n .limit(members.remove.length)\n // clear cache\n this.clearWhiteListCaches(members.remove)\n this.logger.log(`${this.updateGroupMembers.name} - users ${JSON.stringify(members.remove)} was removed from group (${groupId})`)\n } catch (e) {\n this.logger.error(`${this.updateGroupMembers.name} - users ${JSON.stringify(members.remove)} was not removed from group (${groupId}) : ${e}`)\n throw new Error('Group members was not removed')\n }\n }\n }\n\n async listGuests(guestId: null, managerId?: number, asAdmin?: boolean): Promise<GuestUser[]>\n async listGuests(guestId: number, managerId?: number, asAdmin?: boolean): Promise<GuestUser>\n async listGuests(guestId: number | null, managerId?: number, asAdmin = false): Promise<GuestUser | GuestUser[]> {\n const where: SQL[] = [...(guestId ? [eq(usersGuests.guestId, guestId)] : []), ...(asAdmin ? [] : [eq(usersGuests.userId, managerId)])]\n const managersGuestAlias: any = alias(usersGuests, 'managersGuestAlias')\n const managersAlias: any = alias(users, 'managersAlias')\n const guests = await this.db\n .select({\n id: users.id,\n login: users.login,\n email: users.email,\n firstName: users.firstName,\n lastName: users.lastName,\n fullName: userFullNameSQL(users),\n role: users.role,\n isActive: users.isActive,\n passwordAttempts: users.passwordAttempts,\n language: users.language,\n notification: users.notification,\n currentAccess: users.currentAccess,\n lastAccess: users.lastAccess,\n currentIp: users.currentIp,\n lastIp: users.lastIp,\n createdAt: users.createdAt,\n managers: concatDistinctObjectsInArray(managersAlias.id, {\n id: managersAlias.id,\n login: managersAlias.login,\n name: userFullNameSQL(managersAlias),\n type: sql.raw(`'${MEMBER_TYPE.USER}'`),\n description: managersAlias.email,\n createdAt: dateTimeUTC(managersGuestAlias.createdAt)\n } satisfies Record<keyof Pick<Member, 'id' | 'name' | 'login' | 'description' | 'type' | 'createdAt'>, any>)\n } satisfies GuestUser | SelectedFields<any, any>)\n .from(usersGuests)\n .innerJoin(users, and(eq(users.id, usersGuests.guestId), eq(users.role, USER_ROLE.GUEST)))\n .leftJoin(managersGuestAlias, eq(managersGuestAlias.guestId, users.id))\n .leftJoin(managersAlias, eq(managersAlias.id, managersGuestAlias.userId))\n .where(and(...where))\n .groupBy(users.id)\n .limit(guestId ? 1 : undefined)\n return guestId ? guests[0] : guests\n }\n\n async isGuestManager(managerId: number, guestId: number): Promise<{ id: number; login: string } | undefined> {\n const [guest] = await this.db\n .select({ id: usersGuests.guestId, login: users.login })\n .from(usersGuests)\n .innerJoin(users, eq(users.id, usersGuests.guestId))\n .where(and(eq(usersGuests.userId, managerId), eq(usersGuests.guestId, guestId), eq(users.role, USER_ROLE.GUEST)))\n .limit(1)\n return guest\n }\n\n @CacheDecorator(900)\n async usersWhitelist(userId: number, lowerOrEqualUserRole: USER_ROLE = USER_ROLE.GUEST): Promise<number[]> {\n /* Get the list of user ids allowed to the current user\n - all users with no groups (except link users)\n - all users who are members of the current user's groups (excluding link users and members of isolated groups)\n - all guests managed by the current user\n - all managers who manage the current guest\n */\n const usersAlias: any = alias(users, 'usersAlias')\n const groupsAlias: any = alias(groups, 'groupsAlias')\n const userIds: any = sql`\n WITH RECURSIVE children (id, parentId) AS\n (SELECT ${groups.id},\n ${groups.parentId}\n FROM ${groups}\n WHERE (${groups.id} IN (SELECT ${usersGroups.groupId}\n FROM ${usersGroups}\n WHERE ${usersGroups.userId} = ${userId}\n AND ${groups.visibility} != ${GROUP_VISIBILITY.ISOLATED}))\n UNION\n SELECT ${groupsAlias.id},\n ${groupsAlias.parentId}\n FROM ${groups} AS groupsAlias\n INNER JOIN children cs ON ${groupsAlias.parentId} = cs.id AND ${groupsAlias.visibility} = ${sql.raw(`${GROUP_VISIBILITY.VISIBLE}`)})\n SELECT JSON_ARRAYAGG(id) AS ids\n FROM (\n -- Users from visible child groups\n SELECT ${users.id} AS id\n FROM children\n INNER JOIN ${usersGroups} ON ${usersGroups.groupId} = children.id\n INNER JOIN ${users} ON ${usersGroups.userId} = ${users.id} AND ${users.role} <= ${sql.raw(`${lowerOrEqualUserRole}`)}\n\n UNION\n -- Users visible but not assigned to groups\n SELECT ${usersAlias.id} AS id\n FROM ${users} AS usersAlias\n INNER JOIN ${users} ON ${users.id} = ${usersAlias.id} AND ${users.role} <= ${sql.raw(`${lowerOrEqualUserRole}`)}\n WHERE NOT EXISTS (SELECT ${usersGroups.userId} FROM ${usersGroups} WHERE ${usersGroups.userId} = ${usersAlias.id})\n UNION\n -- Users or guests that are manager/managed\n SELECT CASE\n WHEN ${usersGuests.userId} = ${userId} THEN ${usersGuests.guestId}\n WHEN ${usersGuests.guestId} = ${userId} THEN ${usersGuests.userId}\n END AS id\n FROM ${usersGuests}\n WHERE ${usersGuests.userId} = ${userId}\n OR ${usersGuests.guestId} = ${userId}) AS usersUnion\n `\n const [r] = await this.db.execute(userIds)\n return JSON.parse(r[0].ids) || []\n }\n\n @CacheDecorator(900)\n async groupsWhitelist(userId: number): Promise<number[]> {\n /* Get the list of groups ids allowed to the current user\n - all parent groups for which the user is a member (includes personal groups, excludes isolated groups)\n - all subgroups inherited from parent groups\n */\n const groupsAlias: any = alias(groups, 'groupsAlias')\n const groupIds: any = sql`\n WITH RECURSIVE children (id, parentId, type) AS\n (SELECT ${groups.id},\n ${groups.parentId},\n ${groups.type}\n FROM ${groups}\n WHERE (${groups.id} IN (SELECT ${usersGroups.groupId}\n FROM ${usersGroups}\n WHERE ${usersGroups.userId} = ${userId}\n AND ${groups.visibility} != ${GROUP_VISIBILITY.ISOLATED}))\n UNION\n SELECT ${groupsAlias.id},\n ${groupsAlias.parentId},\n ${groupsAlias.type}\n FROM ${groups} AS groupsAlias\n INNER JOIN children cs ON ${groupsAlias.parentId} = cs.id AND ${groupsAlias.visibility} = ${GROUP_VISIBILITY.VISIBLE})\n SELECT JSON_ARRAYAGG(children.id) as ids\n FROM children\n `\n const [r] = await this.db.execute(groupIds)\n return JSON.parse(r[0].ids) || []\n }\n\n clearWhiteListCaches(userIds: number[] | '*') {\n if (userIds === '*') {\n // means all entries\n for (const pattern of [\n this.cache.genSlugKey(this.constructor.name, this.usersWhitelist.name, userIds),\n this.cache.genSlugKey(this.constructor.name, this.groupsWhitelist.name, userIds)\n ]) {\n this.cache\n .keys(pattern)\n .then((keys: string[]) => {\n if (!keys.length) return\n this.logger.verbose(`${this.clearWhiteListCaches.name} - ${JSON.stringify(keys)}`)\n this.cache.mdel(keys).catch((e: Error) => this.logger.error(`${this.clearWhiteListCaches.name} - ${e}`))\n })\n .catch((e: Error) => this.logger.error(`${this.clearWhiteListCaches.name} - ${e}`))\n }\n } else {\n this.cache\n .mdel([\n ...userIds.map((id: number) => this.cache.genSlugKey(this.constructor.name, this.usersWhitelist.name, id)),\n ...userIds.map((id: number) => this.cache.genSlugKey(this.constructor.name, this.groupsWhitelist.name, id))\n ])\n .catch((e: Error) => this.logger.error(`${this.clearWhiteListCaches.name} - ${e}`))\n }\n }\n\n async allUserIdsFromGroupsAndSubGroups(groupIds: number[]): Promise<number[]> {\n if (!groupIds.length) return []\n const subGroup: any = alias(groups, 'subGroup')\n const withChildren: any = sql`\n WITH RECURSIVE child (id, parentId) AS\n (SELECT ${groups.id}, ${groups.parentId}\n FROM ${groups}\n WHERE ${inArray(groups.id, groupIds)}\n UNION\n SELECT ${subGroup.id},\n ${subGroup.parentId}\n FROM ${groups} AS subGroup\n INNER JOIN child AS cs ON ${subGroup.parentId} = cs.id)\n SELECT DISTINCT ${usersGroups.userId} as userId\n FROM child\n INNER JOIN ${usersGroups} ON child.id = ${usersGroups.groupId}\n `\n const [r]: { userId: number }[][] = (await this.db.execute(withChildren)) as MySqlQueryResult\n return r.length ? r.map((r) => r.userId) : []\n }\n\n private async searchGroups(\n searchMembersDto: SearchMembersDto,\n userId?: number,\n limit = 3\n ): Promise<Pick<Group, 'id' | 'name' | 'description' | 'type' | 'permissions'>[]> {\n /* Search for groups */\n const where: SQL[] = [like(groups.name, `%${searchMembersDto.search}%`)]\n if (userId) {\n let idsWhitelist: number[] = await this.groupsWhitelist(userId)\n if (searchMembersDto.ignoreGroupIds?.length) {\n idsWhitelist = idsWhitelist.filter((id) => searchMembersDto.ignoreGroupIds.indexOf(id) === -1)\n }\n where.unshift(inArray(groups.id, idsWhitelist))\n } else if (searchMembersDto.ignoreGroupIds?.length) {\n where.unshift(notInArray(groups.id, searchMembersDto.ignoreGroupIds))\n }\n if (searchMembersDto.excludePersonalGroups) {\n where.unshift(eq(groups.type, GROUP_TYPE.USER))\n }\n return this.db\n .select({ id: groups.id, name: groups.name, description: groups.description, type: groups.type, permissions: groups.permissions })\n .from(groups)\n .where(and(...where))\n .limit(limit)\n }\n\n private async searchUsers(\n searchMembersDto: SearchMembersDto,\n userId?: number,\n limit = 3\n ): Promise<Pick<UserModel, 'id' | 'login' | 'email' | 'fullName' | 'role' | 'permissions'>[]> {\n /* Search for users */\n const where: SQL[] = [\n ne(users.role, USER_ROLE.LINK),\n or(like(sql`CONCAT_WS('-', ${users.login}, ${users.email}, ${users.firstName}, ${users.lastName})`, `%${searchMembersDto.search}%`))\n ]\n if (userId) {\n let idsWhitelist: number[] = await this.usersWhitelist(userId)\n if (searchMembersDto.ignoreUserIds?.length) {\n idsWhitelist = idsWhitelist.filter((id) => searchMembersDto.ignoreUserIds.indexOf(id) === -1)\n }\n where.unshift(inArray(users.id, idsWhitelist))\n } else {\n if (searchMembersDto.ignoreUserIds?.length) {\n where.unshift(notInArray(users.id, searchMembersDto.ignoreUserIds))\n }\n }\n if (typeof searchMembersDto.usersRole !== 'undefined') {\n if (searchMembersDto.usersRole === USER_ROLE.USER) {\n // allow admin users\n where.unshift(lte(users.role, searchMembersDto.usersRole))\n } else {\n where.unshift(eq(users.role, searchMembersDto.usersRole))\n }\n }\n return this.db\n .select({\n id: users.id,\n login: users.login,\n email: users.email,\n fullName: userFullNameSQL(users),\n role: users.role,\n permissions: users.permissions\n })\n .from(users)\n .where(and(...where))\n .limit(limit)\n }\n}\n"],"names":["UsersQueries","checkUserExists","login","email","Error","columns","where","push","eq","users","operator","or","and","db","query","findFirst","setOnlineStatus","userId","onlineStatus","updateUserOrGuest","getOnlineUsers","userIds","select","id","fullName","userFullNameSQL","from","inArray","checkGroupNameExists","groupName","group","name","groups","limit","compareUserPassword","password","hash","selectUsers","comparePassword","loginOrEmail","pQuery","fromIdPermissionsQuery","fromLoginOrEmailPermissionsQuery","sql","placeholder","user","groupsPermissions","permissions","USER_PERMS_SEP","leftJoin","usersGroups","groupId","ne","groupBy","prepare","r","execute","length","uniquePermissions","getUserSecrets","secrets","fields","convertToSelect","selectUserProperties","createUserOrGuest","createUserDto","userRole","dbGetInsertedId","insert","values","role","USER_ROLE","USER","map","gid","GUEST","managers","usersGuests","uid","guestId","set","dbCheckAffectedRows","update","logger","verbose","JSON","stringify","anonymizePassword","e","error","deleteGuestLink","delete","LINK","searchUsersOrGroups","searchMembersDto","onlyUsers","onlyGroups","members","u","searchUsers","description","type","MEMBER_TYPE","withPermissions","undefined","g","searchGroups","GROUP_TYPE","GROUP","PGROUP","groupFromName","innerJoin","browseRootGroups","alias","createdAt","modifiedAt","groupRole","counts","countDistinct","browseGroupMembers","as","canDeletePersonalGroup","PERSONAL","USER_GROUP_ROLE","MANAGER","getGroup","asAdmin","getGroupWithMembers","usersGroupsAlias","raw","concatDistinctObjectsInArray","dateTimeUTC","deletePersonalGroup","createPersonalGroup","managerId","userCreateOrUpdateGroupDto","visibility","GROUP_VISIBILITY","PRIVATE","updateGroup","Object","keys","log","updateGroupMembers","add","m","clearWhiteListCaches","remove","listGuests","managersGuestAlias","managersAlias","guests","firstName","lastName","isActive","passwordAttempts","language","notification","currentAccess","lastAccess","currentIp","lastIp","isGuestManager","guest","usersWhitelist","lowerOrEqualUserRole","usersAlias","groupsAlias","parentId","ISOLATED","VISIBLE","parse","ids","groupsWhitelist","groupIds","pattern","cache","genSlugKey","then","mdel","catch","allUserIdsFromGroupsAndSubGroups","subGroup","withChildren","like","search","idsWhitelist","ignoreGroupIds","filter","indexOf","unshift","notInArray","excludePersonalGroups","ignoreUserIds","usersRole","lte","Logger"],"mappings":"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"}
|
|
@@ -65,6 +65,9 @@ let UsersController = class UsersController {
|
|
|
65
65
|
updateNotification(user, userNotificationDto) {
|
|
66
66
|
return this.usersManager.updateNotification(user, userNotificationDto);
|
|
67
67
|
}
|
|
68
|
+
updateStorageIndexing(user, userStorageIndexingDto) {
|
|
69
|
+
return this.usersManager.updateStorageIndexing(user, userStorageIndexingDto);
|
|
70
|
+
}
|
|
68
71
|
async avatar(user, login) {
|
|
69
72
|
const isMe = login === 'me';
|
|
70
73
|
const [path, mime] = await this.usersManager.getAvatar(isMe ? user.login : login, false, isMe && user.role <= _user.USER_ROLE.USER);
|
|
@@ -206,6 +209,18 @@ _ts_decorate([
|
|
|
206
209
|
]),
|
|
207
210
|
_ts_metadata("design:returntype", void 0)
|
|
208
211
|
], UsersController.prototype, "updateNotification", null);
|
|
212
|
+
_ts_decorate([
|
|
213
|
+
(0, _common.Put)(`${_routes.USERS_ROUTE.ME}/${_routes.USERS_ROUTE.STORAGE_INDEXING}`),
|
|
214
|
+
(0, _rolesdecorator.UserHaveRole)(_user.USER_ROLE.USER),
|
|
215
|
+
_ts_param(0, (0, _userdecorator.GetUser)()),
|
|
216
|
+
_ts_param(1, (0, _common.Body)()),
|
|
217
|
+
_ts_metadata("design:type", Function),
|
|
218
|
+
_ts_metadata("design:paramtypes", [
|
|
219
|
+
typeof _usermodel.UserModel === "undefined" ? Object : _usermodel.UserModel,
|
|
220
|
+
typeof _userpropertiesdto.UserStorageIndexingDto === "undefined" ? Object : _userpropertiesdto.UserStorageIndexingDto
|
|
221
|
+
]),
|
|
222
|
+
_ts_metadata("design:returntype", void 0)
|
|
223
|
+
], UsersController.prototype, "updateStorageIndexing", null);
|
|
209
224
|
_ts_decorate([
|
|
210
225
|
(0, _common.Get)(`${_routes.USERS_ROUTE.AVATAR}/:login`),
|
|
211
226
|
(0, _rolesdecorator.UserHaveRole)(_user.USER_ROLE.LINK),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../backend/src/applications/users/users.controller.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Body, Controller, Delete, Get, Header, Param, ParseIntPipe, Patch, Post, Put, Req, Search, StreamableFile, UseGuards } from '@nestjs/common'\nimport { createReadStream } from 'fs'\nimport { LoginResponseDto } from '../../authentication/dto/login-response.dto'\nimport { AuthTwoFaGuardWithoutPassword } from '../../authentication/guards/auth-two-fa-guard'\nimport { FastifyAuthenticatedRequest } from '../../authentication/interfaces/auth-request.interface'\nimport { USERS_ROUTE } from './constants/routes'\nimport { USER_PERMISSION, USER_ROLE } from './constants/user'\nimport { UserHavePermission } from './decorators/permissions.decorator'\nimport { UserHaveRole } from './decorators/roles.decorator'\nimport { GetUser } from './decorators/user.decorator'\nimport { UserCreateOrUpdateGroupDto } from './dto/create-or-update-group.dto'\nimport { CreateUserDto, UpdateUserDto, UpdateUserFromGroupDto } from './dto/create-or-update-user.dto'\nimport { SearchMembersDto } from './dto/search-members.dto'\nimport { UserAppPasswordDto, UserLanguageDto, UserNotificationDto, UserUpdatePasswordDto } from './dto/user-properties.dto'\nimport { UserPermissionsGuard } from './guards/permissions.guard'\nimport { UserRolesGuard } from './guards/roles.guard'\nimport { GroupBrowse } from './interfaces/group-browse.interface'\nimport { GroupMember } from './interfaces/group-member'\nimport { GuestUser } from './interfaces/guest-user.interface'\nimport { Member } from './interfaces/member.interface'\nimport { UserAppPassword } from './interfaces/user-secrets.interface'\nimport { UserModel } from './models/user.model'\nimport { UsersManager } from './services/users-manager.service'\n\n@Controller(USERS_ROUTE.BASE)\n@UseGuards(UserRolesGuard)\n@UserHaveRole(USER_ROLE.USER)\nexport class UsersController {\n constructor(private readonly usersManager: UsersManager) {}\n\n @Get(USERS_ROUTE.ME)\n @UserHaveRole(USER_ROLE.LINK)\n me(@GetUser() user: UserModel): Promise<Omit<LoginResponseDto, 'token'>> {\n return this.usersManager.me(user)\n }\n\n @Get(`${USERS_ROUTE.ME}/${USERS_ROUTE.APP_PASSWORDS}`)\n @UserHaveRole(USER_ROLE.USER)\n @UseGuards(AuthTwoFaGuardWithoutPassword)\n listAppPasswords(@GetUser() user: UserModel): Promise<Omit<UserAppPassword, 'password'>[]> {\n return this.usersManager.listAppPasswords(user)\n }\n\n @Post(`${USERS_ROUTE.ME}/${USERS_ROUTE.APP_PASSWORDS}`)\n @UserHaveRole(USER_ROLE.USER)\n @UseGuards(AuthTwoFaGuardWithoutPassword)\n generateAppPassword(@GetUser() user: UserModel, @Body() userAppPasswordDto: UserAppPasswordDto): Promise<UserAppPassword> {\n return this.usersManager.generateAppPassword(user, userAppPasswordDto)\n }\n\n @Delete(`${USERS_ROUTE.ME}/${USERS_ROUTE.APP_PASSWORDS}/:name`)\n @UserHaveRole(USER_ROLE.USER)\n deleteAppPassword(@GetUser() user: UserModel, @Param('name') name: string): Promise<void> {\n return this.usersManager.deleteAppPassword(user, name)\n }\n\n @Put(`${USERS_ROUTE.ME}/${USERS_ROUTE.LANGUAGE}`)\n @UserHaveRole(USER_ROLE.GUEST)\n updateLanguage(@GetUser() user: UserModel, @Body() userLanguageDto: UserLanguageDto) {\n return this.usersManager.updateLanguage(user, userLanguageDto)\n }\n\n @Put(`${USERS_ROUTE.ME}/${USERS_ROUTE.PASSWORD}`)\n @UseGuards(AuthTwoFaGuardWithoutPassword)\n updatePassword(@GetUser() user: UserModel, @Body() userPasswordDto: UserUpdatePasswordDto) {\n return this.usersManager.updatePassword(user, userPasswordDto)\n }\n\n @Put(`${USERS_ROUTE.ME}/${USERS_ROUTE.NOTIFICATION}`)\n @UserHaveRole(USER_ROLE.GUEST)\n updateNotification(@GetUser() user: UserModel, @Body() userNotificationDto: UserNotificationDto) {\n return this.usersManager.updateNotification(user, userNotificationDto)\n }\n\n @Get(`${USERS_ROUTE.AVATAR}/:login`)\n @UserHaveRole(USER_ROLE.LINK)\n @Header('cache-control', 'public,max-age=86400')\n async avatar(@GetUser() user: UserModel, @Param('login') login: 'me' | string): Promise<StreamableFile> {\n const isMe: boolean = login === 'me'\n const [path, mime] = await this.usersManager.getAvatar(isMe ? user.login : login, false, isMe && user.role <= USER_ROLE.USER)\n return new StreamableFile(createReadStream(path), { type: mime })\n }\n\n @Put(`${USERS_ROUTE.ME}/${USERS_ROUTE.AVATAR}`)\n updateAvatar(@Req() req: FastifyAuthenticatedRequest) {\n return this.usersManager.updateAvatar(req)\n }\n\n @Patch(`${USERS_ROUTE.ME}/${USERS_ROUTE.AVATAR}`)\n genAvatar(@GetUser() user: UserModel) {\n return this.usersManager.getAvatar(user.login, true)\n }\n\n @Search()\n searchMembers(@GetUser() user: UserModel, @Body() searchMembersDto: SearchMembersDto): Promise<Member[]> {\n return this.usersManager.searchMembers(user, searchMembersDto)\n }\n\n @Get(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}/${USERS_ROUTE.BROWSE}/:name?`)\n browseGroups(@GetUser() user: UserModel, @Param('name') name?: string): Promise<GroupBrowse> {\n return this.usersManager.browseGroups(user, name)\n }\n\n @Post(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}`)\n @UserHavePermission(USER_PERMISSION.PERSONAL_GROUPS_ADMIN)\n @UseGuards(UserPermissionsGuard)\n createPersonalGroup(@GetUser() user: UserModel, @Body() userCreateOrUpdateGroupDto: UserCreateOrUpdateGroupDto): Promise<GroupMember> {\n return this.usersManager.createPersonalGroup(user, userCreateOrUpdateGroupDto)\n }\n\n @Put(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}/:id`)\n updatePersonalGroup(\n @GetUser() user: UserModel,\n @Param('id', ParseIntPipe) groupId: number,\n @Body() userCreateOrUpdateGroupDto: UserCreateOrUpdateGroupDto\n ): Promise<GroupMember> {\n return this.usersManager.updatePersonalGroup(user, groupId, userCreateOrUpdateGroupDto)\n }\n\n @Delete(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}/:id`)\n deletePersonalGroup(@GetUser() user: UserModel, @Param('id', ParseIntPipe) groupId: number): Promise<void> {\n return this.usersManager.deletePersonalGroup(user, groupId)\n }\n\n @Delete(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}/${USERS_ROUTE.GROUPS_LEAVE}/:id`)\n leavePersonalGroup(@GetUser() user: UserModel, @Param('id', ParseIntPipe) groupId: number): Promise<void> {\n return this.usersManager.leavePersonalGroup(user, groupId)\n }\n\n @Patch(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}/:groupId/${USERS_ROUTE.USERS}`)\n addUsersToGroup(@GetUser() user: UserModel, @Param('groupId', ParseIntPipe) groupId: number, @Body() userIds: number[]): Promise<void> {\n return this.usersManager.addUsersToGroup(user, groupId, userIds)\n }\n\n @Delete(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}/:groupId/${USERS_ROUTE.USERS}/:userId`)\n removeUserFromGroup(\n @GetUser() user: UserModel,\n @Param('groupId', ParseIntPipe) groupId: number,\n @Param('userId', ParseIntPipe) userId: number\n ): Promise<void> {\n return this.usersManager.removeUserFromGroup(user, groupId, userId)\n }\n\n @Patch(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}/:groupId/${USERS_ROUTE.USERS}/:userId`)\n updateUserFromPersonalGroup(\n @GetUser() user: UserModel,\n @Param('groupId', ParseIntPipe) groupId: number,\n @Param('userId', ParseIntPipe) userId: number,\n @Body() updateUserFromGroupDto: UpdateUserFromGroupDto\n ): Promise<void> {\n return this.usersManager.updateUserFromPersonalGroup(user, groupId, userId, updateUserFromGroupDto)\n }\n\n @Get(`${USERS_ROUTE.ME}/${USERS_ROUTE.GUESTS}`)\n listGuests(@GetUser() user: UserModel): Promise<GuestUser[]> {\n return this.usersManager.listGuests(user)\n }\n\n @Get(`${USERS_ROUTE.ME}/${USERS_ROUTE.GUESTS}/:id`)\n getGuest(@GetUser() user: UserModel, @Param('id', ParseIntPipe) guestId: number): Promise<GuestUser> {\n return this.usersManager.getGuest(user, guestId)\n }\n\n @Post(`${USERS_ROUTE.ME}/${USERS_ROUTE.GUESTS}`)\n @UserHavePermission(USER_PERMISSION.GUESTS_ADMIN)\n @UseGuards(UserPermissionsGuard)\n createGuest(@GetUser() user: UserModel, @Body() createGuestDto: CreateUserDto): Promise<GuestUser> {\n return this.usersManager.createGuest(user, createGuestDto)\n }\n\n @Put(`${USERS_ROUTE.ME}/${USERS_ROUTE.GUESTS}/:id`)\n updateGuest(@GetUser() user: UserModel, @Param('id', ParseIntPipe) guestId: number, @Body() updateGuestDto: UpdateUserDto): Promise<GuestUser> {\n return this.usersManager.updateGuest(user, guestId, updateGuestDto)\n }\n\n @Delete(`${USERS_ROUTE.ME}/${USERS_ROUTE.GUESTS}/:id`)\n deleteGuest(@GetUser() user: UserModel, @Param('id', ParseIntPipe) guestId: number): Promise<void> {\n return this.usersManager.deleteGuest(user, guestId)\n }\n}\n"],"names":["UsersController","me","user","usersManager","listAppPasswords","generateAppPassword","userAppPasswordDto","deleteAppPassword","name","updateLanguage","userLanguageDto","updatePassword","userPasswordDto","updateNotification","userNotificationDto","avatar","login","isMe","path","mime","getAvatar","role","USER_ROLE","USER","StreamableFile","createReadStream","type","updateAvatar","req","genAvatar","searchMembers","searchMembersDto","browseGroups","createPersonalGroup","userCreateOrUpdateGroupDto","updatePersonalGroup","groupId","deletePersonalGroup","leavePersonalGroup","addUsersToGroup","userIds","removeUserFromGroup","userId","updateUserFromPersonalGroup","updateUserFromGroupDto","listGuests","getGuest","guestId","createGuest","createGuestDto","updateGuest","updateGuestDto","deleteGuest","ME","LINK","USERS_ROUTE","APP_PASSWORDS","LANGUAGE","GUEST","PASSWORD","NOTIFICATION","AVATAR","GROUPS","BROWSE","PERSONAL_GROUPS_ADMIN","GROUPS_LEAVE","USERS","GUESTS","GUESTS_ADMIN","BASE"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../backend/src/applications/users/users.controller.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Body, Controller, Delete, Get, Header, Param, ParseIntPipe, Patch, Post, Put, Req, Search, StreamableFile, UseGuards } from '@nestjs/common'\nimport { createReadStream } from 'fs'\nimport { LoginResponseDto } from '../../authentication/dto/login-response.dto'\nimport { AuthTwoFaGuardWithoutPassword } from '../../authentication/guards/auth-two-fa-guard'\nimport { FastifyAuthenticatedRequest } from '../../authentication/interfaces/auth-request.interface'\nimport { USERS_ROUTE } from './constants/routes'\nimport { USER_PERMISSION, USER_ROLE } from './constants/user'\nimport { UserHavePermission } from './decorators/permissions.decorator'\nimport { UserHaveRole } from './decorators/roles.decorator'\nimport { GetUser } from './decorators/user.decorator'\nimport { UserCreateOrUpdateGroupDto } from './dto/create-or-update-group.dto'\nimport { CreateUserDto, UpdateUserDto, UpdateUserFromGroupDto } from './dto/create-or-update-user.dto'\nimport { SearchMembersDto } from './dto/search-members.dto'\nimport { UserAppPasswordDto, UserLanguageDto, UserNotificationDto, UserStorageIndexingDto, UserUpdatePasswordDto } from './dto/user-properties.dto'\nimport { UserPermissionsGuard } from './guards/permissions.guard'\nimport { UserRolesGuard } from './guards/roles.guard'\nimport { GroupBrowse } from './interfaces/group-browse.interface'\nimport { GroupMember } from './interfaces/group-member'\nimport { GuestUser } from './interfaces/guest-user.interface'\nimport { Member } from './interfaces/member.interface'\nimport { UserAppPassword } from './interfaces/user-secrets.interface'\nimport { UserModel } from './models/user.model'\nimport { UsersManager } from './services/users-manager.service'\n\n@Controller(USERS_ROUTE.BASE)\n@UseGuards(UserRolesGuard)\n@UserHaveRole(USER_ROLE.USER)\nexport class UsersController {\n constructor(private readonly usersManager: UsersManager) {}\n\n @Get(USERS_ROUTE.ME)\n @UserHaveRole(USER_ROLE.LINK)\n me(@GetUser() user: UserModel): Promise<Omit<LoginResponseDto, 'token'>> {\n return this.usersManager.me(user)\n }\n\n @Get(`${USERS_ROUTE.ME}/${USERS_ROUTE.APP_PASSWORDS}`)\n @UserHaveRole(USER_ROLE.USER)\n @UseGuards(AuthTwoFaGuardWithoutPassword)\n listAppPasswords(@GetUser() user: UserModel): Promise<Omit<UserAppPassword, 'password'>[]> {\n return this.usersManager.listAppPasswords(user)\n }\n\n @Post(`${USERS_ROUTE.ME}/${USERS_ROUTE.APP_PASSWORDS}`)\n @UserHaveRole(USER_ROLE.USER)\n @UseGuards(AuthTwoFaGuardWithoutPassword)\n generateAppPassword(@GetUser() user: UserModel, @Body() userAppPasswordDto: UserAppPasswordDto): Promise<UserAppPassword> {\n return this.usersManager.generateAppPassword(user, userAppPasswordDto)\n }\n\n @Delete(`${USERS_ROUTE.ME}/${USERS_ROUTE.APP_PASSWORDS}/:name`)\n @UserHaveRole(USER_ROLE.USER)\n deleteAppPassword(@GetUser() user: UserModel, @Param('name') name: string): Promise<void> {\n return this.usersManager.deleteAppPassword(user, name)\n }\n\n @Put(`${USERS_ROUTE.ME}/${USERS_ROUTE.LANGUAGE}`)\n @UserHaveRole(USER_ROLE.GUEST)\n updateLanguage(@GetUser() user: UserModel, @Body() userLanguageDto: UserLanguageDto) {\n return this.usersManager.updateLanguage(user, userLanguageDto)\n }\n\n @Put(`${USERS_ROUTE.ME}/${USERS_ROUTE.PASSWORD}`)\n @UseGuards(AuthTwoFaGuardWithoutPassword)\n updatePassword(@GetUser() user: UserModel, @Body() userPasswordDto: UserUpdatePasswordDto) {\n return this.usersManager.updatePassword(user, userPasswordDto)\n }\n\n @Put(`${USERS_ROUTE.ME}/${USERS_ROUTE.NOTIFICATION}`)\n @UserHaveRole(USER_ROLE.GUEST)\n updateNotification(@GetUser() user: UserModel, @Body() userNotificationDto: UserNotificationDto) {\n return this.usersManager.updateNotification(user, userNotificationDto)\n }\n\n @Put(`${USERS_ROUTE.ME}/${USERS_ROUTE.STORAGE_INDEXING}`)\n @UserHaveRole(USER_ROLE.USER)\n updateStorageIndexing(@GetUser() user: UserModel, @Body() userStorageIndexingDto: UserStorageIndexingDto) {\n return this.usersManager.updateStorageIndexing(user, userStorageIndexingDto)\n }\n\n @Get(`${USERS_ROUTE.AVATAR}/:login`)\n @UserHaveRole(USER_ROLE.LINK)\n @Header('cache-control', 'public,max-age=86400')\n async avatar(@GetUser() user: UserModel, @Param('login') login: 'me' | string): Promise<StreamableFile> {\n const isMe: boolean = login === 'me'\n const [path, mime] = await this.usersManager.getAvatar(isMe ? user.login : login, false, isMe && user.role <= USER_ROLE.USER)\n return new StreamableFile(createReadStream(path), { type: mime })\n }\n\n @Put(`${USERS_ROUTE.ME}/${USERS_ROUTE.AVATAR}`)\n updateAvatar(@Req() req: FastifyAuthenticatedRequest) {\n return this.usersManager.updateAvatar(req)\n }\n\n @Patch(`${USERS_ROUTE.ME}/${USERS_ROUTE.AVATAR}`)\n genAvatar(@GetUser() user: UserModel) {\n return this.usersManager.getAvatar(user.login, true)\n }\n\n @Search()\n searchMembers(@GetUser() user: UserModel, @Body() searchMembersDto: SearchMembersDto): Promise<Member[]> {\n return this.usersManager.searchMembers(user, searchMembersDto)\n }\n\n @Get(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}/${USERS_ROUTE.BROWSE}/:name?`)\n browseGroups(@GetUser() user: UserModel, @Param('name') name?: string): Promise<GroupBrowse> {\n return this.usersManager.browseGroups(user, name)\n }\n\n @Post(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}`)\n @UserHavePermission(USER_PERMISSION.PERSONAL_GROUPS_ADMIN)\n @UseGuards(UserPermissionsGuard)\n createPersonalGroup(@GetUser() user: UserModel, @Body() userCreateOrUpdateGroupDto: UserCreateOrUpdateGroupDto): Promise<GroupMember> {\n return this.usersManager.createPersonalGroup(user, userCreateOrUpdateGroupDto)\n }\n\n @Put(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}/:id`)\n updatePersonalGroup(\n @GetUser() user: UserModel,\n @Param('id', ParseIntPipe) groupId: number,\n @Body() userCreateOrUpdateGroupDto: UserCreateOrUpdateGroupDto\n ): Promise<GroupMember> {\n return this.usersManager.updatePersonalGroup(user, groupId, userCreateOrUpdateGroupDto)\n }\n\n @Delete(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}/:id`)\n deletePersonalGroup(@GetUser() user: UserModel, @Param('id', ParseIntPipe) groupId: number): Promise<void> {\n return this.usersManager.deletePersonalGroup(user, groupId)\n }\n\n @Delete(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}/${USERS_ROUTE.GROUPS_LEAVE}/:id`)\n leavePersonalGroup(@GetUser() user: UserModel, @Param('id', ParseIntPipe) groupId: number): Promise<void> {\n return this.usersManager.leavePersonalGroup(user, groupId)\n }\n\n @Patch(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}/:groupId/${USERS_ROUTE.USERS}`)\n addUsersToGroup(@GetUser() user: UserModel, @Param('groupId', ParseIntPipe) groupId: number, @Body() userIds: number[]): Promise<void> {\n return this.usersManager.addUsersToGroup(user, groupId, userIds)\n }\n\n @Delete(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}/:groupId/${USERS_ROUTE.USERS}/:userId`)\n removeUserFromGroup(\n @GetUser() user: UserModel,\n @Param('groupId', ParseIntPipe) groupId: number,\n @Param('userId', ParseIntPipe) userId: number\n ): Promise<void> {\n return this.usersManager.removeUserFromGroup(user, groupId, userId)\n }\n\n @Patch(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}/:groupId/${USERS_ROUTE.USERS}/:userId`)\n updateUserFromPersonalGroup(\n @GetUser() user: UserModel,\n @Param('groupId', ParseIntPipe) groupId: number,\n @Param('userId', ParseIntPipe) userId: number,\n @Body() updateUserFromGroupDto: UpdateUserFromGroupDto\n ): Promise<void> {\n return this.usersManager.updateUserFromPersonalGroup(user, groupId, userId, updateUserFromGroupDto)\n }\n\n @Get(`${USERS_ROUTE.ME}/${USERS_ROUTE.GUESTS}`)\n listGuests(@GetUser() user: UserModel): Promise<GuestUser[]> {\n return this.usersManager.listGuests(user)\n }\n\n @Get(`${USERS_ROUTE.ME}/${USERS_ROUTE.GUESTS}/:id`)\n getGuest(@GetUser() user: UserModel, @Param('id', ParseIntPipe) guestId: number): Promise<GuestUser> {\n return this.usersManager.getGuest(user, guestId)\n }\n\n @Post(`${USERS_ROUTE.ME}/${USERS_ROUTE.GUESTS}`)\n @UserHavePermission(USER_PERMISSION.GUESTS_ADMIN)\n @UseGuards(UserPermissionsGuard)\n createGuest(@GetUser() user: UserModel, @Body() createGuestDto: CreateUserDto): Promise<GuestUser> {\n return this.usersManager.createGuest(user, createGuestDto)\n }\n\n @Put(`${USERS_ROUTE.ME}/${USERS_ROUTE.GUESTS}/:id`)\n updateGuest(@GetUser() user: UserModel, @Param('id', ParseIntPipe) guestId: number, @Body() updateGuestDto: UpdateUserDto): Promise<GuestUser> {\n return this.usersManager.updateGuest(user, guestId, updateGuestDto)\n }\n\n @Delete(`${USERS_ROUTE.ME}/${USERS_ROUTE.GUESTS}/:id`)\n deleteGuest(@GetUser() user: UserModel, @Param('id', ParseIntPipe) guestId: number): Promise<void> {\n return this.usersManager.deleteGuest(user, guestId)\n }\n}\n"],"names":["UsersController","me","user","usersManager","listAppPasswords","generateAppPassword","userAppPasswordDto","deleteAppPassword","name","updateLanguage","userLanguageDto","updatePassword","userPasswordDto","updateNotification","userNotificationDto","updateStorageIndexing","userStorageIndexingDto","avatar","login","isMe","path","mime","getAvatar","role","USER_ROLE","USER","StreamableFile","createReadStream","type","updateAvatar","req","genAvatar","searchMembers","searchMembersDto","browseGroups","createPersonalGroup","userCreateOrUpdateGroupDto","updatePersonalGroup","groupId","deletePersonalGroup","leavePersonalGroup","addUsersToGroup","userIds","removeUserFromGroup","userId","updateUserFromPersonalGroup","updateUserFromGroupDto","listGuests","getGuest","guestId","createGuest","createGuestDto","updateGuest","updateGuestDto","deleteGuest","ME","LINK","USERS_ROUTE","APP_PASSWORDS","LANGUAGE","GUEST","PASSWORD","NOTIFICATION","STORAGE_INDEXING","AVATAR","GROUPS","BROWSE","PERSONAL_GROUPS_ADMIN","GROUPS_LEAVE","USERS","GUESTS","GUESTS_ADMIN","BASE"],"mappings":"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"}
|
|
@@ -13,7 +13,7 @@ Object.defineProperty(exports, "generateUserTest", {
|
|
|
13
13
|
}
|
|
14
14
|
});
|
|
15
15
|
const _faker = require("@faker-js/faker");
|
|
16
|
-
const
|
|
16
|
+
const _shared = require("../../../common/shared");
|
|
17
17
|
const _user = require("../constants/user");
|
|
18
18
|
function generateUserTest(withId = true) {
|
|
19
19
|
return {
|
|
@@ -22,7 +22,7 @@ function generateUserTest(withId = true) {
|
|
|
22
22
|
},
|
|
23
23
|
login: _faker.faker.internet.username(),
|
|
24
24
|
email: _faker.faker.internet.email(),
|
|
25
|
-
firstName:
|
|
25
|
+
firstName: _shared.SERVER_NAME,
|
|
26
26
|
lastName: 'Testing',
|
|
27
27
|
role: _user.USER_ROLE.USER,
|
|
28
28
|
isActive: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../backend/src/applications/users/utils/test.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 { faker } from '@faker-js/faker'\nimport { SERVER_NAME } from '../../../
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/users/utils/test.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 { faker } from '@faker-js/faker'\nimport { SERVER_NAME } from '../../../common/shared'\nimport { USER_PERMISSION, USER_ROLE } from '../constants/user'\nimport type { UserModel } from '../models/user.model'\n\nexport function generateUserTest(withId: boolean = true): Partial<UserModel> {\n return {\n ...(withId && { id: -faker.number.int() }),\n login: faker.internet.username(),\n email: faker.internet.email(),\n firstName: SERVER_NAME,\n lastName: 'Testing',\n role: USER_ROLE.USER,\n isActive: true,\n password: 'password',\n applications: Object.values(USER_PERMISSION)\n }\n}\n"],"names":["generateUserTest","withId","id","faker","number","int","login","internet","username","email","firstName","SERVER_NAME","lastName","role","USER_ROLE","USER","isActive","password","applications","Object","values","USER_PERMISSION"],"mappings":"AAAA;;;;CAIC;;;;+BAOeA;;;eAAAA;;;uBALM;wBACM;sBACe;AAGpC,SAASA,iBAAiBC,SAAkB,IAAI;IACrD,OAAO;QACL,GAAIA,UAAU;YAAEC,IAAI,CAACC,YAAK,CAACC,MAAM,CAACC,GAAG;QAAG,CAAC;QACzCC,OAAOH,YAAK,CAACI,QAAQ,CAACC,QAAQ;QAC9BC,OAAON,YAAK,CAACI,QAAQ,CAACE,KAAK;QAC3BC,WAAWC,mBAAW;QACtBC,UAAU;QACVC,MAAMC,eAAS,CAACC,IAAI;QACpBC,UAAU;QACVC,UAAU;QACVC,cAAcC,OAAOC,MAAM,CAACC,qBAAe;IAC7C;AACF"}
|
|
@@ -23,11 +23,11 @@ _export(exports, {
|
|
|
23
23
|
return WEBDAV_SPACES;
|
|
24
24
|
}
|
|
25
25
|
});
|
|
26
|
-
const
|
|
26
|
+
const _shared = require("../../../common/shared");
|
|
27
27
|
const _spaces = require("../../spaces/constants/spaces");
|
|
28
28
|
const WEBDAV_BASE_PATH = 'webdav';
|
|
29
29
|
const WEBDAV_NS = {
|
|
30
|
-
SERVER:
|
|
30
|
+
SERVER: _shared.SERVER_NAME,
|
|
31
31
|
WEBDAV: WEBDAV_BASE_PATH,
|
|
32
32
|
PERSONAL: _spaces.SPACE_ALIAS.PERSONAL,
|
|
33
33
|
SPACES: _spaces.SPACE_ALIAS.SPACES,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../backend/src/applications/webdav/constants/routes.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 { SERVER_NAME } from '../../../
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/webdav/constants/routes.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 { SERVER_NAME } from '../../../common/shared'\nimport { SPACE_ALIAS, SPACE_REPOSITORY } from '../../spaces/constants/spaces'\n\nexport const WEBDAV_BASE_PATH = 'webdav'\n\nexport const WEBDAV_NS = {\n SERVER: SERVER_NAME,\n WEBDAV: WEBDAV_BASE_PATH,\n PERSONAL: SPACE_ALIAS.PERSONAL,\n SPACES: SPACE_ALIAS.SPACES,\n SHARES: SPACE_ALIAS.SHARES,\n TRASH: SPACE_ALIAS.TRASH\n} as const\n\nexport const WEBDAV_SPACES: Record<(typeof WEBDAV_NS)[keyof typeof WEBDAV_NS], { route: string; spaceRepository: string[] }> = {\n [WEBDAV_NS.SERVER]: { route: '/', spaceRepository: null },\n [WEBDAV_NS.WEBDAV]: { route: `/${WEBDAV_BASE_PATH}`, spaceRepository: null },\n [WEBDAV_NS.PERSONAL]: { route: `/${WEBDAV_BASE_PATH}/${WEBDAV_NS.PERSONAL}`, spaceRepository: [SPACE_REPOSITORY.FILES, SPACE_ALIAS.PERSONAL] },\n [WEBDAV_NS.SPACES]: { route: `/${WEBDAV_BASE_PATH}/${WEBDAV_NS.SPACES}`, spaceRepository: [SPACE_REPOSITORY.FILES] },\n [WEBDAV_NS.SHARES]: { route: `/${WEBDAV_BASE_PATH}/${WEBDAV_NS.SHARES}`, spaceRepository: [SPACE_REPOSITORY.SHARES] },\n [WEBDAV_NS.TRASH]: {\n route: `/${WEBDAV_BASE_PATH}/${WEBDAV_NS.TRASH}`,\n spaceRepository: [SPACE_REPOSITORY.TRASH]\n }\n}\n"],"names":["WEBDAV_BASE_PATH","WEBDAV_NS","WEBDAV_SPACES","SERVER","SERVER_NAME","WEBDAV","PERSONAL","SPACE_ALIAS","SPACES","SHARES","TRASH","route","spaceRepository","SPACE_REPOSITORY","FILES"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAKYA;eAAAA;;QAEAC;eAAAA;;QASAC;eAAAA;;;wBAde;wBACkB;AAEvC,MAAMF,mBAAmB;AAEzB,MAAMC,YAAY;IACvBE,QAAQC,mBAAW;IACnBC,QAAQL;IACRM,UAAUC,mBAAW,CAACD,QAAQ;IAC9BE,QAAQD,mBAAW,CAACC,MAAM;IAC1BC,QAAQF,mBAAW,CAACE,MAAM;IAC1BC,OAAOH,mBAAW,CAACG,KAAK;AAC1B;AAEO,MAAMR,gBAAkH;IAC7H,CAACD,UAAUE,MAAM,CAAC,EAAE;QAAEQ,OAAO;QAAKC,iBAAiB;IAAK;IACxD,CAACX,UAAUI,MAAM,CAAC,EAAE;QAAEM,OAAO,CAAC,CAAC,EAAEX,kBAAkB;QAAEY,iBAAiB;IAAK;IAC3E,CAACX,UAAUK,QAAQ,CAAC,EAAE;QAAEK,OAAO,CAAC,CAAC,EAAEX,iBAAiB,CAAC,EAAEC,UAAUK,QAAQ,EAAE;QAAEM,iBAAiB;YAACC,wBAAgB,CAACC,KAAK;YAAEP,mBAAW,CAACD,QAAQ;SAAC;IAAC;IAC7I,CAACL,UAAUO,MAAM,CAAC,EAAE;QAAEG,OAAO,CAAC,CAAC,EAAEX,iBAAiB,CAAC,EAAEC,UAAUO,MAAM,EAAE;QAAEI,iBAAiB;YAACC,wBAAgB,CAACC,KAAK;SAAC;IAAC;IACnH,CAACb,UAAUQ,MAAM,CAAC,EAAE;QAAEE,OAAO,CAAC,CAAC,EAAEX,iBAAiB,CAAC,EAAEC,UAAUQ,MAAM,EAAE;QAAEG,iBAAiB;YAACC,wBAAgB,CAACJ,MAAM;SAAC;IAAC;IACpH,CAACR,UAAUS,KAAK,CAAC,EAAE;QACjBC,OAAO,CAAC,CAAC,EAAEX,iBAAiB,CAAC,EAAEC,UAAUS,KAAK,EAAE;QAChDE,iBAAiB;YAACC,wBAAgB,CAACH,KAAK;SAAC;IAC3C;AACF"}
|
|
@@ -74,7 +74,7 @@ _export(exports, {
|
|
|
74
74
|
return XML_CONTENT_TYPE;
|
|
75
75
|
}
|
|
76
76
|
});
|
|
77
|
-
const
|
|
77
|
+
const _shared = require("../../../common/shared");
|
|
78
78
|
const _applicationsconstants = require("../../applications.constants");
|
|
79
79
|
const _routes = require("./routes");
|
|
80
80
|
const REGEX_BASE_PATH = new RegExp(`^/?${_routes.WEBDAV_BASE_PATH}/`);
|
|
@@ -96,7 +96,7 @@ const ALLOW_EMPTY_BODY_METHODS = [
|
|
|
96
96
|
_applicationsconstants.HTTP_WEBDAV_METHOD.LOCK
|
|
97
97
|
];
|
|
98
98
|
const OPTIONS_HEADERS = {
|
|
99
|
-
Server:
|
|
99
|
+
Server: _shared.SERVER_NAME,
|
|
100
100
|
'MS-Author-Via': 'DAV',
|
|
101
101
|
DAV: '1,2',
|
|
102
102
|
Allow: ALLOWED_WEBDAV_METHODS,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../backend/src/applications/webdav/constants/webdav.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 { SERVER_NAME } from '../../../
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/webdav/constants/webdav.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 { SERVER_NAME } from '../../../common/shared'\nimport { HTTP_STANDARD_METHOD, HTTP_WEBDAV_METHOD } from '../../applications.constants'\nimport { WEBDAV_BASE_PATH } from './routes'\n\nexport const REGEX_BASE_PATH = new RegExp(`^/?${WEBDAV_BASE_PATH}/`)\nexport const NS_DAV = 'DAV:'\nexport const NS_PREFIX = 'D'\nexport const LOCK_PREFIX = 'urn:uuid:'\nexport const XML_CONTENT_TYPE = 'application/xml; charset=utf-8'\nexport const HTML_CONTENT_TYPE = 'text/html; charset=utf-8'\n\nexport const ALLOWED_WEBDAV_METHODS: string = [\n HTTP_STANDARD_METHOD.OPTIONS,\n HTTP_STANDARD_METHOD.HEAD,\n HTTP_STANDARD_METHOD.GET,\n HTTP_STANDARD_METHOD.PUT,\n HTTP_STANDARD_METHOD.DELETE,\n ...Object.values(HTTP_WEBDAV_METHOD)\n].join(', ')\n\nexport const ALLOW_EMPTY_BODY_METHODS: string[] = [HTTP_WEBDAV_METHOD.PROPFIND, HTTP_WEBDAV_METHOD.LOCK]\n\nexport const OPTIONS_HEADERS = {\n Server: SERVER_NAME,\n 'MS-Author-Via': 'DAV',\n DAV: '1,2',\n Allow: ALLOWED_WEBDAV_METHODS,\n 'Content-Type': HTML_CONTENT_TYPE,\n 'Content-Length': '0',\n 'Accept-Ranges': 'bytes'\n} as const\n\nexport const HEADER = {\n DEPTH: 'depth',\n IF: 'if',\n LOCK_TOKEN: 'lock-token',\n DESTINATION: 'destination',\n OVERWRITE: 'overwrite',\n TIMEOUT: 'timeout'\n} as const\n\nexport const LOCK_DISCOVERY_PROP = 'lockdiscovery'\nexport const STANDARD_PROPS = [\n 'creationdate',\n 'getcontenttype',\n 'resourcetype',\n 'getlastmodified',\n 'getcontentlength',\n 'displayname',\n 'getetag',\n 'supportedlock',\n LOCK_DISCOVERY_PROP\n]\n\nexport enum LOCK_SCOPE {\n EXCLUSIVE = 'exclusive',\n SHARED = 'shared'\n}\n\nexport enum DEPTH {\n INFINITY = 'infinity',\n RESOURCE = '0',\n MEMBERS = '1'\n}\n\nexport type LOCK_DEPTH = Omit<DEPTH, DEPTH.MEMBERS>\n\nexport enum PROPSTAT {\n ALLPROP = 'allprop',\n PROP = 'prop',\n PROPNAME = 'propname'\n}\n\nexport const PROPPATCH_PROP_UPDATE = 'propertyupdate'\nexport const PROPPATCH_METHOD = { SET: 'set', REMOVE: 'remove' }\nexport const PROPPATCH_MODIFIED_PROPS = ['getlastmodified', 'lastmodified', 'Win32LastModifiedTime']\nexport const PROPPATCH_SUPPORTED_PROPS = [...PROPPATCH_MODIFIED_PROPS, 'Win32CreationTime', 'Win32LastAccessTime', 'Win32FileAttributes']\n\nexport const PRECONDITION = {\n PROTECTED_PROPERTY: 'cannot-modify-protected-property',\n MISSING_LOCK_TOKEN: 'lock-token-submitted',\n LOCK_TOKEN_MISMATCH: 'lock-token-matches-request-uri',\n LOCK_CONFLICT: 'no-conflicting-lock',\n PROPFIND_FINITE_DEPTH: 'propfind-finite-depth'\n} as const\n"],"names":["ALLOWED_WEBDAV_METHODS","ALLOW_EMPTY_BODY_METHODS","DEPTH","HEADER","HTML_CONTENT_TYPE","LOCK_DISCOVERY_PROP","LOCK_PREFIX","LOCK_SCOPE","NS_DAV","NS_PREFIX","OPTIONS_HEADERS","PRECONDITION","PROPPATCH_METHOD","PROPPATCH_MODIFIED_PROPS","PROPPATCH_PROP_UPDATE","PROPPATCH_SUPPORTED_PROPS","PROPSTAT","REGEX_BASE_PATH","STANDARD_PROPS","XML_CONTENT_TYPE","RegExp","WEBDAV_BASE_PATH","HTTP_STANDARD_METHOD","OPTIONS","HEAD","GET","PUT","DELETE","Object","values","HTTP_WEBDAV_METHOD","join","PROPFIND","LOCK","Server","SERVER_NAME","DAV","Allow","IF","LOCK_TOKEN","DESTINATION","OVERWRITE","TIMEOUT","SET","REMOVE","PROTECTED_PROPERTY","MISSING_LOCK_TOKEN","LOCK_TOKEN_MISMATCH","LOCK_CONFLICT","PROPFIND_FINITE_DEPTH"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAaYA;eAAAA;;QASAC;eAAAA;;QAuCDC;eAAAA;;QA3BCC;eAAAA;;QAvBAC;eAAAA;;QAgCAC;eAAAA;;QAlCAC;eAAAA;;QA+CDC;eAAAA;;QAjDCC;eAAAA;;QACAC;eAAAA;;QAgBAC;eAAAA;;QAwDAC;eAAAA;;QAJAC;eAAAA;;QACAC;eAAAA;;QAFAC;eAAAA;;QAGAC;eAAAA;;QATDC;eAAAA;;QA/DCC;eAAAA;;QAsCAC;eAAAA;;QAlCAC;eAAAA;;;wBARe;uCAC6B;wBACxB;AAE1B,MAAMF,kBAAkB,IAAIG,OAAO,CAAC,GAAG,EAAEC,wBAAgB,CAAC,CAAC,CAAC;AAC5D,MAAMb,SAAS;AACf,MAAMC,YAAY;AAClB,MAAMH,cAAc;AACpB,MAAMa,mBAAmB;AACzB,MAAMf,oBAAoB;AAE1B,MAAMJ,yBAAiC;IAC5CsB,2CAAoB,CAACC,OAAO;IAC5BD,2CAAoB,CAACE,IAAI;IACzBF,2CAAoB,CAACG,GAAG;IACxBH,2CAAoB,CAACI,GAAG;IACxBJ,2CAAoB,CAACK,MAAM;OACxBC,OAAOC,MAAM,CAACC,yCAAkB;CACpC,CAACC,IAAI,CAAC;AAEA,MAAM9B,2BAAqC;IAAC6B,yCAAkB,CAACE,QAAQ;IAAEF,yCAAkB,CAACG,IAAI;CAAC;AAEjG,MAAMvB,kBAAkB;IAC7BwB,QAAQC,mBAAW;IACnB,iBAAiB;IACjBC,KAAK;IACLC,OAAOrC;IACP,gBAAgBI;IAChB,kBAAkB;IAClB,iBAAiB;AACnB;AAEO,MAAMD,SAAS;IACpBD,OAAO;IACPoC,IAAI;IACJC,YAAY;IACZC,aAAa;IACbC,WAAW;IACXC,SAAS;AACX;AAEO,MAAMrC,sBAAsB;AAC5B,MAAMa,iBAAiB;IAC5B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACAb;CACD;AAEM,IAAA,AAAKE,oCAAAA;;;WAAAA;;AAKL,IAAA,AAAKL,+BAAAA;;;;WAAAA;;AAQL,IAAA,AAAKc,kCAAAA;;;;WAAAA;;AAML,MAAMF,wBAAwB;AAC9B,MAAMF,mBAAmB;IAAE+B,KAAK;IAAOC,QAAQ;AAAS;AACxD,MAAM/B,2BAA2B;IAAC;IAAmB;IAAgB;CAAwB;AAC7F,MAAME,4BAA4B;OAAIF;IAA0B;IAAqB;IAAuB;CAAsB;AAElI,MAAMF,eAAe;IAC1BkC,oBAAoB;IACpBC,oBAAoB;IACpBC,qBAAqB;IACrBC,eAAe;IACfC,uBAAuB;AACzB"}
|
|
@@ -13,7 +13,7 @@ Object.defineProperty(exports, "WebDAVExceptionsFilter", {
|
|
|
13
13
|
}
|
|
14
14
|
});
|
|
15
15
|
const _common = require("@nestjs/common");
|
|
16
|
-
const
|
|
16
|
+
const _shared = require("../../../common/shared");
|
|
17
17
|
const _webdav = require("../constants/webdav");
|
|
18
18
|
function _ts_decorate(decorators, target, key, desc) {
|
|
19
19
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
@@ -28,7 +28,7 @@ let WebDAVExceptionsFilter = class WebDAVExceptionsFilter {
|
|
|
28
28
|
const status = exception.getStatus();
|
|
29
29
|
if (status === 401) {
|
|
30
30
|
// req.authInfo from the AuthBasicGuard
|
|
31
|
-
res.header('WWW-Authenticate', `Basic realm="${
|
|
31
|
+
res.header('WWW-Authenticate', `Basic realm="${_shared.SERVER_NAME}"`).status(status).send();
|
|
32
32
|
} else {
|
|
33
33
|
let response = exception.getResponse();
|
|
34
34
|
if (typeof response === 'object' && response !== null) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../backend/src/applications/webdav/filters/webdav.filter.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 { ArgumentsHost, Catch, ExceptionFilter, HttpException } from '@nestjs/common'\nimport { SERVER_NAME } from '../../../
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/webdav/filters/webdav.filter.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 { ArgumentsHost, Catch, ExceptionFilter, HttpException } from '@nestjs/common'\nimport { SERVER_NAME } from '../../../common/shared'\nimport { XML_CONTENT_TYPE } from '../constants/webdav'\n\n@Catch(HttpException)\nexport class WebDAVExceptionsFilter implements ExceptionFilter {\n catch(exception: HttpException, host: ArgumentsHost) {\n const ctx = host.switchToHttp()\n const res = ctx.getResponse()\n const status = exception.getStatus()\n\n if (status === 401) {\n // req.authInfo from the AuthBasicGuard\n res.header('WWW-Authenticate', `Basic realm=\"${SERVER_NAME}\"`).status(status).send()\n } else {\n let response: any = exception.getResponse()\n if (typeof response === 'object' && response !== null) {\n response = response.message\n }\n res.type(XML_CONTENT_TYPE).status(status).send(response)\n }\n }\n}\n"],"names":["WebDAVExceptionsFilter","catch","exception","host","ctx","switchToHttp","res","getResponse","status","getStatus","header","SERVER_NAME","send","response","message","type","XML_CONTENT_TYPE"],"mappings":"AAAA;;;;CAIC;;;;+BAOYA;;;eAAAA;;;wBALwD;wBACzC;wBACK;;;;;;;AAG1B,IAAA,AAAMA,yBAAN,MAAMA;IACXC,MAAMC,SAAwB,EAAEC,IAAmB,EAAE;QACnD,MAAMC,MAAMD,KAAKE,YAAY;QAC7B,MAAMC,MAAMF,IAAIG,WAAW;QAC3B,MAAMC,SAASN,UAAUO,SAAS;QAElC,IAAID,WAAW,KAAK;YAClB,uCAAuC;YACvCF,IAAII,MAAM,CAAC,oBAAoB,CAAC,aAAa,EAAEC,mBAAW,CAAC,CAAC,CAAC,EAAEH,MAAM,CAACA,QAAQI,IAAI;QACpF,OAAO;YACL,IAAIC,WAAgBX,UAAUK,WAAW;YACzC,IAAI,OAAOM,aAAa,YAAYA,aAAa,MAAM;gBACrDA,WAAWA,SAASC,OAAO;YAC7B;YACAR,IAAIS,IAAI,CAACC,wBAAgB,EAAER,MAAM,CAACA,QAAQI,IAAI,CAACC;QACjD;IACF;AACF"}
|
|
@@ -8,7 +8,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
8
8
|
});
|
|
9
9
|
const _common = require("@nestjs/common");
|
|
10
10
|
const _testing = require("@nestjs/testing");
|
|
11
|
-
const
|
|
11
|
+
const _shared = require("../../../common/shared");
|
|
12
12
|
const _webdav = require("../constants/webdav");
|
|
13
13
|
const _webdavfilter = require("./webdav.filter");
|
|
14
14
|
describe('WebDAVExceptionsFilter', ()=>{
|
|
@@ -42,7 +42,7 @@ describe('WebDAVExceptionsFilter', ()=>{
|
|
|
42
42
|
const host = createMockHost(res);
|
|
43
43
|
const exception = new _common.HttpException('Unauthorized', 401);
|
|
44
44
|
filter.catch(exception, host);
|
|
45
|
-
expect(res.header).toHaveBeenCalledWith('WWW-Authenticate', `Basic realm="${
|
|
45
|
+
expect(res.header).toHaveBeenCalledWith('WWW-Authenticate', `Basic realm="${_shared.SERVER_NAME}"`);
|
|
46
46
|
expect(res.status).toHaveBeenCalledWith(401);
|
|
47
47
|
expect(res.type).not.toHaveBeenCalled();
|
|
48
48
|
expect(res.send).toHaveBeenCalled();
|