arkaan 1.10.0 → 2.0.0
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/lib/arkaan.rb +0 -2
- data/lib/arkaan/account.rb +0 -3
- data/lib/arkaan/version.rb +1 -1
- metadata +2 -18
- data/lib/arkaan/decorators.rb +0 -8
- data/lib/arkaan/phone.rb +0 -24
- data/lib/arkaan/specs.rb +0 -89
- data/lib/arkaan/utils.rb +0 -10
- data/lib/arkaan/utils/controllers.rb +0 -8
- data/lib/arkaan/utils/controllers/base.rb +0 -215
- data/lib/arkaan/utils/controllers/checked.rb +0 -21
- data/lib/arkaan/utils/errors.rb +0 -12
- data/lib/arkaan/utils/errors/bad_request.rb +0 -14
- data/lib/arkaan/utils/errors/forbidden.rb +0 -14
- data/lib/arkaan/utils/errors/http_error.rb +0 -30
- data/lib/arkaan/utils/errors/not_found.rb +0 -14
- data/lib/arkaan/utils/loaders.rb +0 -7
- data/lib/arkaan/utils/loaders/heroku.rb +0 -20
- data/lib/arkaan/utils/micro_service.rb +0 -170
- data/lib/arkaan/utils/seeder.rb +0 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: edf2d8ccd56f2083589f47086566a40400b98295249d3b2cefe0dc980584cb86
|
4
|
+
data.tar.gz: 1c27bc8b6fae7cec149f26f89ec9265892ff29d09e51a4b346cc57e2b171e6f1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 063cde9a9b391fcea46b43829e251c25649f98e063fa8344294b15168b5d0c90b63248e4102d503e19a6624cd082023a5ed279d95fb679c315eaeb4fed6525b2
|
7
|
+
data.tar.gz: ee49a9fda2912e8efc873207914aec9e61c575290d742012458d86dfa75ec50b1631a3a65a4fb87d262ecb6bcecdd405204bdb5798de0cd086a244493dd2f897
|
data/lib/arkaan.rb
CHANGED
@@ -17,7 +17,6 @@ module Arkaan
|
|
17
17
|
autoload :Campaign , 'arkaan/campaign'
|
18
18
|
autoload :Campaigns , 'arkaan/campaigns'
|
19
19
|
autoload :Concerns , 'arkaan/concerns'
|
20
|
-
autoload :Decorators , 'arkaan/decorators'
|
21
20
|
autoload :Factories , 'arkaan/factories'
|
22
21
|
autoload :Monitoring , 'arkaan/monitoring'
|
23
22
|
autoload :Notification , 'arkaan/notification'
|
@@ -25,5 +24,4 @@ module Arkaan
|
|
25
24
|
autoload :Permissions , 'arkaan/permissions'
|
26
25
|
autoload :Phone , 'arkaan/phone'
|
27
26
|
autoload :Ruleset , 'arkaan/ruleset'
|
28
|
-
autoload :Utils , 'arkaan/utils'
|
29
27
|
end
|
data/lib/arkaan/account.rb
CHANGED
@@ -61,9 +61,6 @@ module Arkaan
|
|
61
61
|
# @return [Array<Arkaan::Monitoring::Websocket>] the websockets created by the owner of this account.
|
62
62
|
has_many :websockets, class_name: 'Arkaan::Monitoring::Websocket', inverse_of: :creator
|
63
63
|
|
64
|
-
# @!attribute [rw] phones
|
65
|
-
# @return [Array<Arkaan::Phone>] the phone numbers given by the user.
|
66
|
-
embeds_many :phones, class_name: 'Arkaan::Phone', inverse_of: :account
|
67
64
|
# @!attribute [rw] notifications
|
68
65
|
# @return [Array<Arkaan::Notification>] the notifications linked to this user.
|
69
66
|
embeds_many :notifications, class_name: 'Arkaan::Notification', inverse_of: :account
|
data/lib/arkaan/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: arkaan
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vincent Courtois
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-12-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -319,7 +319,6 @@ files:
|
|
319
319
|
- lib/arkaan/concerns/premiumable.rb
|
320
320
|
- lib/arkaan/concerns/sluggable.rb
|
321
321
|
- lib/arkaan/concerns/typable.rb
|
322
|
-
- lib/arkaan/decorators.rb
|
323
322
|
- lib/arkaan/decorators/errors.rb
|
324
323
|
- lib/arkaan/decorators/errors/env_variable_missing.rb
|
325
324
|
- lib/arkaan/decorators/gateway.rb
|
@@ -348,22 +347,7 @@ files:
|
|
348
347
|
- lib/arkaan/permissions/category.rb
|
349
348
|
- lib/arkaan/permissions/group.rb
|
350
349
|
- lib/arkaan/permissions/right.rb
|
351
|
-
- lib/arkaan/phone.rb
|
352
350
|
- lib/arkaan/ruleset.rb
|
353
|
-
- lib/arkaan/specs.rb
|
354
|
-
- lib/arkaan/utils.rb
|
355
|
-
- lib/arkaan/utils/controllers.rb
|
356
|
-
- lib/arkaan/utils/controllers/base.rb
|
357
|
-
- lib/arkaan/utils/controllers/checked.rb
|
358
|
-
- lib/arkaan/utils/errors.rb
|
359
|
-
- lib/arkaan/utils/errors/bad_request.rb
|
360
|
-
- lib/arkaan/utils/errors/forbidden.rb
|
361
|
-
- lib/arkaan/utils/errors/http_error.rb
|
362
|
-
- lib/arkaan/utils/errors/not_found.rb
|
363
|
-
- lib/arkaan/utils/loaders.rb
|
364
|
-
- lib/arkaan/utils/loaders/heroku.rb
|
365
|
-
- lib/arkaan/utils/micro_service.rb
|
366
|
-
- lib/arkaan/utils/seeder.rb
|
367
351
|
- lib/arkaan/version.rb
|
368
352
|
homepage: https://rubygems.org/gems/arkaan
|
369
353
|
licenses:
|
data/lib/arkaan/decorators.rb
DELETED
@@ -1,8 +0,0 @@
|
|
1
|
-
module Arkaan
|
2
|
-
# Decorators are used to enrich the features of the model classes without making it too big.
|
3
|
-
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
4
|
-
module Decorators
|
5
|
-
autoload :Gateway, 'arkaan/decorators/gateway'
|
6
|
-
autoload :Errors , 'arkaan/decorators/errors'
|
7
|
-
end
|
8
|
-
end
|
data/lib/arkaan/phone.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
module Arkaan
|
2
|
-
# A phone number is given by a user so that the persons he has selected can have it to contact him.
|
3
|
-
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
4
|
-
class Phone
|
5
|
-
include Mongoid::Document
|
6
|
-
include Mongoid::Timestamps
|
7
|
-
include Arkaan::Concerns::Enumerable
|
8
|
-
|
9
|
-
# @!attribute [rw] privacy
|
10
|
-
# @return [Symbol] the level of privacy you want for this phone number.
|
11
|
-
enum_field :privacy, [:players, :public, :private], default: :private
|
12
|
-
# @!attribute [rw] number
|
13
|
-
# @return [Integer] the phone number the user has given.
|
14
|
-
field :number, type: String
|
15
|
-
|
16
|
-
# @!attribute [rw] account
|
17
|
-
# @return [Arkaan::Account] the account the phone number is associated to.
|
18
|
-
embedded_in :account, class_name: 'Arkaan::Account', inverse_of: :phones
|
19
|
-
|
20
|
-
validates :number,
|
21
|
-
presence: {message: 'required'},
|
22
|
-
format: {with: /\A[0-9\-\._\/]+\z/, message: 'pattern'}
|
23
|
-
end
|
24
|
-
end
|
data/lib/arkaan/specs.rb
DELETED
@@ -1,89 +0,0 @@
|
|
1
|
-
module Arkaan
|
2
|
-
# This module holds all the logic for the specs tools for all micro services (shared examples and other things).
|
3
|
-
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
4
|
-
module Specs
|
5
|
-
|
6
|
-
# Includes all the shared examples you could need, describing the basic behaviour of a route.
|
7
|
-
def self.include_shared_examples
|
8
|
-
RSpec.shared_examples 'a route' do |_verb, _path|
|
9
|
-
let(:verb) { _verb }
|
10
|
-
let(:path) { _path }
|
11
|
-
|
12
|
-
def do_request(parameters)
|
13
|
-
public_send verb.to_sym, path, ['get', 'delete'].include?(verb) ? parameters : parameters.to_json
|
14
|
-
end
|
15
|
-
|
16
|
-
describe 'common errors' do
|
17
|
-
describe 'bad request errors' do
|
18
|
-
describe 'no token error' do
|
19
|
-
before do
|
20
|
-
do_request({app_key: 'test_key'})
|
21
|
-
end
|
22
|
-
it 'Raises a bad request (400) error when the parameters don\'t contain the token of the gateway' do
|
23
|
-
expect(last_response.status).to be 400
|
24
|
-
end
|
25
|
-
it 'returns the correct response if the parameters do not contain a gateway token' do
|
26
|
-
expect(JSON.parse(last_response.body)).to eq({
|
27
|
-
'status' => 400,
|
28
|
-
'field' => 'token',
|
29
|
-
'error' => 'required',
|
30
|
-
'docs' => 'https://github.com/jdr-tools/wiki/wiki/Common-errors#gateway-token-not-given'
|
31
|
-
})
|
32
|
-
end
|
33
|
-
end
|
34
|
-
describe 'no application key error' do
|
35
|
-
before do
|
36
|
-
do_request({token: 'test_token'})
|
37
|
-
end
|
38
|
-
it 'Raises a bad request (400) error when the parameters don\'t contain the application key' do
|
39
|
-
expect(last_response.status).to be 400
|
40
|
-
end
|
41
|
-
it 'returns the correct response if the parameters do not contain a application key' do
|
42
|
-
expect(JSON.parse(last_response.body)).to eq({
|
43
|
-
'status' => 400,
|
44
|
-
'field' => 'app_key',
|
45
|
-
'error' => 'required',
|
46
|
-
'docs' => 'https://github.com/jdr-tools/wiki/wiki/Common-errors#application-key-not-given'
|
47
|
-
})
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
describe 'not_found errors' do
|
52
|
-
describe 'application not found' do
|
53
|
-
before do
|
54
|
-
do_request({token: 'test_token', app_key: 'another_key'})
|
55
|
-
end
|
56
|
-
it 'Raises a not found (404) error when the key doesn\'t belong to any application' do
|
57
|
-
expect(last_response.status).to be 404
|
58
|
-
end
|
59
|
-
it 'returns the correct body when the application doesn\'t exist' do
|
60
|
-
expect(JSON.parse(last_response.body)).to eq({
|
61
|
-
'status' => 404,
|
62
|
-
'field' => 'app_key',
|
63
|
-
'error' => 'unknown',
|
64
|
-
'docs' => 'https://github.com/jdr-tools/wiki/wiki/Common-errors#application-key-not-found'
|
65
|
-
})
|
66
|
-
end
|
67
|
-
end
|
68
|
-
describe 'gateway not found' do
|
69
|
-
before do
|
70
|
-
do_request({token: 'other_token', app_key: 'test_key'})
|
71
|
-
end
|
72
|
-
it 'Raises a not found (404) error when the gateway does\'nt exist' do
|
73
|
-
expect(last_response.status).to be 404
|
74
|
-
end
|
75
|
-
it 'returns the correct body when the gateway doesn\'t exist' do
|
76
|
-
expect(JSON.parse(last_response.body)).to eq({
|
77
|
-
'status' => 404,
|
78
|
-
'field' => 'token',
|
79
|
-
'error' => 'unknown',
|
80
|
-
'docs' => 'https://github.com/jdr-tools/wiki/wiki/Common-errors#gateway-token-not-found'
|
81
|
-
})
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
data/lib/arkaan/utils.rb
DELETED
@@ -1,10 +0,0 @@
|
|
1
|
-
module Arkaan
|
2
|
-
# Utility classes for the different micro-services of the suite.
|
3
|
-
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
4
|
-
module Utils
|
5
|
-
autoload :Controllers , 'arkaan/utils/controllers'
|
6
|
-
autoload :Errors , 'arkaan/utils/errors'
|
7
|
-
autoload :Loaders , 'arkaan/utils/loaders'
|
8
|
-
autoload :MicroService, 'arkaan/utils/micro_service'
|
9
|
-
end
|
10
|
-
end
|
@@ -1,215 +0,0 @@
|
|
1
|
-
module Arkaan
|
2
|
-
module Utils
|
3
|
-
module Controllers
|
4
|
-
# Base controller to handle the standard error when accessing the API.
|
5
|
-
# @author Vincent Courtois <courtois.vincenet@outlook.com>
|
6
|
-
class Base < Sinatra::Base
|
7
|
-
register Sinatra::ConfigFile
|
8
|
-
helpers Sinatra::CustomLogger
|
9
|
-
|
10
|
-
configure do
|
11
|
-
set :logger, Logger.new(STDOUT)
|
12
|
-
logger.level = Logger::ERROR if ENV['RACK_ENV'] == 'test'
|
13
|
-
end
|
14
|
-
|
15
|
-
# Creates a premium route whithin the Sinatra application, and registers it in the database if it does not already exists.
|
16
|
-
# @param verb [String] the HTTP method used to create this route.
|
17
|
-
# @param path [String] the path, beginning with a /, of the route to create.
|
18
|
-
def self.declare_route(verb, path, options: {}, &block)
|
19
|
-
self.declare_route_with(verb, path, false, options, &block)
|
20
|
-
end
|
21
|
-
|
22
|
-
# Creates a non premium route whithin the Sinatra application, and registers it in the database if it does not already exists.
|
23
|
-
# @param verb [String] the HTTP method used to create this route.
|
24
|
-
# @param path [String] the path, beginning with a /, of the route to create.
|
25
|
-
def self.declare_premium_route(verb, path, options: {}, &block)
|
26
|
-
self.declare_route_with(verb, path, true, options, &block)
|
27
|
-
end
|
28
|
-
|
29
|
-
# Declares the status route of the service, used by the Vigilante to check its status
|
30
|
-
# @param path [String] the path used to map the route on.
|
31
|
-
def self.declare_status_route(path = '/status')
|
32
|
-
self.declare_route_with('get', path, false, { authanticated: false }) do
|
33
|
-
if params['token'].nil?
|
34
|
-
custom_error 400, 'vigilante.token.required'
|
35
|
-
elsif Arkaan::Monitoring::Vigilante.where(token: params[:token]).first.nil?
|
36
|
-
custom_error 404, 'vigilante.token.unknown'
|
37
|
-
end
|
38
|
-
service = Arkaan::Utils::MicroService.instance.service
|
39
|
-
informations = {
|
40
|
-
key: service.key,
|
41
|
-
path: service.path,
|
42
|
-
health: 'ok'
|
43
|
-
}
|
44
|
-
halt 200, informations.to_json
|
45
|
-
end
|
46
|
-
Arkaan::Utils::MicroService.instance.service.update_attribute(:diagnostic, path)
|
47
|
-
end
|
48
|
-
|
49
|
-
# Creates a route whithin the Sinatra application, and registers it in the database if it does not already exists.
|
50
|
-
# @param verb [String] the HTTP method used to create this route.
|
51
|
-
# @param path [String] the path, beginning with a /, of the route to create.
|
52
|
-
# @param premium [Boolean] TRUE to make the route premium, FALSE otherwise.
|
53
|
-
def self.declare_route_with(verb, path, premium, options, &block)
|
54
|
-
service = Arkaan::Utils::MicroService.instance.service
|
55
|
-
complete_path = "#{Arkaan::Utils::MicroService.instance.path}#{path == '/' ? '' : path}"
|
56
|
-
|
57
|
-
unless service.nil? || !service.routes.where(path: path, verb: verb).first.nil?
|
58
|
-
route = Arkaan::Monitoring::Route.create(path: path, verb: verb, premium: premium, service: service)
|
59
|
-
if !options.nil? && !options[:authenticated].nil?
|
60
|
-
route.update_attribute(:authenticated, false)
|
61
|
-
end
|
62
|
-
Arkaan::Permissions::Group.where(is_superuser: true).each do |group|
|
63
|
-
group.routes << route
|
64
|
-
group.save!
|
65
|
-
end
|
66
|
-
end
|
67
|
-
if premium
|
68
|
-
self.public_send(verb, complete_path) do
|
69
|
-
@sinatra_route = parse_current_route
|
70
|
-
if !@application.premium?
|
71
|
-
custom_error(403, 'common.app_key.forbidden')
|
72
|
-
end
|
73
|
-
instance_eval(&block)
|
74
|
-
end
|
75
|
-
else
|
76
|
-
self.public_send(verb, complete_path, &block)
|
77
|
-
end
|
78
|
-
complete_path
|
79
|
-
end
|
80
|
-
|
81
|
-
# Loads the errors configuration file from the config folder.
|
82
|
-
# @param file [String] send __FILE__
|
83
|
-
def self.load_errors_from(file)
|
84
|
-
config_file File.join(File.dirname(file), '..', 'config', 'errors.yml')
|
85
|
-
end
|
86
|
-
|
87
|
-
def before_checks
|
88
|
-
add_body_to_params
|
89
|
-
|
90
|
-
check_presence('token', 'app_key', route: 'common')
|
91
|
-
|
92
|
-
gateway = Arkaan::Monitoring::Gateway.where(token: params['token']).first
|
93
|
-
@application = Arkaan::OAuth::Application.where(key: params['app_key']).first
|
94
|
-
|
95
|
-
if gateway.nil?
|
96
|
-
custom_error(404, 'common.token.unknown')
|
97
|
-
elsif @application.nil?
|
98
|
-
custom_error(404, 'common.app_key.unknown')
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
# Checks the presence of several fields given as parameters and halts the execution if it's not present.
|
103
|
-
# @param fields [Array<String>] an array of fields names to search in the parameters
|
104
|
-
# @param route [String] the name of the route you're requiring to put in the error message.
|
105
|
-
def check_presence(*fields, route:)
|
106
|
-
fields.each do |field|
|
107
|
-
custom_error(400, "#{route}.#{field}.required") if params[field].nil? || params[field] == ''
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
# Checks the presence of either fields given in parameters. It halts with an error only if ALL parameters are not given.
|
112
|
-
# @param fields [Array<String>] an array of fields names to search in the parameters
|
113
|
-
# @param route [String] the name of the route you're requiring to put in the error message.
|
114
|
-
# @param key [String] the key to search in the errors configuration file.
|
115
|
-
def check_either_presence(*fields, route:, key:)
|
116
|
-
fields.each do |field|
|
117
|
-
return true if !params[field].nil? && params[field] != ''
|
118
|
-
end
|
119
|
-
custom_error 400, "#{route}.#{key}.required"
|
120
|
-
end
|
121
|
-
|
122
|
-
# Checks if the session ID is given in the parameters and if the session exists.
|
123
|
-
# @param action [String] the action used to get the errors from the errors file.
|
124
|
-
# @return [Arkaan::Authentication::Session] the session when it exists.
|
125
|
-
def check_session(action)
|
126
|
-
check_presence('session_id', route: action)
|
127
|
-
session = Arkaan::Authentication::Session.where(token: params['session_id']).first
|
128
|
-
if session.nil?
|
129
|
-
custom_error(404, "#{action}.session_id.unknown")
|
130
|
-
end
|
131
|
-
return session
|
132
|
-
end
|
133
|
-
|
134
|
-
def check_application(action)
|
135
|
-
check_presence('app_key', route: action)
|
136
|
-
application = Arkaan::OAuth::Application.where(key: params['app_key']).first
|
137
|
-
custom_error(404, "#{action}.app_key.unknown") if application.nil?
|
138
|
-
return application
|
139
|
-
end
|
140
|
-
|
141
|
-
# Adds the parsed body to the parameters, overwriting the parameters of the querystring with the values
|
142
|
-
# of the SON body if they have similar keys.
|
143
|
-
def add_body_to_params
|
144
|
-
if request.body.respond_to?(:rewind) && request.body.respond_to?(:read)
|
145
|
-
request.body.rewind
|
146
|
-
parsed_body = JSON.parse(request.body.read.to_s) rescue {}
|
147
|
-
parsed_body.keys.each do |key|
|
148
|
-
params[key] = parsed_body[key]
|
149
|
-
end
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
# Gets the current route in the database from the sinatra route.
|
154
|
-
# @return [Arkaan::Monitoring::Route] the route declared in the services registry.
|
155
|
-
def parse_current_route
|
156
|
-
splitted = request.env['sinatra.route'].split(' ')
|
157
|
-
return Arkaan::Monitoring::Route.where(verb: splitted.first.downcase, path: splitted.last).first
|
158
|
-
end
|
159
|
-
|
160
|
-
# Halts the application and creates the returned body from the parameters and the errors config file.
|
161
|
-
# @param status [Integer] the HTTP status to halt the application with.
|
162
|
-
# @param path [String] the path in the configuration file to access the URL.
|
163
|
-
def custom_error(status, path)
|
164
|
-
route, field, error = path.split('.')
|
165
|
-
docs = settings.errors[route][field][error] rescue ''
|
166
|
-
halt status, {status: status, field: field, error: error, docs: docs}.to_json
|
167
|
-
end
|
168
|
-
|
169
|
-
# Halts the application with a Bad Request error affecting a field of a model.
|
170
|
-
# @param instance [Mongoid::Document] the document having a field in error.
|
171
|
-
# @param route [String] the type of action you're currently doing (e.g: 'creation')
|
172
|
-
def model_error(instance, route)
|
173
|
-
messages = instance.errors.messages
|
174
|
-
field = messages.keys.first
|
175
|
-
custom_error(400, "#{route}.#{field}.#{messages[field].first}")
|
176
|
-
end
|
177
|
-
|
178
|
-
# Select parameters in the params hash, by its keys.
|
179
|
-
# @param fields [Array<String>] the keys to select in the params hash.
|
180
|
-
# @return [Hash] the selected chunk of the params hash.
|
181
|
-
def select_params(*fields)
|
182
|
-
return params.select { |key, value| fields.include?(key) }
|
183
|
-
end
|
184
|
-
|
185
|
-
# Creates a custom error from an existing Arkaan exception class.
|
186
|
-
# @param exception {StandardError} the exception to transform in a usable error.
|
187
|
-
def handle_arkaan_exception(exception)
|
188
|
-
custom_error(exception.status, "#{exception.action}.#{exception.field}.#{exception.error}")
|
189
|
-
end
|
190
|
-
|
191
|
-
error Arkaan::Utils::Errors::BadRequest do |exception|
|
192
|
-
handle_arkaan_exception(exception)
|
193
|
-
end
|
194
|
-
|
195
|
-
error Arkaan::Utils::Errors::Forbidden do |exception|
|
196
|
-
handle_arkaan_exception(exception)
|
197
|
-
end
|
198
|
-
|
199
|
-
error Arkaan::Utils::Errors::NotFound do |exception|
|
200
|
-
handle_arkaan_exception(exception)
|
201
|
-
end
|
202
|
-
|
203
|
-
error Arkaan::Factories::Errors::GatewayNotFound do |exception|
|
204
|
-
handle_arkaan_exception(exception)
|
205
|
-
end
|
206
|
-
|
207
|
-
if ENV['RACK_ENV'] != 'test'
|
208
|
-
error StandardError do |exception|
|
209
|
-
custom_error(500, 'system_error.unknown_field.unknown_error')
|
210
|
-
end
|
211
|
-
end
|
212
|
-
end
|
213
|
-
end
|
214
|
-
end
|
215
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
module Arkaan
|
2
|
-
module Utils
|
3
|
-
module Controllers
|
4
|
-
# Base controller to handle the standard error when accessing the API.
|
5
|
-
# @author Vincent Courtois <courtois.vincenet@outlook.com>
|
6
|
-
class Checked < Arkaan::Utils::Controllers::Base
|
7
|
-
|
8
|
-
before do
|
9
|
-
pass if route_is_diagnostic?
|
10
|
-
before_checks
|
11
|
-
end
|
12
|
-
|
13
|
-
def route_is_diagnostic?
|
14
|
-
service = Arkaan::Utils::MicroService.instance.service
|
15
|
-
diagnostic = "#{service.path}#{service.diagnostic}"
|
16
|
-
request.path_info == diagnostic
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
data/lib/arkaan/utils/errors.rb
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
module Arkaan
|
2
|
-
module Utils
|
3
|
-
# Module gathering all the exception classes used throughout the utils module, mainly linked to HTTP errors.
|
4
|
-
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
5
|
-
module Errors
|
6
|
-
autoload :BadRequest, 'arkaan/utils/errors/bad_request'
|
7
|
-
autoload :Forbidden , 'arkaan/utils/errors/forbidden'
|
8
|
-
autoload :NotFound , 'arkaan/utils/errors/not_found'
|
9
|
-
autoload :HTTPError , 'arkaan/utils/errors/http_error'
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
module Arkaan
|
2
|
-
module Utils
|
3
|
-
module Errors
|
4
|
-
# A bad request error is raised when the data given to a model makes this model invalid.
|
5
|
-
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
6
|
-
class BadRequest < Arkaan::Utils::Errors::HTTPError
|
7
|
-
|
8
|
-
def initialize(action:, field:, error:)
|
9
|
-
super(action, field, error, 400)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
module Arkaan
|
2
|
-
module Utils
|
3
|
-
module Errors
|
4
|
-
# A forbidden error occurs when a user tries to perform an action he's not allowed to.
|
5
|
-
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
6
|
-
class Forbidden < Arkaan::Utils::Errors::HTTPError
|
7
|
-
|
8
|
-
def initialize (field:, action:, error:)
|
9
|
-
super(action, field, error, 403)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
module Arkaan
|
2
|
-
module Utils
|
3
|
-
module Errors
|
4
|
-
# Standard class parent to all specialized http errors.
|
5
|
-
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
6
|
-
class HTTPError < StandardError
|
7
|
-
|
8
|
-
# @!attribute [rw] field
|
9
|
-
# @return [String, Symbol] the name of the field in error in the model.
|
10
|
-
attr_accessor :field
|
11
|
-
# @!attribute [rw] action
|
12
|
-
# @return [String] the name of the action the user was trying to perform on the model (often crate or update).
|
13
|
-
attr_accessor :action
|
14
|
-
# @attribute [rw] error
|
15
|
-
# @return [String] the label of the error returned by the model.
|
16
|
-
attr_accessor :error
|
17
|
-
# @attribute [rw] status
|
18
|
-
# @return [Integer] the HTTP status code as a number (eg: 400, 422 or 500)
|
19
|
-
attr_accessor :status
|
20
|
-
|
21
|
-
def initialize (action, field, error, status)
|
22
|
-
@action = action
|
23
|
-
@field = field.to_s
|
24
|
-
@error = error
|
25
|
-
@status = status
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
module Arkaan
|
2
|
-
module Utils
|
3
|
-
module Errors
|
4
|
-
# A not found error occurs when a user tries to reach a resource that does not exist.
|
5
|
-
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
6
|
-
class NotFound < Arkaan::Utils::Errors::HTTPError
|
7
|
-
|
8
|
-
def initialize (field:, action:, error:)
|
9
|
-
super(action, field, error, 404)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
data/lib/arkaan/utils/loaders.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
module Arkaan
|
2
|
-
module Utils
|
3
|
-
module Plugins
|
4
|
-
class Heroku
|
5
|
-
# Loads the heroku informations inside the data of the instance.
|
6
|
-
# @param instance [Arkaan::Monitoring::Instance] the instance to put the enrichment inside.
|
7
|
-
def self.load!(instance)
|
8
|
-
if !ENV['OAUTH_TOKEN'].nil? && instance != false && instance.persisted?
|
9
|
-
heroku = PlatformAPI.connect_oauth(ENV['OAUTH_TOKEN'])
|
10
|
-
regex = /\Ahttps?:\/\/([a-z\-]+).herokuapp.com\/?\z/
|
11
|
-
if instance.url.match(regex)
|
12
|
-
app_name = instance.url.scan(regex).first.first
|
13
|
-
instance.update_attribute(:data, heroku.app.info(app_name))
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,170 +0,0 @@
|
|
1
|
-
module Arkaan
|
2
|
-
module Utils
|
3
|
-
# This class is a singleton to load and save parameters for the whole application.
|
4
|
-
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
5
|
-
class MicroService
|
6
|
-
include Singleton
|
7
|
-
|
8
|
-
# @!attribute [r] name
|
9
|
-
# @return [String] the name of the service you want to load.
|
10
|
-
attr_reader :service
|
11
|
-
# @!attribute [r] location
|
12
|
-
# @return [String] the path to the file loading the whole application, used to deduce the loading paths.
|
13
|
-
attr_reader :location
|
14
|
-
# @!attribute [r] name
|
15
|
-
# @return [String] the name of the service, used later to instantiate it when the mongoid configuration is fully loaded.
|
16
|
-
attr_reader :name
|
17
|
-
# @!attribute [r] instance
|
18
|
-
# @return [Arkaan::Monitoring::Instance] the instance of the service currently deployed.
|
19
|
-
attr_reader :instance
|
20
|
-
# @!attribute [r] type
|
21
|
-
# @return [Symbol] the type of instance the application is declaring
|
22
|
-
attr_reader :type
|
23
|
-
|
24
|
-
def initialize
|
25
|
-
@location = false
|
26
|
-
@service = false
|
27
|
-
@instance = false
|
28
|
-
@name = false
|
29
|
-
@type = ENV['INSTANCE_TYPE'] || :heroku
|
30
|
-
@controller_classes = []
|
31
|
-
end
|
32
|
-
|
33
|
-
def get_controllers
|
34
|
-
return [] if defined?(Controllers).nil?
|
35
|
-
classes = Controllers.constants.map { |symbol| get_const(symbol) }
|
36
|
-
return classes.select { |symbol| symbol.is_a? Class }
|
37
|
-
end
|
38
|
-
|
39
|
-
def get_const(symbol)
|
40
|
-
return Object.const_get("Controllers::#{symbol.to_s}")
|
41
|
-
end
|
42
|
-
|
43
|
-
# Determines if the application can be loaded (all the parameters have been correctly set)
|
44
|
-
# @return [Boolean] TRUE if the application can be safely loaded, FALSE otherwise.
|
45
|
-
def loadable?
|
46
|
-
return !!(service && location)
|
47
|
-
end
|
48
|
-
|
49
|
-
# Getter for the path on which the service is mapped.
|
50
|
-
# @return [String, Boolean] the absolute path in the URL on which the service is mapped upon, or FALSE if it's not set already.
|
51
|
-
def path
|
52
|
-
return service ? service.path : false
|
53
|
-
end
|
54
|
-
|
55
|
-
# Look for the service and sets it if it's found in the database, or set it to nil if not found.
|
56
|
-
# @param [String] service_name - the name of the service to look for in the database.
|
57
|
-
# @return [Arkaan::utils::MicroService] the instance of the micro-service to chain other calls.
|
58
|
-
def register_as(service_name)
|
59
|
-
@name = service_name
|
60
|
-
return self
|
61
|
-
end
|
62
|
-
|
63
|
-
# Sets the location of the file calling the micro service and initializing it so that it's used as root.
|
64
|
-
# @param filename [String] the full naame of the file with the extension.
|
65
|
-
# @return [Arkaan::utils::MicroService] the instance of the micro-service to chain other calls.
|
66
|
-
def from_location(filename)
|
67
|
-
@location = File.dirname(filename)
|
68
|
-
return self
|
69
|
-
end
|
70
|
-
|
71
|
-
# Loads the application in standard (production/development) mode, without the test files.
|
72
|
-
# @return [Arkaan::utils::MicroService] the instance of the micro-service to chain other calls.
|
73
|
-
def in_standard_mode
|
74
|
-
return load_application(test_mode: false)
|
75
|
-
end
|
76
|
-
|
77
|
-
# Loads the application in test mode, by adding the needed files to run the test suite to the standard loading process.
|
78
|
-
# @return [Arkaan::utils::MicroService] the instance of the micro-service to chain other calls.
|
79
|
-
def in_test_mode
|
80
|
-
@location = File.join(location, '..')
|
81
|
-
return load_application(test_mode: true)
|
82
|
-
end
|
83
|
-
|
84
|
-
# Loads the application as a websockets service. Only the websockets application should use that.
|
85
|
-
# @return [Arkaan::utils::MicroService] the instance of the micro-service to chain other calls.
|
86
|
-
def in_websocket_mode
|
87
|
-
load_mongoid_configuration
|
88
|
-
load_standard_files
|
89
|
-
|
90
|
-
Arkaan::Monitoring::Websocket.find_or_create_by(url: ENV['WEBSOCKET_URL']).save
|
91
|
-
return self
|
92
|
-
end
|
93
|
-
|
94
|
-
# Deactivates the current instance and the associated service if no more instances are available.
|
95
|
-
def deactivate!
|
96
|
-
instance.update_attribute(:running, false)
|
97
|
-
service.update_attribute(:test_mode, false) if ENV['TEST_MODE']
|
98
|
-
end
|
99
|
-
|
100
|
-
private
|
101
|
-
|
102
|
-
# Registers the service in the database if it has not been created already.
|
103
|
-
def register_service
|
104
|
-
@service = Arkaan::Monitoring::Service.create(key: @name, path: "/#{@name}")
|
105
|
-
end
|
106
|
-
|
107
|
-
# Register the instance of the currently deployed service in the database.
|
108
|
-
# @return [Arkaan::Monitoring::Instance] the instance of the micro service currently running.
|
109
|
-
def register_instance
|
110
|
-
@instance = @service.instances.where(url: ENV['SERVICE_URL']).first
|
111
|
-
if @instance.nil?
|
112
|
-
@instance = Arkaan::Monitoring::Instance.create(service: @service, url: ENV['SERVICE_URL'], type: type)
|
113
|
-
end
|
114
|
-
@instance.update_attribute(:running, true)
|
115
|
-
return @instance
|
116
|
-
end
|
117
|
-
|
118
|
-
# Loads the configuration for Mongoid, the files of the application, and registers the service and the instance in the database.
|
119
|
-
# @param test_mode [Boolean] TRUE to run in test mode (from /spec), FALSE otherwise.
|
120
|
-
# @return [Arkaan::Utils::MicroService] the current instance of the micro service to chain other calls.
|
121
|
-
def load_application(test_mode: false)
|
122
|
-
Dotenv.load
|
123
|
-
load_mongoid_configuration(test_mode: test_mode)
|
124
|
-
if !!(@name && location)
|
125
|
-
@service = Arkaan::Monitoring::Service.where(key: @name).first
|
126
|
-
register_service if @service.nil?
|
127
|
-
if ENV['TEST_MODE']
|
128
|
-
@service.update_attribute(:test_mode, true)
|
129
|
-
end
|
130
|
-
register_instance
|
131
|
-
load_plugin!
|
132
|
-
if service
|
133
|
-
load_standard_files
|
134
|
-
load_test_files if test_mode
|
135
|
-
end
|
136
|
-
end
|
137
|
-
return self
|
138
|
-
end
|
139
|
-
|
140
|
-
def load_plugin!
|
141
|
-
plugin = ENV['ADDITIONAL_PLUGIN']
|
142
|
-
if !plugin.nil? && Arkaan::Utils::Plugins.constants.include?(plugin)
|
143
|
-
Arkaan::Utils::Plugins.const_get(plugin).load!(@instance)
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
def load_mongoid_configuration(test_mode: false)
|
148
|
-
environment = test_mode ? 'test' : (ENV['RACK_ENV'] || 'development')
|
149
|
-
Mongoid.load!(File.join(@location, 'config', 'mongoid.yml'), environment)
|
150
|
-
end
|
151
|
-
|
152
|
-
def load_standard_files
|
153
|
-
require_folder('decorators')
|
154
|
-
require_folder('services')
|
155
|
-
require_folder('controllers')
|
156
|
-
end
|
157
|
-
|
158
|
-
def load_test_files
|
159
|
-
require_folder('spec', 'support')
|
160
|
-
require_folder('spec', 'shared')
|
161
|
-
end
|
162
|
-
|
163
|
-
def require_folder(*folders)
|
164
|
-
Dir[File.join(location, folders, '**', '*.rb')].each do |filename|
|
165
|
-
require filename
|
166
|
-
end
|
167
|
-
end
|
168
|
-
end
|
169
|
-
end
|
170
|
-
end
|
data/lib/arkaan/utils/seeder.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
module Arkaan
|
2
|
-
module Utils
|
3
|
-
# This class loads the necessary data in the database if they don't exist yet.
|
4
|
-
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
5
|
-
class Seeder
|
6
|
-
include Singleton
|
7
|
-
|
8
|
-
# Creates the service if it does not exist, and the instance if it does not exist.
|
9
|
-
# @return [Arkaan::Monitoring::Service] the created, or found, service corresponding to this micro-service.
|
10
|
-
def create_service(key)
|
11
|
-
service = Arkaan::Monitoring::Service.where(key: key).first
|
12
|
-
|
13
|
-
if service.nil?
|
14
|
-
service = Arkaan::Monitoring::Service.create!(key: key, path: "/#{key}", premium: true, active: true)
|
15
|
-
end
|
16
|
-
|
17
|
-
if service.instances.where(url: ENV['SERVICE_URL']).first.nil?
|
18
|
-
Arkaan::Monitoring::Instance.create!(url: ENV['SERVICE_URL'], running: true, service: service, active: true)
|
19
|
-
end
|
20
|
-
|
21
|
-
return service
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|