From 4ecac41396ecf06ba72434cef0bd513f1708faed Mon Sep 17 00:00:00 2001 From: vchikalkin Date: Mon, 23 Dec 2024 15:14:18 +0300 Subject: [PATCH] apps/bot: check user already exists --- apps/bot/src/api/query.ts | 9 ++++++++ apps/bot/src/index.ts | 40 ++++++++++++++++++++++++++++------ packages/graphql/query.graphql | 6 +++++ packages/graphql/types.ts | 10 ++++++++- 4 files changed, 57 insertions(+), 8 deletions(-) diff --git a/apps/bot/src/api/query.ts b/apps/bot/src/api/query.ts index 0698015..88e60c5 100644 --- a/apps/bot/src/api/query.ts +++ b/apps/bot/src/api/query.ts @@ -9,3 +9,12 @@ export async function createCustomer(variables: GQL.CreateCustomerMutationVariab variables, }); } + +export async function getCustomer(variables: GQL.GetCustomerQueryVariables) { + const { query } = await getClientWithToken(); + + return query({ + query: GQL.GetCustomerDocument, + variables, + }); +} diff --git a/apps/bot/src/index.ts b/apps/bot/src/index.ts index 04e3c81..3b680f6 100644 --- a/apps/bot/src/index.ts +++ b/apps/bot/src/index.ts @@ -1,12 +1,27 @@ -/* eslint-disable promise/prefer-await-to-then */ -import { createCustomer } from './api/query'; +import { createCustomer, getCustomer } from './api/query'; import { env as environment } from './config/env'; import { Telegraf } from 'telegraf'; import { message } from 'telegraf/filters'; const bot = new Telegraf(environment.BOT_TOKEN); -bot.start((context) => { +bot.start(async (context) => { + const { id: telegramId } = context.from; + + const response = await getCustomer({ telegramId }); + const customer = response?.data?.customers?.at(0); + + if (customer && !response.error) { + return context.reply( + `Приветствуем снова, ${customer.name}. Чтобы воспользоваться сервисом, откройте приложение.`, + { + reply_markup: { + remove_keyboard: true, + }, + }, + ); + } + return context.reply('Добро пожаловать! Пожалуйста, поделитесь своим номером телефона.', { reply_markup: { keyboard: [ @@ -23,13 +38,24 @@ bot.start((context) => { }); bot.on(message('contact'), async (context) => { - createCustomer({ + const response = await createCustomer({ name: context.from.first_name, phone: context.message.contact.phone_number, telegramId: context.from.id, - }) - .then((response) => context.reply(JSON.stringify(response))) - .catch((error) => context.reply(JSON.stringify(error))); + }); + + if (response.errors?.length) { + return context.reply('Произошла ошибка, попробуйте позже.'); + } + + return context.reply( + 'Спасибо! Мы сохранили ваш номер телефона. Теперь можете открыть приложение.', + { + reply_markup: { + remove_keyboard: true, + }, + }, + ); }); bot.launch(); diff --git a/packages/graphql/query.graphql b/packages/graphql/query.graphql index f74e637..f2b4e29 100644 --- a/packages/graphql/query.graphql +++ b/packages/graphql/query.graphql @@ -26,3 +26,9 @@ mutation CreateCustomer($name: String!, $telegramId: Long!, $phone: String!) { publishedAt } } + +query GetCustomer($telegramId: Long!) { + customers(filters: { telegramId: { eq: $telegramId } }) { + name + } +} diff --git a/packages/graphql/types.ts b/packages/graphql/types.ts index 9608337..47bf8b9 100644 --- a/packages/graphql/types.ts +++ b/packages/graphql/types.ts @@ -574,7 +574,15 @@ export type CreateCustomerMutationVariables = Exact<{ export type CreateCustomerMutation = { __typename?: 'Mutation', createCustomer: { __typename?: 'Customer', documentId: string, name: string, telegramId: any | null, phone: string, role: Enum_Customer_Role, active: boolean | null, createdAt: any | null, updatedAt: any | null, publishedAt: any | null } | null }; +export type GetCustomerQueryVariables = Exact<{ + telegramId: Scalars['Long']['input']; +}>; + + +export type GetCustomerQuery = { __typename?: 'Query', customers: Array<{ __typename?: 'Customer', name: string } | null> }; + 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 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":"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":"Field","name":{"kind":"Name","value":"documentId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"telegramId"}},{"kind":"Field","name":{"kind":"Name","value":"phone"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"active"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"publishedAt"}}]}}]}}]} 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":"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":"Field","name":{"kind":"Name","value":"documentId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"telegramId"}},{"kind":"Field","name":{"kind":"Name","value":"phone"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"active"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"publishedAt"}}]}}]}}]} 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":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]} as unknown as DocumentNode; \ No newline at end of file