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 @@
+
+
+
+
+ <%= Session.human_attribute_name :logged_at %>
+ |
+
+ <%= Session.human_attribute_name :ip_address %>
+ |
+
+
+
+
+ <% sessions.each do |session| %>
+
+ <%= localize session.logged_at, format: :long %> |
+ <%= session.ip_address %> |
+
+ <% end %>
+
+
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