import { ERRORS } from '../constants/errors'; import * as GQL from '../types'; import { BaseService } from './base'; import { type VariablesOf } from '@graphql-typed-document-node/core'; const DEFAULT_CUSTOMERS_SORT = ['name:asc']; export class CustomersService extends BaseService { async addInvitedBy(variables: VariablesOf) { await this.checkIsBanned(); const newInvitedByIds = variables.data.invitedBy; // Проверяем, что пользователь не пытается изменить поле bannedUntil if (variables.data.bannedUntil !== undefined) { throw new Error(ERRORS.NO_PERMISSION); } const { mutate, query } = await this.getGraphQLClient(); const getInvitedByResult = await query({ query: GQL.GetInvitedByDocument, variables, }); const existingInvitedByIds = getInvitedByResult?.data?.customers ?.at(0) ?.invitedBy.map((x) => x?.documentId); const newInvitedByIdsList = [ ...new Set([...(existingInvitedByIds || []), ...(newInvitedByIds || [])]), ]; const mutationResult = await mutate({ mutation: GQL.UpdateCustomerDocument, variables: { data: { invitedBy: newInvitedByIdsList }, documentId: variables.documentId, }, }); const error = mutationResult.errors?.at(0); if (error) throw new Error(error.message); return mutationResult.data; } async getCustomer(variables: VariablesOf) { const { query } = await this.getGraphQLClient(); const result = await query({ query: GQL.GetCustomerDocument, variables, }); const customer = result.data.customers.at(0); return { customer }; } async getCustomers(variables: VariablesOf) { await this.checkIsBanned(); const { query } = await this.getGraphQLClient(); const result = await query({ query: GQL.GetCustomersDocument, variables: { sort: DEFAULT_CUSTOMERS_SORT, ...variables, }, }); return result.data; } async getInvited(variables?: VariablesOf) { await this.checkIsBanned(); const { query } = await this.getGraphQLClient(); const result = await query({ query: GQL.GetInvitedDocument, variables, }); const customer = result.data.customers.at(0); return customer; } async getInvitedBy(variables?: VariablesOf) { await this.checkIsBanned(); const { query } = await this.getGraphQLClient(); const result = await query({ query: GQL.GetInvitedByDocument, variables, }); const customer = result.data.customers.at(0); return customer; } async updateCustomer( variables: Omit, 'documentId'>, ) { await this.checkIsBanned(); const { customer } = await this._getUser(); // Пров еряем, что пользователь не пытается изменить поле bannedUntil if (variables.data.bannedUntil !== undefined) { throw new Error(ERRORS.NO_PERMISSION); } const { mutate } = await this.getGraphQLClient(); const mutationResult = await mutate({ mutation: GQL.UpdateCustomerDocument, variables: { data: variables.data, documentId: customer.documentId, }, }); const error = mutationResult.errors?.at(0); if (error) throw new Error(error.message); return mutationResult.data; } }