From c4a9038579555a569344522a4c3ce02ae3db7bb6 Mon Sep 17 00:00:00 2001 From: Mir Arif Hasan Date: Tue, 28 Nov 2023 17:03:06 +0600 Subject: [PATCH] feat: add query infra-configs --- .../src/admin/infra.resolver.ts | 25 +++++++++++-- .../src/infra-config/helper.ts | 2 +- .../src/infra-config/infra-config.model.ts | 6 ++-- .../src/infra-config/infra-config.service.ts | 35 +++++++++++++++---- 4 files changed, 55 insertions(+), 13 deletions(-) diff --git a/packages/hoppscotch-backend/src/admin/infra.resolver.ts b/packages/hoppscotch-backend/src/admin/infra.resolver.ts index 0fd945bc8..098fb6251 100644 --- a/packages/hoppscotch-backend/src/admin/infra.resolver.ts +++ b/packages/hoppscotch-backend/src/admin/infra.resolver.ts @@ -27,7 +27,8 @@ 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'; import { AuthProvider } from 'src/auth/helper'; -import { Status } from 'src/infra-config/helper'; +import { AuthProviderStatus } from 'src/infra-config/helper'; +import { InfraConfigEnumForClient } from 'src/types/InfraConfig'; @UseGuards(GqlThrottlerGuard) @Resolver(() => Infra) @@ -238,6 +239,24 @@ export class InfraResolver { ); } + @Query(() => [InfraConfig], { + description: 'Fetch infra configs', + }) + @UseGuards(GqlAuthGuard, GqlAdminGuard) + async infraConfigs( + @Args({ + name: 'names', + type: () => [InfraConfigEnumForClient], + description: 'Names of the InfraConfigs', + }) + names: InfraConfigEnumForClient[], + ) { + console.log(names); + const infraConfigs = await this.infraConfigService.getMany(names); + if (E.isLeft(infraConfigs)) throwErr(infraConfigs.left); + return infraConfigs.right; + } + @Query(() => [String], { description: 'Allowed Auth Provider list', }) @@ -288,10 +307,10 @@ export class InfraResolver { provider: AuthProvider, @Args({ name: 'status', - type: () => Status, + type: () => AuthProviderStatus, description: 'Status to enable or disable', }) - status: Status, + status: AuthProviderStatus, ) { const isUpdated = await this.infraConfigService.enableAndDisableSSO( provider, diff --git a/packages/hoppscotch-backend/src/infra-config/helper.ts b/packages/hoppscotch-backend/src/infra-config/helper.ts index bbb34256b..2ca6cadfe 100644 --- a/packages/hoppscotch-backend/src/infra-config/helper.ts +++ b/packages/hoppscotch-backend/src/infra-config/helper.ts @@ -1,6 +1,6 @@ import { PrismaService } from 'src/prisma/prisma.service'; -export enum Status { +export enum AuthProviderStatus { ENABLE = 'ENABLE', DISABLE = 'DISABLE', } diff --git a/packages/hoppscotch-backend/src/infra-config/infra-config.model.ts b/packages/hoppscotch-backend/src/infra-config/infra-config.model.ts index 8e6295e26..fec9bb861 100644 --- a/packages/hoppscotch-backend/src/infra-config/infra-config.model.ts +++ b/packages/hoppscotch-backend/src/infra-config/infra-config.model.ts @@ -1,7 +1,7 @@ import { Field, ObjectType, registerEnumType } from '@nestjs/graphql'; import { AuthProvider } from 'src/auth/helper'; import { InfraConfigEnumForClient } from 'src/types/InfraConfig'; -import { Status } from './helper'; +import { AuthProviderStatus } from './helper'; @ObjectType() export class InfraConfig { @@ -24,6 +24,6 @@ registerEnumType(AuthProvider, { name: 'AuthProvider', }); -registerEnumType(Status, { - name: 'Status', +registerEnumType(AuthProviderStatus, { + name: 'AuthProviderStatus', }); diff --git a/packages/hoppscotch-backend/src/infra-config/infra-config.service.ts b/packages/hoppscotch-backend/src/infra-config/infra-config.service.ts index 913a122b4..737f00c71 100644 --- a/packages/hoppscotch-backend/src/infra-config/infra-config.service.ts +++ b/packages/hoppscotch-backend/src/infra-config/infra-config.service.ts @@ -3,7 +3,10 @@ import { InfraConfig } from './infra-config.model'; import { PrismaService } from 'src/prisma/prisma.service'; import { InfraConfig as DBInfraConfig } from '@prisma/client'; import * as E from 'fp-ts/Either'; -import { InfraConfigEnum } from 'src/types/InfraConfig'; +import { + InfraConfigEnum, + InfraConfigEnumForClient, +} from 'src/types/InfraConfig'; import { DATABASE_TABLE_NOT_EXIST, INFRA_CONFIG_NOT_FOUND, @@ -13,7 +16,7 @@ import { } from 'src/errors'; import { throwErr } from 'src/utils'; import { ConfigService } from '@nestjs/config'; -import { Status, stopApp } from './helper'; +import { AuthProviderStatus, stopApp } from './helper'; import { InfraConfigArgs } from './input-args'; import { AuthProvider } from 'src/auth/helper'; @@ -180,16 +183,19 @@ export class InfraConfigService implements OnModuleInit { * @param status Status to enable or disable * @returns Either true or an error */ - async enableAndDisableSSO(provider: AuthProvider, status: Status) { + async enableAndDisableSSO( + provider: AuthProvider, + status: AuthProviderStatus, + ) { const enabledAuthProviders = this.configService .get('INFRA.VITE_ALLOWED_AUTH_PROVIDERS') .split(','); const isProviderEnabled = enabledAuthProviders.includes(provider); let newEnabledAuthProviders = enabledAuthProviders; - if (status === Status.ENABLE && !isProviderEnabled) { + if (status === AuthProviderStatus.ENABLE && !isProviderEnabled) { newEnabledAuthProviders = [...enabledAuthProviders, provider]; - } else if (status === Status.DISABLE && isProviderEnabled) { + } else if (status === AuthProviderStatus.DISABLE && isProviderEnabled) { newEnabledAuthProviders = enabledAuthProviders.filter( (p) => p !== provider, ); @@ -209,7 +215,7 @@ export class InfraConfigService implements OnModuleInit { * @param name Name of the InfraConfig * @returns InfraConfig model */ - async get(name: InfraConfigEnum) { + async get(name: InfraConfigEnumForClient) { try { const infraConfig = await this.prisma.infraConfig.findUniqueOrThrow({ where: { name }, @@ -221,6 +227,23 @@ export class InfraConfigService implements OnModuleInit { } } + /** + * Get InfraConfigs by names + * @param names Names of the InfraConfigs + * @returns InfraConfig model + */ + async getMany(names: InfraConfigEnumForClient[]) { + try { + const infraConfigs = await this.prisma.infraConfig.findMany({ + where: { name: { in: names } }, + }); + + return E.right(infraConfigs.map((p) => this.cast(p))); + } catch (e) { + return E.left(INFRA_CONFIG_NOT_FOUND); + } + } + /** * Get allowed auth providers for login/signup * @returns string[]