/* eslint-disable canonical/id-match */ import { getClientWithToken } from '../apollo/client'; import { ERRORS as SHARED_ERRORS } from '../constants/errors'; import * as GQL from '../types'; import { type ApolloClient, type NormalizedCacheObject } from '@apollo/client'; import { isCustomerBanned } from '@repo/utils/customer'; export const ERRORS = { MISSING_TELEGRAM_ID: 'Не указан Telegram ID', NOT_FOUND_CUSTOMER: 'Пользователь не найден', } as const; type UserProfile = { telegramId: number; }; export class BaseService { protected _user: UserProfile; protected graphQL: ApolloClient | null; constructor(user: UserProfile) { if (!user?.telegramId) { throw new Error(ERRORS.MISSING_TELEGRAM_ID); } this._user = user; this.graphQL = null; } protected async _getUser() { const { query } = await this.getGraphQLClient(); const result = await query({ query: GQL.GetCustomerDocument, variables: this._user, }); const customer = result.data.customers.at(0); if (!customer) throw new Error(ERRORS.NOT_FOUND_CUSTOMER); if (isCustomerBanned(customer)) { throw new Error(SHARED_ERRORS.NO_PERMISSION); } return { customer }; } protected async checkIsBanned() { const { query } = await this.getGraphQLClient(); const result = await query({ query: GQL.GetCustomerDocument, variables: this._user, }); const customer = result.data.customers.at(0); if (!customer) throw new Error(ERRORS.NOT_FOUND_CUSTOMER); if (customer && isCustomerBanned(customer)) { throw new Error(SHARED_ERRORS.NO_PERMISSION); } return { customer }; } protected async getGraphQLClient() { if (!this.graphQL) this.graphQL = await getClientWithToken(); return this.graphQL; } }