decidim-bulletin_board 0.1.0 → 0.2.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: 32b8c4fc3efdcc66c1d25c784627d955c52c2a3343fd0d1c6863ae89082e6a91
4
- data.tar.gz: da628db5ef6520f1958691654a91105cc0eda053ee58a25cfd4f5b4f927d791c
3
+ metadata.gz: a3d1e27c207aed87322d6be72c10f4cdec8abcad317b1b0f500911d1a1a2db6e
4
+ data.tar.gz: d60a4887bb883c3f4da0f0100cf1b8e19e37bf14c26326288c5d4b63ff417f1e
5
5
  SHA512:
6
- metadata.gz: 846a287aa3d3b31fd177ae29eaa9ff3b2de65b5f9507ed85c30f6c8cba45e1cfbf6f72a4bb3cb4b870f07af2ccf86f18bbfa782e247f2d3934794ff776297b96
7
- data.tar.gz: c28b71b323024e6f92846b6bcb345bf07712a6ed2970ba17684fcb8b970785aea3230f2d039d8dbf10e5ca9c07a6945b57b980c78a9ca192a33a23f4151ec943
6
+ metadata.gz: c69fc5b2a6a410969c72936d030bf8d87184b1a52d2145da348d4b5288cabf51df7edd877317f42555781481b0fe7107da3df89033ef53915dc4ec38db9f2977
7
+ data.tar.gz: 83383e33224e36288e9d25d645a71624375274104a80e59eb1b082ad7cfcd679c283fadcb8d4ab0e6f973821a161006d837c92f73817bf0ab900fa90cef1744d
@@ -1,15 +1,19 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- decidim-bulletin_board (0.1.0)
4
+ decidim-bulletin_board (0.2.0)
5
+ activemodel (~> 5.0, >= 5.0.0.1)
5
6
  activesupport (~> 5.0, >= 5.0.0.1)
6
7
  byebug (~> 11.0)
7
8
  graphlient (~> 0.4.0)
8
9
  jwt
10
+ wisper (~> 2.0.0)
9
11
 
10
12
  GEM
11
13
  remote: https://rubygems.org/
12
14
  specs:
15
+ activemodel (5.2.4.4)
16
+ activesupport (= 5.2.4.4)
13
17
  activesupport (5.2.4.4)
14
18
  concurrent-ruby (~> 1.0, >= 1.0.2)
15
19
  i18n (>= 0.7, < 2)
@@ -91,6 +95,8 @@ GEM
91
95
  addressable (>= 2.3.6)
92
96
  crack (>= 0.3.2)
93
97
  hashdiff (>= 0.4.0, < 2.0.0)
98
+ wisper (2.0.1)
99
+ wisper-rspec (1.1.0)
94
100
 
95
101
  PLATFORMS
96
102
  ruby
@@ -103,6 +109,7 @@ DEPENDENCIES
103
109
  rubocop-faker
104
110
  rubocop-rspec (~> 1.21)
105
111
  webmock (~> 3.6)
112
+ wisper-rspec (~> 1.1.0)
106
113
 
107
114
  BUNDLED WITH
108
115
  2.1.4
@@ -23,12 +23,15 @@ Gem::Specification.new do |s|
23
23
  s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
24
  s.require_paths = ["lib"]
25
25
 
26
+ s.add_dependency "activemodel", "~> 5.0", ">= 5.0.0.1"
26
27
  s.add_dependency "activesupport", "~> 5.0", ">= 5.0.0.1"
27
28
  s.add_dependency "byebug", "~> 11.0"
28
29
  s.add_dependency "graphlient", "~> 0.4.0"
29
30
  s.add_dependency "jwt"
31
+ s.add_dependency "wisper", "~> 2.0.0"
30
32
 
31
33
  s.add_development_dependency "rake", "~> 13.0"
32
34
  s.add_development_dependency "rspec", "~> 3.7"
33
35
  s.add_development_dependency "webmock", "~> 3.6"
36
+ s.add_development_dependency "wisper-rspec", "~> 1.1.0"
34
37
  end
@@ -2,10 +2,13 @@
2
2
 
3
3
  require "decidim/bulletin_board/version"
4
4
  require "graphlient"
5
+ require "wisper"
6
+ require "active_model"
5
7
  require "decidim/bulletin_board/jwk_utils"
6
8
  require "decidim/bulletin_board/client"
7
9
  require "decidim/bulletin_board/graphql/client"
8
10
  require "decidim/bulletin_board/create_election"
11
+ require "decidim/bulletin_board/voter"
9
12
  require "active_support/configurable"
10
13
  require "jwt"
11
14
 
@@ -34,11 +34,23 @@ module Decidim
34
34
  private_key && server && api_key
35
35
  end
36
36
 
37
+ def sign_data(data)
38
+ JWT.encode(data, identification_private_key.keypair, "RS256")
39
+ end
40
+
37
41
  def setup_election(election_data)
38
42
  message_id = "#{election_data[:election_id]}.create_election+a.#{authority_slug}"
39
43
  Decidim::BulletinBoard::CreateElection.call(election_data, message_id)
40
44
  end
41
45
 
46
+ def cast_vote(election_data, voter_data, encrypted_vote)
47
+ form = Decidim::BulletinBoard::Voter::VoteForm.new(self, election_data, voter_data, encrypted_vote)
48
+ cast_vote = Decidim::BulletinBoard::Voter::CastVote.new(form)
49
+ cast_vote.on(:ok) { |pending_message| return pending_message }
50
+ cast_vote.on(:error) { |error_message| raise StandardError, error_message }
51
+ cast_vote.call
52
+ end
53
+
42
54
  private
43
55
 
44
56
  attr_reader :identification_private_key, :private_key
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Decidim
4
4
  module BulletinBoard
5
- VERSION = "0.1.0"
5
+ VERSION = "0.2.0"
6
6
  end
7
7
  end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "decidim/bulletin_board/voter/cast_vote"
4
+ require "decidim/bulletin_board/voter/vote_form"
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module BulletinBoard
5
+ module Voter
6
+ # This command uses the GraphQL client to cast the vote.
7
+ class CastVote
8
+ include Wisper::Publisher
9
+ # Public: Initializes the command.
10
+ #
11
+ # form - A form object with the params.
12
+ def initialize(form)
13
+ @form = form
14
+ end
15
+
16
+ # Executes the command. Broadcasts these events:
17
+ #
18
+ # - :ok when everything is valid and the mutation operation is successful.
19
+ # - :error if the form wasn't valid or the mutation operation was not successful.
20
+ #
21
+ # Returns nothing.
22
+ def call
23
+ return broadcast(:error, form.errors.full_messages.join(". ")) unless form.valid?
24
+
25
+ args = {
26
+ message_id: form.message_id,
27
+ signed_data: form.signed_data
28
+ }
29
+
30
+ begin
31
+ response = client.query do
32
+ mutation do
33
+ vote(messageId: args[:message_id], signedData: args[:signed_data]) do
34
+ pendingMessage do
35
+ status
36
+ end
37
+ error
38
+ end
39
+ end
40
+ end
41
+
42
+ return broadcast(:error, response.data.vote.error) if response.data.vote.error.present?
43
+
44
+ broadcast(:ok, response.data.vote.pending_message)
45
+ rescue Graphlient::Errors::FaradayServerError
46
+ broadcast(:error, "something went wrong")
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ attr_reader :form
53
+
54
+ def client
55
+ @client ||= BulletinBoard::Graphql::Client.client
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module BulletinBoard
5
+ module Voter
6
+ # A form object to handle some data transformation and validation to cast a vote.
7
+ class VoteForm
8
+ include ActiveModel::Validations
9
+
10
+ validates :election_data, :voter_data, :encrypted_vote, presence: true
11
+ validate :election_id_present
12
+ validate :voter_id_present
13
+
14
+ # Public: initialize the form
15
+ #
16
+ # bulletin_board_data - An instance of the bulletin board client
17
+ # election_data - A Hash including the necessary data from the election.
18
+ # voter_data - A Hash including the necessary data from the voter.
19
+ # encrypted_vote - A Hash including the encrypted vote to cast
20
+ def initialize(bulletin_board_client, election_data, voter_data, encrypted_vote)
21
+ @bulletin_board_client = bulletin_board_client
22
+ @election_data = election_data
23
+ @voter_data = voter_data
24
+ @encrypted_vote = encrypted_vote
25
+ end
26
+
27
+ # Public: returns a message identifier for the cast vote operation.
28
+ def message_id
29
+ @message_id ||= "#{election_id}.vote.cast+v.#{voter_id}"
30
+ end
31
+
32
+ # Public: uses the bulletin board client to sign the encrypted vote merged with the `message_id`.
33
+ def signed_data
34
+ @signed_data ||= bulletin_board_client.sign_data(encrypted_vote.merge(message_id: message_id))
35
+ end
36
+
37
+ private
38
+
39
+ attr_reader :bulletin_board_client, :election_data, :voter_data, :encrypted_vote
40
+
41
+ def election_id_present
42
+ errors.add(:election_data, "doesn't include the election id") unless election_id.present?
43
+ end
44
+
45
+ def election_id
46
+ return if election_data.blank?
47
+
48
+ election_data[:election_id]
49
+ end
50
+
51
+ def voter_id_present
52
+ errors.add(:voter_data, "doesn't include the voter id") unless voter_id.present?
53
+ end
54
+
55
+ def voter_id
56
+ return if voter_data.blank?
57
+
58
+ voter_data[:voter_id]
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: decidim-bulletin_board
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Morcillo
@@ -9,8 +9,28 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2020-12-07 00:00:00.000000000 Z
12
+ date: 2020-12-08 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activemodel
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '5.0'
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 5.0.0.1
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: !ruby/object:Gem::Requirement
27
+ requirements:
28
+ - - "~>"
29
+ - !ruby/object:Gem::Version
30
+ version: '5.0'
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 5.0.0.1
14
34
  - !ruby/object:Gem::Dependency
15
35
  name: activesupport
16
36
  requirement: !ruby/object:Gem::Requirement
@@ -73,6 +93,20 @@ dependencies:
73
93
  - - ">="
74
94
  - !ruby/object:Gem::Version
75
95
  version: '0'
96
+ - !ruby/object:Gem::Dependency
97
+ name: wisper
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: 2.0.0
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: 2.0.0
76
110
  - !ruby/object:Gem::Dependency
77
111
  name: rake
78
112
  requirement: !ruby/object:Gem::Requirement
@@ -115,6 +149,20 @@ dependencies:
115
149
  - - "~>"
116
150
  - !ruby/object:Gem::Version
117
151
  version: '3.6'
152
+ - !ruby/object:Gem::Dependency
153
+ name: wisper-rspec
154
+ requirement: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: 1.1.0
159
+ type: :development
160
+ prerelease: false
161
+ version_requirements: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - "~>"
164
+ - !ruby/object:Gem::Version
165
+ version: 1.1.0
118
166
  description: ''
119
167
  email:
120
168
  - david@codegram.com
@@ -142,6 +190,9 @@ files:
142
190
  - lib/decidim/bulletin_board/graphql/client.rb
143
191
  - lib/decidim/bulletin_board/jwk_utils.rb
144
192
  - lib/decidim/bulletin_board/version.rb
193
+ - lib/decidim/bulletin_board/voter.rb
194
+ - lib/decidim/bulletin_board/voter/cast_vote.rb
195
+ - lib/decidim/bulletin_board/voter/vote_form.rb
145
196
  homepage: https://github.com
146
197
  licenses:
147
198
  - AGPL-3.0