-
Notifications
You must be signed in to change notification settings - Fork 7.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix(core): Split event bus controller into community and ee (#7107)
- Loading branch information
1 parent
6aa7b93
commit 011ee2e
Showing
7 changed files
with
566 additions
and
465 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,132 @@ | ||
/* eslint-disable @typescript-eslint/no-explicit-any */ | ||
import express from 'express'; | ||
import { eventBus } from './MessageEventBus/MessageEventBus'; | ||
import { | ||
isMessageEventBusDestinationSentryOptions, | ||
MessageEventBusDestinationSentry, | ||
} from './MessageEventBusDestination/MessageEventBusDestinationSentry.ee'; | ||
import { | ||
isMessageEventBusDestinationSyslogOptions, | ||
MessageEventBusDestinationSyslog, | ||
} from './MessageEventBusDestination/MessageEventBusDestinationSyslog.ee'; | ||
import { MessageEventBusDestinationWebhook } from './MessageEventBusDestination/MessageEventBusDestinationWebhook.ee'; | ||
import { BadRequestError } from '@/ResponseHelper'; | ||
import type { | ||
MessageEventBusDestinationWebhookOptions, | ||
MessageEventBusDestinationOptions, | ||
} from 'n8n-workflow'; | ||
import { MessageEventBusDestinationTypeNames } from 'n8n-workflow'; | ||
import { RestController, Get, Post, Delete, Authorized } from '@/decorators'; | ||
import type { MessageEventBusDestination } from './MessageEventBusDestination/MessageEventBusDestination.ee'; | ||
import type { DeleteResult } from 'typeorm'; | ||
import { AuthenticatedRequest } from '@/requests'; | ||
import { logStreamingLicensedMiddleware } from './middleware/logStreamingEnabled.middleware.ee'; | ||
|
||
// ---------------------------------------- | ||
// TypeGuards | ||
// ---------------------------------------- | ||
|
||
const isWithIdString = (candidate: unknown): candidate is { id: string } => { | ||
const o = candidate as { id: string }; | ||
if (!o) return false; | ||
return o.id !== undefined; | ||
}; | ||
|
||
const isMessageEventBusDestinationWebhookOptions = ( | ||
candidate: unknown, | ||
): candidate is MessageEventBusDestinationWebhookOptions => { | ||
const o = candidate as MessageEventBusDestinationWebhookOptions; | ||
if (!o) return false; | ||
return o.url !== undefined; | ||
}; | ||
|
||
const isMessageEventBusDestinationOptions = ( | ||
candidate: unknown, | ||
): candidate is MessageEventBusDestinationOptions => { | ||
const o = candidate as MessageEventBusDestinationOptions; | ||
if (!o) return false; | ||
return o.__type !== undefined; | ||
}; | ||
|
||
// ---------------------------------------- | ||
// Controller | ||
// ---------------------------------------- | ||
|
||
@Authorized() | ||
@RestController('/eventbus') | ||
export class EventBusControllerEE { | ||
// ---------------------------------------- | ||
// Destinations | ||
// ---------------------------------------- | ||
|
||
@Get('/destination', { middlewares: [logStreamingLicensedMiddleware] }) | ||
async getDestination(req: express.Request): Promise<MessageEventBusDestinationOptions[]> { | ||
if (isWithIdString(req.query)) { | ||
return eventBus.findDestination(req.query.id); | ||
} else { | ||
return eventBus.findDestination(); | ||
} | ||
} | ||
|
||
@Authorized(['global', 'owner']) | ||
@Post('/destination', { middlewares: [logStreamingLicensedMiddleware] }) | ||
async postDestination(req: AuthenticatedRequest): Promise<any> { | ||
let result: MessageEventBusDestination | undefined; | ||
if (isMessageEventBusDestinationOptions(req.body)) { | ||
switch (req.body.__type) { | ||
case MessageEventBusDestinationTypeNames.sentry: | ||
if (isMessageEventBusDestinationSentryOptions(req.body)) { | ||
result = await eventBus.addDestination( | ||
new MessageEventBusDestinationSentry(eventBus, req.body), | ||
); | ||
} | ||
break; | ||
case MessageEventBusDestinationTypeNames.webhook: | ||
if (isMessageEventBusDestinationWebhookOptions(req.body)) { | ||
result = await eventBus.addDestination( | ||
new MessageEventBusDestinationWebhook(eventBus, req.body), | ||
); | ||
} | ||
break; | ||
case MessageEventBusDestinationTypeNames.syslog: | ||
if (isMessageEventBusDestinationSyslogOptions(req.body)) { | ||
result = await eventBus.addDestination( | ||
new MessageEventBusDestinationSyslog(eventBus, req.body), | ||
); | ||
} | ||
break; | ||
default: | ||
throw new BadRequestError( | ||
`Body is missing ${req.body.__type} options or type ${req.body.__type} is unknown`, | ||
); | ||
} | ||
if (result) { | ||
await result.saveToDb(); | ||
return { | ||
...result.serialize(), | ||
eventBusInstance: undefined, | ||
}; | ||
} | ||
throw new BadRequestError('There was an error adding the destination'); | ||
} | ||
throw new BadRequestError('Body is not configuring MessageEventBusDestinationOptions'); | ||
} | ||
|
||
@Get('/testmessage', { middlewares: [logStreamingLicensedMiddleware] }) | ||
async sendTestMessage(req: express.Request): Promise<boolean> { | ||
if (isWithIdString(req.query)) { | ||
return eventBus.testDestination(req.query.id); | ||
} | ||
return false; | ||
} | ||
|
||
@Authorized(['global', 'owner']) | ||
@Delete('/destination', { middlewares: [logStreamingLicensedMiddleware] }) | ||
async deleteDestination(req: AuthenticatedRequest): Promise<DeleteResult | undefined> { | ||
if (isWithIdString(req.query)) { | ||
return eventBus.removeDestination(req.query.id); | ||
} else { | ||
throw new BadRequestError('Query is missing id'); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
15 changes: 15 additions & 0 deletions
15
packages/cli/src/eventbus/middleware/logStreamingEnabled.middleware.ee.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
import type { RequestHandler } from 'express'; | ||
import Container from 'typedi'; | ||
import { License } from '../../License'; | ||
|
||
export function islogStreamingLicensed(): boolean { | ||
return Container.get(License).isLogStreamingEnabled(); | ||
} | ||
|
||
export const logStreamingLicensedMiddleware: RequestHandler = (req, res, next) => { | ||
if (islogStreamingLicensed()) { | ||
next(); | ||
} else { | ||
res.status(403).json({ status: 'error', message: 'Unauthorized' }); | ||
} | ||
}; |
Oops, something went wrong.