gorg_service 0.2.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
  SHA1:
3
- metadata.gz: c367d16bc5790468c190d509d84e89effef69fbb
4
- data.tar.gz: 1951f35a70ffacddb8f1f141df9febeadc890420
3
+ metadata.gz: 4202710bccd62ba26cc53da5903a84e570bc3ca6
4
+ data.tar.gz: 7b7a517db9b978955a768471aad1e3685b8a89bd
5
5
  SHA512:
6
- metadata.gz: 912bc14211df2c260d360023f3e6ee378bb228db615408d46615197bb0db4f0acaa4957aeb10bb1d3ba1c1a2b6e7593fbbb12b99a50467583fce7326b22028b4
7
- data.tar.gz: 7c1bc8ac7f5f3268d35b5d481efe7fb2821b5d2abb6fdbfb3389a47c2de453f1b6660bfdd1e267ba4cbbba90318953b4c2e9bf313e8b3a0ef51c8dc430680d2e
6
+ metadata.gz: 36684953d4b5825695b0b2f5e970c69ea2ba9dc05158180f4db95d6d22bde0369938aa2c448157e4ac4d297eea3a3e843ff7c16487448eda9a14759031135e4b
7
+ data.tar.gz: bca143a3e2bbbaa1154e92e5f2f1d26f32db5fc5044eac750038e8bdfd2e4d33db3cc4bc42513f902c73c9011322dda24c4b544afbe0ba880b2bbffc77d3ccd3
data/gorg_service.gemspec CHANGED
@@ -35,4 +35,5 @@ Gem::Specification.new do |spec|
35
35
  spec.add_development_dependency 'bogus', '~> 0.1.6'
36
36
  spec.add_development_dependency 'bunny-mock', '~> 1.4'
37
37
  spec.add_development_dependency 'byebug', '~> 9.0'
38
+ spec.add_development_dependency 'json-schema'
38
39
  end
@@ -24,14 +24,14 @@ class GorgService
24
24
  #Softfail error : This message should be processed again later
25
25
  class SoftfailError < FailError
26
26
  def type
27
- "softfail"
27
+ "softerror"
28
28
  end
29
29
  end
30
30
 
31
31
  #Hardfail error : This message is not processable and will never be
32
32
  class HardfailError < FailError
33
33
  def type
34
- "hardfail"
34
+ "harderror"
35
35
  end
36
36
  end
37
37
  end
@@ -3,6 +3,8 @@
3
3
  require 'json'
4
4
  require 'time'
5
5
 
6
+ require "gorg_service/message/json_schema"
7
+
6
8
  class GorgService
7
9
  class Message
8
10
 
@@ -10,24 +12,30 @@ class GorgService
10
12
  attr_accessor :id
11
13
  attr_accessor :data
12
14
  attr_accessor :errors
15
+ attr_accessor :creation_time
16
+ attr_accessor :sender
13
17
 
14
18
  def errors
15
19
  @errors||=[]
16
20
  end
17
21
 
18
22
 
19
- def initialize(id: nil, data: nil, event: nil, errors: [])
20
- @id=id || generate_id
23
+ def initialize(id: generate_id, data: nil, event: nil, creation_time: DateTime.now.iso8601, sender: application_id , errors: [])
24
+ @id=id
21
25
  @event=event
22
26
  @data=data
23
27
  @errors=errors
28
+ @creation_time=creation_time
29
+ @sender= sender
24
30
  end
25
31
 
26
32
  # Generate RabbitMQ message body
27
33
  def to_json
28
34
  body={
29
- id: @id,
30
- event: @event,
35
+ event_uuid: @id,
36
+ event_name: @event,
37
+ event_sender_id: @sender,
38
+ event_creation_time: @creation_time,
31
39
  data: @data,
32
40
  }
33
41
  if errors.any?
@@ -39,12 +47,16 @@ class GorgService
39
47
 
40
48
  # Log FailError in message body
41
49
  def log_error error
42
- errors<<{
43
- type: error.type.downcase,
44
- message: error.message,
45
- timestamp: Time.now.utc.iso8601,
46
- extra: error.error_raised.inspect,
50
+ hsh={
51
+ error_type: error.type.downcase,
52
+ error_uuid: generate_id,
53
+ error_sender: application_id ,
54
+ error_message: error.message||"",
55
+ timestamp: DateTime.now.iso8601,
56
+ error_debug: {internal_error: error.error_raised.inspect},
47
57
  }
58
+ hsh[:error_debug] = {internal_error: error.error_raised.inspect} if error.error_raised
59
+ errors<<hsh
48
60
  end
49
61
 
50
62
  ### Class methods
@@ -58,10 +70,14 @@ class GorgService
58
70
  begin
59
71
  json_body=JSON.parse(body)
60
72
 
73
+ JSON::Validator.validate!(GorgService::Message::JSON_SCHEMA,json_body)
74
+
61
75
  msg=self.new(
62
- id: json_body["id"],
63
- event: json_body["event"],
76
+ id: json_body["event_uuid"],
77
+ event: json_body["event_name"],
64
78
  data: convert_keys_to_sym(json_body["data"]),
79
+ creation_time: json_body["event_creation_time"] && DateTime.parse(json_body["event_creation_time"]),
80
+ sender: json_body["event_sender_id"],
65
81
  errors: json_body["errors"]&&json_body["errors"].map{|e| convert_keys_to_sym(e)},
66
82
  )
67
83
 
@@ -92,7 +108,11 @@ class GorgService
92
108
 
93
109
  # Generate new id
94
110
  def generate_id
95
- "#{GorgService.configuration.application_id}_#{Time.now.to_i}"
111
+ SecureRandom.uuid()
112
+ end
113
+
114
+ def application_id
115
+ GorgService.configuration.application_id
96
116
  end
97
117
 
98
118
 
@@ -0,0 +1,98 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require 'json'
5
+
6
+ class GorgService
7
+ class Message
8
+
9
+ JSON_SCHEMA = JSON.parse('{
10
+ "$schema": "http://json-schema.org/draft-04/schema#",
11
+ "type": "object",
12
+ "properties": {
13
+ "event_name": {
14
+ "type": "string",
15
+ "pattern": "^[_a-z]+((\\.)?[_a-z]+)*$",
16
+ "description": "Event type. Must match the routing key"
17
+ },
18
+ "event_uuid": {
19
+ "type": "string",
20
+ "description": "The unique identifier of this message as UUID",
21
+ "pattern": "[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}"
22
+ },
23
+ "event_creation_time": {
24
+ "type": "string",
25
+ "description": "Creation time in UTC ISO 8601 format",
26
+ "pattern": "^([\\\+-]?\\\d{4}(?!\\\d{2}\\\b))((-?)((0[1-9]|1[0-2])(\\\3([12]\\\d|0[1-9]|3[01]))?|W([0-4]\\\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\\\d|[12]\\\d{2}|3([0-5]\\\d|6[1-6])))([T\\\s]((([01]\\\d|2[0-3])((:?)[0-5]\\\d)?|24\\\:?00)([\\\.,]\\\d+(?!:))?)?(\\\17[0-5]\\\d([\\\.,]\\\d+)?)?([zZ]|([\\\+-])([01]\\\d|2[0-3]):?([0-5]\\\d)?)?)?)?$"
27
+ },
28
+ "event_sender_id": {
29
+ "type": "string",
30
+ "description": "Producer that sent the original message"
31
+ },
32
+ "data": {
33
+ "type": "object",
34
+ "description": "Data used to process this message"
35
+ },
36
+ "errors_count": {
37
+ "type": "integer",
38
+ "description": "Helper for counting errors"
39
+ },
40
+ "errors": {
41
+ "type": "array",
42
+ "items": {
43
+ "type": "object",
44
+ "properties": {
45
+ "error_type": {
46
+ "enum": [ "debug", "info", "warning", "softerror", "harderror" ],
47
+ "description": "Type of error."
48
+ },
49
+ "error_sender": {
50
+ "type": "string",
51
+ "description": "Consummer that sent this error"
52
+ },
53
+ "error_code":{
54
+ "type":"string",
55
+ "description": "Optionnal error code from the consummer"
56
+ },
57
+ "error_uuid":{
58
+ "type":"string",
59
+ "description": "The unique identifier of this error as UUID",
60
+ "pattern": "[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}"
61
+ },
62
+ "error_message":{
63
+ "type":"string",
64
+ "description": "Error explanation"
65
+ },
66
+ "timestamp": {
67
+ "type": "string",
68
+ "description": "Time of occuring error in UTC ISO 8601",
69
+ "pattern": "^([\\\+-]?\\\d{4}(?!\\\d{2}\\\b))((-?)((0[1-9]|1[0-2])(\\\3([12]\\\d|0[1-9]|3[01]))?|W([0-4]\\\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\\\d|[12]\\\d{2}|3([0-5]\\\d|6[1-6])))([T\\\s]((([01]\\\d|2[0-3])((:?)[0-5]\\\d)?|24\\\:?00)([\\\.,]\\\d+(?!:))?)?(\\\17[0-5]\\\d([\\\.,]\\\d+)?)?([zZ]|([\\\+-])([01]\\\d|2[0-3]):?([0-5]\\\d)?)?)?)?$"
70
+ },
71
+ "error_debug": {
72
+ "type": "object",
73
+ "description": "Complementary informations for debugging"
74
+ }
75
+ },
76
+ "additionalProperties": false,
77
+ "required": [
78
+ "error_type",
79
+ "error_sender",
80
+ "timestamp",
81
+ "error_uuid",
82
+ "error_message"
83
+ ]
84
+ }
85
+ }
86
+ },
87
+ "additionalProperties": false,
88
+ "required": [
89
+ "event_name",
90
+ "event_uuid",
91
+ "event_creation_time",
92
+ "event_sender_id",
93
+ "data"
94
+ ]
95
+ }')
96
+
97
+ end
98
+ end
@@ -9,11 +9,11 @@ class GorgService
9
9
  end
10
10
 
11
11
  def raise_hardfail(message, error:nil)
12
- raise HardfailError.new(error), message
12
+ raise HardfailError.new(message, error)
13
13
  end
14
14
 
15
15
  def raise_softfail(message, error:nil)
16
- raise SoftfailError.new(error), message
16
+ raise SoftfailError.new(message, error)
17
17
  end
18
18
 
19
19
  end
@@ -2,5 +2,5 @@
2
2
  # encoding: utf-8
3
3
 
4
4
  class GorgService
5
- VERSION = "0.2.0"
5
+ VERSION = "1.0.0"
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gorg_service
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexandre Narbonne
@@ -128,6 +128,20 @@ dependencies:
128
128
  - - "~>"
129
129
  - !ruby/object:Gem::Version
130
130
  version: '9.0'
131
+ - !ruby/object:Gem::Dependency
132
+ name: json-schema
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
131
145
  description:
132
146
  email:
133
147
  - alexandre.narbonne@gadz.org
@@ -151,6 +165,7 @@ files:
151
165
  - lib/gorg_service/errors.rb
152
166
  - lib/gorg_service/listener.rb
153
167
  - lib/gorg_service/message.rb
168
+ - lib/gorg_service/message/json_schema.rb
154
169
  - lib/gorg_service/message_handler.rb
155
170
  - lib/gorg_service/version.rb
156
171
  homepage: https://github.com/Zooip/gorg_service