n8n/packages/cli/src/services/hooks.service.ts
कारतोफ्फेलस्क्रिप्ट™ 39d5e0ff87
Some checks failed
Test Master / install-and-build (push) Waiting to run
Test Master / Unit tests (18.x) (push) Blocked by required conditions
Test Master / Unit tests (20.x) (push) Blocked by required conditions
Test Master / Unit tests (22.4) (push) Blocked by required conditions
Test Master / Lint (push) Blocked by required conditions
Test Master / Notify Slack on failure (push) Blocked by required conditions
Benchmark Docker Image CI / build (push) Has been cancelled
refactor(core): Replace typedi with our custom DI system (no-changelog) (#12389)
Co-authored-by: Iván Ovejero <ivov.src@gmail.com>
2025-01-06 10:21:24 +01:00

127 lines
4.4 KiB
TypeScript

import { Service } from '@n8n/di';
// eslint-disable-next-line n8n-local-rules/misplaced-n8n-typeorm-import
import type { FindManyOptions, FindOneOptions, FindOptionsWhere } from '@n8n/typeorm';
import type { QueryDeepPartialEntity } from '@n8n/typeorm/query-builder/QueryPartialEntity';
import RudderStack, { type constructorOptions } from '@rudderstack/rudder-sdk-node';
import type { NextFunction, Response } from 'express';
import { AuthService } from '@/auth/auth.service';
import type { AuthUser } from '@/databases/entities/auth-user';
import type { CredentialsEntity } from '@/databases/entities/credentials-entity';
import type { Settings } from '@/databases/entities/settings';
import type { User } from '@/databases/entities/user';
import type { WorkflowEntity } from '@/databases/entities/workflow-entity';
import { AuthUserRepository } from '@/databases/repositories/auth-user.repository';
import { CredentialsRepository } from '@/databases/repositories/credentials.repository';
import { SettingsRepository } from '@/databases/repositories/settings.repository';
import { UserRepository } from '@/databases/repositories/user.repository';
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
import type { Invitation } from '@/interfaces';
import type { AuthenticatedRequest } from '@/requests';
import { UserService } from '@/services/user.service';
/**
* Exposes functionality to be used by the cloud BE hooks.
* DO NOT DELETE or RENAME any of the methods without making sure this is not used in cloud BE hooks.
*/
@Service()
export class HooksService {
constructor(
private readonly userService: UserService,
private readonly authService: AuthService,
private readonly userRepository: UserRepository,
private readonly settingsRepository: SettingsRepository,
private readonly workflowRepository: WorkflowRepository,
private readonly credentialsRepository: CredentialsRepository,
private readonly authUserRepository: AuthUserRepository,
) {}
/**
* Invite users to instance during signup
*/
async inviteUsers(owner: User, attributes: Invitation[]) {
return await this.userService.inviteUsers(owner, attributes);
}
/**
* Set the n8n-auth cookie in the response to auto-login
* the user after instance is provisioned
*/
issueCookie(res: Response, user: AuthUser) {
return this.authService.issueCookie(res, user);
}
/**
* Find user in the instance
* 1. To know whether the instance owner is already setup
* 2. To know when to update the user's profile also in cloud
*/
async findOneUser(filter: FindOneOptions<AuthUser>) {
return await this.authUserRepository.findOne(filter);
}
/**
* Save instance owner with the cloud signup data
*/
async saveUser(user: User) {
return await this.userRepository.save(user);
}
/**
* Update instance's settings
* 1. To keep the state when users are invited to the instance
*/
async updateSettings(filter: FindOptionsWhere<Settings>, set: QueryDeepPartialEntity<Settings>) {
return await this.settingsRepository.update(filter, set);
}
/**
* Count the number of workflows
* 1. To enforce the active workflow limits in cloud
*/
async workflowsCount(filter: FindManyOptions<WorkflowEntity>) {
return await this.workflowRepository.count(filter);
}
/**
* Count the number of credentials
* 1. To enforce the max credential limits in cloud
*/
async credentialsCount(filter: FindManyOptions<CredentialsEntity>) {
return await this.credentialsRepository.count(filter);
}
/**
* Count the number of occurrences of a specific key
* 1. To know when to stop attempting to invite users
*/
async settingsCount(filter: FindManyOptions<Settings>) {
return await this.settingsRepository.count(filter);
}
/**
* Add auth middleware to routes injected via the hooks
* 1. To authenticate the /proxy routes in the hooks
*/
async authMiddleware(req: AuthenticatedRequest, res: Response, next: NextFunction) {
return await this.authService.authMiddleware(req, res, next);
}
getRudderStackClient(key: string, options: constructorOptions): RudderStack {
return new RudderStack(key, options);
}
/**
* Return repositories to be used in the hooks
* 1. Some self-hosted users rely in the repositories to interact with the DB directly
*/
dbCollections() {
return {
User: this.userRepository,
Settings: this.settingsRepository,
Credentials: this.credentialsRepository,
Workflow: this.workflowRepository,
};
}
}