feat: update infra configs mutation added

This commit is contained in:
Mir Arif Hasan
2023-11-24 20:37:35 +06:00
parent 4e188f3c11
commit 0a10f7c654
7 changed files with 109 additions and 8 deletions

View File

@@ -12,6 +12,7 @@ import { TeamCollectionModule } from '../team-collection/team-collection.module'
import { TeamRequestModule } from '../team-request/team-request.module';
import { InfraResolver } from './infra.resolver';
import { ShortcodeModule } from 'src/shortcode/shortcode.module';
import { InfraConfigModule } from 'src/infra-config/infra-config.module';
@Module({
imports: [
@@ -25,6 +26,7 @@ import { ShortcodeModule } from 'src/shortcode/shortcode.module';
TeamCollectionModule,
TeamRequestModule,
ShortcodeModule,
InfraConfigModule,
],
providers: [InfraResolver, AdminResolver, AdminService],
exports: [AdminService],

View File

@@ -1,5 +1,12 @@
import { UseGuards } from '@nestjs/common';
import { Args, ID, Query, ResolveField, Resolver } from '@nestjs/graphql';
import {
Args,
ID,
Mutation,
Query,
ResolveField,
Resolver,
} from '@nestjs/graphql';
import { GqlThrottlerGuard } from 'src/guards/gql-throttler.guard';
import { Infra } from './infra.model';
import { AdminService } from './admin.service';
@@ -16,11 +23,17 @@ import { Team } from 'src/team/team.model';
import { TeamInvitation } from 'src/team-invitation/team-invitation.model';
import { GqlAdmin } from './decorators/gql-admin.decorator';
import { ShortcodeWithUserEmail } from 'src/shortcode/shortcode.model';
import { InfraConfig } from 'src/infra-config/infra-config.model';
import { InfraConfigService } from 'src/infra-config/infra-config.service';
import { InfraConfigArgs } from 'src/infra-config/input-args';
@UseGuards(GqlThrottlerGuard)
@Resolver(() => Infra)
export class InfraResolver {
constructor(private adminService: AdminService) {}
constructor(
private adminService: AdminService,
private infraConfigService: InfraConfigService,
) {}
@Query(() => Infra, {
description: 'Fetch details of the Infrastructure',
@@ -222,4 +235,23 @@ export class InfraResolver {
userEmail,
);
}
/* Mutations */
@Mutation(() => [InfraConfig], {
description: 'Update Infra Configs',
})
@UseGuards(GqlAuthGuard, GqlAdminGuard)
async updateInfraConfigs(
@Args({
name: 'infraConfigs',
type: () => [InfraConfigArgs],
description: 'InfraConfigs to update',
})
infraConfigs: InfraConfigArgs[],
) {
const updatedRes = await this.infraConfigService.updateMany(infraConfigs);
if (E.isLeft(updatedRes)) throwErr(updatedRes.left);
return updatedRes.right;
}
}

View File

@@ -651,6 +651,12 @@ export const SHORTCODE_PROPERTIES_NOT_FOUND =
*/
export const INFRA_CONFIG_NOT_FOUND = 'infra_config/not_found' as const;
/**
* Infra Config update failed
* (InfraConfigService)
*/
export const INFRA_CONFIG_UPDATE_FAILED = 'infra_config/update_failed' as const;
/**
* Infra Config not listed for onModuleInit creation
* (InfraConfigService)

View File

@@ -1,14 +1,25 @@
import { Field, ObjectType } from '@nestjs/graphql';
import {
ArgsType,
Field,
InputType,
ObjectType,
registerEnumType,
} from '@nestjs/graphql';
import { InfraConfigEnum } from 'src/types/InfraConfig';
@ObjectType()
export class InfraConfig {
@Field({
description: 'Infra Config Name',
})
name: string;
name: InfraConfigEnum;
@Field({
description: 'Infra Config Value',
})
value: string;
}
registerEnumType(InfraConfigEnum, {
name: 'InfraConfigEnum',
});

View File

@@ -2,7 +2,7 @@ import { mockDeep, mockReset } from 'jest-mock-extended';
import { PrismaService } from 'src/prisma/prisma.service';
import { InfraConfigService } from './infra-config.service';
import { InfraConfigEnum } from 'src/types/InfraConfig';
import { INFRA_CONFIG_NOT_FOUND } from 'src/errors';
import { INFRA_CONFIG_NOT_FOUND, INFRA_CONFIG_UPDATE_FAILED } from 'src/errors';
import { ConfigService } from '@nestjs/config';
import * as helper from './helper';
@@ -55,14 +55,14 @@ describe('InfraConfigService', () => {
expect(mockPrisma.infraConfig.update).toHaveBeenCalledTimes(1);
});
it('should throw an error if the infra config does not exist', async () => {
it('should throw an error if the infra config update failed', async () => {
const name = InfraConfigEnum.GOOGLE_CLIENT_ID;
const value = 'true';
mockPrisma.infraConfig.update.mockRejectedValueOnce('null');
const result = await infraConfigService.update(name, value);
expect(result).toEqualLeft(INFRA_CONFIG_NOT_FOUND);
expect(result).toEqualLeft(INFRA_CONFIG_UPDATE_FAILED);
});
});

View File

@@ -8,10 +8,12 @@ import {
DATABASE_TABLE_NOT_EXIST,
INFRA_CONFIG_NOT_FOUND,
INFRA_CONFIG_NOT_LISTED,
INFRA_CONFIG_UPDATE_FAILED,
} from 'src/errors';
import { throwErr } from 'src/utils';
import { ConfigService } from '@nestjs/config';
import { stopApp } from './helper';
import { InfraConfigArgs } from './input-args';
@Injectable()
export class InfraConfigService implements OnModuleInit {
@@ -153,7 +155,40 @@ export class InfraConfigService implements OnModuleInit {
return E.right(this.cast(infraConfig));
} catch (e) {
return E.left(INFRA_CONFIG_NOT_FOUND);
return E.left(INFRA_CONFIG_UPDATE_FAILED);
}
}
/**
* Update InfraConfigs by name
* @param infraConfigs InfraConfigs to update
* @returns InfraConfig model
*/
async updateMany(infraConfigs: InfraConfigArgs[]) {
try {
await this.prisma.$transaction(async (tx) => {
const deleteCount = await tx.infraConfig.deleteMany({
where: { name: { in: infraConfigs.map((p) => p.name) } },
});
const createCount = await tx.infraConfig.createMany({
data: infraConfigs.map((p) => ({
name: p.name,
value: p.value,
})),
});
if (deleteCount.count !== createCount.count) {
throwErr(INFRA_CONFIG_UPDATE_FAILED);
}
});
stopApp();
return E.right(infraConfigs);
} catch (e) {
console.log(e);
return E.left(INFRA_CONFIG_UPDATE_FAILED);
}
}

View File

@@ -0,0 +1,15 @@
import { Field, InputType } from '@nestjs/graphql';
import { InfraConfigEnum } from 'src/types/InfraConfig';
@InputType()
export class InfraConfigArgs {
@Field(() => InfraConfigEnum, {
description: 'Infra Config Name',
})
name: InfraConfigEnum;
@Field({
description: 'Infra Config Value',
})
value: string;
}