modulofcm 0.1.0 → 1.0.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: 756a3db83bff049923812f16b3c306b65acccd9878d8e23888d4fc6972d6b860
4
- data.tar.gz: 90274c6c4c7bda319d1e7c804f1fbfd14083501c6712724587ac68b4a1ec83b7
3
+ metadata.gz: aec5f5c510d0c910403e80a2950b6281eafa1c00785683795b0a4d386407f2e6
4
+ data.tar.gz: 93f82faf62804139c3f839c7c0fe531c9ccda102038e6ce4007e9dfcddb1b529
5
5
  SHA512:
6
- metadata.gz: 62460e72622514d6607bace864a8f9befe393b3b892366cee5797e075a49d37679917f6a3762a3be9f9c7033b16a7fb9930868cff1ec956621b2892674028d48
7
- data.tar.gz: 3115a67425c392403e781d828390fee9ced2ec5b11a0b2edb48f49cc6fa7a2447767cee1e08e83557663631d4c6a4832b0d4d0dd7fbe5b49e78217b05381270f
6
+ metadata.gz: 34fe6c17bd43d09f8bd9407a525f260ae48e020e4e6d0238fac6815505d71b5249b81c04a4117df71d335ebca8afea08723f83113cbf3e76747abab296d68e2b
7
+ data.tar.gz: 90efe6b85984cb2d8b0eca03695322a9e56b0ccc3d144911d757e636bca9fdb5537821c8c411250f9c7add832315de9d4b5eed7b45d26bb1f7550a9267605c32
data/CHANGELOG.md CHANGED
@@ -1,6 +1,12 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [1.0.0] - 2024-05-22
4
+
5
+ - Implement API v1
6
+ - Fix Modulofcm::Configurator#validate_client for APIv1 clients
7
+ - Fix typo for Modulofcm::Response#success?
8
+
3
9
  ## [0.1.0] - 2024-04-24
4
10
 
5
11
  - Initial release
6
- - Send Legacy push notifications.
12
+ - Send Legacy push notifications.
data/README.md CHANGED
@@ -20,9 +20,14 @@ Modulofcm.configure do |config|
20
20
  client.api_key = 'My Legacy HTTP API key - will cease to function after June 2024.'
21
21
  end
22
22
 
23
- config.client(:new_client) do |client|
24
- client.api_token = 'my_token'
25
- client.google_application_credentials_path = ''
23
+ config.client(:api_v1_client) do |client|
24
+ client.firebase_project_id = 'Firebase Project id'
25
+ client.google_application_credentials = '{"type": "service_account", "project_id": "...", ...}'
26
+ end
27
+
28
+ config.client(:another_api_v1_client) do |client|
29
+ client.firebase_project_id = 'Firebase Project id'
30
+ client.google_application_credentials_path = 'config/google_application_credentials.json'
26
31
  end
27
32
  end
28
33
 
@@ -30,7 +35,11 @@ end
30
35
  data = {
31
36
  id: 232_342,
32
37
  key: 'asd9adfiu6bn',
33
- mission_id: 234_323
38
+ mission_id: 234_323,
39
+ data: {
40
+ user_id: 15_123,
41
+ company_id: 23_341
42
+ }
34
43
  }
35
44
 
36
45
  # All keyword arguments are optional and references a field in Firebase documentation:
@@ -54,8 +63,9 @@ data = {
54
63
  # data: Arbitrary key/value payload, which must be UTF-8 encoded. The key should not be a reserved word ("from", "message_type", or any word starting with "google" or "gcm").
55
64
  # Legacy: `data`
56
65
  # APIv1: `message.data`
57
- Modulofcm.client(:legacy_client).push('Legacy device registration token', data: data, title: 'My title', body: 'The body', sound: 'notif.caf', content_available: true)
58
- Modulofcm.client(:new_client).push('FCM new token', data: data, title: 'My title', body: 'The body', sound: 'notif.caf', content_available: true)
66
+ Modulofcm.client(:legacy_client).push('Registration token', data: data, title: 'My title', body: 'The body', sound: 'notif.caf', content_available: true)
67
+ Modulofcm.client(:api_v1_client).push('Registration token', data: data, title: 'My title', body: 'The body', sound: 'notif.caf', content_available: true)
68
+ Modulofcm.client(:another_api_v1_client).push('Registration token', data: data, title: 'My title', body: 'The body', sound: 'notif.caf', content_available: true)
59
69
  ```
60
70
 
61
71
  ## Development
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'file_i_o'
3
4
  require_relative 'response'
4
5
 
5
6
  # rubocop:disable Metrics/ParameterLists
@@ -7,14 +8,15 @@ module Modulofcm
7
8
 
8
9
  class Client
9
10
 
10
- attr_reader :name, :api_key, :api_token, :google_application_credentials_path, :firebase_project_id, :mode
11
+ attr_reader :name, :api_key, :google_application_credentials, :firebase_project_id, :mode
11
12
 
12
- def initialize(name:, api_key: nil, api_token: nil, google_application_credentials_path: nil,
13
+ def initialize(name:, api_key: nil,
14
+ google_application_credentials_path: nil, google_application_credentials: nil,
13
15
  firebase_project_id: nil)
14
16
  @name = name.to_sym
15
17
  @api_key = api_key
16
- @api_token = api_token
17
18
  @google_application_credentials_path = google_application_credentials_path
19
+ @google_application_credentials = google_application_credentials
18
20
  @firebase_project_id = firebase_project_id
19
21
  @mode = :api_v1
20
22
  end
@@ -49,12 +51,13 @@ module Modulofcm
49
51
  when :legacy
50
52
  push_legacy(token, data: data, title: title, body: body, sound: sound, content_available: content_available)
51
53
  else
52
- raise NotImplementedError, 'Only Legacy notifications are supported'
53
- # push_v1(token, data: data, title: title, body: body, sound: sound, content_available: content_available)
54
+ push_v1(token, data: data, title: title, body: body, sound: sound, content_available: content_available)
54
55
  end
55
56
  end
56
57
 
57
- %w[api_key api_token firebase_project_id google_application_credentials_path].each do |attribute|
58
+ %w[
59
+ api_key firebase_project_id google_application_credentials_path google_application_credentials
60
+ ].each do |attribute|
58
61
  define_method("#{attribute}=") do |value|
59
62
  instance_variable_set(:"@#{attribute}", value)
60
63
 
@@ -62,10 +65,24 @@ module Modulofcm
62
65
  end
63
66
  end
64
67
 
68
+ def google_application_credentials_path
69
+ if @google_application_credentials_path.present? || @google_application_credentials.blank?
70
+ return @google_application_credentials_path
71
+ end
72
+
73
+ @google_application_credentials_path = if @google_application_credentials.is_a?(String)
74
+ FileIO.new(@google_application_credentials, 'creds.json')
75
+ elsif @google_application_credentials.respond_to?(:to_json)
76
+ FileIO.new(@google_application_credentials.to_json, 'creds.json')
77
+ else
78
+ @google_application_credentials
79
+ end
80
+ end
81
+
65
82
  private
66
83
 
67
84
  def update_mode
68
- api_v1_fields_all_present = [api_token, google_application_credentials_path, firebase_project_id].all?(&:present?)
85
+ api_v1_fields_all_present = [google_application_credentials_path, firebase_project_id].all?(&:present?)
69
86
  api_key_blank = api_key.blank?
70
87
 
71
88
  @mode = if api_v1_fields_all_present || api_key_blank
@@ -78,7 +95,7 @@ module Modulofcm
78
95
  when :legacy
79
96
  FCM.new(api_key)
80
97
  else
81
- FCM.new(api_token, google_application_credentials_path, firebase_project_id)
98
+ FCM.new('', google_application_credentials_path, firebase_project_id)
82
99
  end
83
100
  end
84
101
 
@@ -98,6 +115,16 @@ module Modulofcm
98
115
  handle_data(payload, data)
99
116
  handle_notification(payload, body, sound, title)
100
117
 
118
+ # According to Firebase documentation, all values must be strings. So all hashes/arrays are JSON-ified and other
119
+ # fields (including numbers) are converted to strings.
120
+ payload[:data].transform_values! do |value|
121
+ if value.is_a?(Hash) || value.is_a?(Array)
122
+ value.to_json
123
+ else
124
+ value.to_s
125
+ end
126
+ end
127
+
101
128
  make_v1_response(@client.send_v1(payload))
102
129
  end
103
130
 
@@ -110,9 +137,11 @@ module Modulofcm
110
137
  else
111
138
  {
112
139
  android: {},
113
- apns: {
114
- aps: {
115
- 'content-available' => content_available ? 1 : 0
140
+ apns: {
141
+ payload: {
142
+ aps: {
143
+ 'content-available' => content_available ? 1 : 0
144
+ }
116
145
  }
117
146
  }
118
147
  }
@@ -143,7 +172,7 @@ module Modulofcm
143
172
  when :legacy
144
173
  payload[:notification][:sound] = value
145
174
  else
146
- payload[:apns][:aps][:sound] = value
175
+ payload[:apns][:payload][:aps][:sound] = value
147
176
  payload[:android][:sound] = value
148
177
  end
149
178
  end
@@ -155,7 +184,7 @@ module Modulofcm
155
184
  def make_v1_response(response)
156
185
  response_body = JSON.parse(response[:body])
157
186
 
158
- Response.new(success: response_body['message'].present?,
187
+ Response.new(success: response[:response] == 'success',
159
188
  status: response[:status_code], body: response_body)
160
189
  end
161
190
 
@@ -38,14 +38,14 @@ module Modulofcm
38
38
 
39
39
  @errors << 'Required field: name' if client.name.blank?
40
40
 
41
- if [client.google_application_credentials_path, client.api_token, client.firebase_project_id].all?(:present?)
41
+ if [client.google_application_credentials_path, client.firebase_project_id].all?(&:present?)
42
42
  return [@errors.empty?, @errors]
43
43
  end
44
44
 
45
45
  return [@errors.empty?, @errors] if client.api_key.present?
46
46
 
47
47
  # rubocop:disable Layout/LineLength
48
- @errors << 'Either an API key for Legacy API (deprecated) either the API token, the Google application credentials path and the Firebase project id are required'
48
+ @errors << 'Either an API key for Legacy API (deprecated) either the Google application credentials and the Firebase project id are required'
49
49
  # rubocop:enable Layout/LineLength
50
50
 
51
51
  [false, @errors]
@@ -0,0 +1,18 @@
1
+ class FileIO < StringIO
2
+
3
+ attr_reader :original_filename
4
+ attr_reader :identifier
5
+
6
+ def initialize(stream, filename)
7
+ super(stream.to_s)
8
+ @original_filename = filename
9
+ @filename = filename
10
+ end
11
+
12
+ def read(...)
13
+ rewind
14
+
15
+ super(...)
16
+ end
17
+
18
+ end
@@ -12,7 +12,7 @@ module Modulofcm
12
12
  @body = body
13
13
  end
14
14
 
15
- def succcess? = success
15
+ def success? = success
16
16
 
17
17
  end
18
18
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Modulofcm
4
4
 
5
- VERSION = '0.1.0'
5
+ VERSION = '1.0.0'
6
6
 
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: modulofcm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthieu Ciappara
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-04-24 00:00:00.000000000 Z
11
+ date: 2024-05-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -61,6 +61,7 @@ files:
61
61
  - lib/modulofcm/client.rb
62
62
  - lib/modulofcm/configurator.rb
63
63
  - lib/modulofcm/errors.rb
64
+ - lib/modulofcm/file_i_o.rb
64
65
  - lib/modulofcm/response.rb
65
66
  - lib/modulofcm/version.rb
66
67
  - modulofcm.gemspec
@@ -73,7 +74,7 @@ metadata:
73
74
  source_code_uri: https://github.com/moduloTech/modulofcm
74
75
  changelog_uri: https://github.com/moduloTech/modulofcm/blob/master/CHANGELOG.md
75
76
  rubygems_mfa_required: 'true'
76
- post_install_message:
77
+ post_install_message:
77
78
  rdoc_options: []
78
79
  require_paths:
79
80
  - lib
@@ -88,8 +89,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
88
89
  - !ruby/object:Gem::Version
89
90
  version: '0'
90
91
  requirements: []
91
- rubygems_version: 3.5.3
92
- signing_key:
92
+ rubygems_version: 3.3.7
93
+ signing_key:
93
94
  specification_version: 4
94
95
  summary: Firebase Cloud Messaging client library
95
96
  test_files: []