arkaan 2.5.0 → 2.7.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7876afd3de8047883f8c7a4cedd1311c4b40dc3fdd711c3ebfa9b6abd118e330
4
- data.tar.gz: 975ad0b4de93452222925f704460cb25f8d760cc26643bc2c1cd6377964a7fe4
3
+ metadata.gz: 49b4f5f61273d5bb04c52296fbd6d98d2132e960872d2f3ef13c0abb9843f16c
4
+ data.tar.gz: 2f6a9767b394c101937eee1275116c034a5aec3152ecd55a81f27d771cf2619e
5
5
  SHA512:
6
- metadata.gz: 799b4bc8be02916ef27d7e3b99ee57991849450f7b0b2cab54945ebe8863a85a858836de4745725325fa76408b7799b284b7a28e91cc3bf3a294310b02daa314
7
- data.tar.gz: 9e233034348c67b2a29672e3fe9154e252c5ce42819474c19b68cbf0adec613d1fb2dd9ce86ce3cba4823c46097bc7801a247132361ac2f08991b670f5f20326
6
+ metadata.gz: 988474c07ee9facdd07b1d5e29baaadfbe65c68b4b7dd9b6c85474f4bdf31363205d85a5dc91e3a298d10ef436317922953b5867699165b84986911caf4b8186
7
+ data.tar.gz: aaa639ed45955ca052dc7aea2fec0090b9e6fc9d8c69afb2ed1258f5b161e902a96593124848666fa4c340626b240455a09428bca1da4250a061c10e4e44a817
@@ -13,6 +13,7 @@ module Arkaan
13
13
  autoload :Chatroom , 'arkaan/chatroom'
14
14
  autoload :Chatrooms , 'arkaan/chatrooms'
15
15
  autoload :Concerns , 'arkaan/concerns'
16
+ autoload :Event , 'arkaan/event'
16
17
  autoload :Factories , 'arkaan/factories'
17
18
  autoload :Files , 'arkaan/files'
18
19
  autoload :Monitoring , 'arkaan/monitoring'
@@ -57,9 +57,6 @@ module Arkaan
57
57
  # @!attribute [rw] invitations
58
58
  # @return [Array<Arkaan::Campaigns::Invitation>] the invitations you've issued yourself to other players.
59
59
  has_many :created_invitations, class_name: 'Arkaan::Campaigns::Invitation', inverse_of: :creator
60
- # @!attribute [rw] websockets
61
- # @return [Array<Arkaan::Monitoring::Websocket>] the websockets created by the owner of this account.
62
- has_many :websockets, class_name: 'Arkaan::Monitoring::Websocket', inverse_of: :creator
63
60
  # @!attribute [rw] permissions
64
61
  # @return [Array<Arkaan::Files::Permission>] the file access permissions granted to this account.
65
62
  has_many :permissions, class_name: 'Arkaan::Files::Permission', inverse_of: :account
@@ -51,14 +51,18 @@ module Arkaan
51
51
  # @param account [Arkaan::Account] the account of the creator for this campaign.
52
52
  def creator=(account)
53
53
  if !invitations.where(account: account).exists?
54
- Arkaan::Campaigns::Invitation.create(campaign: self, account: account, enum_status: :creator)
54
+ invitation = Arkaan::Campaigns::Invitation.create(
55
+ campaign: self,
56
+ account: account,
57
+ status: :creator
58
+ )
55
59
  end
56
60
  end
57
61
 
58
62
  # Getter for the creator account of this campaign.
59
63
  # @return [Arkaan::Account] the account of the player creating this campaign.
60
64
  def creator
61
- return invitations.where(enum_status: :creator).first.account
65
+ invitations.to_a.find(&:status_creator?).account
62
66
  end
63
67
 
64
68
  # Adds an error message if the account creating this campaign already has a campaign with the very same name.
@@ -83,7 +87,9 @@ module Arkaan
83
87
 
84
88
  # @return [Array<Arkaan::Campaigns::Invitation>] the players in this campaign.
85
89
  def players
86
- invitations.where(enum_status: :accepted)
90
+ invitations.to_a.select do |invitation|
91
+ [:creator, :accepted].include? invitation.enum_status
92
+ end
87
93
  end
88
94
 
89
95
  # @return [Integer] the number of players in this campaign.
@@ -1,15 +1,16 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Arkaan
2
4
  module Campaigns
3
- # An invitation is the linked between a player and a campaign, accepted or not.
5
+ # An invitation is the linked between a player and a campaign.
6
+ # It keeps the history of the interaction between the player and the campaign.
7
+ #
4
8
  # @author Vincent Courtois <courtois.vincent@outlook.com>
5
9
  class Invitation
6
10
  include Mongoid::Document
7
11
  include Mongoid::Timestamps
8
12
  include Arkaan::Concerns::Enumerable
9
-
10
- # @!attribute [rw] status
11
- # @return [Symbol] the current status of the invitation.
12
- enum_field :status, [:accepted, :blocked, :expelled, :ignored, :left, :pending, :refused, :request, :creator], default: :pending
13
+ include Arkaan::Concerns::Historizable
13
14
 
14
15
  # @!attribute [rw] account
15
16
  # @return [Arkaan::Account] the account the invitation has been issued to.
@@ -17,6 +18,12 @@ module Arkaan
17
18
  # @!attribute [rw] campaign
18
19
  # @return [Arkaan::Campaign] the campaign the invitation has been made in.
19
20
  belongs_to :campaign, class_name: 'Arkaan::Campaign', inverse_of: :invitations
21
+
22
+ # @!attribute [rw] status
23
+ # @return [Symbol] the current status of the invitation.
24
+ historize enum_field :status,
25
+ [:pending, :request, :accepted, :refused, :expelled, :left, :master, :creator],
26
+ default: :pending
20
27
  end
21
28
  end
22
- end
29
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Arkaan
2
4
  module Campaigns
3
5
  # A campaign tag is a string describing a characteristic of the campaign it's in.
@@ -13,9 +15,7 @@ module Arkaan
13
15
  # @return [Integer] the number of campaigns this tag is in, avoiding a join.
14
16
  field :count, type: Integer, default: 1
15
17
 
16
- validates :content,
17
- presence: {message: 'required'},
18
- uniqueness: {message: 'uniq'}
18
+ validates :content, presence: { message: 'required' }, uniqueness: { message: 'uniq' }
19
19
  end
20
20
  end
21
- end
21
+ end
@@ -5,6 +5,7 @@ module Arkaan
5
5
  autoload :Activable , 'arkaan/concerns/activable'
6
6
  autoload :Diagnosticable, 'arkaan/concerns/diagnosticable'
7
7
  autoload :Enumerable , 'arkaan/concerns/enumerable'
8
+ autoload :Historizable , 'arkaan/concerns/historizable'
8
9
  autoload :MimeTypable , 'arkaan/concerns/mime_typable'
9
10
  autoload :Premiumable , 'arkaan/concerns/premiumable'
10
11
  autoload :Sluggable , 'arkaan/concerns/sluggable'
@@ -14,7 +14,7 @@ module Arkaan
14
14
  # @param values [Array<Symbol>] the possible values of the enumerated field.
15
15
  # @param options [Hash<Symbol, Any>] the possible options for the field.
16
16
  def enum_field(field_name, values, options = {})
17
- field :"enum_#{field_name}", type: Symbol, default: options[:default]
17
+ returned = field :"enum_#{field_name}", type: Symbol, default: options[:default]
18
18
 
19
19
  validates :"enum_#{field_name}", inclusion: {in: values.map(&:to_sym), message: 'inclusion'}
20
20
 
@@ -37,6 +37,10 @@ module Arkaan
37
37
  self["enum_#{field_name}"] == value
38
38
  end
39
39
  end
40
+
41
+ # This is to make enumerations historizable by
42
+ # returning the field object created by Mongoid.
43
+ returned
40
44
  end
41
45
  end
42
46
  end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arkaan
4
+ module Concerns
5
+ # This module is what I call "a beautiful piece of Ruby engineering"
6
+ # It takes any mongoid field that you may have declared, and historizes
7
+ # it in a dedicated relation if this relation does not already exists.
8
+ #
9
+ # What it does exactly :
10
+ # - Creates the :history relation if it does not already exists.
11
+ # - Creates a method to check for changes of a specific attribute.
12
+ # - Check for changes at initialization to insert the first value.
13
+ # - Check for changes at update/save to store the history.
14
+ #
15
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
16
+ module Historizable
17
+ extend ActiveSupport::Concern
18
+
19
+ # Adds an entry in the history table for the given field.
20
+ # It checks several things to make the history entry valid :
21
+ # - the new value is different from the old value
22
+ # - the old value is identical to the last recorded new value.
23
+ #
24
+ # @param field [String] the name of the field to historize
25
+ # @param from [Any] the old value before update
26
+ # @param to [Any] the new value after update.
27
+ def add_history(field:, from:, to:)
28
+ return if from == to
29
+ return if !history.empty? && history.order_by(:created_at.desc).first.to != from
30
+
31
+ event = Arkaan::Event.create(field: field, from: from, to: to, document: self)
32
+ event.save
33
+ end
34
+
35
+ # Submodule holding all the static methods add to the current subclass.
36
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
37
+ module ClassMethods
38
+
39
+ # Takes the Mongoid declared field and creates the callbacks
40
+ # to intercept any value change and add it to the history.
41
+ # @field field [Mongoid::Fields::Standard] the Mongoid field to historize.
42
+ def historize(field)
43
+
44
+ unless relations.key?('history')
45
+ embeds_many :history, class_name: 'Arkaan::Event'
46
+ end
47
+
48
+ after_initialize do |doc|
49
+ add_history(field: field.name, from: nil, to: doc[field.name])
50
+ end
51
+
52
+ after_save do |doc|
53
+ if doc.changed_attributes.key?(field.name)
54
+ from = doc.changed_attributes[field.name]
55
+ add_history(field: field.name, from: from, to: doc[field.name])
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arkaan
4
+ # An event is symbolizing a timestamped change in a model.
5
+ # It is recommended NOT to use this class directly but to use
6
+ # the Arkaan::Concerns::Historizable concern in a model.
7
+ #
8
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
9
+ class Event
10
+ include Mongoid::Document
11
+ include Mongoid::Timestamps
12
+
13
+ # @!attribute [rw] field
14
+ # @return [String] the name of the field being historized
15
+ field :field, type: String
16
+ # @!attribute [rw] from
17
+ # @return [Any] the value of the field before update
18
+ field :from
19
+ # @!attribute [rw] to
20
+ # @return [Any] the value of the field after update
21
+ field :to
22
+
23
+ # @!attribute [rw] document
24
+ # @return [Any] the model in which the history is embedded
25
+ embedded_in :document, polymorphic: true, inverse_of: :history
26
+
27
+ validates :field, presence: { message: 'required' }
28
+ end
29
+ end
@@ -2,13 +2,7 @@ module Arkaan
2
2
  # The monitoring module holds all the logic about the services so they can be activated or deactivated.
3
3
  # @author Vincent Courtois <courtois.vincent@outlook.com>
4
4
  module Monitoring
5
- autoload :Action , 'arkaan/monitoring/action'
6
- autoload :Gateway , 'arkaan/monitoring/gateway'
7
- autoload :Instance , 'arkaan/monitoring/instance'
8
- autoload :Results , 'arkaan/monitoring/results'
9
- autoload :Route , 'arkaan/monitoring/route'
10
- autoload :Service , 'arkaan/monitoring/service'
11
- autoload :Vigilante, 'arkaan/monitoring/vigilante'
12
- autoload :Websocket, 'arkaan/monitoring/websocket'
5
+ autoload :Route , 'arkaan/monitoring/route'
6
+ autoload :Service, 'arkaan/monitoring/service'
13
7
  end
14
8
  end
@@ -10,21 +10,15 @@ module Arkaan
10
10
  include Arkaan::Concerns::Premiumable
11
11
 
12
12
  # @!attribute [rw] key
13
- # @return [String] the name, or title of the service, optionally given to identify it more easily.
13
+ # @return [String] the name of the service, used as a namespace on the Kubernetes side.
14
14
  field :key, type: String
15
15
  # @!attribute [rw] path
16
- # @return [String] the path the service will be mapped on in the API.
16
+ # @return [String] the path the service will be mapped on in the API. This will be used in the Ingress.
17
17
  field :path, type: String, default: '/'
18
- # @!attribute [rw] test_mode
19
- # @return [Boolean] TRUE if the service is currently in test mode and thus the gateway shall only qurty local instances.
20
- field :test_mode, type: Boolean, default: false
21
18
 
22
19
  # @!attribute [rw] creator
23
20
  # @return [Arkaan::Account] the creator of this service.
24
21
  belongs_to :creator, class_name: 'Arkaan::Account', optional: true, inverse_of: :services
25
- # @!attribute [rw] instances
26
- # @return [Array<Arkaan::Monitoring::Instance>] the instances of this service currently deployed.
27
- embeds_many :instances, class_name: 'Arkaan::Monitoring::Instance', inverse_of: :service
28
22
  # @!attribute [rw] routes
29
23
  # @return [Array<Arkaan::Monitoring::Route>] the routes associated to this service, accessible from the gateway.
30
24
  has_many :routes, class_name: 'Arkaan::Monitoring::Route', inverse_of: :service
@@ -1,6 +1,7 @@
1
1
  module Arkaan
2
2
  module OAuth
3
- # An access token is the value assigned to the application to access the private data of an account.
3
+ # An access token is the value assigned to the application
4
+ # to access the data the user is allowed to access.
4
5
  # @author Vincent Courtois <courtois.vincent@outlook.com>
5
6
  class AccessToken
6
7
  include Mongoid::Document
@@ -15,11 +16,17 @@ module Arkaan
15
16
 
16
17
  # @!attribute [rw] authorization
17
18
  # @return [Arkaan::OAuth::Authorization] the authorization code that issued this token to the application for this user.
18
- belongs_to :authorization, class_name: 'Arkaan::OAuth::Authorization', inverse_of: :access_token
19
+ belongs_to :authorization, class_name: 'Arkaan::OAuth::Authorization', inverse_of: :tokens
19
20
 
20
21
  validates :value,
21
22
  presence: {message: 'required'},
22
23
  uniqueness: {message: 'uniq'}
24
+
25
+ # Checks if the current date is inferior to the creation date + expiration period
26
+ # @return [Boolean] TRUE if the token is expired, FALSE otherwise.
27
+ def expired?
28
+ created_at.to_time.to_i + expiration < Time.now.to_i
29
+ end
23
30
  end
24
31
  end
25
32
  end
@@ -1,6 +1,9 @@
1
1
  module Arkaan
2
2
  module OAuth
3
3
  # An OAuth authorization is granted by a user to an application to access its personal data.
4
+ # The application then transforms it into an access token to be able to send it with
5
+ # further requests, so that we know the user has authorized the application to access its data.
6
+ #
4
7
  # @author Vincent Courtois <courtois.vincent@outlook.com>
5
8
  class Authorization
6
9
  include Mongoid::Document
@@ -18,7 +21,7 @@ module Arkaan
18
21
  belongs_to :application, class_name: 'Arkaan::OAuth::Application', inverse_of: :authorizations
19
22
  # @!attribute [rw] token
20
23
  # @return [Arkaan::OAuth::AccessToken] the access token used further in the application process to access private data of the account.
21
- has_one :token, class_name: 'Arkaan::OAuth::AccessToken', inverse_of: :authorization
24
+ has_many :tokens, class_name: 'Arkaan::OAuth::AccessToken', inverse_of: :authorization
22
25
 
23
26
  validates :code,
24
27
  presence: {message: 'required'},
@@ -1,3 +1,3 @@
1
1
  module Arkaan
2
- VERSION = '2.5.0'
2
+ VERSION = '2.7.2'
3
3
  end
metadata CHANGED
@@ -1,239 +1,253 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arkaan
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.0
4
+ version: 2.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vincent Courtois
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-23 00:00:00.000000000 Z
11
+ date: 2020-09-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rspec
14
+ name: database_cleaner
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 3.6.0
19
+ version: 1.6.1
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 3.6.0
26
+ version: 1.6.1
27
27
  - !ruby/object:Gem::Dependency
28
- name: rspec-json_expectations
28
+ name: factory_bot
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: 2.1.0
33
+ version: 6.1.0
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: 2.1.0
40
+ version: 6.1.0
41
41
  - !ruby/object:Gem::Dependency
42
- name: rack-test
42
+ name: factory_girl
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - '='
46
46
  - !ruby/object:Gem::Version
47
- version: 0.7.0
47
+ version: 4.8.1
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - '='
53
53
  - !ruby/object:Gem::Version
54
- version: 0.7.0
54
+ version: 4.8.1
55
55
  - !ruby/object:Gem::Dependency
56
- name: factory_girl
56
+ name: faker
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - '='
60
60
  - !ruby/object:Gem::Version
61
- version: 4.8.1
61
+ version: 2.13.0
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - '='
67
67
  - !ruby/object:Gem::Version
68
- version: 4.8.1
68
+ version: 2.13.0
69
69
  - !ruby/object:Gem::Dependency
70
- name: factory_bot
70
+ name: pry
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - '='
74
74
  - !ruby/object:Gem::Version
75
- version: 5.1.1
75
+ version: 0.13.1
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - '='
81
81
  - !ruby/object:Gem::Version
82
- version: 5.1.1
82
+ version: 0.13.1
83
83
  - !ruby/object:Gem::Dependency
84
- name: database_cleaner
84
+ name: rack
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - '='
88
88
  - !ruby/object:Gem::Version
89
- version: 1.6.1
89
+ version: 2.2.3
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - '='
95
95
  - !ruby/object:Gem::Version
96
- version: 1.6.1
96
+ version: 2.2.3
97
97
  - !ruby/object:Gem::Dependency
98
- name: simplecov
98
+ name: rack-test
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - '='
102
102
  - !ruby/object:Gem::Version
103
- version: 0.15.1
103
+ version: 1.1.0
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - '='
109
109
  - !ruby/object:Gem::Version
110
- version: 0.15.1
110
+ version: 1.1.0
111
111
  - !ruby/object:Gem::Dependency
112
- name: yard
112
+ name: rspec
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - '='
116
116
  - !ruby/object:Gem::Version
117
- version: 0.9.20
117
+ version: 3.9.0
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - '='
123
123
  - !ruby/object:Gem::Version
124
- version: 0.9.20
124
+ version: 3.9.0
125
125
  - !ruby/object:Gem::Dependency
126
- name: pry
126
+ name: rspec-json_expectations
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - '='
130
130
  - !ruby/object:Gem::Version
131
- version: 0.11.1
131
+ version: 2.1.0
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - '='
137
137
  - !ruby/object:Gem::Version
138
- version: 0.11.1
138
+ version: 2.1.0
139
139
  - !ruby/object:Gem::Dependency
140
- name: rack
140
+ name: rubocop
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
143
  - - '='
144
144
  - !ruby/object:Gem::Version
145
- version: 2.0.8
145
+ version: 0.90.0
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - '='
151
151
  - !ruby/object:Gem::Version
152
- version: 2.0.8
152
+ version: 0.90.0
153
153
  - !ruby/object:Gem::Dependency
154
- name: faker
154
+ name: simplecov
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - '='
158
+ - !ruby/object:Gem::Version
159
+ version: 0.19.0
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - '='
165
+ - !ruby/object:Gem::Version
166
+ version: 0.19.0
167
+ - !ruby/object:Gem::Dependency
168
+ name: yard
155
169
  requirement: !ruby/object:Gem::Requirement
156
170
  requirements:
157
171
  - - '='
158
172
  - !ruby/object:Gem::Version
159
- version: 2.10.0
173
+ version: 0.9.25
160
174
  type: :development
161
175
  prerelease: false
162
176
  version_requirements: !ruby/object:Gem::Requirement
163
177
  requirements:
164
178
  - - '='
165
179
  - !ruby/object:Gem::Version
166
- version: 2.10.0
180
+ version: 0.9.25
167
181
  - !ruby/object:Gem::Dependency
168
182
  name: mongoid
169
183
  requirement: !ruby/object:Gem::Requirement
170
184
  requirements:
171
185
  - - '='
172
186
  - !ruby/object:Gem::Version
173
- version: 7.0.1
187
+ version: 7.1.0
174
188
  type: :runtime
175
189
  prerelease: false
176
190
  version_requirements: !ruby/object:Gem::Requirement
177
191
  requirements:
178
192
  - - '='
179
193
  - !ruby/object:Gem::Version
180
- version: 7.0.1
194
+ version: 7.1.0
181
195
  - !ruby/object:Gem::Dependency
182
196
  name: activemodel
183
197
  requirement: !ruby/object:Gem::Requirement
184
198
  requirements:
185
199
  - - '='
186
200
  - !ruby/object:Gem::Version
187
- version: 5.2.3
201
+ version: 6.0.3.2
188
202
  type: :runtime
189
203
  prerelease: false
190
204
  version_requirements: !ruby/object:Gem::Requirement
191
205
  requirements:
192
206
  - - '='
193
207
  - !ruby/object:Gem::Version
194
- version: 5.2.3
208
+ version: 6.0.3.2
195
209
  - !ruby/object:Gem::Dependency
196
210
  name: activesupport
197
211
  requirement: !ruby/object:Gem::Requirement
198
212
  requirements:
199
213
  - - '='
200
214
  - !ruby/object:Gem::Version
201
- version: 5.2.3
215
+ version: 6.0.3.2
202
216
  type: :runtime
203
217
  prerelease: false
204
218
  version_requirements: !ruby/object:Gem::Requirement
205
219
  requirements:
206
220
  - - '='
207
221
  - !ruby/object:Gem::Version
208
- version: 5.2.3
222
+ version: 6.0.3.2
209
223
  - !ruby/object:Gem::Dependency
210
224
  name: bcrypt
211
225
  requirement: !ruby/object:Gem::Requirement
212
226
  requirements:
213
227
  - - '='
214
228
  - !ruby/object:Gem::Version
215
- version: 3.1.11
229
+ version: 3.1.13
216
230
  type: :runtime
217
231
  prerelease: false
218
232
  version_requirements: !ruby/object:Gem::Requirement
219
233
  requirements:
220
234
  - - '='
221
235
  - !ruby/object:Gem::Version
222
- version: 3.1.11
236
+ version: 3.1.13
223
237
  - !ruby/object:Gem::Dependency
224
238
  name: dotenv
225
239
  requirement: !ruby/object:Gem::Requirement
226
240
  requirements:
227
241
  - - '='
228
242
  - !ruby/object:Gem::Version
229
- version: 2.7.2
243
+ version: 2.7.6
230
244
  type: :runtime
231
245
  prerelease: false
232
246
  version_requirements: !ruby/object:Gem::Requirement
233
247
  requirements:
234
248
  - - '='
235
249
  - !ruby/object:Gem::Version
236
- version: 2.7.2
250
+ version: 2.7.6
237
251
  description: This gem holds the model layer for my table-top RPG games application.
238
252
  email: courtois.vincent@outlook.com
239
253
  executables: []
@@ -258,6 +272,7 @@ files:
258
272
  - lib/arkaan/concerns/activable.rb
259
273
  - lib/arkaan/concerns/diagnosticable.rb
260
274
  - lib/arkaan/concerns/enumerable.rb
275
+ - lib/arkaan/concerns/historizable.rb
261
276
  - lib/arkaan/concerns/mime_typable.rb
262
277
  - lib/arkaan/concerns/premiumable.rb
263
278
  - lib/arkaan/concerns/sluggable.rb
@@ -265,6 +280,7 @@ files:
265
280
  - lib/arkaan/decorators/errors.rb
266
281
  - lib/arkaan/decorators/errors/env_variable_missing.rb
267
282
  - lib/arkaan/decorators/gateway.rb
283
+ - lib/arkaan/event.rb
268
284
  - lib/arkaan/factories.rb
269
285
  - lib/arkaan/factories/errors.rb
270
286
  - lib/arkaan/factories/errors/gateway_not_found.rb
@@ -272,15 +288,8 @@ files:
272
288
  - lib/arkaan/files/document.rb
273
289
  - lib/arkaan/files/permission.rb
274
290
  - lib/arkaan/monitoring.rb
275
- - lib/arkaan/monitoring/action.rb
276
- - lib/arkaan/monitoring/instance.rb
277
- - lib/arkaan/monitoring/results.rb
278
- - lib/arkaan/monitoring/results/heartbeat.rb
279
- - lib/arkaan/monitoring/results/report.rb
280
291
  - lib/arkaan/monitoring/route.rb
281
292
  - lib/arkaan/monitoring/service.rb
282
- - lib/arkaan/monitoring/vigilante.rb
283
- - lib/arkaan/monitoring/websocket.rb
284
293
  - lib/arkaan/notification.rb
285
294
  - lib/arkaan/oauth.rb
286
295
  - lib/arkaan/oauth/access_token.rb
@@ -312,7 +321,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
312
321
  - !ruby/object:Gem::Version
313
322
  version: '0'
314
323
  requirements: []
315
- rubygems_version: 3.1.2
324
+ rubygems_version: 3.0.6
316
325
  signing_key:
317
326
  specification_version: 4
318
327
  summary: The model layer for my table-RPG application
@@ -1,25 +0,0 @@
1
- module Arkaan
2
- module Monitoring
3
- # An action is made by an authorized user on the instance of a server to perform a task.
4
- # @author Vincent Courtois <courtois.vincent@outlook.com>
5
- class Action
6
- include Mongoid::Document
7
- include Mongoid::Timestamps
8
- include Arkaan::Concerns::Enumerable
9
-
10
- # @!attribute [rw] type
11
- # @return [Symbol] the type of action you're making on this instance
12
- enum_field :type, [:restart]
13
- # @!attribute [rw] success
14
- # @return [Boolean] TRUE if the action succeeded (or at least was successfully launched), FALSE otherwise.
15
- field :success, type: Boolean, default: false
16
-
17
- # @!attribute [rw] user
18
- # @return [Arkaan::Account] the user performing the action on the instance.
19
- belongs_to :user, class_name: 'Arkaan::Account'
20
- # @!attribute [rw] instance
21
- # @return [Arkaan::Monitoring::Instance] the instance of a service on which the action is performed.
22
- embedded_in :instance, class_name: 'Arkaan::Monitoring::Instance', inverse_of: :actions
23
- end
24
- end
25
- end
@@ -1,38 +0,0 @@
1
- module Arkaan
2
- module Monitoring
3
- # An instance is one of the services, deployed on one server. A service may have many instances to balance the load between them all.
4
- # @author Vincent Courtois <courtois.vincent@outlook.com>
5
- class Instance
6
- include Mongoid::Document
7
- include Mongoid::Timestamps
8
- include Arkaan::Concerns::Activable
9
- include Arkaan::Concerns::Typable
10
-
11
- # @!attribute [rw] url
12
- # @return [String] the URL of the instance, where the requests will be issued.
13
- field :url, type: String
14
- # @!attribute [rw] running
15
- # @return [Boolean] the running status of the instance, indicating if it can be used or not.
16
- field :running, type: Boolean, default: false
17
- # @!attribute [rw] data
18
- # @return [Hash] the additional datas for this instance (for example for an Heroku instance it's all the data provided by the API)
19
- field :data, type: Hash, default: {}
20
-
21
- scope :running , ->{ where(running: true) }
22
-
23
- # @!attribute [r] service
24
- # @return [Arkaan::Monitoring::Service] the service this instance is linked to.
25
- embedded_in :service, class_name: 'Arkaan::Monitoring::Service', inverse_of: :instances
26
- # @!attribute [rw] actions
27
- # @return [Arkaan::Monitoring::Action] the actions that has been performed on the service.
28
- embeds_many :actions, class_name: 'Arkaan::Monitoring::Action', inverse_of: :instance
29
-
30
- has_many :heartbeats, class_name: 'Arkaan::Monitoring::Results::Heartbeat', inverse_of: :instance
31
-
32
- validates :url,
33
- presence: {message: 'required'},
34
- format: {with: /\A(https?:\/\/)((([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*)|(localhost:[0-9]{2,4})\/?)\z/, message: 'pattern', if: :url?}
35
- end
36
- end
37
- end
38
-
@@ -1,10 +0,0 @@
1
- module Arkaan
2
- module Monitoring
3
- # The results module handle classes to make results for the vigilante runs.
4
- # @author Vincent Courtois <courtois.vincent@outlook.com>
5
- module Results
6
- autoload :Report, 'arkaan/monitoring/results/report'
7
- autoload :Heartbeat, 'arkaan/monitoring/results/heartbeat'
8
- end
9
- end
10
- end
@@ -1,50 +0,0 @@
1
- module Arkaan
2
- module Monitoring
3
- module Results
4
- # A record is the result of the vigilante asking the health of one instance.
5
- # @author Vincent Courtois <courtois.vincent@outlook.com>
6
- class Heartbeat
7
- include Mongoid::Document
8
-
9
- # @!attribute [rw] status
10
- # @return [Integer] the HTTP status of the request made for this record.
11
- field :status, type: Integer, default: 500
12
- # @!attribute [rw] body
13
- # @return [Hash] the JSON parsed body from the heartbeat request.
14
- field :body, type: Hash, default: {}
15
- # @!attribute [rw] healthy
16
- # @return [Boolean] TRUE if the instance is deemed healthy, FALSE otherwise.
17
- field :healthy, type: Boolean, default: false
18
- # @!attribute [rw] started_at
19
- # @return [DateTime] the date at which the heartbeat request has started.
20
- field :started_at, type: DateTime
21
- # @!attribute [rw] ended_at
22
- # @return [DateTime] the date at which the request was terminated.
23
- field :ended_at, type: DateTime
24
-
25
- # @!attribute [rw] instance
26
- # @return [Arkaan::Monitoring::Instance] the instance on which the record has been done.
27
- belongs_to :instance, class_name: 'Arkaan::Monitoring::Instance', inverse_of: :heartbeats
28
-
29
- # @!attribute [rw] report
30
- # @return [Arkaan::Monitoring::Results::Report] the report made by the vigilante including this record.
31
- belongs_to :report, class_name: 'Arkaan::Monitoring::Results::Report', inverse_of: :heartbeats
32
-
33
- attr_readonly :healthy
34
-
35
- def status=(status)
36
- self[:status] = status
37
- self[:healthy] = status == 200
38
- end
39
-
40
- def start!
41
- self.started_at = DateTime.now
42
- end
43
-
44
- def end!
45
- self.ended_at = DateTime.now
46
- end
47
- end
48
- end
49
- end
50
- end
@@ -1,46 +0,0 @@
1
- module Arkaan
2
- module Monitoring
3
- module Results
4
- # A report is the result of one call to the API on one instance status route.
5
- # @author Vincent Courtois <courtoi.vincent@outlook.com>
6
- class Report
7
- include Mongoid::Document
8
- include Mongoid::Timestamps
9
-
10
- field :started_at, type: DateTime
11
- # @!attribute [rw] ended_at
12
- # @return [DateTime] the timestamp at which the report ends.
13
- field :ended_at, type: DateTime
14
- # @!attribute [rw] total
15
- # @return [Integer] the total number of services monitored.
16
- field :total, type: Integer, default: 0
17
- # @!attribute [rw] healthy
18
- # @return [Integer] the number of healthy services amongst all the monitored services.
19
- field :healthy, type: Integer, default: 0
20
-
21
- # @!attribute [rw] records
22
- # @return [Array<Arkaan::Monitoring::Results::Record>] the records linked to this report.
23
- has_many :heartbeats, class_name: 'Arkaan::Monitoring::Results::Heartbeat', inverse_of: :report
24
- # @!attribute [rw] vigilante
25
- # @return [Arkaan::Monitoring::Vigilante] the vigilante application that has created this report.
26
- belongs_to :vigilante, class_name: 'Arkaan::Monitoring::Vigilante', inverse_of: :reports
27
-
28
- def add_heartbeat(heartbeat)
29
- self.heartbeats << heartbeat
30
- self.total += 1
31
- self.healthy += (heartbeat.healthy ? 1 : 0)
32
- heartbeat.end!
33
- end
34
-
35
- def start!
36
- self.started_at = DateTime.now
37
- end
38
-
39
- def end!
40
- self.ended_at = DateTime.now
41
- self.save!
42
- end
43
- end
44
- end
45
- end
46
- end
@@ -1,48 +0,0 @@
1
- module Arkaan
2
- module Monitoring
3
- # A vigilante is a specific type of service that watches over the
4
- # infrastructure and give a clear look at its global state.
5
- # @author Vincent Courtois <courtois.vincent@outlook.com>
6
- class Vigilante
7
- include Mongoid::Document
8
- include Mongoid::Timestamps
9
-
10
- # @!attribute [rw] token
11
- # @return [String] the token the vigilante uses to identify himself in the services
12
- field :token, type: String
13
- # @!attribute [rw] max_results
14
- # @return [Integer] the number of results the vigilante should be keeping at any time.
15
- # The oldest result should be erased to not go over the limit
16
- field :max_results, type: Integer, default: 20
17
-
18
- # @!attribute [rw] reports
19
- # @return [Array<Arkaan::monitoring::Results::Report>] the report generated by running this vigilante.
20
- has_many :reports, class_name: 'Arkaan::Monitoring::Results::Report', inverse_of: :vigilante
21
-
22
- validates :token, presence: {message: 'required'}
23
-
24
- validates :max_results,
25
- numericality: {greater_than: 0, message: 'minimum'}
26
-
27
- # Adds a report to the collection of reports by eventually deleting the oldest one.
28
- # @param report [Arkaan::Monitoring::Results::Report] the report to add to the vigilante,
29
- # added only if it does not exceed the max number of reports the vigilante can store.
30
- def add_report(report)
31
- erase_oldest_result if result_full?
32
- reports << report
33
- end
34
-
35
- # Checks if the list of reports is already full, or if more can be added.
36
- # @return [Boolean] TRUE if the number of reports already exceeds the max number.
37
- def results_full?
38
- reports.to_a.count >= max_results
39
- end
40
-
41
- # Erases the oldest results to keep only MAX - 1 results in the list.
42
- def erase_oldest_result
43
- limit = reports.count + 1 - vigilante.max_results
44
- reports.sort_by(created_at: :asc).limit(limit).each(&:delete)
45
- end
46
- end
47
- end
48
- end
@@ -1,25 +0,0 @@
1
- module Arkaan
2
- module Monitoring
3
- # The websocket is a particular kind of service, just like the gateway. It always has the same signature.
4
- # A websocket document is a particular instance of websocket, located on a server and answering to a URL.
5
- # @author Vincent Courtois <courtois.vincent@outlook.com>
6
- class Websocket
7
- include Mongoid::Document
8
- include Mongoid::Timestamps
9
- include Arkaan::Concerns::Activable
10
- include Arkaan::Concerns::Diagnosticable
11
-
12
- # @!attribute [rw] url
13
- # @return [String] the URL of the websocket to be contacted on.
14
- field :url, type: String
15
-
16
- # @!attribute [rw] creator
17
- # @return [Arkaan::Account] the account that created this web socket instance in the database.
18
- belongs_to :creator, class_name: 'Arkaan::Account', inverse_of: :web_sockets, optional: true
19
-
20
- validates :url,
21
- presence: {message: 'required'},
22
- format: {with: /\A(ws:\/\/)([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?\z/, message: 'pattern', if: :url?}
23
- end
24
- end
25
- end