evematic 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|