virtuatable-core 1.0.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/lib/core/controllers/base.rb +63 -0
  3. data/lib/core/controllers.rb +9 -0
  4. data/lib/core/helpers/accounts.rb +22 -0
  5. data/lib/core/helpers/applications.rb +26 -0
  6. data/lib/core/helpers/declarators.rb +83 -0
  7. data/lib/core/helpers/errors/bad_request.rb +15 -0
  8. data/lib/core/helpers/errors/base.rb +36 -0
  9. data/lib/core/helpers/errors/forbidden.rb +15 -0
  10. data/lib/core/helpers/errors/not_found.rb +15 -0
  11. data/lib/core/helpers/errors.rb +48 -0
  12. data/lib/core/helpers/fields.rb +35 -0
  13. data/lib/core/helpers/parameters.rb +25 -0
  14. data/lib/core/helpers/responses.rb +50 -0
  15. data/lib/core/helpers/routes.rb +21 -0
  16. data/lib/core/helpers/sessions.rb +30 -0
  17. data/lib/core/helpers.rb +18 -0
  18. data/lib/core/models/account.rb +2 -5
  19. data/lib/core/models/authentication/session.rb +2 -0
  20. data/lib/core/models/campaign.rb +7 -1
  21. data/lib/core/models/campaigns/invitation.rb +2 -0
  22. data/lib/core/models/campaigns/map.rb +37 -0
  23. data/lib/core/models/campaigns/tag.rb +2 -0
  24. data/lib/core/models/campaigns/token.rb +31 -0
  25. data/lib/core/models/campaigns/token_position.rb +39 -0
  26. data/lib/core/models/campaigns.rb +3 -0
  27. data/lib/core/models/chatrooms/campaign.rb +3 -0
  28. data/lib/core/models/chatrooms/message.rb +3 -1
  29. data/lib/core/models/concerns/activable.rb +1 -1
  30. data/lib/core/models/concerns/premiumable.rb +1 -1
  31. data/lib/core/models/concerns.rb +0 -1
  32. data/lib/core/models/files/document.rb +2 -0
  33. data/lib/core/models/files/permission.rb +2 -0
  34. data/lib/core/models/notification.rb +1 -1
  35. data/lib/core/models/oauth/access_token.rb +2 -0
  36. data/lib/core/models/oauth/application.rb +3 -1
  37. data/lib/core/models/oauth/authorization.rb +2 -0
  38. data/lib/core/models/oauth/refresh_token.rb +2 -0
  39. data/lib/core/models/permissions/category.rb +2 -0
  40. data/lib/core/models/permissions/group.rb +5 -3
  41. data/lib/core/models/permissions/right.rb +2 -0
  42. data/lib/core/models/{monitoring → permissions}/route.rb +7 -16
  43. data/lib/core/models/permissions.rb +1 -0
  44. data/lib/core/models/ruleset.rb +2 -0
  45. data/lib/core/models.rb +0 -3
  46. data/lib/core/services/accounts.rb +16 -0
  47. data/lib/core/services/base.rb +11 -0
  48. data/lib/core/services/registry.rb +15 -0
  49. data/lib/core/services/sessions.rb +33 -0
  50. data/lib/core/services.rb +8 -0
  51. data/lib/core/version.rb +1 -1
  52. data/lib/core.rb +3 -0
  53. metadata +84 -43
  54. data/lib/core/models/chatrooms/conversation.rb +0 -9
  55. data/lib/core/models/chatrooms/membership.rb +0 -17
  56. data/lib/core/models/concerns/diagnosticable.rb +0 -24
  57. data/lib/core/models/decorators/errors/env_variable_missing.rb +0 -16
  58. data/lib/core/models/decorators/errors.rb +0 -11
  59. data/lib/core/models/decorators/gateway.rb +0 -111
  60. data/lib/core/models/factories/errors/gateway_not_found.rb +0 -16
  61. data/lib/core/models/factories/errors.rb +0 -11
  62. data/lib/core/models/factories.rb +0 -10
  63. data/lib/core/models/monitoring/service.rb +0 -33
  64. data/lib/core/models/monitoring.rb +0 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eaef58986378462da6ff78e3aeac595cbed418f3351254e3e99b303059fe21d1
4
- data.tar.gz: 1ed97f4ff856ecfbe5ccf969547ee0141f03f1e9c59304661880f6d4e87bfaf7
3
+ metadata.gz: dfc5218a02310414bc7961f93e97d05bb37cb73b9d4868fa8c83e6666485447a
4
+ data.tar.gz: c83d949e50ae999b2182fd7c4678b9b45a5418c25d750d859d43f4f41713029e
5
5
  SHA512:
6
- metadata.gz: ffc760f437db7e376de09c5e88fa794e440729600819f8cce7474d4db6a122185fc20472020e131ae889d6371f1cf95f0fb7389506ac4ec1f5a9840a3ed2dc98
7
- data.tar.gz: '08addb4e9612082536359a2a624f5eded215ba382a8f9b16aebf016cfc35b9c9dbc12a503a3160780dc81896bdabf0434f1966062d5eb339e999eadef92cbec1'
6
+ metadata.gz: 34d89edd05d094d7db645e4403060bbbe091e3e4c77733285cd34fb7d4ab3890f28a03427bb270195c5422f4ea6235140a5693d5a112b3178f25d7a1fe9e8314
7
+ data.tar.gz: c5c6871afefd3a2dd445ffaf060c59cb676ed54a720ae26c401af4a5b62e49be4969baac10eebea8bd46ded9a8835249b62168c6ef1338560f00f6d190d288cc
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+ require 'sinatra/config_file'
3
+ require 'sinatra/custom_logger'
4
+
5
+ module Core
6
+ module Controllers
7
+ # This class represents a base controller for the system, giving access
8
+ # to checking methods for sessions, gateways, applications, etc.
9
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
10
+ class Base < Sinatra::Base
11
+ register Sinatra::ConfigFile
12
+ helpers Sinatra::CustomLogger
13
+ # Includes the custom errors throwers and responses helpers.
14
+ include Core::Helpers::Errors
15
+ include Core::Helpers::Responses
16
+ # Includes the checking methods for sessions.
17
+ include Core::Helpers::Sessions
18
+ # Include the checkers and getters for OAuth apps
19
+ include Core::Helpers::Applications
20
+ # Include checkers for field requirement and check
21
+ include Core::Helpers::Fields
22
+ # Include the getter for the currently requested route.
23
+ include Core::Helpers::Routes
24
+ # Include the getter and checkers for accounts.
25
+ include Core::Helpers::Accounts
26
+ # Include the loading of the parameters from the JSON body
27
+ include Core::Helpers::Parameters
28
+ # This module is extended, not included, because it provides routes
29
+ # declaration methods used in class declarations.
30
+ extend Core::Helpers::Declarators
31
+
32
+ configure do
33
+ set :logger, Logger.new(STDOUT)
34
+ logger.level = Logger::ERROR if ENV['RACK_ENV'] == 'test'
35
+ # This configuration options allow the error handler to work in tests.
36
+ set :show_exceptions, false
37
+ set :raise_errors, false
38
+ end
39
+
40
+ error Mongoid::Errors::Validations do |errors|
41
+ key = errors.document.errors.messages.keys.first
42
+ message = errors.document.errors.messages[key][0]
43
+ api_bad_request key, message: message
44
+ end
45
+
46
+ error Core::Helpers::Errors::NotFound do |exception|
47
+ api_not_found exception.message
48
+ end
49
+
50
+ error Core::Helpers::Errors::BadRequest do |exception|
51
+ api_bad_request exception.message
52
+ end
53
+
54
+ error Core::Helpers::Errors::Forbidden do |exception|
55
+ api_forbidden exception.message
56
+ end
57
+
58
+ error StandardError do |error|
59
+ api_error 500, "unknown_field.#{error.class.name}"
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Core
4
+ # Controllers are to be subclassed in each service.
5
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
6
+ module Controllers
7
+ autoload :Base, 'core/controllers/base'
8
+ end
9
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Core
4
+ module Helpers
5
+ # These helpers provide methods used to get and check accounts.
6
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
7
+ module Accounts
8
+ # Raises a bad request error if the account if not found.
9
+ # @raise [Virtuatable::API::Errors::BadRequest] the error raised when the account is not found.
10
+ def account
11
+ return @account unless @account.nil?
12
+
13
+ session_id_required if !respond_to?(:session) || session.nil?
14
+ @account = session.account
15
+ end
16
+
17
+ def account_id_not_found
18
+ api_bad_request('session_id.required')
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Core
4
+ module Helpers
5
+ # Helpers to get and check OAuth applications connecting the the application.
6
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
7
+ module Applications
8
+ # Looks for the application sending the API's request, and raises error if not found.
9
+ # @param [Core::Models::OAuth::Application] the application requesting the service.
10
+ def application(premium: false)
11
+ return @application unless @application.nil?
12
+
13
+ check_presence 'app_key'
14
+ @application = application_model.find_by(key: params['app_key'])
15
+ api_not_found 'app_key.unknown' if @application.nil?
16
+ api_forbidden 'app_key.forbidden' if premium && !@application.premium
17
+
18
+ @application
19
+ end
20
+
21
+ def application_model
22
+ Core::Models::OAuth::Application
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Core
4
+ module Helpers
5
+ # This helpers module is a bit larger than the others as it provides methods
6
+ # to declare routes whithin a service, performing needed checks and filters.
7
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
8
+ module Declarators
9
+ # @!attribute [r] routes
10
+ # @return [Array<Core::Models::Permissions::Route>] the currently declared routes.
11
+ attr_reader :api_routes
12
+
13
+ # Main method to declare new routes, persisting them in the database and
14
+ # declaring it in the Sinatra application with the needed before checks.
15
+ #
16
+ # @param verb [String] the HTTP method for the route.
17
+ # @param path [String] the whole URI with parameters for the route.
18
+ # @param options [Hash] the additional options for the route.
19
+ def api_route(verb, path, options: {}, &block)
20
+ options = default_options.merge(options)
21
+ route = add_route(verb: verb, path: path, options: options)
22
+
23
+ # TODO : do everything in the #send itself to avoid
24
+ # route reload issues when premium is changed. It will
25
+ # add some treatments but avoid many problems if route.premium
26
+ send(route.verb, route.path) do
27
+ application(premium: current_route.premium)
28
+ session if current_route.authenticated
29
+ instance_eval(&block)
30
+ end
31
+ end
32
+
33
+ # Add a route to the database, then to the routes array.
34
+ # @param verb [String] the HTTP method used to request this route.
35
+ # @param path [String] the path used to request this route.
36
+ # @return [Core::Models::Permissions::Route] the created route.
37
+ def add_route(verb:, path:, options:)
38
+ route = Core::Models::Permissions::Route.find_or_create_by!(
39
+ path: path,
40
+ verb: verb.downcase,
41
+ premium: options[:premium],
42
+ authenticated: options[:authenticated]
43
+ )
44
+ api_routes.nil? ? @api_routes = [route] : push_route(route)
45
+ add_permissions(route)
46
+ route
47
+ end
48
+
49
+ # Pushes the route in the api routes list, by creating it if needed
50
+ # @param route [Core::Models::Permissions::Route] the route to push in the list of routes.
51
+ def push_route(route)
52
+ @api_routes << route if api_routes.none? do |tmp_route|
53
+ route.id == tmp_route.id
54
+ end
55
+ end
56
+
57
+ # Add the default access permissions to a route. Any group tagged superuser
58
+ # can automatically access any newly declared_route.
59
+ # params route [Core::Models::Permissions::Route] the route to add the permissions to.
60
+ def add_permissions(route)
61
+ groups = Core::Models::Permissions::Group.where(is_superuser: true)
62
+ groups.each do |group|
63
+ unless route.groups.where(id: group.id).exists?
64
+ route.groups << group
65
+ route.save!
66
+ end
67
+ end
68
+ end
69
+
70
+ # The default options for a route, being the most used value for each key.
71
+ # @return [Hash] the default options as a hash.
72
+ def default_options
73
+ {
74
+ # If TRUE the application MUST be premium to access the route.
75
+ # Mainly used to protect administration routes against illegal accesses.
76
+ premium: false,
77
+ # If TRUE the user MUST be authenticated to access the route.
78
+ authenticated: true
79
+ }
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Core
4
+ module Helpers
5
+ module Errors
6
+ # A bad request error is raised when the data given to a model makes this model invalid.
7
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
8
+ class BadRequest < Core::Helpers::Errors::Base
9
+ def initialize(field:, error:)
10
+ super(field: field, error: error, status: 400)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Core
4
+ module Helpers
5
+ module Errors
6
+ # Standard class parent to all specialized http errors.
7
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
8
+ class Base < StandardError
9
+ # @!attribute [rw] field
10
+ # @return [String, Symbol] the name of the field in error in the model.
11
+ attr_accessor :field
12
+ # @!attribute [rw] action
13
+ # @return [String] the name of the action the user was trying to perform on the model (often crate or update).
14
+ attr_accessor :action
15
+ # @attribute [rw] error
16
+ # @return [String] the label of the error returned by the model.
17
+ attr_accessor :error
18
+ # @attribute [rw] status
19
+ # @return [Integer] the HTTP status code as a number (eg: 400, 422 or 500)
20
+ attr_accessor :status
21
+
22
+ def initialize(field:, error:, status:)
23
+ @field = field.to_s
24
+ @error = error
25
+ @status = status
26
+ end
27
+
28
+ # Returns the formatted message for this exception.
29
+ # @return [String] a message indicating what field fails, and why.
30
+ def message
31
+ "#{field}.#{error}"
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Core
4
+ module Helpers
5
+ module Errors
6
+ # A forbidden error occurs when a user tries to perform an action he's not allowed to.
7
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
8
+ class Forbidden < Core::Helpers::Errors::Base
9
+ def initialize(field:, error:)
10
+ super(field: field, error: error, status: 403)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Core
4
+ module Helpers
5
+ module Errors
6
+ # A not found error occurs when a user tries to reach a resource that does not exist.
7
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
8
+ class NotFound < Core::Helpers::Errors::Base
9
+ def initialize(field:, error:)
10
+ super(field: field, error: error, status: 404)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Core
4
+ module Helpers
5
+ # This module defines method to raise HTTP errors in the routes easily.
6
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
7
+ module Errors
8
+ autoload :Base, 'core/helpers/errors/base'
9
+ autoload :BadRequest, 'core/helpers/errors/bad_request'
10
+ autoload :Forbidden, 'core/helpers/errors/forbidden'
11
+ autoload :NotFound, 'core/helpers/errors/not_found'
12
+
13
+ # Stops the executing and raises an HTTP error in the route.
14
+ # The message MUST be of the for <field>.<error> to be correctly parsed.
15
+ # The action is automatically parsed from the route call and added.
16
+ #
17
+ # @param status [Integer] the HTTP status code the response will have
18
+ # @param message [String] the raw message to split and format as body.
19
+ def api_error(status, message)
20
+ field, error = message.split('.')
21
+ docs = settings.errors.try(field).try(error)
22
+ errors = { status: status, field: field, error: error, docs: docs }
23
+ halt status, errors.to_json
24
+ end
25
+
26
+ # Stops the execution to return a NOT FOUND response.
27
+ # @param field [String] the field in params concerned by the error.
28
+ # @param message [String] the message if different of "unknown".
29
+ def api_not_found(field, message: 'unknown')
30
+ api_error 404, "#{field}.#{message}"
31
+ end
32
+
33
+ # Stops the execution to return a BAD REQUEST response.
34
+ # @param field [String] the field in params concerned by the error.
35
+ # @param message [String] the message if different of "required".
36
+ def api_bad_request(field, message: 'required')
37
+ api_error 400, "#{field}.#{message}"
38
+ end
39
+
40
+ # Stops the execution to return a FORBIDDEN response.
41
+ # @param field [String] the field in params concerned by the error.
42
+ # @param message [String] the message if different of "forbidden".
43
+ def api_forbidden(field, message: 'forbidden')
44
+ api_error 403, "#{field}.#{message}"
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Core
4
+ module Helpers
5
+ # Helpers for the parameters of a request.
6
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
7
+ module Fields
8
+ # Checks the presence of several fields given as parameters and halts the execution if it's not present.
9
+ # @param fields [Array<String>] an array of fields names to search in the parameters
10
+ def check_presence(*fields)
11
+ fields.each do |field|
12
+ api_bad_request "#{field}.required" unless field_defined?(field)
13
+ end
14
+ end
15
+
16
+ # Checks the presence of either fields given in parameters.
17
+ # It halts with an error only if ALL parameters are not given.
18
+ #
19
+ # @param fields [Array<String>] an array of fields names to search in the parameters
20
+ # @param key [String] the key to search in the errors configuration file.
21
+ def check_either_presence(*fields, key:)
22
+ api_bad_request "#{key}.required" if fields.none? do |field|
23
+ field_defined?(field)
24
+ end
25
+ end
26
+
27
+ # Checks if a given field is defined in the params
28
+ # @param field [String] the name of the field to check in the params
29
+ # @return [Boolean] TRUE if the field exists, FALSE otherwise.
30
+ def field_defined?(field)
31
+ !params.nil? && params.key?(field) && params[field] != ''
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Core
4
+ module Helpers
5
+ # Helpers to correctly build the parameters hash, even from the JSON body.
6
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
7
+ module Parameters
8
+ # Returns the parameters depending on whether the request has a body
9
+ # or not. If it has a body, it parses it, otherwise it just returns the params.
10
+ # @return [Hash] the parameters sent with the request.
11
+ def params
12
+ super.merge(body_params)
13
+ end
14
+
15
+ # The parameters from the JSON body if it is sent.
16
+ # @return [Hash] the JSON body parsed as a dictionary.
17
+ def body_params
18
+ request.body.rewind
19
+ JSON.parse(request.body.read.to_s)
20
+ rescue JSON::ParserError
21
+ {}
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Core
4
+ module Helpers
5
+ # Modules holding the responses that are NOT errors.
6
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
7
+ module Responses
8
+ # Builds a list of items as a standard API response.
9
+ # The response will be a JSON hash containing two keys :
10
+ # - :count will hold the number of items displayed in the list
11
+ # - :items will hold the list of items.
12
+ # @param items [Array] the items to format as a standard API response.
13
+ def api_list(items)
14
+ halt 200, {
15
+ count: items.count,
16
+ items: items.map { |item| enhanced_h(item) }
17
+ }.to_json
18
+ end
19
+
20
+ # Displays a creation standard response,
21
+ # returning the informations about the created item.
22
+ # @param item [Object] any object that responds to #to_h to display to the user.
23
+ def api_created(item)
24
+ halt 201, enhanced_json(item)
25
+ end
26
+
27
+ # Displays an item with the standards of the API.
28
+ # @param item [Object] the item to display as a JSON formatted hash.
29
+ def api_item(item)
30
+ halt 200, enhanced_json(item)
31
+ end
32
+
33
+ # Displays a message with a 200 status code
34
+ # @param message [String] the message to display with the API standards.
35
+ def api_ok(message)
36
+ api_item message: message
37
+ end
38
+
39
+ private
40
+
41
+ def enhanced_h(item)
42
+ (item.respond_to?(:enhance) ? item.enhance : item).to_h
43
+ end
44
+
45
+ def enhanced_json(item)
46
+ enhanced_h(item).to_json
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Core
4
+ module Helpers
5
+ # This module provides the #current_route method to get the current
6
+ # Core::Models::Monitoring::Route object from whithin sinatra routes.
7
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
8
+ module Routes
9
+ # The currently requested API route, used to see inside the block
10
+ # if the route is premium or not, authenticated or not.
11
+ # @return [Core::Models::Monitoring::Route] the currently requested route.
12
+ def current_route
13
+ splitted = request.env['sinatra.route'].split(' ')
14
+ verb = splitted.first.downcase
15
+ self.class.api_routes.find do |route|
16
+ route.verb == verb && route.path == splitted.last
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Core
4
+ module Helpers
5
+ # This helper gives access to methods about user's session on the API.
6
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
7
+ module Sessions
8
+ # Checks the session of the user requesting the API and returns an error
9
+ # if it either not exists with the given token, or the token is not given.
10
+ #
11
+ # @raise [Virtuatable::API::Errors::NotFound] if the session is not found
12
+ # or the token not given in the parameters of the request.
13
+ # @raise [Virtuatable::API::Errors::BadRequest] if the session token is
14
+ # not correctly given in the parameters.
15
+ #
16
+ # @return [Core::Models::Authentication::Session] the current session of the user.
17
+ def session
18
+ return @session unless @session.nil?
19
+
20
+ check_presence 'session_id'
21
+ @session = session_model.find_by(token: params['session_id'])
22
+ @session.nil? ? api_not_found('session_id.unknown') : @session
23
+ end
24
+
25
+ def session_model
26
+ Core::Models::Authentication::Session
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Core
4
+ # The helpers are used inside the controllers to dynamically
5
+ # add features and functions.
6
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
7
+ module Helpers
8
+ autoload :Accounts, 'core/helpers/accounts'
9
+ autoload :Applications, 'core/helpers/applications'
10
+ autoload :Declarators, 'core/helpers/declarators'
11
+ autoload :Errors, 'core/helpers/errors'
12
+ autoload :Fields, 'core/helpers/fields'
13
+ autoload :Parameters, 'core/helpers/parameters'
14
+ autoload :Responses, 'core/helpers/responses'
15
+ autoload :Routes, 'core/helpers/routes'
16
+ autoload :Sessions, 'core/helpers/sessions'
17
+ end
18
+ end
@@ -8,6 +8,8 @@ module Core
8
8
  include ActiveModel::SecurePassword
9
9
  include Core::Models::Concerns::Enumerable
10
10
 
11
+ store_in collection: 'accounts'
12
+
11
13
  # @!attribute [rw] username
12
14
  # @return [String] the nickname the user chose at subscription, must be given, unique, and 6 or more characters long.
13
15
  field :username, type: String
@@ -46,9 +48,6 @@ module Core
46
48
  # @!attribute [rw] authorizations
47
49
  # @return [Array<Core::Models::OAuth::Authorization>] the authorization issued by this account to third-party applications to access its data.
48
50
  has_many :authorizations, class_name: 'Core::Models::OAuth::Authorization', inverse_of: :account
49
- # @!attribute [rw] services
50
- # @return [Array<Core::Models::Monitoring::Service>] the services created by this user.
51
- has_many :services, class_name: 'Core::Models::Monitoring::Service', inverse_of: :creator
52
51
  # @!attribute [rw] sessions
53
52
  # @return [Array<Core::Models::Authentication::Session>] the sessions on which this account is, or has been logged in.
54
53
  has_many :sessions, class_name: 'Core::Models::Authentication::Session', inverse_of: :account
@@ -65,8 +64,6 @@ module Core
65
64
  # @return [Array<Core::Models::Chatrooms::Messages>] all the messages ever sent by the user.
66
65
  has_many :messages, class_name: 'Core::Models::Chatrooms::Message', inverse_of: :account
67
66
 
68
- has_many :memberships, class_name: 'Core::Models::Chatrooms::Membership', inverse_of: :account
69
-
70
67
  # @!attribute [rw] notifications
71
68
  # @return [Array<Core::Models::Notification>] the notifications linked to this user.
72
69
  embeds_many :notifications, class_name: 'Core::Models::Notification', inverse_of: :account
@@ -9,6 +9,8 @@ module Core
9
9
  include Mongoid::Document
10
10
  include Mongoid::Timestamps
11
11
 
12
+ store_in collection: 'sessions'
13
+
12
14
  # @!attribute [rw] token
13
15
  # @return [String] the unique token for this session, used to identify it and be sure the user is connected on this application.
14
16
  field :token, type: String
@@ -6,6 +6,8 @@ module Core
6
6
  include Mongoid::Document
7
7
  include Mongoid::Timestamps
8
8
 
9
+ store_in collection: 'campaigns'
10
+
9
11
  # @!attribute [rw] title
10
12
  # @return [String] the title, or name, of the campaign, used to identify it in the list.
11
13
  field :title, type: String
@@ -14,7 +16,7 @@ module Core
14
16
  field :description, type: String
15
17
  # @!attribute [rw] is_private
16
18
  # @return [Boolean] TRUE if the campaign can be joined only by being invited by the creator, FALSE if it's publicly displayed and accessible.
17
- field :is_private, type: Boolean, default: true
19
+ field :is_private, type: Mongoid::Boolean, default: true
18
20
  # @!attribute [rw] tags
19
21
  # @return [Array<String>] an array of tags describing characteristics of this campaign.
20
22
  field :tags, type: Array, default: []
@@ -33,6 +35,10 @@ module Core
33
35
  # @return [Core::Models::Chatrooms::Campaign] the chatroom linked to this campaign.
34
36
  embeds_one :chatroom, class_name: 'Core::Models::Chatrooms::Campaign', inverse_of: :campaign
35
37
 
38
+ # @!attribute [rw] tokens
39
+ # @return [Array<Core::Models::Campaigns::Token>] the tokens declared in this campaign.
40
+ embeds_many :tokens, class_name: 'Core::Models::Campaigns::Token', inverse_of: :campaign
41
+
36
42
  # @!attribute [rw] ruleset
37
43
  # @return [Core::Models::Ruleset] the set of rules this campaign is based upon.
38
44
  belongs_to :ruleset, class_name: 'Core::Models::Ruleset', inverse_of: :campaigns, optional: true
@@ -13,6 +13,8 @@ module Core
13
13
  include Core::Models::Concerns::Enumerable
14
14
  include Core::Models::Concerns::Historizable
15
15
 
16
+ store_in collection: 'invitations'
17
+
16
18
  # @!attribute [rw] account
17
19
  # @return [Core::Models::Account] the account the invitation has been issued to.
18
20
  belongs_to :account, class_name: 'Core::Models::Account', inverse_of: :invitations
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Core
4
+ module Models
5
+ module Campaigns
6
+ # A map is a battleground where the players can place tokens and live the adventure.
7
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
8
+ class Map
9
+ include Mongoid::Document
10
+ include Mongoid::Timestamps
11
+
12
+ store_in collection: 'maps'
13
+
14
+ # @!attribute [rw] height
15
+ # @return [Integer] the number of lines in the map matric.
16
+ field :height, type: Integer, default: 1
17
+ # @!attribute [rw] width
18
+ # @return [Integer] the number of columns in the map matric.
19
+ field :width, type: Integer, default: 1
20
+
21
+ # @!attribute [rw] campaign
22
+ # @return [Core::Models::Campaign] the campaign in which the map can be found.
23
+ belongs_to :campaign, class_name: 'Core::Models::Campaign', inverse_of: :maps
24
+
25
+ # @!attribute [rw] positions
26
+ # @return [Array<Core::Model::Campaigns::TokenPosition>] the instanciated tokens on this map.
27
+ embeds_many :positions, class_name: 'Core::Models::Campaigns::TokenPosition', inverse_of: :map
28
+
29
+ validates :height,
30
+ numericality: { greater_than: 0, message: 'minimum' }
31
+
32
+ validates :width,
33
+ numericality: { greater_than: 0, message: 'minimum' }
34
+ end
35
+ end
36
+ end
37
+ end
@@ -9,6 +9,8 @@ module Core
9
9
  include Mongoid::Document
10
10
  include Mongoid::Timestamps
11
11
 
12
+ store_in collection: 'tags'
13
+
12
14
  # @!attribute [rw] content
13
15
  # @return [String] the string content of the tag, describing a characteristic.
14
16
  field :content, type: String