From af128f42c5965b26c4c5811864d0d67bee65546f Mon Sep 17 00:00:00 2001 From: vchikalkin Date: Mon, 13 Jan 2025 19:50:25 +0300 Subject: [PATCH] refactor customer queries --- apps/bot/src/index.ts | 16 +- packages/graphql/api/customer.test.ts | 205 ------------------ packages/graphql/api/customer.ts | 95 ++++---- packages/graphql/operations/customer.graphql | 35 ++- .../graphql/types/operations.generated.ts | 52 ++--- 5 files changed, 99 insertions(+), 304 deletions(-) delete mode 100644 packages/graphql/api/customer.test.ts diff --git a/apps/bot/src/index.ts b/apps/bot/src/index.ts index 5101972..7419c04 100644 --- a/apps/bot/src/index.ts +++ b/apps/bot/src/index.ts @@ -2,7 +2,7 @@ /* eslint-disable consistent-return */ import { env as environment } from './config/env'; import { commandsList, KEYBOARD_REMOVE, KEYBOARD_SHARE_PHONE } from './message'; -import { createOrUpdateClient, createOrUpdateUser, getCustomer } from '@repo/graphql/api'; +import { createOrUpdateUser, getCustomer, updateCustomerMaster } from '@repo/graphql/api'; import { Enum_Customer_Role } from '@repo/graphql/types'; import { Telegraf } from 'telegraf'; import { message } from 'telegraf/filters'; @@ -70,16 +70,20 @@ bot.on(message('contact'), async (context) => { ); } - const masterId = customer.documentId; + try { + await createOrUpdateUser({ name, phone }); - const response = await createOrUpdateClient({ masterId, name, phone }).catch((error) => { - context.reply('Произошла ошибка.\n' + error); - }); + await updateCustomerMaster({ + masterId: customer.documentId, + operation: 'add', + phone, + }); - if (response) { return context.reply( `Добавили контакт ${name}. Пригласите пользователя в приложение и тогда вы сможете добавлять записи с этим контактом.`, ); + } catch (error) { + context.reply('Произошла ошибка.\n' + error); } } }); diff --git a/packages/graphql/api/customer.test.ts b/packages/graphql/api/customer.test.ts deleted file mode 100644 index a511fb5..0000000 --- a/packages/graphql/api/customer.test.ts +++ /dev/null @@ -1,205 +0,0 @@ -import { beforeEach, describe, expect, it, Mock, vi } from 'vitest'; -import * as ApolloClient from '../apollo/client'; -import * as GQL from '../types'; -import { createOrUpdateClient, createOrUpdateUser } from './customer'; - -vi.mock('../apollo/client', () => ({ - getClientWithToken: vi.fn(), -})); - -const mockQuery = vi.fn(); -const mockMutate = vi.fn(); - -type ApolloResponse = { - data: TData; -}; - -describe('api/customer', () => { - describe('createOrUpdateUser', () => { - beforeEach(() => { - vi.clearAllMocks(); - (ApolloClient.getClientWithToken as Mock).mockResolvedValue({ - query: mockQuery, - mutate: mockMutate, - }); - }); - - const variables: GQL.CreateUserMutationVariables = { - name: 'John Doe', - phone: '1234567890', - telegramId: '1234567890', - }; - - const user: GQL.CustomerProfileFragment = { - __typename: 'Customer', - documentId: '123', - name: 'John Doe', - phone: '1234567890', - telegramId: '1234567890', - role: GQL.Enum_Customer_Role.Client, - masters: [], - }; - - it('create new user if it does not exist', async () => { - mockQuery.mockResolvedValueOnce({ - data: { - customers: [], - }, - }); - - const mockCreateResponse: ApolloResponse = { - data: { createCustomer: user }, - }; - mockMutate.mockResolvedValueOnce(mockCreateResponse); - - const result = await createOrUpdateUser(variables); - - expect(mockQuery).toHaveBeenCalledWith({ - query: GQL.GetUserByPhoneDocument, - variables, - }); - - expect(mockMutate).toHaveBeenCalledWith({ - mutation: GQL.CreateUserDocument, - variables, - }); - - expect(mockMutate).not.toHaveBeenCalledWith({ - mutation: GQL.UpdateCustomerProfileDocument, - variables, - }); - - expect(result).toEqual(mockCreateResponse); - }); - - it('update user if it exists', async () => { - mockQuery.mockResolvedValueOnce({ - data: { - customers: [user], - }, - }); - - const mockUpdateResponse: ApolloResponse = { - data: { updateCustomer: user }, - }; - mockMutate.mockResolvedValueOnce(mockUpdateResponse); - - const result = await createOrUpdateUser(variables); - - expect(mockQuery).toHaveBeenCalledWith({ - query: GQL.GetUserByPhoneDocument, - variables, - }); - - expect(mockMutate).toHaveBeenCalledWith({ - mutation: GQL.UpdateCustomerProfileDocument, - variables: { - documentId: user.documentId, - data: variables, - }, - }); - - expect(mockMutate).not.toHaveBeenCalledWith({ - mutation: GQL.CreateUserDocument, - variables, - }); - - expect(result).toEqual(mockUpdateResponse); - }); - }); - - describe('createOrUpdateClient', () => { - beforeEach(() => { - vi.clearAllMocks(); - (ApolloClient.getClientWithToken as Mock).mockResolvedValue({ - query: mockQuery, - mutate: mockMutate, - }); - }); - - const variables: GQL.CreateClientMutationVariables = { - name: 'John Doe', - phone: '1234567890', - masterId: '123', - }; - - const client: GQL.CustomerProfileFragment = { - __typename: 'Customer', - documentId: '123', - name: 'John Doe', - phone: '1234567890', - telegramId: '1234567890', - role: GQL.Enum_Customer_Role.Client, - masters: [], - }; - - it('create new client if it does not exist', async () => { - mockQuery.mockResolvedValueOnce({ - data: { - customers: [], - }, - }); - - const mockCreateResponse: ApolloResponse = { - data: { createCustomer: client }, - }; - mockMutate.mockResolvedValueOnce(mockCreateResponse); - - const result = await createOrUpdateClient(variables); - - expect(mockQuery).toHaveBeenCalledWith({ - query: GQL.GetUserByPhoneDocument, - variables, - }); - - expect(mockMutate).toHaveBeenCalledWith({ - mutation: GQL.CreateClientDocument, - variables, - }); - - expect(mockMutate).not.toHaveBeenCalledWith({ - mutation: GQL.UpdateCustomerProfileDocument, - variables, - }); - - expect(result).toEqual(mockCreateResponse); - }); - - it('update client if it exists', async () => { - mockQuery.mockResolvedValueOnce({ - data: { - customers: [client], - }, - }); - - const mockUpdateResponse: ApolloResponse = { - data: { updateCustomer: client }, - }; - mockMutate.mockResolvedValueOnce(mockUpdateResponse); - - const result = await createOrUpdateClient(variables); - - expect(mockQuery).toHaveBeenCalledWith({ - query: GQL.GetUserByPhoneDocument, - variables, - }); - - expect(mockMutate).toHaveBeenCalledWith({ - mutation: GQL.UpdateCustomerProfileDocument, - variables: { - documentId: client.documentId, - data: { - masters: [variables.masterId], - }, - }, - }); - - expect(mockMutate).not.toHaveBeenCalledWith({ - mutation: GQL.CreateClientDocument, - variables, - }); - - expect(result).toEqual(mockUpdateResponse); - }); - }); -}); diff --git a/packages/graphql/api/customer.ts b/packages/graphql/api/customer.ts index e2eb985..fb2e2a3 100644 --- a/packages/graphql/api/customer.ts +++ b/packages/graphql/api/customer.ts @@ -2,68 +2,40 @@ import { getClientWithToken } from '../apollo/client'; import * as GQL from '../types'; -export async function createOrUpdateUser(variables: GQL.CreateUserMutationVariables) { +export async function createOrUpdateUser(input: GQL.CreateCustomerMutationVariables) { + if (!input.phone && !input.telegramId) throw new Error('Missing phone and telegramId'); + const { query, mutate } = await getClientWithToken(); const response = await query({ - query: GQL.GetUserByPhoneDocument, - variables, + query: GQL.GetCustomerDocument, + variables: input, }); const customer = response?.data?.customers?.at(0); - if (customer?.phone === variables.phone) { + if (customer && customer.phone === input.phone) { return mutate({ mutation: GQL.UpdateCustomerProfileDocument, variables: { documentId: customer.documentId, - data: variables, + data: { ...input }, }, }); } return mutate({ - mutation: GQL.CreateUserDocument, - variables, + mutation: GQL.CreateCustomerDocument, + variables: input, }); } -export async function createOrUpdateClient(variables: GQL.CreateClientMutationVariables) { - const { query, mutate } = await getClientWithToken(); - - const response = await query({ - query: GQL.GetUserByPhoneDocument, - variables, - }); - - const client = response?.data?.customers?.at(0); - - if (client?.phone === variables.phone) { - const masters = [...new Set([...client.masters.map((x) => x?.documentId), variables.masterId])]; - - return mutate({ - mutation: GQL.UpdateCustomerProfileDocument, - variables: { - documentId: client.documentId, - data: { - masters, - }, - }, - }); - } - - return mutate({ - mutation: GQL.CreateClientDocument, - variables, - }); -} - -export async function getCustomer(variables: GQL.GetCustomerQueryVariables) { +export async function getCustomer(input: GQL.GetCustomerQueryVariables) { const { query } = await getClientWithToken(); const response = await query({ query: GQL.GetCustomerDocument, - variables, + variables: input, }); const customer = response?.data?.customers?.at(0); @@ -71,11 +43,52 @@ export async function getCustomer(variables: GQL.GetCustomerQueryVariables) { return customer; } -export async function updateCustomerProfile(variables: GQL.UpdateCustomerProfileMutationVariables) { +type AddCustomerMasterInput = Pick & { + masterId: GQL.Scalars['ID']['input']; + operation: 'add' | 'remove'; +}; + +export async function updateCustomerMaster(input: AddCustomerMasterInput) { + if (!input.phone && !input.telegramId) throw new Error('Missing phone and telegramId'); + + const { query } = await getClientWithToken(); + + const response = await query({ + query: GQL.GetCustomerMastersDocument, + variables: input, + }); + + const customer = response?.data?.customers?.at(0); + + if (customer) { + let newMastersIds = customer.masters.map((x) => x?.documentId); + + switch (input.operation) { + case 'add': + if (newMastersIds.includes(input.masterId)) return; + newMastersIds = [...newMastersIds, input.masterId]; + break; + case 'remove': + newMastersIds = newMastersIds.filter((x) => x !== input.masterId); + break; + default: + break; + } + + return updateCustomerProfile({ + documentId: customer.documentId, + data: { + masters: newMastersIds, + }, + }); + } +} + +export async function updateCustomerProfile(input: GQL.UpdateCustomerProfileMutationVariables) { const { mutate } = await getClientWithToken(); return mutate({ mutation: GQL.UpdateCustomerProfileDocument, - variables, + variables: input, }); } diff --git a/packages/graphql/operations/customer.graphql b/packages/graphql/operations/customer.graphql index 2418a0a..209cbdd 100644 --- a/packages/graphql/operations/customer.graphql +++ b/packages/graphql/operations/customer.graphql @@ -1,4 +1,4 @@ -fragment CustomerProfile on Customer { +fragment CustomerFields on Customer { active documentId name @@ -6,40 +6,31 @@ fragment CustomerProfile on Customer { photoUrl role telegramId - masters { - documentId - name - phone - photoUrl - } } -mutation CreateUser($name: String!, $telegramId: Long!, $phone: String!) { +mutation CreateCustomer($name: String!, $telegramId: Long, $phone: String) { createCustomer(data: { name: $name, telegramId: $telegramId, phone: $phone, role: client }) { - ...CustomerProfile + documentId } } -mutation CreateClient($name: String!, $phone: String!, $masterId: ID!) { - createCustomer(data: { name: $name, phone: $phone, role: client, masters: [$masterId] }) { - ...CustomerProfile +query GetCustomer($phone: String, $telegramId: Long) { + customers(filters: { or: [{ phone: { eq: $phone } }, { telegramId: { eq: $telegramId } }] }) { + ...CustomerFields } } -query GetUserByPhone($phone: String!) { - customers(filters: { phone: { eq: $phone } }) { - ...CustomerProfile - } -} - -query GetCustomer($telegramId: Long!) { - customers(filters: { telegramId: { eq: $telegramId } }) { - ...CustomerProfile +query GetCustomerMasters($phone: String, $telegramId: Long) { + customers(filters: { or: [{ phone: { eq: $phone } }, { telegramId: { eq: $telegramId } }] }) { + documentId + masters { + ...CustomerFields + } } } mutation UpdateCustomerProfile($documentId: ID!, $data: CustomerInput!) { updateCustomer(documentId: $documentId, data: $data) { - ...CustomerProfile + ...CustomerFields } } diff --git a/packages/graphql/types/operations.generated.ts b/packages/graphql/types/operations.generated.ts index a878997..cde454c 100644 --- a/packages/graphql/types/operations.generated.ts +++ b/packages/graphql/types/operations.generated.ts @@ -567,39 +567,32 @@ export type LoginMutationVariables = Exact<{ export type LoginMutation = { __typename?: 'Mutation', login: { __typename?: 'UsersPermissionsLoginPayload', jwt?: string | null | undefined } }; -export type CustomerProfileFragment = { __typename?: 'Customer', active?: boolean | null | undefined, documentId: string, name: string, phone: string, photoUrl?: string | null | undefined, role: Enum_Customer_Role, telegramId?: any | null | undefined, masters: Array<{ __typename?: 'Customer', documentId: string, name: string, phone: string, photoUrl?: string | null | undefined } | null | undefined> }; +export type CustomerFieldsFragment = { __typename?: 'Customer', active?: boolean | null | undefined, documentId: string, name: string, phone: string, photoUrl?: string | null | undefined, role: Enum_Customer_Role, telegramId?: any | null | undefined }; -export type CreateUserMutationVariables = Exact<{ +export type CreateCustomerMutationVariables = Exact<{ name: Scalars['String']['input']; - telegramId: Scalars['Long']['input']; - phone: Scalars['String']['input']; + telegramId?: InputMaybe; + phone?: InputMaybe; }>; -export type CreateUserMutation = { __typename?: 'Mutation', createCustomer?: { __typename?: 'Customer', active?: boolean | null | undefined, documentId: string, name: string, phone: string, photoUrl?: string | null | undefined, role: Enum_Customer_Role, telegramId?: any | null | undefined, masters: Array<{ __typename?: 'Customer', documentId: string, name: string, phone: string, photoUrl?: string | null | undefined } | null | undefined> } | null | undefined }; - -export type CreateClientMutationVariables = Exact<{ - name: Scalars['String']['input']; - phone: Scalars['String']['input']; - masterId: Scalars['ID']['input']; -}>; - - -export type CreateClientMutation = { __typename?: 'Mutation', createCustomer?: { __typename?: 'Customer', active?: boolean | null | undefined, documentId: string, name: string, phone: string, photoUrl?: string | null | undefined, role: Enum_Customer_Role, telegramId?: any | null | undefined, masters: Array<{ __typename?: 'Customer', documentId: string, name: string, phone: string, photoUrl?: string | null | undefined } | null | undefined> } | null | undefined }; - -export type GetUserByPhoneQueryVariables = Exact<{ - phone: Scalars['String']['input']; -}>; - - -export type GetUserByPhoneQuery = { __typename?: 'Query', customers: Array<{ __typename?: 'Customer', active?: boolean | null | undefined, documentId: string, name: string, phone: string, photoUrl?: string | null | undefined, role: Enum_Customer_Role, telegramId?: any | null | undefined, masters: Array<{ __typename?: 'Customer', documentId: string, name: string, phone: string, photoUrl?: string | null | undefined } | null | undefined> } | null | undefined> }; +export type CreateCustomerMutation = { __typename?: 'Mutation', createCustomer?: { __typename?: 'Customer', documentId: string } | null | undefined }; export type GetCustomerQueryVariables = Exact<{ - telegramId: Scalars['Long']['input']; + phone?: InputMaybe; + telegramId?: InputMaybe; }>; -export type GetCustomerQuery = { __typename?: 'Query', customers: Array<{ __typename?: 'Customer', active?: boolean | null | undefined, documentId: string, name: string, phone: string, photoUrl?: string | null | undefined, role: Enum_Customer_Role, telegramId?: any | null | undefined, masters: Array<{ __typename?: 'Customer', documentId: string, name: string, phone: string, photoUrl?: string | null | undefined } | null | undefined> } | null | undefined> }; +export type GetCustomerQuery = { __typename?: 'Query', customers: Array<{ __typename?: 'Customer', active?: boolean | null | undefined, documentId: string, name: string, phone: string, photoUrl?: string | null | undefined, role: Enum_Customer_Role, telegramId?: any | null | undefined } | null | undefined> }; + +export type GetCustomerMastersQueryVariables = Exact<{ + phone?: InputMaybe; + telegramId?: InputMaybe; +}>; + + +export type GetCustomerMastersQuery = { __typename?: 'Query', customers: Array<{ __typename?: 'Customer', documentId: string, masters: Array<{ __typename?: 'Customer', active?: boolean | null | undefined, documentId: string, name: string, phone: string, photoUrl?: string | null | undefined, role: Enum_Customer_Role, telegramId?: any | null | undefined } | null | undefined> } | null | undefined> }; export type UpdateCustomerProfileMutationVariables = Exact<{ documentId: Scalars['ID']['input']; @@ -607,13 +600,12 @@ export type UpdateCustomerProfileMutationVariables = Exact<{ }>; -export type UpdateCustomerProfileMutation = { __typename?: 'Mutation', updateCustomer?: { __typename?: 'Customer', active?: boolean | null | undefined, documentId: string, name: string, phone: string, photoUrl?: string | null | undefined, role: Enum_Customer_Role, telegramId?: any | null | undefined, masters: Array<{ __typename?: 'Customer', documentId: string, name: string, phone: string, photoUrl?: string | null | undefined } | null | undefined> } | null | undefined }; +export type UpdateCustomerProfileMutation = { __typename?: 'Mutation', updateCustomer?: { __typename?: 'Customer', active?: boolean | null | undefined, documentId: string, name: string, phone: string, photoUrl?: string | null | undefined, role: Enum_Customer_Role, telegramId?: any | null | undefined } | null | undefined }; -export const CustomerProfileFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CustomerProfile"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Customer"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"active"}},{"kind":"Field","name":{"kind":"Name","value":"documentId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"phone"}},{"kind":"Field","name":{"kind":"Name","value":"photoUrl"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"telegramId"}},{"kind":"Field","name":{"kind":"Name","value":"masters"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"documentId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"phone"}},{"kind":"Field","name":{"kind":"Name","value":"photoUrl"}}]}}]}}]} as unknown as DocumentNode; +export const CustomerFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CustomerFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Customer"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"active"}},{"kind":"Field","name":{"kind":"Name","value":"documentId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"phone"}},{"kind":"Field","name":{"kind":"Name","value":"photoUrl"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"telegramId"}}]}}]} as unknown as DocumentNode; export const RegisterDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"Register"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"identifier"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"password"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"email"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"register"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"username"},"value":{"kind":"Variable","name":{"kind":"Name","value":"identifier"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"password"},"value":{"kind":"Variable","name":{"kind":"Name","value":"password"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"email"},"value":{"kind":"Variable","name":{"kind":"Name","value":"email"}}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"jwt"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"username"}}]}}]}}]}}]} as unknown as DocumentNode; export const LoginDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"Login"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"identifier"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"password"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"login"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"identifier"},"value":{"kind":"Variable","name":{"kind":"Name","value":"identifier"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"password"},"value":{"kind":"Variable","name":{"kind":"Name","value":"password"}}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"jwt"}}]}}]}}]} as unknown as DocumentNode; -export const CreateUserDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateUser"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"name"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"telegramId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Long"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"phone"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createCustomer"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"data"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"name"},"value":{"kind":"Variable","name":{"kind":"Name","value":"name"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"telegramId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"telegramId"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"phone"},"value":{"kind":"Variable","name":{"kind":"Name","value":"phone"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"role"},"value":{"kind":"EnumValue","value":"client"}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CustomerProfile"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CustomerProfile"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Customer"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"active"}},{"kind":"Field","name":{"kind":"Name","value":"documentId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"phone"}},{"kind":"Field","name":{"kind":"Name","value":"photoUrl"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"telegramId"}},{"kind":"Field","name":{"kind":"Name","value":"masters"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"documentId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"phone"}},{"kind":"Field","name":{"kind":"Name","value":"photoUrl"}}]}}]}}]} as unknown as DocumentNode; -export const CreateClientDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateClient"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"name"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"phone"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"masterId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createCustomer"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"data"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"name"},"value":{"kind":"Variable","name":{"kind":"Name","value":"name"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"phone"},"value":{"kind":"Variable","name":{"kind":"Name","value":"phone"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"role"},"value":{"kind":"EnumValue","value":"client"}},{"kind":"ObjectField","name":{"kind":"Name","value":"masters"},"value":{"kind":"ListValue","values":[{"kind":"Variable","name":{"kind":"Name","value":"masterId"}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CustomerProfile"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CustomerProfile"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Customer"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"active"}},{"kind":"Field","name":{"kind":"Name","value":"documentId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"phone"}},{"kind":"Field","name":{"kind":"Name","value":"photoUrl"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"telegramId"}},{"kind":"Field","name":{"kind":"Name","value":"masters"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"documentId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"phone"}},{"kind":"Field","name":{"kind":"Name","value":"photoUrl"}}]}}]}}]} as unknown as DocumentNode; -export const GetUserByPhoneDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetUserByPhone"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"phone"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"customers"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filters"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"phone"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"phone"}}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CustomerProfile"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CustomerProfile"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Customer"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"active"}},{"kind":"Field","name":{"kind":"Name","value":"documentId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"phone"}},{"kind":"Field","name":{"kind":"Name","value":"photoUrl"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"telegramId"}},{"kind":"Field","name":{"kind":"Name","value":"masters"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"documentId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"phone"}},{"kind":"Field","name":{"kind":"Name","value":"photoUrl"}}]}}]}}]} as unknown as DocumentNode; -export const GetCustomerDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetCustomer"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"telegramId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Long"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"customers"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filters"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"telegramId"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"telegramId"}}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CustomerProfile"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CustomerProfile"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Customer"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"active"}},{"kind":"Field","name":{"kind":"Name","value":"documentId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"phone"}},{"kind":"Field","name":{"kind":"Name","value":"photoUrl"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"telegramId"}},{"kind":"Field","name":{"kind":"Name","value":"masters"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"documentId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"phone"}},{"kind":"Field","name":{"kind":"Name","value":"photoUrl"}}]}}]}}]} as unknown as DocumentNode; -export const UpdateCustomerProfileDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateCustomerProfile"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"documentId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"data"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"CustomerInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateCustomer"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"documentId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"documentId"}}},{"kind":"Argument","name":{"kind":"Name","value":"data"},"value":{"kind":"Variable","name":{"kind":"Name","value":"data"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CustomerProfile"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CustomerProfile"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Customer"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"active"}},{"kind":"Field","name":{"kind":"Name","value":"documentId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"phone"}},{"kind":"Field","name":{"kind":"Name","value":"photoUrl"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"telegramId"}},{"kind":"Field","name":{"kind":"Name","value":"masters"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"documentId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"phone"}},{"kind":"Field","name":{"kind":"Name","value":"photoUrl"}}]}}]}}]} as unknown as DocumentNode; \ No newline at end of file +export const CreateCustomerDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateCustomer"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"name"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"telegramId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Long"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"phone"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createCustomer"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"data"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"name"},"value":{"kind":"Variable","name":{"kind":"Name","value":"name"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"telegramId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"telegramId"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"phone"},"value":{"kind":"Variable","name":{"kind":"Name","value":"phone"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"role"},"value":{"kind":"EnumValue","value":"client"}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"documentId"}}]}}]}}]} as unknown as DocumentNode; +export const GetCustomerDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetCustomer"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"phone"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"telegramId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Long"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"customers"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filters"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"or"},"value":{"kind":"ListValue","values":[{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"phone"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"phone"}}}]}}]},{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"telegramId"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"telegramId"}}}]}}]}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CustomerFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CustomerFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Customer"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"active"}},{"kind":"Field","name":{"kind":"Name","value":"documentId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"phone"}},{"kind":"Field","name":{"kind":"Name","value":"photoUrl"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"telegramId"}}]}}]} as unknown as DocumentNode; +export const GetCustomerMastersDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetCustomerMasters"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"phone"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"telegramId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Long"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"customers"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filters"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"or"},"value":{"kind":"ListValue","values":[{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"phone"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"phone"}}}]}}]},{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"telegramId"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"telegramId"}}}]}}]}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"documentId"}},{"kind":"Field","name":{"kind":"Name","value":"masters"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CustomerFields"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CustomerFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Customer"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"active"}},{"kind":"Field","name":{"kind":"Name","value":"documentId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"phone"}},{"kind":"Field","name":{"kind":"Name","value":"photoUrl"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"telegramId"}}]}}]} as unknown as DocumentNode; +export const UpdateCustomerProfileDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateCustomerProfile"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"documentId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"data"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"CustomerInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateCustomer"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"documentId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"documentId"}}},{"kind":"Argument","name":{"kind":"Name","value":"data"},"value":{"kind":"Variable","name":{"kind":"Name","value":"data"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CustomerFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CustomerFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Customer"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"active"}},{"kind":"Field","name":{"kind":"Name","value":"documentId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"phone"}},{"kind":"Field","name":{"kind":"Name","value":"photoUrl"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"telegramId"}}]}}]} as unknown as DocumentNode; \ No newline at end of file