diff --git a/app/controllers/telegram_bot_updates_controller.rb b/app/controllers/telegram_bot_updates_controller.rb index 2834e10..1f343b8 100644 --- a/app/controllers/telegram_bot_updates_controller.rb +++ b/app/controllers/telegram_bot_updates_controller.rb @@ -8,6 +8,8 @@ class TelegramBotUpdatesController < ApplicationController def create logger.info params.inspect + handle_message params[:message] if params[:message] + render status: :no_content, json: {} end @@ -20,4 +22,19 @@ private def verify_telegram_bot_secret raise NotAuthorizedError unless params[:secret] == @telegram_bot.secret end + + def handle_message(message) + handle_user message[:from] if message[:from] + end + + def handle_user(user) + TelegramUser.create!( + remote_telegram_id: user[:id], + is_bot: user[:is_bot], + first_name: user[:first_name], + last_name: user[:last_name], + username: user[:username], + language_code: user[:language_code], + ) + end end diff --git a/factories/telegram_users.rb b/factories/telegram_users.rb index 1b44a38..66dc832 100644 --- a/factories/telegram_users.rb +++ b/factories/telegram_users.rb @@ -7,6 +7,6 @@ FactoryBot.define do first_name { Faker::Name.first_name } last_name { Faker::Name.last_name } username { Faker::Internet.username } - language_code { I18n.available_locales.sample } + language_code { I18n.available_locales.sample.to_s } end end diff --git a/spec/requests/telegram_bot_updates/create_spec.rb b/spec/requests/telegram_bot_updates/create_spec.rb index 430819e..13f6a9f 100644 --- a/spec/requests/telegram_bot_updates/create_spec.rb +++ b/spec/requests/telegram_bot_updates/create_spec.rb @@ -40,4 +40,50 @@ RSpec.describe 'POST /telegram_bot_updates' do expect(response).to have_http_status :unauthorized end end + + context 'when message "from" attribute is set' do + def make_request + post '/telegram_bot_updates', + params: { telegram_bot_id: telegram_bot.id, + secret: telegram_bot.secret, + message: { from: telegram_user_attributes } } + end + + let :telegram_user_attributes do + { + id: remote_telegram_id, + is_bot: is_bot, + first_name: first_name, + last_name: last_name, + username: username, + language_code: language_code, + } + end + + let(:remote_telegram_id) { rand 1..1_000_000 } + let(:is_bot) { [false, true].sample } + let(:first_name) { Faker::Name.first_name } + let(:last_name) { Faker::Name.last_name } + let(:username) { Faker::Internet.username } + let(:language_code) { I18n.available_locales.sample.to_s } + + specify do + expect { make_request }.to change(TelegramUser, :count).from(0).to(1) + end + + context 'after request' do + before { make_request } + + specify do + expect(TelegramUser.last).to have_attributes( + remote_telegram_id: remote_telegram_id, + is_bot: is_bot, + first_name: first_name, + last_name: last_name, + username: username, + language_code: language_code, + ) + end + end + end end