@sync-in/server
Version:
The secure, open-source platform for file storage, sharing, collaboration, and sync
181 lines (180 loc) • 12 kB
JavaScript
/*
* 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