arkaan 2.8.0 → 3.2.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 +4 -4
- data/lib/arkaan.rb +18 -16
- data/lib/arkaan/account.rb +24 -19
- data/lib/arkaan/authentication.rb +4 -1
- data/lib/arkaan/authentication/device.rb +23 -0
- data/lib/arkaan/authentication/session.rb +28 -9
- data/lib/arkaan/campaign.rb +21 -19
- data/lib/arkaan/campaigns.rb +4 -2
- data/lib/arkaan/campaigns/invitation.rb +2 -2
- data/lib/arkaan/chatrooms.rb +7 -5
- data/lib/arkaan/chatrooms/base.rb +3 -1
- data/lib/arkaan/chatrooms/campaign.rb +3 -1
- data/lib/arkaan/chatrooms/conversation.rb +5 -1
- data/lib/arkaan/chatrooms/membership.rb +6 -2
- data/lib/arkaan/chatrooms/message.rb +5 -3
- data/lib/arkaan/concerns.rb +10 -8
- data/lib/arkaan/concerns/activable.rb +6 -4
- data/lib/arkaan/concerns/diagnosticable.rb +7 -5
- data/lib/arkaan/concerns/enumerable.rb +21 -9
- data/lib/arkaan/concerns/historizable.rb +7 -5
- data/lib/arkaan/concerns/mime_typable.rb +18 -10
- data/lib/arkaan/concerns/premiumable.rb +3 -1
- data/lib/arkaan/concerns/sluggable.rb +9 -8
- data/lib/arkaan/concerns/typable.rb +5 -3
- data/lib/arkaan/factories.rb +4 -2
- data/lib/arkaan/files.rb +6 -2
- data/lib/arkaan/files/document.rb +5 -3
- data/lib/arkaan/files/permission.rb +4 -2
- data/lib/arkaan/monitoring.rb +4 -2
- data/lib/arkaan/monitoring/route.rb +6 -3
- data/lib/arkaan/monitoring/service.rb +5 -3
- data/lib/arkaan/notification.rb +5 -2
- data/lib/arkaan/oauth.rb +6 -4
- data/lib/arkaan/oauth/access_token.rb +10 -8
- data/lib/arkaan/oauth/application.rb +18 -12
- data/lib/arkaan/oauth/authorization.rb +8 -6
- data/lib/arkaan/oauth/refresh_token.rb +7 -4
- data/lib/arkaan/permissions.rb +5 -3
- data/lib/arkaan/permissions/category.rb +4 -2
- data/lib/arkaan/permissions/group.rb +4 -2
- data/lib/arkaan/permissions/right.rb +8 -4
- data/lib/arkaan/ruleset.rb +6 -4
- metadata +3 -8
- data/lib/arkaan/decorators/errors.rb +0 -9
- data/lib/arkaan/decorators/errors/env_variable_missing.rb +0 -14
- data/lib/arkaan/decorators/gateway.rb +0 -109
- data/lib/arkaan/factories/errors.rb +0 -9
- data/lib/arkaan/factories/errors/gateway_not_found.rb +0 -14
- data/lib/arkaan/version.rb +0 -3
data/lib/arkaan/concerns.rb
CHANGED
@@ -1,14 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Arkaan
|
2
4
|
# This module holds the shared concerns to include in the desired models.
|
3
5
|
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
4
6
|
module Concerns
|
5
|
-
autoload :Activable
|
7
|
+
autoload :Activable, 'arkaan/concerns/activable'
|
6
8
|
autoload :Diagnosticable, 'arkaan/concerns/diagnosticable'
|
7
|
-
autoload :Enumerable
|
8
|
-
autoload :Historizable
|
9
|
-
autoload :MimeTypable
|
10
|
-
autoload :Premiumable
|
11
|
-
autoload :Sluggable
|
12
|
-
autoload :Typable
|
9
|
+
autoload :Enumerable, 'arkaan/concerns/enumerable'
|
10
|
+
autoload :Historizable, 'arkaan/concerns/historizable'
|
11
|
+
autoload :MimeTypable, 'arkaan/concerns/mime_typable'
|
12
|
+
autoload :Premiumable, 'arkaan/concerns/premiumable'
|
13
|
+
autoload :Sluggable, 'arkaan/concerns/sluggable'
|
14
|
+
autoload :Typable, 'arkaan/concerns/typable'
|
13
15
|
end
|
14
|
-
end
|
16
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Arkaan
|
2
4
|
module Concerns
|
3
5
|
# Concerns for the objects that can be activated or deactivated, included the corresponding scopes.
|
@@ -9,10 +11,10 @@ module Arkaan
|
|
9
11
|
# @!attribute [rw] active
|
10
12
|
# @return [Boolean] the active status of the instance, indicating if someone has deactivated it or not.
|
11
13
|
field :active, type: Boolean, default: true
|
12
|
-
|
13
|
-
scope :active
|
14
|
-
scope :inactive, ->{ where(active: false) }
|
14
|
+
|
15
|
+
scope :active, -> { where(active: true) }
|
16
|
+
scope :inactive, -> { where(active: false) }
|
15
17
|
end
|
16
18
|
end
|
17
19
|
end
|
18
|
-
end
|
20
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Arkaan
|
2
4
|
module Concerns
|
3
5
|
# Includes the diagnostic URL field, and the related validations.
|
@@ -9,14 +11,14 @@ module Arkaan
|
|
9
11
|
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
10
12
|
included do
|
11
13
|
# @!attribute [rw] diagnostic
|
12
|
-
# @return [String] the diagnostic URL to know the status of an
|
14
|
+
# @return [String] the diagnostic URL to know the status of an instance or a service.
|
13
15
|
field :diagnostic, type: String, default: '/status'
|
14
16
|
|
15
17
|
validates :diagnostic,
|
16
|
-
|
17
|
-
|
18
|
-
|
18
|
+
presence: { message: 'required' },
|
19
|
+
length: { minimum: 4, message: 'minlength' },
|
20
|
+
format: { with: %r{\A(\/[a-z]+)+\z}, message: 'pattern' }
|
19
21
|
end
|
20
22
|
end
|
21
23
|
end
|
22
|
-
end
|
24
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Arkaan
|
2
4
|
module Concerns
|
3
5
|
# Defines enumerations for the Mongoid models. An enumeration is a field that can only use a given set of values.
|
@@ -8,7 +10,6 @@ module Arkaan
|
|
8
10
|
# Submodule holding all the static methods add to the current subclass.
|
9
11
|
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
10
12
|
module ClassMethods
|
11
|
-
|
12
13
|
# Creates the field with the given name, set of possible values, and options.
|
13
14
|
# @param field_name [String] the name of the enumerated field.
|
14
15
|
# @param values [Array<Symbol>] the possible values of the enumerated field.
|
@@ -16,18 +17,33 @@ module Arkaan
|
|
16
17
|
def enum_field(field_name, values, options = {})
|
17
18
|
returned = field :"enum_#{field_name}", type: Symbol, default: options[:default]
|
18
19
|
|
19
|
-
validates :"enum_#{field_name}", inclusion: {in: values.map(&:to_sym), message: 'inclusion'}
|
20
|
+
validates :"enum_#{field_name}", inclusion: { in: values.map(&:to_sym), message: 'inclusion' }
|
21
|
+
|
22
|
+
define_getter(field_name)
|
23
|
+
|
24
|
+
define_setter(field_name, values)
|
25
|
+
|
26
|
+
define_values_methods(field_name, values)
|
27
|
+
|
28
|
+
# This is to make enumerations historizable by
|
29
|
+
# returning the field object created by Mongoid.
|
30
|
+
returned
|
31
|
+
end
|
20
32
|
|
33
|
+
def define_getter(field_name)
|
21
34
|
define_method field_name do
|
22
35
|
return self["enum_#{field_name}"]
|
23
36
|
end
|
37
|
+
end
|
24
38
|
|
39
|
+
def define_setter(field_name, values)
|
25
40
|
define_method "#{field_name}=" do |value|
|
26
|
-
|
27
|
-
|
28
|
-
end
|
41
|
+
value = value.to_sym
|
42
|
+
self["enum_#{field_name}"] = value if values.include? value
|
29
43
|
end
|
44
|
+
end
|
30
45
|
|
46
|
+
def define_values_methods(field_name, values)
|
31
47
|
values.map(&:to_sym).each do |value|
|
32
48
|
define_method "#{field_name}_#{value}!" do
|
33
49
|
self["enum_#{field_name}"] = value
|
@@ -37,10 +53,6 @@ module Arkaan
|
|
37
53
|
self["enum_#{field_name}"] == value
|
38
54
|
end
|
39
55
|
end
|
40
|
-
|
41
|
-
# This is to make enumerations historizable by
|
42
|
-
# returning the field object created by Mongoid.
|
43
|
-
returned
|
44
56
|
end
|
45
57
|
end
|
46
58
|
end
|
@@ -35,20 +35,22 @@ module Arkaan
|
|
35
35
|
# Submodule holding all the static methods add to the current subclass.
|
36
36
|
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
37
37
|
module ClassMethods
|
38
|
-
|
39
38
|
# Takes the Mongoid declared field and creates the callbacks
|
40
39
|
# to intercept any value change and add it to the history.
|
41
40
|
# @field field [Mongoid::Fields::Standard] the Mongoid field to historize.
|
42
41
|
def historize(field)
|
42
|
+
embeds_many :history, class_name: 'Arkaan::Event' unless relations.key?('history')
|
43
|
+
historization_after_init(field)
|
44
|
+
historization_after_save(field)
|
45
|
+
end
|
43
46
|
|
44
|
-
|
45
|
-
embeds_many :history, class_name: 'Arkaan::Event'
|
46
|
-
end
|
47
|
-
|
47
|
+
def historization_after_init(field)
|
48
48
|
after_initialize do |doc|
|
49
49
|
add_history(field: field.name, from: nil, to: doc[field.name])
|
50
50
|
end
|
51
|
+
end
|
51
52
|
|
53
|
+
def historization_after_save(field)
|
52
54
|
after_save do |doc|
|
53
55
|
if doc.changed_attributes.key?(field.name)
|
54
56
|
from = doc.changed_attributes[field.name]
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Arkaan
|
2
4
|
module Concerns
|
3
5
|
# Includes the MIME type field to files to ensure only supported types are included.
|
@@ -11,32 +13,38 @@ module Arkaan
|
|
11
13
|
# Defines the MIME type attribute with the given possible MIME types.
|
12
14
|
# @param values [Array<String>] the possible MIME types, * can be used as wild cards.
|
13
15
|
def mime_type(values)
|
14
|
-
|
15
16
|
# @!attribute [rw] mime_type
|
16
17
|
# @return [String] the MIME type of the file, obtained from the uploaded file.
|
17
18
|
field :mime_type, type: String
|
18
|
-
|
19
|
-
validates :mime_type, presence: {message: 'required'}
|
19
|
+
|
20
|
+
validates :mime_type, presence: { message: 'required' }
|
20
21
|
|
21
22
|
validate :mime_type_validity, if: :mime_type?
|
22
23
|
|
24
|
+
mime_type_check(values)
|
25
|
+
end
|
26
|
+
|
27
|
+
def mime_type_check(values)
|
23
28
|
# Validates the validity of the MIME type by checking if it respects any of the given mime types.
|
24
29
|
# If it does not respect any MIME types possible, it adds an error to the mime_type field and invalidates.
|
25
30
|
define_method :mime_type_validity do
|
26
|
-
checked_types =
|
27
|
-
self.send(values) rescue []
|
28
|
-
else
|
29
|
-
values
|
30
|
-
end
|
31
|
+
checked_types = parse_values(values)
|
31
32
|
return true if checked_types.empty?
|
33
|
+
|
32
34
|
checked_types.each do |type|
|
33
35
|
type_regex = ::Regexp.new("^#{type.sub(/\*/, '(.+)')}$")
|
34
|
-
return true
|
36
|
+
return true unless type_regex.match(mime_type).nil?
|
35
37
|
end
|
36
38
|
errors.add(:mime_type, 'pattern')
|
37
39
|
end
|
38
40
|
end
|
41
|
+
|
42
|
+
def parse_values(values)
|
43
|
+
values.is_a?(Symbol) ? send(values) : values
|
44
|
+
rescue StandardError
|
45
|
+
[]
|
46
|
+
end
|
39
47
|
end
|
40
48
|
end
|
41
49
|
end
|
42
|
-
end
|
50
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Arkaan
|
2
4
|
module Concerns
|
3
5
|
# Includes the slug field, always the same in all models.
|
@@ -9,19 +11,18 @@ module Arkaan
|
|
9
11
|
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
10
12
|
module ClassMethods
|
11
13
|
# Add the field and its validations in the model including it.
|
12
|
-
|
13
|
-
def make_sluggable(entity_type)
|
14
|
+
def make_sluggable
|
14
15
|
# @!attribute [rw] slug
|
15
|
-
# @return [String] the slug of the current entity
|
16
|
+
# @return [String] the slug of the current entity, in snake-case.
|
16
17
|
field :slug, type: String
|
17
18
|
|
18
19
|
validates :slug,
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
length: { minimum: 4, message: 'minlength', if: :slug? },
|
21
|
+
format: { with: /\A[a-z]+(_[a-z]+)*\z/, message: 'pattern', if: :slug? },
|
22
|
+
uniqueness: { message: 'uniq', if: :slug? },
|
23
|
+
presence: { message: 'required' }
|
23
24
|
end
|
24
25
|
end
|
25
26
|
end
|
26
27
|
end
|
27
|
-
end
|
28
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Arkaan
|
2
4
|
module Concerns
|
3
5
|
# Concerns for the objects that can be activated or deactivated, included the corresponding scopes.
|
@@ -7,11 +9,11 @@ module Arkaan
|
|
7
9
|
|
8
10
|
included do
|
9
11
|
include Arkaan::Concerns::Enumerable
|
10
|
-
|
12
|
+
|
11
13
|
# @!attribute [rw] type
|
12
14
|
# @return [Symbol] the type of the instance, determining its way of being deployed, restarted, etc.
|
13
|
-
enum_field :type, [
|
15
|
+
enum_field :type, %i[heroku local unix], default: :heroku
|
14
16
|
end
|
15
17
|
end
|
16
18
|
end
|
17
|
-
end
|
19
|
+
end
|
data/lib/arkaan/factories.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Arkaan
|
2
4
|
# Static factories are used to create decorated objects easily.
|
3
5
|
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
4
6
|
module Factories
|
5
7
|
autoload :Gateways, 'arkaan/factories/gateways'
|
6
|
-
autoload :Errors
|
8
|
+
autoload :Errors, 'arkaan/factories/errors'
|
7
9
|
end
|
8
|
-
end
|
10
|
+
end
|
data/lib/arkaan/files.rb
CHANGED
@@ -1,6 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Arkaan
|
4
|
+
# This module holds all logic for the files uploaded in a conversation.
|
5
|
+
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
2
6
|
module Files
|
3
|
-
autoload :Document
|
7
|
+
autoload :Document, 'arkaan/files/document'
|
4
8
|
autoload :Permission, 'arkaan/files/permission'
|
5
9
|
end
|
6
|
-
end
|
10
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Arkaan
|
2
4
|
module Files
|
3
5
|
# a document is an uploaded file in the S3 clone application.
|
@@ -30,9 +32,9 @@ module Arkaan
|
|
30
32
|
# @return [Array<Arkaan::Files::Permission>] the permissions granted to access this file.
|
31
33
|
has_many :permissions, class_name: 'Arkaan::Files::Permission', inverse_of: :file
|
32
34
|
|
33
|
-
validates :name, :extension, :folder, :mime_type, presence: {message: 'required'}
|
35
|
+
validates :name, :extension, :folder, :mime_type, presence: { message: 'required' }
|
34
36
|
|
35
|
-
validates :folder, format: {without:
|
37
|
+
validates :folder, format: { without: %r{\/\/}, message: 'format' }
|
36
38
|
|
37
39
|
validate :filename_unicity
|
38
40
|
|
@@ -47,4 +49,4 @@ module Arkaan
|
|
47
49
|
end
|
48
50
|
end
|
49
51
|
end
|
50
|
-
end
|
52
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Arkaan
|
2
4
|
module Files
|
3
5
|
# The permission granted to a user to access and/or delete a file.
|
@@ -9,7 +11,7 @@ module Arkaan
|
|
9
11
|
|
10
12
|
# @!attribute [rw] type
|
11
13
|
# @return [Symbol] the type of permission granted (is the user able to delete the file ?)
|
12
|
-
enum_field :type, [
|
14
|
+
enum_field :type, %i[read read_write]
|
13
15
|
|
14
16
|
# @!attribute [rw] file
|
15
17
|
# @return [Arkaan::Files::Document] the document the permission is linked to.
|
@@ -19,4 +21,4 @@ module Arkaan
|
|
19
21
|
belongs_to :account, class_name: 'Arkaan::Account', inverse_of: :permissions
|
20
22
|
end
|
21
23
|
end
|
22
|
-
end
|
24
|
+
end
|
data/lib/arkaan/monitoring.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Arkaan
|
2
4
|
# The monitoring module holds all the logic about the services so they can be activated or deactivated.
|
3
5
|
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
4
6
|
module Monitoring
|
5
|
-
autoload :Route
|
7
|
+
autoload :Route, 'arkaan/monitoring/route'
|
6
8
|
autoload :Service, 'arkaan/monitoring/service'
|
7
9
|
end
|
8
|
-
end
|
10
|
+
end
|
@@ -1,6 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Arkaan
|
2
4
|
module Monitoring
|
3
|
-
# A route is an endpoint accessible in a service. Each route has to have
|
5
|
+
# A route is an endpoint accessible in a service. Each route has to have
|
6
|
+
# an associated endpoint in the deployed instances.
|
4
7
|
# @param Vincent Courtois <courtois.vincent@outlook.com>
|
5
8
|
class Route
|
6
9
|
include Mongoid::Document
|
@@ -27,10 +30,10 @@ module Arkaan
|
|
27
30
|
has_and_belongs_to_many :groups, class_name: 'Arkaan::Permissions::Group', inverse_of: :groups
|
28
31
|
|
29
32
|
validates :path,
|
30
|
-
|
33
|
+
format: { with: %r{\A(\/|((\/:?[a-zA-Z0-9_]+)+))\z}, message: 'pattern', if: :path? }
|
31
34
|
|
32
35
|
validates :verb,
|
33
|
-
|
36
|
+
inclusion: { message: 'unknown', in: %w[get post put delete patch option] }
|
34
37
|
|
35
38
|
# Returns the complete path, enriched with the path of the service.
|
36
39
|
# @return [String] the complete path to access this route from the outside.
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Arkaan
|
2
4
|
module Monitoring
|
3
5
|
# A service is the representation of one of the applications composing the API.
|
@@ -23,9 +25,9 @@ module Arkaan
|
|
23
25
|
# @return [Array<Arkaan::Monitoring::Route>] the routes associated to this service, accessible from the gateway.
|
24
26
|
has_many :routes, class_name: 'Arkaan::Monitoring::Route', inverse_of: :service
|
25
27
|
|
26
|
-
validates :key, uniqueness: {message: 'uniq'}
|
28
|
+
validates :key, uniqueness: { message: 'uniq' }
|
27
29
|
|
28
|
-
validates :path, format: {with:
|
30
|
+
validates :path, format: { with: %r{\A(\/:?[a-z]+)+\z}, message: 'pattern' }
|
29
31
|
end
|
30
32
|
end
|
31
|
-
end
|
33
|
+
end
|
data/lib/arkaan/notification.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Arkaan
|
2
4
|
# A notification is a little something to warn a user that an action concerning him or her occurred.
|
3
5
|
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
@@ -12,11 +14,12 @@ module Arkaan
|
|
12
14
|
# @return [Boolean] TRUE if the notification has been read (seen by the user), FALSE otherwise.
|
13
15
|
field :read, type: Boolean, default: false
|
14
16
|
# @!attribute [rw] data
|
15
|
-
# @return [Hash] the custom data that can be attached to this notification,
|
17
|
+
# @return [Hash] the custom data that can be attached to this notification,
|
18
|
+
# for example for an invitation it can be the invited username.
|
16
19
|
field :data, type: Hash, default: {}
|
17
20
|
|
18
21
|
# @!attribute [rw] account
|
19
22
|
# @return [Arkaan::Account] the account concerned by this notification.
|
20
23
|
embedded_in :account, class_name: 'Arkaan::Account', inverse_of: :notifications
|
21
24
|
end
|
22
|
-
end
|
25
|
+
end
|
data/lib/arkaan/oauth.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Arkaan
|
2
4
|
# This module holds the logic for the connection of an application to our API.
|
3
5
|
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
4
6
|
module OAuth
|
5
|
-
autoload :Application
|
7
|
+
autoload :Application, 'arkaan/oauth/application'
|
6
8
|
autoload :Authorization, 'arkaan/oauth/authorization'
|
7
|
-
autoload :AccessToken
|
8
|
-
autoload :RefreshToken
|
9
|
+
autoload :AccessToken, 'arkaan/oauth/access_token'
|
10
|
+
autoload :RefreshToken, 'arkaan/oauth/refresh_token'
|
9
11
|
end
|
10
|
-
end
|
12
|
+
end
|