4002 prevent user from creating twice the same blocklist item (#5213)
Closes #4002
This commit is contained in:
@ -1,46 +1,28 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
|
||||
import z from 'zod';
|
||||
|
||||
import { WorkspacePreQueryHook } from 'src/engine/api/graphql/workspace-query-runner/workspace-pre-query-hook/interfaces/workspace-pre-query-hook.interface';
|
||||
import { CreateManyResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface';
|
||||
|
||||
import { isDomain } from 'src/engine/utils/is-domain';
|
||||
import { BlocklistObjectMetadata } from 'src/modules/connected-account/standard-objects/blocklist.object-metadata';
|
||||
import {
|
||||
BlocklistItem,
|
||||
BlocklistValidationService,
|
||||
} from 'src/modules/connected-account/services/blocklist/blocklist-validation.service';
|
||||
|
||||
@Injectable()
|
||||
export class BlocklistCreateManyPreQueryHook implements WorkspacePreQueryHook {
|
||||
constructor() {}
|
||||
constructor(
|
||||
private readonly blocklistValidationService: BlocklistValidationService,
|
||||
) {}
|
||||
|
||||
async execute(
|
||||
userId: string,
|
||||
workspaceId: string,
|
||||
payload: CreateManyResolverArgs<
|
||||
Omit<BlocklistObjectMetadata, 'createdAt' | 'updatedAt'> & {
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
}
|
||||
>,
|
||||
payload: CreateManyResolverArgs<BlocklistItem>,
|
||||
): Promise<void> {
|
||||
const emailOrDomainSchema = z
|
||||
.string()
|
||||
.trim()
|
||||
.email('Invalid email or domain')
|
||||
.or(
|
||||
z
|
||||
.string()
|
||||
.refine(
|
||||
(value) => value.startsWith('@') && isDomain(value.slice(1)),
|
||||
'Invalid email or domain',
|
||||
),
|
||||
);
|
||||
|
||||
for (const { handle } of payload.data) {
|
||||
if (!handle) {
|
||||
throw new Error('Handle is required');
|
||||
}
|
||||
|
||||
emailOrDomainSchema.parse(handle);
|
||||
}
|
||||
await this.blocklistValidationService.validateBlocklistForCreateMany(
|
||||
payload,
|
||||
userId,
|
||||
workspaceId,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,12 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
|
||||
import { WorkspacePreQueryHook } from 'src/engine/api/graphql/workspace-query-runner/workspace-pre-query-hook/interfaces/workspace-pre-query-hook.interface';
|
||||
|
||||
@Injectable()
|
||||
export class BlocklistUpdateManyPreQueryHook implements WorkspacePreQueryHook {
|
||||
constructor() {}
|
||||
|
||||
async execute(): Promise<void> {
|
||||
throw new Error('Method not implemented.');
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,28 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
|
||||
import { WorkspacePreQueryHook } from 'src/engine/api/graphql/workspace-query-runner/workspace-pre-query-hook/interfaces/workspace-pre-query-hook.interface';
|
||||
import { UpdateOneResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface';
|
||||
|
||||
import {
|
||||
BlocklistItem,
|
||||
BlocklistValidationService,
|
||||
} from 'src/modules/connected-account/services/blocklist/blocklist-validation.service';
|
||||
|
||||
@Injectable()
|
||||
export class BlocklistUpdateOnePreQueryHook implements WorkspacePreQueryHook {
|
||||
constructor(
|
||||
private readonly blocklistValidationService: BlocklistValidationService,
|
||||
) {}
|
||||
|
||||
async execute(
|
||||
userId: string,
|
||||
workspaceId: string,
|
||||
payload: UpdateOneResolverArgs<BlocklistItem>,
|
||||
): Promise<void> {
|
||||
await this.blocklistValidationService.validateBlocklistForUpdateOne(
|
||||
payload,
|
||||
userId,
|
||||
workspaceId,
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -1,14 +1,25 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
|
||||
import { BlocklistCreateManyPreQueryHook } from 'src/modules/connected-account/query-hooks/blocklist/blocklist-create-many.pre-query.hook';
|
||||
import { BlocklistUpdateManyPreQueryHook } from 'src/modules/connected-account/query-hooks/blocklist/blocklist-update-many.pre-query.hook';
|
||||
import { BlocklistUpdateOnePreQueryHook } from 'src/modules/connected-account/query-hooks/blocklist/blocklist-update-one.pre-query.hook';
|
||||
import { BlocklistValidationModule } from 'src/modules/connected-account/services/blocklist/blocklist-validation.module';
|
||||
|
||||
@Module({
|
||||
imports: [],
|
||||
imports: [BlocklistValidationModule],
|
||||
providers: [
|
||||
{
|
||||
provide: BlocklistCreateManyPreQueryHook.name,
|
||||
useClass: BlocklistCreateManyPreQueryHook,
|
||||
},
|
||||
{
|
||||
provide: BlocklistUpdateManyPreQueryHook.name,
|
||||
useClass: BlocklistUpdateManyPreQueryHook,
|
||||
},
|
||||
{
|
||||
provide: BlocklistUpdateOnePreQueryHook.name,
|
||||
useClass: BlocklistUpdateOnePreQueryHook,
|
||||
},
|
||||
],
|
||||
})
|
||||
export class ConnectedAccountQueryHookModule {}
|
||||
|
||||
Reference in New Issue
Block a user