From e8b0b24b3627e79bb2eeba29ab0be080361b7331 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Wed, 27 Aug 2025 14:27:19 +0530 Subject: [PATCH] feat: implement login --- app/controllers/omniauth_controller.rb | 24 +++++++++++------- .../controllers/omniauth_controller_spec.rb | 25 +++++++++++++++++-- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/app/controllers/omniauth_controller.rb b/app/controllers/omniauth_controller.rb index fcd8bd31b..e5ef58eb9 100644 --- a/app/controllers/omniauth_controller.rb +++ b/app/controllers/omniauth_controller.rb @@ -20,17 +20,23 @@ class OmniauthController < ApplicationController user = User.find_by(email: email) if user - render json: { - message: 'Login successful', - user: { - id: user.id, - email: user.email, - name: user.name - } - } + # Create authentication token (DeviseTokenAuth way) + @resource = user + @token = @resource.create_token + @resource.save! + + # Sign in the user + sign_in(:user, @resource, store: false, bypass: false) + + # Update sign in tracking + @resource.update_tracked_fields!(request) + + # Render success response using Chatwoot's auth template + render partial: 'devise/auth', formats: [:json], locals: { resource: @resource } else render json: { - error: 'User not found' + error: 'User not found', + message: "No user exists with email: #{email}" }, status: :not_found end else diff --git a/spec/enterprise/controllers/omniauth_controller_spec.rb b/spec/enterprise/controllers/omniauth_controller_spec.rb index f8ced16ee..bf43ea415 100644 --- a/spec/enterprise/controllers/omniauth_controller_spec.rb +++ b/spec/enterprise/controllers/omniauth_controller_spec.rb @@ -36,8 +36,29 @@ RSpec.describe 'SAML Authentication API', type: :request do expect(response).to have_http_status(:ok) json_response = JSON.parse(response.body) - expect(json_response['message']).to eq('Login successful') - expect(json_response['user']['email']).to eq('john.doe@example.com') + expect(json_response['data']).to be_present + expect(json_response['data']['email']).to eq('john.doe@example.com') + expect(json_response['data']['id']).to eq(existing_user.id) + end + + it 'creates authentication tokens for the user' do + expect do + post "/auth/saml/#{account.id}/callback", + env: { 'omniauth.auth' => auth_hash }, + as: :json + end.to change { existing_user.reload.tokens.count }.by(1) + end + + it 'updates user sign in tracking' do + existing_user + + expect do + post "/auth/saml/#{account.id}/callback", + env: { 'omniauth.auth' => auth_hash }, + as: :json + end.to change { existing_user.reload.sign_in_count }.by(1) + + expect(existing_user.reload.current_sign_in_at).to be_present end end