diff --git a/packages/hoppscotch-backend/src/errors.ts b/packages/hoppscotch-backend/src/errors.ts index 0caed05e3..e8da11b9c 100644 --- a/packages/hoppscotch-backend/src/errors.ts +++ b/packages/hoppscotch-backend/src/errors.ts @@ -220,4 +220,10 @@ export const BUG_TEAM_ENV_GUARD_NO_ENV_ID = * User settings update failed * (UserSettingsService) */ -export const USER_SETTINGS_UPDATE_FAILED = 'user_settings/update_failed' as const; \ No newline at end of file +export const USER_SETTINGS_UPDATE_FAILED = 'user_settings/update_failed' as const; + +/** + * User settings not found + * (UserSettingsService) + */ +export const USER_SETTINGS_NOT_FOUND = 'user_settings/not_found' as const; diff --git a/packages/hoppscotch-backend/src/user-settings/user-settings.module.ts b/packages/hoppscotch-backend/src/user-settings/user-settings.module.ts index f85f36150..df3547243 100644 --- a/packages/hoppscotch-backend/src/user-settings/user-settings.module.ts +++ b/packages/hoppscotch-backend/src/user-settings/user-settings.module.ts @@ -1,11 +1,17 @@ import { Module } from '@nestjs/common'; import { PrismaModule } from 'src/prisma/prisma.module'; import { PubSubModule } from 'src/pubsub/pubsub.module'; +import { UserModule } from 'src/user/user.module'; import { UserSettingsResolver } from './user-settings.resolver'; import { UserSettingsService } from './user-settings.service'; +import { UserSettingsUserResolver } from './user.resolver'; @Module({ - imports: [PrismaModule, PubSubModule], - providers: [UserSettingsResolver, UserSettingsService], + imports: [PrismaModule, PubSubModule, UserModule], + providers: [ + UserSettingsResolver, + UserSettingsService, + UserSettingsUserResolver, + ], }) export class UserSettingsModule {} diff --git a/packages/hoppscotch-backend/src/user-settings/user-settings.service.ts b/packages/hoppscotch-backend/src/user-settings/user-settings.service.ts index e9dc0b0f7..ddb870777 100644 --- a/packages/hoppscotch-backend/src/user-settings/user-settings.service.ts +++ b/packages/hoppscotch-backend/src/user-settings/user-settings.service.ts @@ -5,7 +5,10 @@ import { User } from 'src/user/user.model'; import * as E from 'fp-ts/Either'; import { stringToJson } from 'src/utils'; import { UserSettings } from './user-settings.model'; -import { USER_SETTINGS_UPDATE_FAILED } from 'src/errors'; +import { + USER_SETTINGS_NOT_FOUND, + USER_SETTINGS_UPDATE_FAILED, +} from 'src/errors'; @Injectable() export class UserSettingsService { @@ -14,6 +17,26 @@ export class UserSettingsService { private readonly pubsub: PubSubService, ) {} + async fetchUserSettings(user: User) { + try { + const dbUserSettings = await this.prisma.userSettings.findUnique({ + where: { userUid: user.uid }, + rejectOnNotFound: true, + }); + + const userSettings: UserSettings = { + id: dbUserSettings.id, + userUid: dbUserSettings.userUid, + properties: JSON.stringify(dbUserSettings.properties), + updatedOn: dbUserSettings.updatedOn, + }; + + return E.right(userSettings); + } catch (e) { + return E.left(USER_SETTINGS_NOT_FOUND); + } + } + async createUserSettings(user: User, properties: string) { const jsonProperties = stringToJson(properties); if (E.isLeft(jsonProperties)) return E.left(jsonProperties.left); diff --git a/packages/hoppscotch-backend/src/user-settings/user.resolver.ts b/packages/hoppscotch-backend/src/user-settings/user.resolver.ts new file mode 100644 index 000000000..7967355bf --- /dev/null +++ b/packages/hoppscotch-backend/src/user-settings/user.resolver.ts @@ -0,0 +1,21 @@ +import { Parent, ResolveField, Resolver } from '@nestjs/graphql'; +import { User } from 'src/user/user.model'; +import { UserSettings } from './user-settings.model'; +import { UserSettingsService } from './user-settings.service'; +import * as E from 'fp-ts/Either'; +import { throwErr } from 'src/utils'; + +@Resolver(() => User) +export class UserSettingsUserResolver { + constructor(private readonly userSettingsService: UserSettingsService) {} + + @ResolveField(() => UserSettings, { + description: 'Returns user settings', + }) + async settings(@Parent() user: User): Promise { + const userSettings = await this.userSettingsService.fetchUserSettings(user); + + if (E.isLeft(userSettings)) throwErr(userSettings.left); + return userSettings.right; + } +}