arkaan 1.8.0 → 1.9.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 931a5d11dc8f40aa987d3960f2a8e16dc66ec04c6f1a442ecc31f3bbc08431fa
4
- data.tar.gz: a425f9550df833b6221daa379b57d1ecaa54d428a253de887dffc9845ba59d88
3
+ metadata.gz: e70b9b135c0ac5b57d31e26c224937b2ed9ca69bd902f10f2cc4f7c2bddd339f
4
+ data.tar.gz: 61b68c995672ff514cecf8c022a30e9231c05e9f5ed55b468e17fe528068d3a6
5
5
  SHA512:
6
- metadata.gz: e7263f342e7821a773574f5bdc98fa35e6d931bc1b2223941be1c5ac790dbf83d3063561ff82f4f0bf345e14ba30391ba22640225efe23e33b90b7bff04a8f0f
7
- data.tar.gz: decf9dc3d4431fd1c8fd84f557dcb2f46ba8f7674add35b947ef167fb69cfc198fd1a1c0c47e8020d71b02f1e24d8b28ef721ecaad2accfd6428e1b00fbdac60
6
+ metadata.gz: 94729cac55877bb9da88d9d4a7824ff99158480fe16afe1e2eee6f4732e64039ddce67fbbcef74b6f943c88b1e1ea0b88e6568955e58d22541d6c8b6365a1047
7
+ data.tar.gz: 0b83a9933b47a4c47285c50bcb9aa87288e0a449068d3ae17b901497148d8998fd71a13bcfc1ecff40466df10b810ddc0b5ada68d72f1d329a465d9c49a7bd9a
@@ -72,14 +72,33 @@ module Arkaan
72
72
  end
73
73
  end
74
74
 
75
+ # Validation for the max number of players for a campaign.
76
+ # If there is a max number of players, and the current number of
77
+ # players is above it, or the max number of players is 0, raises an error.
75
78
  def max_players_minimum
76
79
  if max_players? && (max_players < players_count || max_players < 1)
77
80
  errors.add(:max_players, 'minimum')
78
81
  end
79
82
  end
80
83
 
84
+ # @return [Array<Arkaan::Campaigns::Invitation>] the players in this campaign.
85
+ def players
86
+ invitations.where(enum_status: :accepted)
87
+ end
88
+
89
+ # @return [Integer] the number of players in this campaign.
81
90
  def players_count
82
- invitations.where(enum_status: :accepted).count
91
+ players.count
92
+ end
93
+
94
+ # @return [Array<Arkaan::Campaigns::Character>] a flattened list of characters for this campaign.
95
+ def characters
96
+ players.map(&:characters).flatten
97
+ end
98
+
99
+ # @return [Array<Arkaan::Campaigns::Files::Document>] the document of this campaign as a flattened array.
100
+ def documents
101
+ invitations.map(&:documents).flatten
83
102
  end
84
103
  end
85
104
  end
@@ -2,6 +2,7 @@ module Arkaan
2
2
  # The campaigns module is holding the logic for some objects related to campaigns.
3
3
  # @author Vincent Courtois <courtois.vincent@outlook.com>
4
4
  module Campaigns
5
+ autoload :Character , 'arkaan/campaigns/character'
5
6
  autoload :Files , 'arkaan/campaigns/files'
6
7
  autoload :Invitation, 'arkaan/campaigns/invitation'
7
8
  autoload :Message , 'arkaan/campaigns/message'
@@ -0,0 +1,52 @@
1
+ module Arkaan
2
+ module Campaigns
3
+ # A character sheet represents a character played by a player in a campaign.
4
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
5
+ class Character
6
+ include Mongoid::Document
7
+ include Mongoid::Timestamps
8
+ include Arkaan::Concerns::MimeTypable
9
+ include Arkaan::Campaigns::Files::Concerns::Nameable
10
+
11
+ # @!attribute [rw] selected
12
+ # @return [Boolean] TRUE if the sheet is currently selected by the player, FALSE otherwise.
13
+ field :selected, type: Boolean, default: false
14
+ # @!attribute [rw] mime_type
15
+ # @return [String] the mime_type of the character sheet, MUST be an authorized MIME type for
16
+ # the ruleset the campaign is set to be in.
17
+ mime_type :available_mime_types
18
+
19
+ # @!attribute [rw] invitation
20
+ # @return [Arkaan::Campaigns::Invitation] the invitation of the player playing this character.
21
+ belongs_to :invitation, class_name: 'Arkaan::Campaigns::Invitation', inverse_of: :characters
22
+
23
+ # Returns the player linked to this character.
24
+ # @return [Arkaan::Account] the account of the player incarnating this character.
25
+ def player
26
+ invitation.account
27
+ end
28
+
29
+ # Method used to dinamically determine what MIME types are allowed for this character sheet
30
+ # If the campaign this character is in has no ruleset, every MIME type is allowed.
31
+ # @return [Array<String>] the available MIME type for the campaign linked to this character.
32
+ def available_mime_types
33
+ invitation.campaign.ruleset.mime_types
34
+ end
35
+
36
+ def campaign
37
+ invitation.campaign
38
+ end
39
+
40
+ # Puts the selected flag to TRUE for this character and to FALSE for all the
41
+ # other characters for the same player in the same campaign.
42
+ def select!
43
+ invitation.characters.each do |character|
44
+ character.update_attribute(:selected, false)
45
+ character.save!
46
+ end
47
+ update_attribute(:selected, true)
48
+ save!
49
+ end
50
+ end
51
+ end
52
+ end
@@ -1,11 +1,9 @@
1
1
  module Arkaan
2
2
  module Campaigns
3
3
  module Files
4
- autoload :Base , 'arkaan/campaigns/files/base'
5
4
  autoload :Character , 'arkaan/campaigns/files/character'
6
5
  autoload :Concerns , 'arkaan/campaigns/files/concerns'
7
6
  autoload :Document , 'arkaan/campaigns/files/document'
8
- autoload :Note , 'arkaan/campaigns/files/note'
9
7
  autoload :Permission, 'arkaan/campaigns/files/permission'
10
8
  end
11
9
  end
@@ -11,51 +11,6 @@ module Arkaan
11
11
  field :name, type: String
12
12
 
13
13
  validates :name, presence: {message: 'required'}
14
-
15
- validate :name_unicity
16
-
17
- # Checks if the name is unique in the campaign, and if it is not then modifies it.
18
- # The modifications are the same than in a windows or UNIX system :
19
- # - if the name exists as it is given, the system adds the suffix "(1)" to it.
20
- # - if the name with the suffix still exists, the system tries to increment it until an available name is found.
21
- # - the found name is then afected to the name of the current file.
22
- def name_unicity
23
- if !campaign.nil? && !self[:name].nil?
24
- if exists_in_campaign(self[:name])
25
- suffix = 1
26
- while exists_in_campaign(merge_suffix(suffix))
27
- suffix = suffix + 1
28
- end
29
- self[:name] = merge_suffix(suffix)
30
- end
31
- end
32
- end
33
-
34
- # Merges the given suffix with the name correctly.
35
- # @param suffix [String] the suffix to append between perenthesis at the end of the file name, but before the extension.
36
- # @return [String] the complete name for the file, with the suffix correctly appended.
37
- def merge_suffix(suffix)
38
- return "#{raw_name} (#{suffix}).#{extension}"
39
- end
40
-
41
- # Checks if the given name already exists for a file in the campaign.
42
- # @param tmp_name [String] the name to check the existence of in the campaign.
43
- # @return [Boolean] TRUE if the file exists in the campaign, FALSE otherwise.
44
- def exists_in_campaign(tmp_name)
45
- campaign.files.where(name: tmp_name, :id.ne => id).exists?
46
- end
47
-
48
- # Returns the file name without the extension for the current file.
49
- # @return [String] the name of the file without the extension.
50
- def raw_name
51
- return self[:name].gsub(".#{extension}", '')
52
- end
53
-
54
- # Returns the extension of the file, without the dot.
55
- # @return [String] the text representation for this file extension, without the leading dot.
56
- def extension
57
- return self[:name].split('.').last
58
- end
59
14
  end
60
15
  end
61
16
  end
@@ -1,17 +1,63 @@
1
1
  module Arkaan
2
2
  module Campaigns
3
3
  module Files
4
- # Representation of a file, allowing us to retrieve it on AWS by its filename and linked campaign ID.
4
+ # A document is any piece of data added by a user to a campaign. It can either be a direct text note, or an uploaded document for example.
5
5
  # @author Vincent Courtois <courtois.vincent@outlook.com>
6
- class Document < Arkaan::Campaigns::Files::Base
6
+ class Document
7
+ include Mongoid::Document
8
+ include Mongoid::Timestamps
7
9
  include Arkaan::Concerns::MimeTypable
8
10
  include Arkaan::Campaigns::Files::Concerns::Nameable
9
-
11
+
10
12
  # @!attribute [rw] size
11
- # @return [Integer] the size of the file in bytes.
13
+ # @return [Integer] the size of the document in bytes.
12
14
  field :size, type: Integer, default: 0
13
15
 
14
16
  mime_type ['image/*', 'text/plain']
17
+
18
+ # @!attribute [rw] permission
19
+ # @return [Arkaan::Campaigns::Permission] the permissions granted to the different users of the campaign concerning this document.
20
+ has_many :permissions, class_name: 'Arkaan::Campaigns::Files::Permission', inverse_of: :document
21
+
22
+ # Custom setter for the creator of the document so that it can be used as a normal field.
23
+ # @param invitation [Arkaan::Campaigns::Invitation] the invitation of the player creating this document.
24
+ def creator=(invitation)
25
+ if !permissions.where(invitation: invitation).exists?
26
+ Arkaan::Campaigns::Files::Permission.create(enum_level: :creator, document: self, invitation: invitation)
27
+ end
28
+ end
29
+
30
+ # Custom getter for the creator of the campaign.
31
+ # @return [Arkaan::Account] the account of the player that created this document.
32
+ def creator
33
+ return permissions.where(enum_level: :creator).first.invitation.account
34
+ end
35
+
36
+ # Checks if an account is allowed to access this document, accounts must have one of the following characteristics to read a document :
37
+ # - Be the creator of the document
38
+ # - Be the game master of the campaign in which the document is declared
39
+ # - Have been granted the permission to access the document
40
+ #
41
+ # @param account [Arkaan::Account] the account trying to access the document.
42
+ # @return [Boolean] TRUE if this account has the right to access the document, FALSe otherwise.
43
+ def is_allowed?(account)
44
+ return true if campaign.creator.id == account.id
45
+ return true if creator.id == account.id
46
+ return true if has_permission?(account)
47
+ return false
48
+ end
49
+
50
+ # Checks if the account has the permission to access the designated document.
51
+ # @param account [Arkaan::Account] the account to check the existence of a permission for.
52
+ # @return [Boolean] TRUE if the account has a permission to access this document, FALSE otherwise.
53
+ def has_permission?(account)
54
+ invitation = campaign.invitations.where(account: account).first
55
+ return !invitation.nil? && permissions.where(invitation: invitation).exists?
56
+ end
57
+
58
+ def campaign
59
+ permissions.first.invitation.campaign rescue nil
60
+ end
15
61
  end
16
62
  end
17
63
  end
@@ -19,7 +19,7 @@ module Arkaan
19
19
  belongs_to :invitation, class_name: 'Arkaan::Campaigns::Invitation', inverse_of: :permissions
20
20
  # @!attribute [rw] file
21
21
  # @return [Arkaan::Campaigns::Files::Document] the file on which the permissions are granted.
22
- belongs_to :file, class_name: 'Arkaan::Campaigns::Files::Document', inverse_of: :permissions
22
+ belongs_to :document, class_name: 'Arkaan::Campaigns::Files::Document', inverse_of: :permissions
23
23
  end
24
24
  end
25
25
  end
@@ -20,16 +20,26 @@ module Arkaan
20
20
 
21
21
  # @!attribute [rw] files
22
22
  # @return [Array<Arkaan::Campaigns::Files::Document>] the files uploaded in this campaign by the user linked to this invitation.
23
- has_many :permissions, class_name: 'Arkaan::Campaigns::Files::Document', inverse_of: :invitation
23
+ has_many :permissions, class_name: 'Arkaan::Campaigns::Files::Permission', inverse_of: :invitation
24
24
  # @!attribute [rw] characters
25
- # @return [Array<Arkaan::Campaigns::Files::Character>] the character sheets for this player.
26
- has_many :characters, class_name: 'Arkaan::Campaigns::Files::Character', inverse_of: :invitation
25
+ # @return [Array<Arkaan::Campaigns::Character>] the character sheets for this player.
26
+ has_many :characters, class_name: 'Arkaan::Campaigns::Character', inverse_of: :invitation
27
27
 
28
28
  # Gets the currently selected character in a convenient way.
29
29
  # @return [Arkaan::Campaigns::Files::Character] the character currently selected by the player.
30
30
  def character
31
31
  characters.where(selected: true).first
32
32
  end
33
+
34
+ def documents
35
+ permissions.map(&:document)
36
+ end
37
+
38
+ def has_file?(filename)
39
+ return permissions.map(&:document).map(&:name).any? do |name|
40
+ name == filename
41
+ end
42
+ end
33
43
  end
34
44
  end
35
45
  end
@@ -204,8 +204,10 @@ module Arkaan
204
204
  handle_arkaan_exception(exception)
205
205
  end
206
206
 
207
- error StandardError do |exception|
208
- custom_error(500, 'system_error.unknown_field.unknown_error')
207
+ if ENV['RACK_ENV'] != 'test'
208
+ error StandardError do |exception|
209
+ custom_error(500, 'system_error.unknown_field.unknown_error')
210
+ end
209
211
  end
210
212
  end
211
213
  end
@@ -1,3 +1,3 @@
1
1
  module Arkaan
2
- VERSION = '1.8.0'
2
+ VERSION = '1.9.0'
3
3
  end
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: 1.8.0
4
+ version: 1.9.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-09 00:00:00.000000000 Z
11
+ date: 2019-11-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -302,13 +302,11 @@ files:
302
302
  - lib/arkaan/authentication/session.rb
303
303
  - lib/arkaan/campaign.rb
304
304
  - lib/arkaan/campaigns.rb
305
+ - lib/arkaan/campaigns/character.rb
305
306
  - lib/arkaan/campaigns/files.rb
306
- - lib/arkaan/campaigns/files/base.rb
307
- - lib/arkaan/campaigns/files/character.rb
308
307
  - lib/arkaan/campaigns/files/concerns.rb
309
308
  - lib/arkaan/campaigns/files/concerns/nameable.rb
310
309
  - lib/arkaan/campaigns/files/document.rb
311
- - lib/arkaan/campaigns/files/note.rb
312
310
  - lib/arkaan/campaigns/files/permission.rb
313
311
  - lib/arkaan/campaigns/invitation.rb
314
312
  - lib/arkaan/campaigns/message.rb
@@ -1,56 +0,0 @@
1
- module Arkaan
2
- module Campaigns
3
- module Files
4
- # A document is any piece of data added by a user to a campaign. It can either be a direct text note, or an uploaded file for example.
5
- # @author Vincent Courtois <courtois.vincent@outlook.com>
6
- class Base
7
- include Mongoid::Document
8
- include Mongoid::Timestamps
9
-
10
- # @!attribute [rw] permission
11
- # @return [Arkaan::Campaigns::Permission] the permissions granted to the different users of the campaign concerning this file.
12
- has_many :permissions, class_name: 'Arkaan::Campaigns::Files::Permission', inverse_of: :file
13
-
14
- # @!attribute [rw] campaign
15
- # @return [Arkaan::Campaign] the campaign in which this file was uploaded.
16
- belongs_to :campaign, class_name: 'Arkaan::Campaign', inverse_of: :files
17
-
18
- # Custom setter for the creator of the file so that it can be used as a normal field.
19
- # @param invitation [Arkaan::Campaigns::Invitation] the invitation of the player creating this file.
20
- def creator=(invitation)
21
- if !permissions.where(invitation: invitation).exists?
22
- Arkaan::Campaigns::Files::Permission.create(enum_level: :creator, file: self, invitation: invitation)
23
- end
24
- end
25
-
26
- # Custom getter for the creator of the campaign.
27
- # @return [Arkaan::Account] the account of the player that created this file.
28
- def creator
29
- return permissions.where(enum_level: :creator).first.invitation.account
30
- end
31
-
32
- # Checks if an account is allowed to access this file, accounts must have one of the following characteristics to read a file :
33
- # - Be the creator of the file
34
- # - Be the game master of the campaign in which the file is declared
35
- # - Have been granted the permission to access the file
36
- #
37
- # @param account [Arkaan::Account] the account trying to access the file.
38
- # @return [Boolean] TRUE if this account has the right to access the file, FALSe otherwise.
39
- def is_allowed?(account)
40
- return true if campaign.creator.id == account.id
41
- return true if creator.id == account.id
42
- return true if has_permission?(account)
43
- return false
44
- end
45
-
46
- # Checks if the account has the permission to access the designated file.
47
- # @param account [Arkaan::Account] the account to check the existence of a permission for.
48
- # @return [Boolean] TRUE if the account has a permission to access this file, FALSE otherwise.
49
- def has_permission?(account)
50
- invitation = campaign.invitations.where(account: account).first
51
- return !invitation.nil? && permissions.where(invitation: invitation).exists?
52
- end
53
- end
54
- end
55
- end
56
- end
@@ -1,48 +0,0 @@
1
- module Arkaan
2
- module Campaigns
3
- module Files
4
- # A character sheet represents a character played by a player in a campaign.
5
- # @author Vincent Courtois <courtois.vincent@outlook.com>
6
- class Character < Arkaan::Campaigns::Files::Base
7
- include Arkaan::Campaigns::Files::Concerns::Nameable
8
- include Arkaan::Concerns::MimeTypable
9
-
10
- # @!attribute [rw] selected
11
- # @return [Boolean] TRUE if the sheet is currently selected by the player, FALSE otherwise.
12
- field :selected, type: Boolean, default: false
13
- # @!attribute [rw] mime_type
14
- # @return [String] the mime_type of the character sheet, MUST be an authorized MIME type for
15
- # the ruleset the campaign is set to be in.
16
- mime_type :available_mime_types
17
-
18
- # @!attribute [rw] invitation
19
- # @return [Arkaan::Campaigns::Invitation] the invitation of the player playing this character.
20
- belongs_to :invitation, class_name: 'Arkaan::Campaigns::Invitation', inverse_of: :characters
21
-
22
- # Returns the player linked to this character.
23
- # @return [Arkaan::Account] the account of the player incarnating this character.
24
- def player
25
- invitation.account
26
- end
27
-
28
- # Method used to dinamically determine what MIME types are allowed for this character sheet
29
- # If the campaign this character is in has no ruleset, every MIME type is allowed.
30
- # @return [Array<String>] the available MIME type for the campaign linked to this character.
31
- def available_mime_types
32
- invitation.campaign.ruleset.mime_types
33
- end
34
-
35
- # Puts the selected flag to TRUE for this character and to FALSE for all the
36
- # other characters for the same player in the same campaign.
37
- def select!
38
- invitation.characters.each do |character|
39
- character.update_attribute(:selected, false)
40
- character.save!
41
- end
42
- update_attribute(:selected, true)
43
- save!
44
- end
45
- end
46
- end
47
- end
48
- end
@@ -1,9 +0,0 @@
1
- module Arkaan
2
- module Campaigns
3
- module Files
4
- class Note < Arkaan::Campaigns::Files::Base
5
- field :content, type: String, default: ''
6
- end
7
- end
8
- end
9
- end