mirror of
https://github.com/n8n-io/n8n.git
synced 2025-02-02 07:01:30 -08:00
* ⚡ Implemented new grid row - banners * ✨ Fixing node creator and executions sidebar position after layout update * 💄 Added configurable round corners to the Callout component * ⚡ Fixing mouse position detection and main tab bar position * ⚡ Implemented basic banner component structure * ⚡ Implemented banner state and dismiss logic * ⚡ Fixing grid layout. Updating banners height state dynamically * ⚡ Fix zoom to fit position, mouse position in demo mode and callout vertical alignment * ⚡ Implementing proper trial banners logic * 💄 Only showing execution usage data once the sidebar is fully expanded * ✨ Implemented permanent/temporary dismiss logic for v1 flag * ⚡ Minor refactoring of banner logic * ⚡ Updating permanent dismiss logic to work with all banners * 👕 Fixing linting errors * ✔️ Updating Callout component test snapshots * 💄 Tweaking zoom to fit position * ✔️ Updating testing endpoints to use new store data * ✅ Added banners unit tests * ✔️ Fixing failing banner tests * ✅ Added more banner tests * ⚡ Updating banners dimensions on resize, removing leftover code * ✔️ Removing store import from API file * 👕 Fixing lint errors * ⚡ Updating migration files * ⚡ Using query parameters in migrations * 👌 Addressing design review feedback * ⚡ Updating upgrade plan button click * ⚡ Updating the migrations syntax * 👌 Updating permanent banner dismiss endpoint and back-end logic * 👌 Refactoring trial banner component and ui store * 👌 Addressing more points from code review * 👌 Moving DOM logic from the store * ✔️ Updated callout component snapshots * 👌 Updating mysql migration file * ✔️ Updating e2e test canvas coordinates after setting it's position to absolute * 👌 Addressing back-end review feedback * 👌 Improving typing around banners * 👕 Fixing lint errors
429 lines
11 KiB
TypeScript
429 lines
11 KiB
TypeScript
import type express from 'express';
|
|
import type {
|
|
Banners,
|
|
IConnections,
|
|
ICredentialDataDecryptedObject,
|
|
ICredentialNodeAccess,
|
|
INode,
|
|
INodeCredentialTestRequest,
|
|
IPinData,
|
|
IRunData,
|
|
IWorkflowSettings,
|
|
} from 'n8n-workflow';
|
|
|
|
import { IsBoolean, IsEmail, IsOptional, IsString, Length } from 'class-validator';
|
|
import { NoXss } from '@db/utils/customValidators';
|
|
import type { PublicUser, IExecutionDeleteFilter, IWorkflowDb } from '@/Interfaces';
|
|
import type { Role } from '@db/entities/Role';
|
|
import type { User } from '@db/entities/User';
|
|
import type { UserManagementMailer } from '@/UserManagement/email';
|
|
import type { Variables } from '@db/entities/Variables';
|
|
|
|
export class UserUpdatePayload implements Pick<User, 'email' | 'firstName' | 'lastName'> {
|
|
@IsEmail()
|
|
email: string;
|
|
|
|
@NoXss()
|
|
@IsString({ message: 'First name must be of type string.' })
|
|
@Length(1, 32, { message: 'First name must be $constraint1 to $constraint2 characters long.' })
|
|
firstName: string;
|
|
|
|
@NoXss()
|
|
@IsString({ message: 'Last name must be of type string.' })
|
|
@Length(1, 32, { message: 'Last name must be $constraint1 to $constraint2 characters long.' })
|
|
lastName: string;
|
|
}
|
|
export class UserSettingsUpdatePayload {
|
|
@IsBoolean({ message: 'userActivated should be a boolean' })
|
|
@IsOptional()
|
|
userActivated: boolean;
|
|
|
|
@IsBoolean({ message: 'allowSSOManualLogin should be a boolean' })
|
|
@IsOptional()
|
|
allowSSOManualLogin?: boolean;
|
|
}
|
|
|
|
export type AuthlessRequest<
|
|
RouteParams = {},
|
|
ResponseBody = {},
|
|
RequestBody = {},
|
|
RequestQuery = {},
|
|
> = express.Request<RouteParams, ResponseBody, RequestBody, RequestQuery>;
|
|
|
|
export type AuthenticatedRequest<
|
|
RouteParams = {},
|
|
ResponseBody = {},
|
|
RequestBody = {},
|
|
RequestQuery = {},
|
|
> = Omit<express.Request<RouteParams, ResponseBody, RequestBody, RequestQuery>, 'user'> & {
|
|
user: User;
|
|
mailer?: UserManagementMailer;
|
|
globalMemberRole?: Role;
|
|
};
|
|
|
|
// ----------------------------------
|
|
// /workflows
|
|
// ----------------------------------
|
|
|
|
export declare namespace WorkflowRequest {
|
|
type CreateUpdatePayload = Partial<{
|
|
id: string; // delete if sent
|
|
name: string;
|
|
nodes: INode[];
|
|
connections: IConnections;
|
|
settings: IWorkflowSettings;
|
|
active: boolean;
|
|
tags: string[];
|
|
hash: string;
|
|
}>;
|
|
|
|
type ManualRunPayload = {
|
|
workflowData: IWorkflowDb;
|
|
runData: IRunData;
|
|
pinData: IPinData;
|
|
startNodes?: string[];
|
|
destinationNode?: string;
|
|
};
|
|
|
|
type Create = AuthenticatedRequest<{}, {}, CreateUpdatePayload>;
|
|
|
|
type Get = AuthenticatedRequest<{ id: string }>;
|
|
|
|
type Delete = Get;
|
|
|
|
type Update = AuthenticatedRequest<
|
|
{ id: string },
|
|
{},
|
|
CreateUpdatePayload,
|
|
{ forceSave?: string }
|
|
>;
|
|
|
|
type NewName = AuthenticatedRequest<{}, {}, {}, { name?: string }>;
|
|
|
|
type GetAll = AuthenticatedRequest<{}, {}, {}, { filter: string }>;
|
|
|
|
type GetAllActive = AuthenticatedRequest;
|
|
|
|
type GetAllActivationErrors = Get;
|
|
|
|
type ManualRun = AuthenticatedRequest<{}, {}, ManualRunPayload>;
|
|
|
|
type Share = AuthenticatedRequest<{ workflowId: string }, {}, { shareWithIds: string[] }>;
|
|
}
|
|
|
|
// ----------------------------------
|
|
// /credentials
|
|
// ----------------------------------
|
|
|
|
export declare namespace CredentialRequest {
|
|
type CredentialProperties = Partial<{
|
|
id: string; // delete if sent
|
|
name: string;
|
|
type: string;
|
|
nodesAccess: ICredentialNodeAccess[];
|
|
data: ICredentialDataDecryptedObject;
|
|
}>;
|
|
|
|
type Create = AuthenticatedRequest<{}, {}, CredentialProperties>;
|
|
|
|
type Get = AuthenticatedRequest<{ id: string }, {}, {}, Record<string, string>>;
|
|
|
|
type Delete = Get;
|
|
|
|
type GetAll = AuthenticatedRequest<{}, {}, {}, { filter: string }>;
|
|
|
|
type Update = AuthenticatedRequest<{ id: string }, {}, CredentialProperties>;
|
|
|
|
type NewName = WorkflowRequest.NewName;
|
|
|
|
type Test = AuthenticatedRequest<{}, {}, INodeCredentialTestRequest>;
|
|
|
|
type Share = AuthenticatedRequest<{ credentialId: string }, {}, { shareWithIds: string[] }>;
|
|
}
|
|
|
|
// ----------------------------------
|
|
// /executions
|
|
// ----------------------------------
|
|
|
|
export declare namespace ExecutionRequest {
|
|
namespace QueryParam {
|
|
type GetAll = {
|
|
filter: string; // '{ waitTill: string; finished: boolean, [other: string]: string }'
|
|
limit: string;
|
|
lastId: string;
|
|
firstId: string;
|
|
};
|
|
|
|
type GetAllCurrent = {
|
|
filter: string; // '{ workflowId: string }'
|
|
};
|
|
}
|
|
|
|
type GetAll = AuthenticatedRequest<{}, {}, {}, QueryParam.GetAll>;
|
|
type Get = AuthenticatedRequest<{ id: string }, {}, {}, { unflattedResponse: 'true' | 'false' }>;
|
|
type Delete = AuthenticatedRequest<{}, {}, IExecutionDeleteFilter>;
|
|
type Retry = AuthenticatedRequest<{ id: string }, {}, { loadWorkflow: boolean }, {}>;
|
|
type Stop = AuthenticatedRequest<{ id: string }>;
|
|
type GetAllCurrent = AuthenticatedRequest<{}, {}, {}, QueryParam.GetAllCurrent>;
|
|
}
|
|
|
|
// ----------------------------------
|
|
// /me
|
|
// ----------------------------------
|
|
|
|
export declare namespace MeRequest {
|
|
export type UserSettingsUpdate = AuthenticatedRequest<{}, {}, UserSettingsUpdatePayload>;
|
|
export type UserUpdate = AuthenticatedRequest<{}, {}, UserUpdatePayload>;
|
|
export type Password = AuthenticatedRequest<
|
|
{},
|
|
{},
|
|
{ currentPassword: string; newPassword: string }
|
|
>;
|
|
export type SurveyAnswers = AuthenticatedRequest<{}, {}, Record<string, string> | {}>;
|
|
}
|
|
|
|
export interface UserSetupPayload {
|
|
email: string;
|
|
password: string;
|
|
firstName: string;
|
|
lastName: string;
|
|
}
|
|
|
|
// ----------------------------------
|
|
// /owner
|
|
// ----------------------------------
|
|
|
|
export declare namespace OwnerRequest {
|
|
type Post = AuthenticatedRequest<{}, {}, UserSetupPayload, {}>;
|
|
|
|
type DismissBanner = AuthenticatedRequest<{}, {}, Partial<{ bannerName: Banners }>, {}>;
|
|
}
|
|
|
|
// ----------------------------------
|
|
// password reset endpoints
|
|
// ----------------------------------
|
|
|
|
export declare namespace PasswordResetRequest {
|
|
export type Email = AuthlessRequest<{}, {}, Pick<PublicUser, 'email'>>;
|
|
|
|
export type Credentials = AuthlessRequest<{}, {}, {}, { userId?: string; token?: string }>;
|
|
|
|
export type NewPassword = AuthlessRequest<
|
|
{},
|
|
{},
|
|
Pick<PublicUser, 'password'> & { token?: string; userId?: string }
|
|
>;
|
|
}
|
|
|
|
// ----------------------------------
|
|
// /users
|
|
// ----------------------------------
|
|
|
|
export declare namespace UserRequest {
|
|
export type List = AuthenticatedRequest;
|
|
|
|
export type Invite = AuthenticatedRequest<{}, {}, Array<{ email: string }>>;
|
|
|
|
export type ResolveSignUp = AuthlessRequest<
|
|
{},
|
|
{},
|
|
{},
|
|
{ inviterId?: string; inviteeId?: string }
|
|
>;
|
|
|
|
export type SignUp = AuthenticatedRequest<
|
|
{ id: string },
|
|
{ inviterId?: string; inviteeId?: string }
|
|
>;
|
|
|
|
export type Delete = AuthenticatedRequest<
|
|
{ id: string; email: string; identifier: string },
|
|
{},
|
|
{},
|
|
{ transferId?: string; includeRole: boolean }
|
|
>;
|
|
|
|
export type Get = AuthenticatedRequest<
|
|
{ id: string; email: string; identifier: string },
|
|
{},
|
|
{},
|
|
{ limit?: number; offset?: number; cursor?: string; includeRole?: boolean }
|
|
>;
|
|
|
|
export type PasswordResetLink = AuthenticatedRequest<{ id: string }, {}, {}, {}>;
|
|
|
|
export type UserSettingsUpdate = AuthenticatedRequest<
|
|
{ id: string },
|
|
{},
|
|
UserSettingsUpdatePayload
|
|
>;
|
|
|
|
export type Reinvite = AuthenticatedRequest<{ id: string }>;
|
|
|
|
export type Update = AuthlessRequest<
|
|
{ id: string },
|
|
{},
|
|
{
|
|
inviterId: string;
|
|
firstName: string;
|
|
lastName: string;
|
|
password: string;
|
|
}
|
|
>;
|
|
}
|
|
|
|
// ----------------------------------
|
|
// /login
|
|
// ----------------------------------
|
|
|
|
export type LoginRequest = AuthlessRequest<
|
|
{},
|
|
{},
|
|
{
|
|
email: string;
|
|
password: string;
|
|
}
|
|
>;
|
|
|
|
// ----------------------------------
|
|
// oauth endpoints
|
|
// ----------------------------------
|
|
|
|
export declare namespace OAuthRequest {
|
|
namespace OAuth1Credential {
|
|
type Auth = AuthenticatedRequest<{}, {}, {}, { id: string }>;
|
|
type Callback = AuthenticatedRequest<
|
|
{},
|
|
{},
|
|
{},
|
|
{ oauth_verifier: string; oauth_token: string; cid: string }
|
|
> & {
|
|
user?: User;
|
|
};
|
|
}
|
|
|
|
namespace OAuth2Credential {
|
|
type Auth = OAuth1Credential.Auth;
|
|
type Callback = AuthenticatedRequest<{}, {}, {}, { code: string; state: string }>;
|
|
}
|
|
}
|
|
|
|
// ----------------------------------
|
|
// /node-parameter-options
|
|
// ----------------------------------
|
|
|
|
export type NodeParameterOptionsRequest = AuthenticatedRequest<
|
|
{},
|
|
{},
|
|
{},
|
|
{
|
|
nodeTypeAndVersion: string;
|
|
methodName: string;
|
|
path: string;
|
|
currentNodeParameters: string;
|
|
credentials: string;
|
|
}
|
|
>;
|
|
|
|
// ----------------------------------
|
|
// /node-list-search
|
|
// ----------------------------------
|
|
|
|
export type NodeListSearchRequest = AuthenticatedRequest<
|
|
{},
|
|
{},
|
|
{},
|
|
{
|
|
nodeTypeAndVersion: string;
|
|
methodName: string;
|
|
path: string;
|
|
currentNodeParameters: string;
|
|
credentials: string;
|
|
filter?: string;
|
|
paginationToken?: string;
|
|
}
|
|
>;
|
|
|
|
// ----------------------------------
|
|
// /get-mapping-fields
|
|
// ----------------------------------
|
|
|
|
export type ResourceMapperRequest = AuthenticatedRequest<
|
|
{},
|
|
{},
|
|
{},
|
|
{
|
|
nodeTypeAndVersion: string;
|
|
methodName: string;
|
|
path: string;
|
|
currentNodeParameters: string;
|
|
credentials: string;
|
|
}
|
|
>;
|
|
|
|
// ----------------------------------
|
|
// /tags
|
|
// ----------------------------------
|
|
|
|
export declare namespace TagsRequest {
|
|
type GetAll = AuthenticatedRequest<{}, {}, {}, { withUsageCount: string }>;
|
|
type Create = AuthenticatedRequest<{}, {}, { name: string }>;
|
|
type Update = AuthenticatedRequest<{ id: string }, {}, { name: string }>;
|
|
type Delete = AuthenticatedRequest<{ id: string }>;
|
|
}
|
|
|
|
// ----------------------------------
|
|
// /nodes
|
|
// ----------------------------------
|
|
|
|
export declare namespace NodeRequest {
|
|
type GetAll = AuthenticatedRequest;
|
|
|
|
type Post = AuthenticatedRequest<{}, {}, { name?: string }>;
|
|
|
|
type Delete = AuthenticatedRequest<{}, {}, {}, { name: string }>;
|
|
|
|
type Update = Post;
|
|
}
|
|
|
|
// ----------------------------------
|
|
// /curl-to-json
|
|
// ----------------------------------
|
|
|
|
export declare namespace CurlHelper {
|
|
type ToJson = AuthenticatedRequest<{}, {}, { curlCommand?: string }>;
|
|
}
|
|
|
|
// ----------------------------------
|
|
// /license
|
|
// ----------------------------------
|
|
|
|
export declare namespace LicenseRequest {
|
|
type Activate = AuthenticatedRequest<{}, {}, { activationKey: string }, {}>;
|
|
}
|
|
|
|
export type BinaryDataRequest = AuthenticatedRequest<
|
|
{ path: string },
|
|
{},
|
|
{},
|
|
{
|
|
mode: 'view' | 'download';
|
|
fileName?: string;
|
|
mimeType?: string;
|
|
}
|
|
>;
|
|
|
|
// ----------------------------------
|
|
// /variables
|
|
// ----------------------------------
|
|
//
|
|
export declare namespace VariablesRequest {
|
|
type CreateUpdatePayload = Omit<Variables, 'id'> & { id?: unknown };
|
|
|
|
type GetAll = AuthenticatedRequest;
|
|
type Get = AuthenticatedRequest<{ id: string }, {}, {}, {}>;
|
|
type Create = AuthenticatedRequest<{}, {}, CreateUpdatePayload, {}>;
|
|
type Update = AuthenticatedRequest<{ id: string }, {}, CreateUpdatePayload, {}>;
|
|
type Delete = Get;
|
|
}
|