evematic 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/controllers/evematic/sessions_controller.rb +21 -0
- data/app/controllers/evematic/sso_callbacks_controller.rb +30 -0
- data/app/models/evematic/access_rule.rb +17 -0
- data/app/models/evematic/account.rb +12 -0
- data/app/models/evematic/application_record.rb +2 -4
- data/app/models/evematic/esi/alliance.rb +25 -0
- data/app/models/evematic/esi/character.rb +35 -0
- data/app/models/evematic/esi/corporation.rb +37 -0
- data/app/models/evematic/identity.rb +24 -0
- data/config/i18n-tasks.yml +5 -4
- data/config/locales/en.yml +13 -0
- data/lib/evematic/configuration/builder.rb +74 -0
- data/lib/evematic/configuration.rb +20 -0
- data/lib/evematic/controllers/helper.rb +7 -0
- data/lib/evematic/controllers/helpers/authentication.rb +90 -0
- data/lib/evematic/controllers.rb +2 -0
- data/lib/evematic/engine.rb +82 -8
- data/lib/evematic/esi/client.rb +89 -0
- data/lib/evematic/esi/helper.rb +43 -0
- data/lib/evematic/esi.rb +2 -0
- data/lib/evematic/jobs/helper.rb +3 -0
- data/lib/evematic/models/helper.rb +31 -0
- data/lib/evematic/models/mixins/access_rule.rb +43 -0
- data/lib/evematic/models/mixins/account.rb +38 -0
- data/lib/evematic/models/mixins/esi/alliance.rb +34 -0
- data/lib/evematic/models/mixins/esi/character.rb +41 -0
- data/lib/evematic/models/mixins/esi/corporation.rb +41 -0
- data/lib/evematic/models/mixins/esi/entity.rb +55 -0
- data/lib/evematic/models/mixins/esi.rb +2 -0
- data/lib/evematic/models/mixins/identity.rb +37 -0
- data/lib/evematic/models/mixins.rb +2 -0
- data/lib/evematic/models.rb +2 -0
- data/lib/evematic/routes/helper.rb +5 -0
- data/lib/evematic/routes/router.rb +10 -0
- data/lib/evematic/routes/routers/authentication.rb +14 -0
- data/lib/evematic/routes.rb +2 -0
- data/lib/evematic/version.rb +1 -1
- data/lib/evematic/views/helper.rb +2 -0
- data/lib/evematic/views.rb +2 -0
- data/lib/evematic.rb +37 -1
- metadata +182 -9
- data/config/locales/evematic.en.yml +0 -5
- data/config/routes.rb +0 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d16f6d328d5aea704d82573875c449e09f134461a20ff38625616b818a1b6015
|
4
|
+
data.tar.gz: c4d141a17d434effacde6518ad13b4e82811df234bf69110e114a347df825b83
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9ffdbb85c44a34add6302b1cb206e8ccc1015306e429240164b00c2fbb91b66570abad783fb31794f1f52f22f745f5cc1f529f1571cb9dfb614ed05b53c63fd9
|
7
|
+
data.tar.gz: 42e449b89c3bca4a2075974d0e40fa6e61fcb1b42756ae6f53f80146ef8f28d00158225829595f7875bd1660412fbc9f44813f8995ac3a3a0230bd401abb506f
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class Evematic::SessionsController < Evematic::ApplicationController
|
2
|
+
def new
|
3
|
+
redirect_to after_login_path if logged_in?
|
4
|
+
end
|
5
|
+
|
6
|
+
def destroy
|
7
|
+
log_out
|
8
|
+
redirect_to after_logout_path
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def auth_controller?
|
14
|
+
true
|
15
|
+
end
|
16
|
+
|
17
|
+
def log_out
|
18
|
+
session[:current_identity_id] = nil
|
19
|
+
session[:current_account_id] = nil
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class Evematic::SSOCallbacksController < Evematic::ApplicationController
|
2
|
+
def eve
|
3
|
+
auth = request.env["omniauth.auth"]
|
4
|
+
character = esi_character_model.find_or_create_by(id: auth.uid)
|
5
|
+
identity = identity_model.sso_authenticate_by(character)
|
6
|
+
if identity&.persisted?
|
7
|
+
log_in(identity)
|
8
|
+
redirect_to(stored_location || after_login_path)
|
9
|
+
else
|
10
|
+
flash[:error] = t(".forbidden", name: character.name)
|
11
|
+
redirect_to login_path
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def failure
|
16
|
+
flash.now[:error] = t(".not_authorized")
|
17
|
+
redirect_to login_path
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def auth_controller?
|
23
|
+
true
|
24
|
+
end
|
25
|
+
|
26
|
+
def log_in(identity)
|
27
|
+
session[:current_identity_id] = identity.id
|
28
|
+
session[:current_account_id] = identity.account_id
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# == Schema Information
|
2
|
+
#
|
3
|
+
# Table name: access_rules
|
4
|
+
#
|
5
|
+
# id :integer not null, primary key
|
6
|
+
# action :string default("deny"), not null
|
7
|
+
# principal_type :string not null
|
8
|
+
# created_at :datetime not null
|
9
|
+
# principal_id :integer not null
|
10
|
+
#
|
11
|
+
# Indexes
|
12
|
+
#
|
13
|
+
# index_access_rules_on_principal (principal_type,principal_id) UNIQUE
|
14
|
+
#
|
15
|
+
class Evematic::AccessRule < Evematic::ApplicationRecord
|
16
|
+
include Evematic::Models::Mixins::AccessRule
|
17
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# == Schema Information
|
2
|
+
#
|
3
|
+
# Table name: accounts
|
4
|
+
#
|
5
|
+
# id :integer not null, primary key
|
6
|
+
# admin :boolean
|
7
|
+
# created_at :datetime not null
|
8
|
+
# updated_at :datetime not null
|
9
|
+
#
|
10
|
+
class Evematic::Account < Evematic::ApplicationRecord
|
11
|
+
include Evematic::Models::Mixins::Account
|
12
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# == Schema Information
|
2
|
+
#
|
3
|
+
# Table name: esi_alliances
|
4
|
+
#
|
5
|
+
# id :integer not null, primary key
|
6
|
+
# date_founded :date not null
|
7
|
+
# esi_etag :string
|
8
|
+
# esi_expires_at :datetime
|
9
|
+
# esi_last_modified_at :datetime
|
10
|
+
# name :string not null
|
11
|
+
# ticker :string not null
|
12
|
+
# created_at :datetime not null
|
13
|
+
# updated_at :datetime not null
|
14
|
+
# creator_corporation_id :integer not null
|
15
|
+
# creator_id :integer not null
|
16
|
+
# executor_corporation_id :integer
|
17
|
+
# faction_id :integer
|
18
|
+
#
|
19
|
+
# Indexes
|
20
|
+
#
|
21
|
+
# index_esi_alliances_on_ticker (ticker) UNIQUE
|
22
|
+
#
|
23
|
+
class Evematic::ESI::Alliance < Evematic::ApplicationRecord
|
24
|
+
include Evematic::Models::Mixins::ESI::Alliance
|
25
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# == Schema Information
|
2
|
+
#
|
3
|
+
# Table name: esi_characters
|
4
|
+
#
|
5
|
+
# id :integer not null, primary key
|
6
|
+
# birthday :date not null
|
7
|
+
# description :text
|
8
|
+
# esi_etag :string
|
9
|
+
# esi_expires_at :datetime
|
10
|
+
# esi_last_modified_at :datetime
|
11
|
+
# gender :string not null
|
12
|
+
# name :string not null
|
13
|
+
# security_status :decimal(, )
|
14
|
+
# title :string
|
15
|
+
# created_at :datetime not null
|
16
|
+
# updated_at :datetime not null
|
17
|
+
# alliance_id :integer
|
18
|
+
# bloodline_id :integer not null
|
19
|
+
# corporation_id :integer not null
|
20
|
+
# faction_id :integer
|
21
|
+
# race_id :integer not null
|
22
|
+
#
|
23
|
+
# Indexes
|
24
|
+
#
|
25
|
+
# index_esi_characters_on_alliance_id (alliance_id)
|
26
|
+
# index_esi_characters_on_corporation_id (corporation_id)
|
27
|
+
#
|
28
|
+
# Foreign Keys
|
29
|
+
#
|
30
|
+
# alliance_id (alliance_id => esi_alliances.id)
|
31
|
+
# corporation_id (corporation_id => esi_corporations.id)
|
32
|
+
#
|
33
|
+
class Evematic::ESI::Character < Evematic::ApplicationRecord
|
34
|
+
include Evematic::Models::Mixins::ESI::Character
|
35
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# == Schema Information
|
2
|
+
#
|
3
|
+
# Table name: esi_corporations
|
4
|
+
#
|
5
|
+
# id :integer not null, primary key
|
6
|
+
# date_founded :date not null
|
7
|
+
# description :text
|
8
|
+
# esi_etag :string
|
9
|
+
# esi_expires_at :datetime
|
10
|
+
# esi_last_modified_at :datetime
|
11
|
+
# member_count :integer not null
|
12
|
+
# name :string not null
|
13
|
+
# shares :bigint
|
14
|
+
# tax_rate :decimal(, ) not null
|
15
|
+
# ticker :string not null
|
16
|
+
# url :string
|
17
|
+
# war_eligible :boolean
|
18
|
+
# created_at :datetime not null
|
19
|
+
# updated_at :datetime not null
|
20
|
+
# alliance_id :integer
|
21
|
+
# ceo_id :integer not null
|
22
|
+
# creator_id :integer not null
|
23
|
+
# faction_id :integer
|
24
|
+
# home_station_id :integer
|
25
|
+
#
|
26
|
+
# Indexes
|
27
|
+
#
|
28
|
+
# index_esi_corporations_on_alliance_id (alliance_id)
|
29
|
+
# index_esi_corporations_on_ticker (ticker) UNIQUE
|
30
|
+
#
|
31
|
+
# Foreign Keys
|
32
|
+
#
|
33
|
+
# alliance_id (alliance_id => esi_alliances.id)
|
34
|
+
#
|
35
|
+
class Evematic::ESI::Corporation < Evematic::ApplicationRecord
|
36
|
+
include Evematic::Models::Mixins::ESI::Corporation
|
37
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# == Schema Information
|
2
|
+
#
|
3
|
+
# Table name: identities
|
4
|
+
#
|
5
|
+
# id :integer not null, primary key
|
6
|
+
# main :boolean
|
7
|
+
# created_at :datetime not null
|
8
|
+
# updated_at :datetime not null
|
9
|
+
# account_id :integer not null
|
10
|
+
# character_id :integer not null
|
11
|
+
#
|
12
|
+
# Indexes
|
13
|
+
#
|
14
|
+
# index_identities_on_account_id_and_character_id (account_id,character_id) UNIQUE
|
15
|
+
# index_identities_on_account_id_and_main (account_id,main) UNIQUE
|
16
|
+
#
|
17
|
+
# Foreign Keys
|
18
|
+
#
|
19
|
+
# account_id (account_id => accounts.id)
|
20
|
+
# character_id (character_id => esi_characters.id)
|
21
|
+
#
|
22
|
+
class Evematic::Identity < Evematic::ApplicationRecord
|
23
|
+
include Evematic::Models::Mixins::Identity
|
24
|
+
end
|
data/config/i18n-tasks.yml
CHANGED
@@ -15,7 +15,7 @@ data:
|
|
15
15
|
|
16
16
|
# Locale files or `File.find` patterns where translations are read from:
|
17
17
|
read:
|
18
|
-
- config/locales
|
18
|
+
# - config/locales/{locale}.yml
|
19
19
|
## Default:
|
20
20
|
# - config/locales/%{locale}.yml
|
21
21
|
## More files:
|
@@ -54,8 +54,10 @@ data:
|
|
54
54
|
# Find translate calls
|
55
55
|
search:
|
56
56
|
## Paths or `File.find` patterns to search in:
|
57
|
-
|
58
|
-
|
57
|
+
paths:
|
58
|
+
- app/
|
59
|
+
- lib/evematic/controllers
|
60
|
+
- lib/evematic/views
|
59
61
|
|
60
62
|
## Root directories for relative keys resolution.
|
61
63
|
# relative_roots:
|
@@ -119,7 +121,6 @@ search:
|
|
119
121
|
|
120
122
|
## Consider these keys used:
|
121
123
|
ignore_unused:
|
122
|
-
- evematic.engine.name
|
123
124
|
# - 'activerecord.attributes.*'
|
124
125
|
# - '{devise,kaminari,will_paginate}.*'
|
125
126
|
# - 'simple_form.{yes,no}'
|
@@ -0,0 +1,13 @@
|
|
1
|
+
---
|
2
|
+
en:
|
3
|
+
evematic:
|
4
|
+
errors:
|
5
|
+
login_required: You need to log in to do that.
|
6
|
+
sessions:
|
7
|
+
new:
|
8
|
+
login_button_label: Log in with EVE Online SSO
|
9
|
+
sso_callbacks:
|
10
|
+
eve:
|
11
|
+
forbidden: "%{name} is not authorized to log in."
|
12
|
+
failure:
|
13
|
+
not_authorized: Character is not authorized to log in.
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require "dry-configurable"
|
2
|
+
|
3
|
+
class Evematic::Configuration::Builder
|
4
|
+
include Dry::Configurable
|
5
|
+
|
6
|
+
delegate_missing_to :config
|
7
|
+
|
8
|
+
setting :authentication_enabled, default: true
|
9
|
+
|
10
|
+
setting :esi_base_url, default: "https://esi.evetech.net"
|
11
|
+
setting :esi_client_id, default: -> { ENV.fetch("ESI_CLIENT_ID") }
|
12
|
+
setting :esi_client_secret, default: -> { ENV.fetch("ESI_CLIENT_SECRET") }
|
13
|
+
setting :esi_detailed_logging, default: false
|
14
|
+
setting :esi_retry_options, default: {}
|
15
|
+
setting :esi_user_agent, default: "Evematic/1.0 (+https://evematic.dev)"
|
16
|
+
|
17
|
+
setting :esi_alliance_class, default: "Evematic::ESI::Alliance"
|
18
|
+
setting :esi_alliances_table, default: "esi_alliances"
|
19
|
+
|
20
|
+
setting :esi_character_class, default: "Evematic::ESI::Character"
|
21
|
+
setting :esi_characters_table, default: "esi_characters"
|
22
|
+
|
23
|
+
setting :esi_corporation_class, default: "Evematic::ESI::Corporation"
|
24
|
+
setting :esi_corporations_table, default: "esi_corporations"
|
25
|
+
|
26
|
+
setting :access_rule_class, default: "Evematic::AccessRule"
|
27
|
+
setting :access_rules_table, default: "access_rules"
|
28
|
+
|
29
|
+
setting :account_class, default: "Evematic::Account"
|
30
|
+
setting :accounts_table, default: "accounts"
|
31
|
+
|
32
|
+
setting :identity_class, default: "Evematic::Identity"
|
33
|
+
setting :identities_table, default: "identities"
|
34
|
+
|
35
|
+
setting :after_login_path, default: -> { root_path }
|
36
|
+
setting :after_logout_path, default: -> { root_path }
|
37
|
+
|
38
|
+
def clear_cache!
|
39
|
+
%i[
|
40
|
+
access_rule_model
|
41
|
+
account_model
|
42
|
+
esi_alliance_model
|
43
|
+
esi_character_model
|
44
|
+
esi_corporation_model
|
45
|
+
identity_model
|
46
|
+
].each do |var|
|
47
|
+
remove_instance_variable("@#{var}") if instance_variable_defined?("@#{var}")
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def esi_alliance_model
|
52
|
+
@esi_alliance_model ||= config.esi_alliance_class.safe_constantize
|
53
|
+
end
|
54
|
+
|
55
|
+
def esi_character_model
|
56
|
+
@esi_character_model ||= config.esi_character_class.safe_constantize
|
57
|
+
end
|
58
|
+
|
59
|
+
def esi_corporation_model
|
60
|
+
@esi_corporation_model ||= config.esi_corporation_class.safe_constantize
|
61
|
+
end
|
62
|
+
|
63
|
+
def access_rule_model
|
64
|
+
@access_rule_model ||= config.access_rule_class.safe_constantize
|
65
|
+
end
|
66
|
+
|
67
|
+
def account_model
|
68
|
+
@account_model ||= config.account_class.safe_constantize
|
69
|
+
end
|
70
|
+
|
71
|
+
def identity_model
|
72
|
+
@identity_model ||= config.identity_class.safe_constantize
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Evematic
|
2
|
+
module Configuration
|
3
|
+
require "evematic/configuration/builder"
|
4
|
+
end
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def configuration_builder
|
8
|
+
@configuration_builder ||= Evematic::Configuration::Builder.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def configuration
|
12
|
+
configuration_builder
|
13
|
+
end
|
14
|
+
alias_method :config, :configuration
|
15
|
+
|
16
|
+
def configure(&block)
|
17
|
+
configuration_builder.configure(&block)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
module Evematic::Controllers::Helpers::Authentication
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
|
4
|
+
included do
|
5
|
+
helper_method :logged_in?, :current_account, :current_identity
|
6
|
+
end
|
7
|
+
|
8
|
+
def require_login!
|
9
|
+
return true if current_identity
|
10
|
+
|
11
|
+
flash[:error] = t("evematic.errors.login_required")
|
12
|
+
store_location(request.fullpath)
|
13
|
+
redirect_to login_path
|
14
|
+
end
|
15
|
+
|
16
|
+
def require_admin!
|
17
|
+
not_found unless current_account&.admin?
|
18
|
+
end
|
19
|
+
|
20
|
+
def logged_in?
|
21
|
+
current_identity_id.present?
|
22
|
+
end
|
23
|
+
|
24
|
+
def current_account_id
|
25
|
+
session[:current_account_id]
|
26
|
+
end
|
27
|
+
|
28
|
+
def current_account
|
29
|
+
@current_account ||= account_model.find_by(id: current_account_id)
|
30
|
+
end
|
31
|
+
|
32
|
+
def current_identity_id
|
33
|
+
session[:current_identity_id]
|
34
|
+
end
|
35
|
+
|
36
|
+
def current_identity
|
37
|
+
@current_identity ||= identity_model.includes(:character, :corporation, :alliance).find_by(id: current_identity_id)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Helper methods taken from Devise
|
41
|
+
# https://github.com/heartcombo/devise/blob/main/lib/devise/controllers/store_location.rb
|
42
|
+
|
43
|
+
def storable_location?
|
44
|
+
request.get? && request.format.to_sym == :html && !auth_controller? && !request.xhr?
|
45
|
+
end
|
46
|
+
|
47
|
+
def store_location(location)
|
48
|
+
path = extract_path_from_location(location)
|
49
|
+
session["return_to"] = path if path
|
50
|
+
end
|
51
|
+
|
52
|
+
def stored_location
|
53
|
+
if request.format.to_sym == :html
|
54
|
+
session.delete("return_to")
|
55
|
+
else
|
56
|
+
session["return_to"]
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def parse_uri(location)
|
61
|
+
location && URI.parse(location)
|
62
|
+
rescue URI::InvalidURIError
|
63
|
+
nil
|
64
|
+
end
|
65
|
+
|
66
|
+
def extract_path_from_location(location)
|
67
|
+
uri = parse_uri(location)
|
68
|
+
|
69
|
+
if uri
|
70
|
+
path = remove_domain_from_uri(uri)
|
71
|
+
add_fragment_back_to_path(uri, path)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def remove_domain_from_uri(uri)
|
76
|
+
[uri.path.sub(/\A\/+/, "/"), uri.query].compact.join("?")
|
77
|
+
end
|
78
|
+
|
79
|
+
def add_fragment_back_to_path(uri, path)
|
80
|
+
[path, uri.fragment].compact.join("#")
|
81
|
+
end
|
82
|
+
|
83
|
+
def after_login_path
|
84
|
+
root_path
|
85
|
+
end
|
86
|
+
|
87
|
+
def after_logout_path
|
88
|
+
root_path
|
89
|
+
end
|
90
|
+
end
|
data/lib/evematic/engine.rb
CHANGED
@@ -1,15 +1,34 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
require "rails"
|
2
|
+
require "omniauth"
|
3
|
+
require "omniauth/strategies/eve_online"
|
4
|
+
require "omniauth/rails_csrf_protection"
|
5
|
+
require "turbo-rails"
|
6
|
+
|
7
|
+
require "evematic/configuration"
|
8
|
+
require "evematic/esi"
|
9
|
+
require "evematic/models"
|
10
|
+
|
11
|
+
OmniAuth::Strategies::EVEOnline.class_eval do
|
12
|
+
# Hack to allow passing scope as a query parameter to /auth/eve
|
13
|
+
def callback_url
|
14
|
+
full_host + callback_path
|
15
|
+
end
|
3
16
|
end
|
4
17
|
|
5
18
|
class Evematic::Engine < ::Rails::Engine
|
6
|
-
|
19
|
+
config.evematic = Evematic.config
|
7
20
|
|
8
|
-
config.
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
21
|
+
config.to_prepare do
|
22
|
+
Evematic.setup
|
23
|
+
end
|
24
|
+
|
25
|
+
initializer "evematic.assets" do
|
26
|
+
config.middleware.use(
|
27
|
+
Rack::Static,
|
28
|
+
urls: ["evematic"],
|
29
|
+
root: Evematic::Engine.root.join("public")
|
30
|
+
)
|
31
|
+
end
|
13
32
|
|
14
33
|
initializer "evematic.inflections" do
|
15
34
|
ActiveSupport::Inflector.inflections(:en) do |inflect|
|
@@ -22,4 +41,59 @@ class Evematic::Engine < ::Rails::Engine
|
|
22
41
|
inflect.acronym "UI"
|
23
42
|
end
|
24
43
|
end
|
44
|
+
|
45
|
+
initializer "evematic.routes" do
|
46
|
+
ActionDispatch::Routing::Mapper.include Evematic::Routes::Helper
|
47
|
+
end
|
48
|
+
|
49
|
+
initializer "evematic.action_controller" do
|
50
|
+
ActiveSupport.on_load(:action_controller) do
|
51
|
+
include Evematic::Models::Helper
|
52
|
+
include Evematic::Controllers::Helper
|
53
|
+
include Evematic::Controllers::Helpers::Authentication if Evematic.config.authentication_enabled
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
initializer "evematic.action_view" do
|
58
|
+
ActiveSupport.on_load(:action_view) do
|
59
|
+
include Evematic::Models::Helper
|
60
|
+
include Evematic::Views::Helper
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
initializer "evematic.active_job" do
|
65
|
+
ActiveSupport.on_load(:active_job) do
|
66
|
+
include Evematic::Models::Helper
|
67
|
+
include Evematic::Jobs::Helper
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
initializer "evematic.active_record" do
|
72
|
+
ActiveSupport.on_load(:active_record) do
|
73
|
+
include Evematic::Models::Helper
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
initializer "evematic.i18n" do |app|
|
78
|
+
app.config.i18n.raise_on_missing_translations = true if Rails.env.local?
|
79
|
+
end
|
80
|
+
|
81
|
+
initializer "evematic.omniauth" do |app|
|
82
|
+
next unless Evematic.config.authentication_enabled
|
83
|
+
|
84
|
+
OmniAuth.config.logger = Rails.logger
|
85
|
+
|
86
|
+
app.middleware.use OmniAuth::Builder do
|
87
|
+
provider OmniAuth::Strategies::EVEOnline,
|
88
|
+
name: :eve,
|
89
|
+
setup: lambda { |env|
|
90
|
+
req = Rack::Request.new(env)
|
91
|
+
env["omniauth.strategy"].tap do |strategy|
|
92
|
+
strategy.options[:client_id] = Evematic.config.esi_client_id
|
93
|
+
strategy.options[:client_secret] = Evematic.config.esi_client_secret
|
94
|
+
strategy.options[:scope] = req.params["scope"]
|
95
|
+
end
|
96
|
+
}
|
97
|
+
end
|
98
|
+
end
|
25
99
|
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require "dry-initializer"
|
2
|
+
require "faraday"
|
3
|
+
require "faraday/detailed_logger"
|
4
|
+
require "faraday/http_cache"
|
5
|
+
require "faraday/retry"
|
6
|
+
require "faraday/typhoeus"
|
7
|
+
|
8
|
+
class Evematic::ESI::Client
|
9
|
+
extend Dry::Initializer
|
10
|
+
|
11
|
+
option :base_url, default: -> { Evematic.config.esi_base_url }
|
12
|
+
option :cache, default: -> { Rails.cache }
|
13
|
+
option :detailed_logging, default: -> { Evematic.config.esi_detailed_logging }
|
14
|
+
option :logger, default: -> { Rails.logger }
|
15
|
+
option :instrumenter, default: -> { ActiveSupport::Notifications }
|
16
|
+
option :user_agent, default: -> { Evematic.config.esi_user_agent }
|
17
|
+
|
18
|
+
def delete(path, body: nil, params: {}, token: nil)
|
19
|
+
json_encoded.delete(path) do |req|
|
20
|
+
req.body = body
|
21
|
+
req.params = params
|
22
|
+
req.headers = default_headers
|
23
|
+
req.headers = headers(token)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def get(path, params: {}, token: nil)
|
28
|
+
url_encoded.get(path) do |req|
|
29
|
+
req.params = params
|
30
|
+
req.headers = headers(token)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def post(path, body: nil, params: {}, token: nil)
|
35
|
+
json_encoded.post(path) do |req|
|
36
|
+
req.body = body
|
37
|
+
req.params = params
|
38
|
+
req.headers = headers(token)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def put(path, body: nil, params: {}, token: nil)
|
43
|
+
json_encoded.put(path) do |req|
|
44
|
+
req.body = body
|
45
|
+
req.params = params
|
46
|
+
req.headers = headers(token)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def headers(token)
|
53
|
+
h = default_headers
|
54
|
+
h[:authorization] = authorization_header(token) if token
|
55
|
+
h
|
56
|
+
end
|
57
|
+
|
58
|
+
def default_headers
|
59
|
+
{user_agent: user_agent.strip}
|
60
|
+
end
|
61
|
+
|
62
|
+
def authorization_header(token)
|
63
|
+
"Authorization: Bearer #{token}"
|
64
|
+
end
|
65
|
+
|
66
|
+
def url_encoded
|
67
|
+
@url_encoded ||= Faraday.new(url: base_url) do |conn|
|
68
|
+
conn.use(:http_cache, store: cache, logger:, instrumenter:)
|
69
|
+
conn.request :url_encoded
|
70
|
+
conn.request :retry, retry_options
|
71
|
+
conn.response :detailed_logger, logger if detailed_logging
|
72
|
+
conn.adapter :typhoeus
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def json_encoded
|
77
|
+
@json_encoded ||= Faraday.new(url: base_url) do |conn|
|
78
|
+
conn.use(:http_cache, store: cache, logger:, instrumenter:)
|
79
|
+
conn.request :json
|
80
|
+
conn.request :retry, retry_options
|
81
|
+
conn.response :detailed_logger, logger if detailed_logging
|
82
|
+
conn.adapter :typhoeus
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def retry_options
|
87
|
+
@retry_options ||= Evematic.config.esi_retry_options.to_h.merge(retry_statuses: [503, 504])
|
88
|
+
end
|
89
|
+
end
|