UNPKG

@sync-in/server

Version:

The secure, open-source platform for file storage, sharing, collaboration, and sync

181 lines (180 loc) 12 kB
/* * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com> * This file is part of Sync-in | The open source file sync and share solution * See the LICENSE file for licensing details */ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "LinksQueries", { enumerable: true, get: function() { return LinksQueries; } }); const _common = require("@nestjs/common"); const _drizzleorm = require("drizzle-orm"); const _mysqlcore = require("drizzle-orm/mysql-core"); const _cacheservice = require("../../../infrastructure/cache/services/cache.service"); const _constants = require("../../../infrastructure/database/constants"); const _utils = require("../../../infrastructure/database/utils"); const _filesschema = require("../../files/schemas/files.schema"); const _sharesmembersschema = require("../../shares/schemas/shares-members.schema"); const _sharesschema = require("../../shares/schemas/shares.schema"); const _spaces = require("../../spaces/constants/spaces"); const _spacesmembersschema = require("../../spaces/schemas/spaces-members.schema"); const _spacesrootsschema = require("../../spaces/schemas/spaces-roots.schema"); const _spacesschema = require("../../spaces/schemas/spaces.schema"); const _user = require("../../users/constants/user"); const _usersschema = require("../../users/schemas/users.schema"); const _cache = require("../constants/cache"); const _links = require("../constants/links"); const _linksschema = require("../schemas/links.schema"); function _ts_decorate(decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; } function _ts_metadata(k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); } function _ts_param(paramIndex, decorator) { return function(target, key) { decorator(target, key, paramIndex); }; } let LinksQueries = class LinksQueries { async linkFromShare(ownerId, linkId, shareId, isAdmin = 0) { const [r] = await this.db.select({ ...(0, _drizzleorm.getTableColumns)(_linksschema.links), permissions: _sharesmembersschema.sharesMembers.permissions, language: _usersschema.users.language, isActive: _usersschema.users.isActive }).from(_linksschema.links).innerJoin(_sharesschema.shares, (0, _drizzleorm.and)((0, _drizzleorm.eq)(_sharesschema.shares.id, shareId), (0, _drizzleorm.or)((0, _drizzleorm.eq)(_sharesschema.shares.ownerId, ownerId), (0, _drizzleorm.and)((0, _drizzleorm.eq)((0, _drizzleorm.sql)`${isAdmin}`, 1), (0, _drizzleorm.isNull)(_sharesschema.shares.ownerId))))).innerJoin(_sharesmembersschema.sharesMembers, (0, _drizzleorm.and)((0, _drizzleorm.eq)(_sharesmembersschema.sharesMembers.shareId, _sharesschema.shares.id), (0, _drizzleorm.eq)(_sharesmembersschema.sharesMembers.userId, _linksschema.links.userId), (0, _drizzleorm.eq)(_sharesmembersschema.sharesMembers.linkId, linkId))).innerJoin(_usersschema.users, (0, _drizzleorm.eq)(_usersschema.users.id, _linksschema.links.userId)).where((0, _drizzleorm.eq)(_linksschema.links.id, linkId)).limit(1); return r; } async linkFromSpace(managerId, linkId, spaceId) { const linkMember = (0, _mysqlcore.alias)(_spacesmembersschema.spacesMembers, 'linkMember'); const [r] = await this.db.select({ ...(0, _drizzleorm.getTableColumns)(_linksschema.links), permissions: linkMember.permissions, language: _usersschema.users.language, isActive: _usersschema.users.isActive }).from(_linksschema.links).innerJoin(_spacesmembersschema.spacesMembers, (0, _drizzleorm.and)((0, _drizzleorm.eq)(_spacesmembersschema.spacesMembers.spaceId, spaceId), (0, _drizzleorm.eq)(_spacesmembersschema.spacesMembers.userId, managerId), (0, _drizzleorm.eq)(_spacesmembersschema.spacesMembers.role, _spaces.SPACE_ROLE.IS_MANAGER))).innerJoin(linkMember, (0, _drizzleorm.and)((0, _drizzleorm.eq)(linkMember.spaceId, _spacesmembersschema.spacesMembers.spaceId), (0, _drizzleorm.eq)(linkMember.userId, _linksschema.links.userId), (0, _drizzleorm.eq)(linkMember.linkId, linkId))).innerJoin(_usersschema.users, (0, _drizzleorm.eq)(_usersschema.users.id, _linksschema.links.userId)).where((0, _drizzleorm.eq)(_linksschema.links.id, linkId)).limit(1); return r; } async updateLinkFromSpaceOrShare(link, shareId, diffUser, diffLink, diffShare, diffMember) { if (Object.keys(diffUser).length) { await this.db.update(_usersschema.users).set(diffUser).where((0, _drizzleorm.eq)(_usersschema.users.id, link.userId)); } if (Object.keys(diffLink).length) { await this.db.update(_linksschema.links).set(diffLink).where((0, _drizzleorm.eq)(_linksschema.links.id, link.id)); } if (Object.keys(diffShare).length) { await this.db.update(_sharesschema.shares).set(diffShare).where((0, _drizzleorm.eq)(_sharesschema.shares.id, shareId)); } if (Object.keys(diffMember).length) { await this.db.update(_sharesmembersschema.sharesMembers).set(diffMember).where((0, _drizzleorm.and)((0, _drizzleorm.eq)(_sharesmembersschema.sharesMembers.shareId, shareId), (0, _drizzleorm.eq)(_sharesmembersschema.sharesMembers.userId, link.userId), (0, _drizzleorm.eq)(_sharesmembersschema.sharesMembers.linkId, link.id))); } } async createLinkToSpaceOrShare(guestId, spaceOrShareId, type, link) { const linkId = (0, _utils.dbGetInsertedId)(await this.db.insert(_linksschema.links).values(link)); if (type === _links.LINK_TYPE.SPACE) { await this.db.insert(_spacesmembersschema.spacesMembers).values({ userId: guestId, spaceId: spaceOrShareId, permissions: link.permissions, role: _spaces.SPACE_ROLE.IS_MEMBER, linkId: linkId }); } else { await this.db.insert(_sharesmembersschema.sharesMembers).values({ userId: guestId, shareId: spaceOrShareId, linkId: linkId, permissions: link.permissions }); } return linkId; } allLinksFromSpaceOrShare(spaceOrShareId, type) { const members = (0, _mysqlcore.alias)(type == 'share' ? _sharesmembersschema.sharesMembers : _spacesmembersschema.spacesMembers, 'members'); return this.db.select({ id: _usersschema.users.id, linkId: members.linkId }).from(members).innerJoin(_usersschema.users, (0, _drizzleorm.and)((0, _drizzleorm.eq)(_usersschema.users.id, members.userId), (0, _drizzleorm.eq)(_usersschema.users.role, _user.USER_ROLE.LINK))).where((0, _drizzleorm.and)((0, _drizzleorm.eq)(type == 'share' ? members.shareId : members.spaceId, spaceOrShareId), (0, _drizzleorm.isNotNull)(members.linkId))); } async linkFromUUID(uuid) { const { password, ...userColumns } = (0, _drizzleorm.getTableColumns)(_usersschema.users); const [r] = await this.db.select({ ...(0, _drizzleorm.getTableColumns)(_linksschema.links), user: { ...userColumns } }).from(_linksschema.links).leftJoin(_usersschema.users, (0, _drizzleorm.eq)(_usersschema.users.id, _linksschema.links.userId)).where((0, _drizzleorm.eq)(_linksschema.links.uuid, uuid)).limit(1); return r; } async spaceLink(uuid) { const shareOwner = (0, _mysqlcore.alias)(_usersschema.users, 'shareOwner'); const shareSpaceRoot = (0, _mysqlcore.alias)(_spacesrootsschema.spacesRoots, 'shareSpaceRoot'); const [r] = await this.db.select({ share: { name: _sharesschema.shares.name, alias: _sharesschema.shares.alias, hasParent: (0, _drizzleorm.isNotNull)(_sharesschema.shares.parentId).mapWith(Boolean), isDir: (0, _drizzleorm.sql)`IF (${(0, _drizzleorm.isNotNull)(_sharesschema.shares.externalPath)}, 1 ,${_filesschema.files.isDir})`.mapWith(Boolean), mime: _filesschema.files.mime }, space: { name: _spacesschema.spaces.name, alias: _spacesschema.spaces.alias }, owner: { login: shareOwner.login, fullName: (0, _usersschema.userFullNameSQL)(shareOwner) } }).from(_linksschema.links).leftJoin(_sharesmembersschema.sharesMembers, (0, _drizzleorm.eq)(_sharesmembersschema.sharesMembers.linkId, _linksschema.links.id)).leftJoin(_sharesschema.shares, (0, _drizzleorm.eq)(_sharesschema.shares.id, _sharesmembersschema.sharesMembers.shareId)).leftJoin(shareOwner, (0, _drizzleorm.eq)(shareOwner.id, _sharesschema.shares.ownerId)).leftJoin(_spacesmembersschema.spacesMembers, (0, _drizzleorm.eq)(_spacesmembersschema.spacesMembers.linkId, _linksschema.links.id)).leftJoin(_spacesschema.spaces, (0, _drizzleorm.eq)(_spacesschema.spaces.id, _spacesmembersschema.spacesMembers.spaceId)).leftJoin(shareSpaceRoot, (0, _drizzleorm.and)((0, _drizzleorm.isNull)(_sharesschema.shares.externalPath), (0, _drizzleorm.isNull)(_sharesschema.shares.fileId), (0, _drizzleorm.eq)(shareSpaceRoot.id, _sharesschema.shares.spaceRootId))).leftJoin(_filesschema.files, (0, _drizzleorm.or)((0, _drizzleorm.and)((0, _drizzleorm.isNotNull)(_sharesschema.shares.fileId), (0, _drizzleorm.eq)(_filesschema.files.id, _sharesschema.shares.fileId)), (0, _drizzleorm.and)((0, _drizzleorm.isNull)(_sharesschema.shares.externalPath), (0, _drizzleorm.isNotNull)(shareSpaceRoot.fileId), (0, _drizzleorm.eq)(_filesschema.files.id, shareSpaceRoot.fileId)))).where((0, _drizzleorm.eq)(_linksschema.links.uuid, uuid)).limit(1); return r; } async incrementLinkNbAccess(uuid) { await this.db.update(_linksschema.links).set({ nbAccess: (0, _drizzleorm.sql)`${_linksschema.links.nbAccess} + 1` }).where((0, _drizzleorm.eq)(_linksschema.links.uuid, uuid)).limit(1); } async isUniqueUUID(userId, uuid) { const [r] = await this.db.select({ check: _linksschema.links.uuid }).from(_linksschema.links).where((0, _drizzleorm.eq)(_linksschema.links.uuid, uuid)).limit(1); if (!r) { // uuid does not exist in db const cacheKey = this.cache.genSlugKey(_cache.CACHE_LINK_UUID_PREFIX, userId, uuid); // check if uuid was already requested if (!await this.cache.has(cacheKey)) { // store uuid to prevent reuse await this.cache.set(cacheKey, uuid, _cache.CACHE_LINK_UUID_TTL); return true; } return false; } return false; } isReservedUUID(userId, uuid) { // check if uuid is reserved return this.cache.has(this.cache.genSlugKey(_cache.CACHE_LINK_UUID_PREFIX, userId, uuid)); } constructor(db, cache){ this.db = db; this.cache = cache; } }; LinksQueries = _ts_decorate([ (0, _common.Injectable)(), _ts_param(0, (0, _common.Inject)(_constants.DB_TOKEN_PROVIDER)), _ts_metadata("design:type", Function), _ts_metadata("design:paramtypes", [ typeof DBSchema === "undefined" ? Object : DBSchema, typeof _cacheservice.Cache === "undefined" ? Object : _cacheservice.Cache ]) ], LinksQueries); //# sourceMappingURL=links-queries.service.js.map