refactor(core): Remove roleId indirection (no-changelog) (#8413)
This commit is contained in:
committed by
GitHub
parent
1affebd85e
commit
d6deceacde
@@ -34,10 +34,10 @@ export class EnterpriseWorkflowService {
|
||||
user,
|
||||
workflowId,
|
||||
{ allowGlobalScope: false },
|
||||
['workflow', 'role'],
|
||||
['workflow'],
|
||||
);
|
||||
|
||||
if (!sharing || sharing.role.name !== 'owner') return { ownsWorkflow: false };
|
||||
if (!sharing || sharing.role !== 'workflow:owner') return { ownsWorkflow: false };
|
||||
|
||||
const { workflow } = sharing;
|
||||
|
||||
@@ -54,7 +54,7 @@ export class EnterpriseWorkflowService {
|
||||
workflow.shared?.forEach(({ user, role }) => {
|
||||
const { id, email, firstName, lastName } = user;
|
||||
|
||||
if (role.name === 'owner') {
|
||||
if (role === 'workflow:owner') {
|
||||
workflow.ownedBy = { id, email, firstName, lastName };
|
||||
return;
|
||||
}
|
||||
@@ -101,7 +101,7 @@ export class EnterpriseWorkflowService {
|
||||
};
|
||||
credential.shared?.forEach(({ user, role }) => {
|
||||
const { id, email, firstName, lastName } = user;
|
||||
if (role.name === 'owner') {
|
||||
if (role === 'credential:owner') {
|
||||
workflowCredential.ownedBy = { id, email, firstName, lastName };
|
||||
} else {
|
||||
workflowCredential.sharedWith?.push({ id, email, firstName, lastName });
|
||||
|
||||
@@ -8,6 +8,7 @@ import { BinaryDataService } from 'n8n-core';
|
||||
import config from '@/config';
|
||||
import type { User } from '@db/entities/User';
|
||||
import type { WorkflowEntity } from '@db/entities/WorkflowEntity';
|
||||
import type { WorkflowSharingRole } from '@db/entities/SharedWorkflow';
|
||||
import { ExecutionRepository } from '@db/repositories/execution.repository';
|
||||
import { SharedWorkflowRepository } from '@db/repositories/sharedWorkflow.repository';
|
||||
import { WorkflowTagMappingRepository } from '@db/repositories/workflowTagMapping.repository';
|
||||
@@ -60,7 +61,7 @@ export class WorkflowService {
|
||||
workflowId: string,
|
||||
tagIds?: string[],
|
||||
forceSave?: boolean,
|
||||
roles?: string[],
|
||||
roles?: WorkflowSharingRole[],
|
||||
): Promise<WorkflowEntity> {
|
||||
const shared = await this.sharedWorkflowRepository.findSharing(
|
||||
workflowId,
|
||||
@@ -250,7 +251,7 @@ export class WorkflowService {
|
||||
workflowId,
|
||||
user,
|
||||
'workflow:delete',
|
||||
{ roles: ['owner'] },
|
||||
{ roles: ['workflow:owner'] },
|
||||
);
|
||||
|
||||
if (!sharedWorkflow) {
|
||||
|
||||
@@ -1,31 +1,25 @@
|
||||
import { Service } from 'typedi';
|
||||
import { In, type FindOptionsWhere } from 'typeorm';
|
||||
|
||||
import type { RoleNames } from '@db/entities/Role';
|
||||
import type { SharedWorkflow } from '@db/entities/SharedWorkflow';
|
||||
import type { SharedWorkflow, WorkflowSharingRole } from '@db/entities/SharedWorkflow';
|
||||
import type { User } from '@db/entities/User';
|
||||
import { RoleRepository } from '@db/repositories/role.repository';
|
||||
import { SharedWorkflowRepository } from '@db/repositories/sharedWorkflow.repository';
|
||||
|
||||
@Service()
|
||||
export class WorkflowSharingService {
|
||||
constructor(
|
||||
private readonly roleRepository: RoleRepository,
|
||||
private readonly sharedWorkflowRepository: SharedWorkflowRepository,
|
||||
) {}
|
||||
constructor(private readonly sharedWorkflowRepository: SharedWorkflowRepository) {}
|
||||
|
||||
/**
|
||||
* Get the IDs of the workflows that have been shared with the user.
|
||||
* Returns all IDs if user has the 'workflow:read' scope.
|
||||
*/
|
||||
async getSharedWorkflowIds(user: User, roleNames?: RoleNames[]): Promise<string[]> {
|
||||
async getSharedWorkflowIds(user: User, roles?: WorkflowSharingRole[]): Promise<string[]> {
|
||||
const where: FindOptionsWhere<SharedWorkflow> = {};
|
||||
if (!user.hasGlobalScope('workflow:read')) {
|
||||
where.userId = user.id;
|
||||
}
|
||||
if (roleNames?.length) {
|
||||
const roleIds = await this.roleRepository.getIdsInScopeWorkflowByNames(roleNames);
|
||||
where.roleId = In(roleIds);
|
||||
if (roles?.length) {
|
||||
where.role = In(roles);
|
||||
}
|
||||
const sharedWorkflows = await this.sharedWorkflowRepository.find({
|
||||
where,
|
||||
|
||||
@@ -10,8 +10,7 @@ import * as WorkflowHelpers from '@/WorkflowHelpers';
|
||||
import type { IWorkflowResponse } from '@/Interfaces';
|
||||
import config from '@/config';
|
||||
import { Authorized, Delete, Get, Patch, Post, Put, RestController } from '@/decorators';
|
||||
import type { RoleNames } from '@db/entities/Role';
|
||||
import { SharedWorkflow } from '@db/entities/SharedWorkflow';
|
||||
import { SharedWorkflow, type WorkflowSharingRole } from '@db/entities/SharedWorkflow';
|
||||
import { WorkflowEntity } from '@db/entities/WorkflowEntity';
|
||||
import { SharedWorkflowRepository } from '@db/repositories/sharedWorkflow.repository';
|
||||
import { TagRepository } from '@db/repositories/tag.repository';
|
||||
@@ -23,7 +22,6 @@ import { ListQuery } from '@/requests';
|
||||
import { WorkflowService } from './workflow.service';
|
||||
import { License } from '@/License';
|
||||
import { InternalHooks } from '@/InternalHooks';
|
||||
import { RoleService } from '@/services/role.service';
|
||||
import * as utils from '@/utils';
|
||||
import { listQueryMiddleware } from '@/middlewares';
|
||||
import { TagService } from '@/services/tag.service';
|
||||
@@ -53,7 +51,6 @@ export class WorkflowsController {
|
||||
private readonly externalHooks: ExternalHooks,
|
||||
private readonly tagRepository: TagRepository,
|
||||
private readonly enterpriseWorkflowService: EnterpriseWorkflowService,
|
||||
private readonly roleService: RoleService,
|
||||
private readonly workflowHistoryService: WorkflowHistoryService,
|
||||
private readonly tagService: TagService,
|
||||
private readonly namingService: NamingService,
|
||||
@@ -116,12 +113,10 @@ export class WorkflowsController {
|
||||
await Db.transaction(async (transactionManager) => {
|
||||
savedWorkflow = await transactionManager.save<WorkflowEntity>(newWorkflow);
|
||||
|
||||
const role = await this.roleService.findWorkflowOwnerRole();
|
||||
|
||||
const newSharedWorkflow = new SharedWorkflow();
|
||||
|
||||
Object.assign(newSharedWorkflow, {
|
||||
role,
|
||||
role: 'workflow:owner',
|
||||
user: req.user,
|
||||
workflow: savedWorkflow,
|
||||
});
|
||||
@@ -151,7 +146,9 @@ export class WorkflowsController {
|
||||
@Get('/', { middlewares: listQueryMiddleware })
|
||||
async getAll(req: ListQuery.Request, res: express.Response) {
|
||||
try {
|
||||
const roles: RoleNames[] = this.license.isSharingEnabled() ? [] : ['owner'];
|
||||
const roles: WorkflowSharingRole[] = this.license.isSharingEnabled()
|
||||
? []
|
||||
: ['workflow:owner'];
|
||||
const sharedWorkflowIds = await this.workflowSharingService.getSharedWorkflowIds(
|
||||
req.user,
|
||||
roles,
|
||||
@@ -223,7 +220,7 @@ export class WorkflowsController {
|
||||
const { id: workflowId } = req.params;
|
||||
|
||||
if (this.license.isSharingEnabled()) {
|
||||
const relations = ['shared', 'shared.user', 'shared.role'];
|
||||
const relations = ['shared', 'shared.user'];
|
||||
if (!config.getEnv('workflowTagsDisabled')) {
|
||||
relations.push('tags');
|
||||
}
|
||||
@@ -281,7 +278,8 @@ export class WorkflowsController {
|
||||
const { tags, ...rest } = req.body;
|
||||
Object.assign(updateData, rest);
|
||||
|
||||
if (this.license.isSharingEnabled()) {
|
||||
const isSharingEnabled = this.license.isSharingEnabled();
|
||||
if (isSharingEnabled) {
|
||||
updateData = await this.enterpriseWorkflowService.preventTampering(
|
||||
updateData,
|
||||
workflowId,
|
||||
@@ -294,8 +292,8 @@ export class WorkflowsController {
|
||||
updateData,
|
||||
workflowId,
|
||||
tags,
|
||||
this.license.isSharingEnabled() ? forceSave : true,
|
||||
this.license.isSharingEnabled() ? undefined : ['owner'],
|
||||
isSharingEnabled ? forceSave : true,
|
||||
isSharingEnabled ? undefined : ['workflow:owner'],
|
||||
);
|
||||
|
||||
return updatedWorkflow;
|
||||
@@ -378,10 +376,10 @@ export class WorkflowsController {
|
||||
await this.workflowRepository.getSharings(
|
||||
Db.getConnection().createEntityManager(),
|
||||
workflowId,
|
||||
['shared', 'shared.role'],
|
||||
['shared'],
|
||||
)
|
||||
)
|
||||
.filter((e) => e.role.name === 'owner')
|
||||
.filter((e) => e.role === 'workflow:owner')
|
||||
.map((e) => e.userId);
|
||||
|
||||
let newShareeIds: string[] = [];
|
||||
@@ -399,9 +397,7 @@ export class WorkflowsController {
|
||||
|
||||
if (newShareeIds.length) {
|
||||
const users = await this.userRepository.getByIds(trx, newShareeIds);
|
||||
const role = await this.roleService.findWorkflowEditorRole();
|
||||
|
||||
await this.sharedWorkflowRepository.share(trx, workflow!, users, role.id);
|
||||
await this.sharedWorkflowRepository.share(trx, workflow!, users);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user