diff --git a/app/controllers/settings/sessions_controller.rb b/app/controllers/settings/sessions_controller.rb new file mode 100644 index 0000000..5956be0 --- /dev/null +++ b/app/controllers/settings/sessions_controller.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +class Settings::SessionsController < ApplicationController + before_action :skip_policy_scope, only: :index + + # GET /settings/sessions + def index + authorize [:settings, Session] + + @sessions = current_account.sessions.order(logged_at: :desc).limit(10) + end +end diff --git a/app/policies/settings/session_policy.rb b/app/policies/settings/session_policy.rb new file mode 100644 index 0000000..037d273 --- /dev/null +++ b/app/policies/settings/session_policy.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class Settings::SessionPolicy < ApplicationPolicy + def index? + !!account + end +end diff --git a/app/views/settings/_nav_sidebar.html.erb b/app/views/settings/_nav_sidebar.html.erb index 232e3c1..7e830e0 100644 --- a/app/views/settings/_nav_sidebar.html.erb +++ b/app/views/settings/_nav_sidebar.html.erb @@ -17,4 +17,8 @@ policy(%i[settings contact]).index?, settings_contacts_path, ], + sessions: [ + policy(%i[settings session]).index?, + settings_sessions_path, + ], ) %> diff --git a/app/views/settings/sessions/_table.html.erb b/app/views/settings/sessions/_table.html.erb new file mode 100644 index 0000000..599c09a --- /dev/null +++ b/app/views/settings/sessions/_table.html.erb @@ -0,0 +1,21 @@ + + + + + + + + + + <% sessions.each do |session| %> + + + + + <% end %> + +
+ <%= Session.human_attribute_name :logged_at %> + + <%= Session.human_attribute_name :ip_address %> +
<%= localize session.logged_at, format: :long %><%= session.ip_address %>
diff --git a/app/views/settings/sessions/index.html.erb b/app/views/settings/sessions/index.html.erb new file mode 100644 index 0000000..eded376 --- /dev/null +++ b/app/views/settings/sessions/index.html.erb @@ -0,0 +1,11 @@ +
+
+
+ <%= render partial: 'settings/nav_sidebar', locals: { tab: :sessions } %> +
+ +
+ <%= render partial: 'table', locals: { sessions: @sessions } %> +
+
+
diff --git a/config/locales/activerecord/en.yml b/config/locales/activerecord/en.yml index 8e52698..b33ca02 100644 --- a/config/locales/activerecord/en.yml +++ b/config/locales/activerecord/en.yml @@ -27,7 +27,10 @@ en: many: Regional offices relationship: one: Party relation - one: Party relations + many: Party relations + session: + one: Session + many: Sessions user: one: User many: Users @@ -93,6 +96,11 @@ en: from_date: From date status: Status position: Position + session: + id: ID + account: Account + logged_at: Date & time (UTC timezone) + ip_address: IP address user: id: ID confirmation_sent_at: Confirmation sent at diff --git a/config/locales/activerecord/ru.yml b/config/locales/activerecord/ru.yml index 3d1fbf3..4bd07a6 100644 --- a/config/locales/activerecord/ru.yml +++ b/config/locales/activerecord/ru.yml @@ -28,6 +28,9 @@ ru: relationship: one: Отношение с партией one: Отношения с партией + session: + one: Сессия + many: Сессии user: one: Пользователь many: Пользователи @@ -93,6 +96,11 @@ ru: from_date: Дата начала status: Статус position: Должность + session: + id: ID + account: Аккаунт + logged_at: Дата & время (часовой пояс UTC) + ip_address: IP-адрес user: id: ID confirmation_sent_at: Дата отправки подтверждения diff --git a/config/locales/nav_tabs/en.yml b/config/locales/nav_tabs/en.yml index 86db4c6..40c9e63 100644 --- a/config/locales/nav_tabs/en.yml +++ b/config/locales/nav_tabs/en.yml @@ -10,3 +10,4 @@ en: profile: Public profile person: Person contacts: Contacts + sessions: Sessions diff --git a/config/locales/nav_tabs/ru.yml b/config/locales/nav_tabs/ru.yml index 298c6ab..abdd0ea 100644 --- a/config/locales/nav_tabs/ru.yml +++ b/config/locales/nav_tabs/ru.yml @@ -10,3 +10,4 @@ ru: profile: Публичный профиль person: Личность contacts: Контакты + sessions: Сессии diff --git a/config/routes.rb b/config/routes.rb index 7e8d6cb..4fca253 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -34,6 +34,7 @@ Rails.application.routes.draw do resource :profile, only: %i[edit update] resource :person, only: %i[show new] resources :contacts, only: %i[index create destroy] + resources :sessions, only: :index end ######################### diff --git a/spec/policies/settings/session_policy_spec.rb b/spec/policies/settings/session_policy_spec.rb new file mode 100644 index 0000000..cbd15cf --- /dev/null +++ b/spec/policies/settings/session_policy_spec.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe Settings::SessionPolicy do + pending "add some examples to (or delete) #{__FILE__}" +end diff --git a/spec/requests/settings/sessions/index_spec.rb b/spec/requests/settings/sessions/index_spec.rb new file mode 100644 index 0000000..be6e7f7 --- /dev/null +++ b/spec/requests/settings/sessions/index_spec.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'GET /settings/sessions' do + before do + sign_in current_account.user if current_account&.user + + if current_account + create_list :some_session, rand(1..3), account: current_account + end + + get '/settings/sessions' + end + + for_account_types nil do + specify do + expect(response).to have_http_status :forbidden + end + end + + for_account_types :usual, :personal, :superuser do + specify do + expect(response).to have_http_status :ok + end + end +end