unidom-common 1.2 → 1.3
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.
- checksums.yaml +4 -4
- data/README.md +72 -0
- data/app/models/unidom/common/concerns/aes256_cryptor.rb +24 -0
- data/app/models/unidom/common/concerns/model_extension.rb +146 -153
- data/app/models/unidom/common/concerns/sha1_digester.rb +29 -0
- data/app/models/unidom/common/concerns/sha2_digester.rb +29 -0
- data/lib/unidom/common.rb +2 -2
- data/lib/unidom/common/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 72b239e03d003ae2a4e0f68db103b014417ea67e
|
4
|
+
data.tar.gz: 24dc122ec9aa546cbbe8565eab0bd56ace09a143
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d0ee19de3aaff418f90faf82cd2cf56e7dee37d42907057317161712d1f76ce7d06aa17321121ed9e22fbc817a3fb06bebc1b0342560c10cf669fd805e6f3a1d
|
7
|
+
data.tar.gz: b833df4e2a8e3efd2654ab64a379bcf0dd9ac1bbf4c99f6b4724fcdd89a5f3a7c9c78a27faa7bbb2400f34f20c329dd09196c56ff85f8f705f4c0eda3af07d1d
|
data/README.md
CHANGED
@@ -235,6 +235,62 @@ hex_digested == Unidom::Common::Numeration.hex digested # true
|
|
235
235
|
```
|
236
236
|
|
237
237
|
|
238
|
+
## SHA 1 Digester
|
239
|
+
```ruby
|
240
|
+
class IdentityCard
|
241
|
+
|
242
|
+
include Unidom::Common::Concerns::Sha1Digester
|
243
|
+
attr_accessor :identification_number
|
244
|
+
|
245
|
+
def initialize(identification_number)
|
246
|
+
self.identification_number = identification_number
|
247
|
+
end
|
248
|
+
|
249
|
+
def digest_identification_number
|
250
|
+
digest identification_number, pepper: self.class.name
|
251
|
+
end
|
252
|
+
|
253
|
+
def hex_digest_identification_number
|
254
|
+
hex_digest identification_number, pepper: self.class.name
|
255
|
+
end
|
256
|
+
|
257
|
+
end
|
258
|
+
|
259
|
+
identity_card = IdentityCard.new '9527'
|
260
|
+
digested = identity_card.digest_identification_number
|
261
|
+
hex_digested = identity_card.hex_digest_identification_number
|
262
|
+
hex_digested == Unidom::Common::Numeration.hex digested # true
|
263
|
+
```
|
264
|
+
|
265
|
+
|
266
|
+
## SHA 2 Digester
|
267
|
+
```ruby
|
268
|
+
class IdentityCard
|
269
|
+
|
270
|
+
include Unidom::Common::Concerns::Sha1Digester
|
271
|
+
attr_accessor :identification_number
|
272
|
+
|
273
|
+
def initialize(identification_number)
|
274
|
+
self.identification_number = identification_number
|
275
|
+
end
|
276
|
+
|
277
|
+
def digest_identification_number
|
278
|
+
digest identification_number, pepper: self.class.name
|
279
|
+
end
|
280
|
+
|
281
|
+
def hex_digest_identification_number
|
282
|
+
hex_digest identification_number, pepper: self.class.name
|
283
|
+
end
|
284
|
+
|
285
|
+
end
|
286
|
+
|
287
|
+
identity_card = IdentityCard.new '9527'
|
288
|
+
digested = identity_card.digest_identification_number
|
289
|
+
hex_digested = identity_card.hex_digest_identification_number
|
290
|
+
hex_digested == Unidom::Common::Numeration.hex digested # true
|
291
|
+
```
|
292
|
+
|
293
|
+
|
238
294
|
## ActiveRecord Migration Naming Convention
|
239
295
|
### Domain Models (200YMMDDHHMMSS)
|
240
296
|
|
@@ -305,6 +361,7 @@ hex_digested == Unidom::Common::Numeration.hex digested # true
|
|
305
361
|
<td>The Standard domain model engine includes the Standard model and the Standard Associating model. 标准领域模型引擎包括行为标准和标准关联的模型。</td>
|
306
362
|
</tr>
|
307
363
|
|
364
|
+
|
308
365
|
<tr>
|
309
366
|
<td>[](https://github.com/topbitdu/unidom-party)</td>
|
310
367
|
<td>200101DDHHMMSS</td>
|
@@ -348,6 +405,7 @@ hex_digested == Unidom::Common::Numeration.hex digested # true
|
|
348
405
|
<td>The Geo domain model engine includes the Location and Locating models. 地理领域模型引擎包括位置和定位的模型。</td>
|
349
406
|
</tr>
|
350
407
|
|
408
|
+
|
351
409
|
<tr>
|
352
410
|
<td>[](https://github.com/topbitdu/unidom-article_number)</td>
|
353
411
|
<td>200201DDHHMMSS</td>
|
@@ -399,6 +457,19 @@ hex_digested == Unidom::Common::Numeration.hex digested # true
|
|
399
457
|
<td>The Order domain model engine includes Order, Order Item, and Order Adjustment models. 订单领域模型引擎包括订单、订单项和订单调整的模型。</td>
|
400
458
|
</tr>
|
401
459
|
|
460
|
+
<tr>
|
461
|
+
<td>[](https://github.com/topbitdu/unidom-inventory)</td>
|
462
|
+
<td>200209DDHHMMSS</td>
|
463
|
+
<td>
|
464
|
+
- Serialized Inventory Item
|
465
|
+
- Grouped Inventory Item
|
466
|
+
- Lot
|
467
|
+
- Inventory Item Variance
|
468
|
+
</td>
|
469
|
+
<td>The Inventory domain model engine includes the Serialized Inventory Item, the Grouped Inventory Item, the Lot, and the Inventory Item Variance models. 库存领域模型引擎包括序列化库存项、分组库存项、批量和库存项变化的模型。</td>
|
470
|
+
</tr>
|
471
|
+
|
472
|
+
|
402
473
|
<tr>
|
403
474
|
<td>[](https://github.com/topbitdu/unidom-position)</td>
|
404
475
|
<td>200402DDHHMMSS</td>
|
@@ -421,6 +492,7 @@ hex_digested == Unidom::Common::Numeration.hex digested # true
|
|
421
492
|
<td>The Position domain model engine includes the Post Fulfillment and its relative models. 就职领域模型引擎包括岗位履行及其相关的模型。</td>
|
422
493
|
</tr>
|
423
494
|
|
495
|
+
|
424
496
|
</tbody>
|
425
497
|
</table>
|
426
498
|
|
@@ -4,6 +4,30 @@ module Unidom::Common::Concerns::Aes256Cryptor
|
|
4
4
|
|
5
5
|
included do |includer|
|
6
6
|
|
7
|
+
def encrypt(message, key: nil)
|
8
|
+
self.class.encrypt message, key: key
|
9
|
+
end
|
10
|
+
|
11
|
+
def decrypt(encoded, key: nil)
|
12
|
+
self.class.decrypt encoded, key: key
|
13
|
+
end
|
14
|
+
|
15
|
+
def aes_256_padding
|
16
|
+
self.class.aes_256_padding
|
17
|
+
end
|
18
|
+
|
19
|
+
def hex_encrypt(message, key: nil)
|
20
|
+
self.class.hex_encrypt message, key: key
|
21
|
+
end
|
22
|
+
|
23
|
+
def hex_decrypt(encoded, key: nil)
|
24
|
+
self.class.hex_decrypt encoded, key: key
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
module ClassMethods
|
30
|
+
|
7
31
|
def encrypt(message, key: nil)
|
8
32
|
|
9
33
|
raise ArgumentError.new('The message argument is required.') if message.blank?
|
@@ -1,186 +1,179 @@
|
|
1
|
-
module Unidom
|
2
|
-
module Common
|
3
|
-
module Concerns
|
1
|
+
module Unidom::Common::Concerns::ModelExtension
|
4
2
|
|
5
|
-
|
3
|
+
extend ActiveSupport::Concern
|
6
4
|
|
7
|
-
|
5
|
+
included do |includer|
|
8
6
|
|
9
|
-
|
7
|
+
validates :state, presence: true, length: { is: columns_hash['state'].limit }
|
10
8
|
|
11
|
-
|
9
|
+
scope :included_by, ->(inclusion) { where id: inclusion }
|
10
|
+
scope :excluded_by, ->(exclusion) { where.not id: exclusion }
|
12
11
|
|
13
|
-
|
14
|
-
scope :excluded_by, ->(exclusion) { where.not id: exclusion }
|
12
|
+
scope :transited_to, ->(states) { where state: states }
|
15
13
|
|
16
|
-
|
14
|
+
scope :valid_at, ->(now: Time.now) { where "? BETWEEN #{includer.table_name}.opened_at AND #{includer.table_name}.closed_at", now }
|
15
|
+
scope :valid_duration, ->(range) { where "(#{includer.table_name}.opened_at BETWEEN ? AND ?) OR (#{includer.table_name}.closed_at <= ? AND #{includer.table_name}.closed_at >= ?)", range.min, range.max, range.max, range.min }
|
17
16
|
|
18
|
-
|
19
|
-
|
17
|
+
scope :alive, ->(living: true) { where defunct: !living }
|
18
|
+
scope :dead, ->(defunct: true) { where defunct: defunct }
|
20
19
|
|
21
|
-
|
22
|
-
|
20
|
+
scope :notation_column_where, ->(name, operator, value) do
|
21
|
+
operation = :like==operator ? { operator: 'ILIKE', value: "%#{value}%" } : { operator: operator.to_s, value: value }
|
22
|
+
where "#{table_name}.notation -> 'columns' ->> '#{name}' #{operation[:operator]} :value", value: operation[:value]
|
23
|
+
end
|
23
24
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
end
|
25
|
+
scope :notation_boolean_column_where, ->(name, value) do
|
26
|
+
where "(#{table_name}.notation -> 'columns' ->> '#{name}')::boolean = :value", value: (value ? true : false)
|
27
|
+
end
|
28
28
|
|
29
|
-
|
30
|
-
|
31
|
-
|
29
|
+
if columns_hash['ordinal'].present?&&:integer==columns_hash['ordinal'].type
|
30
|
+
validates :ordinal, presence: true, numericality: { integer_only: true, greater_than: 0 }
|
31
|
+
scope :ordinal_is, ->(ordinal) { where ordinal: ordinal }
|
32
|
+
end
|
32
33
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
34
|
+
if columns_hash['uuid'].present?&&:uuid==columns_hash['uuid'].type
|
35
|
+
validates :uuid, presence: true, length: { is: 36 }
|
36
|
+
scope :uuid_is, ->(uuid) { where uuid: uuid }
|
37
|
+
end
|
37
38
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
end
|
39
|
+
if columns_hash['elemental'].present?&&:boolean==columns_hash['elemental'].type
|
40
|
+
scope :primary, ->(elemental = true) { where elemental: elemental }
|
41
|
+
end
|
42
42
|
|
43
|
-
|
44
|
-
|
45
|
-
|
43
|
+
if columns_hash['grade'].present?&&:integer==columns_hash['grade'].type
|
44
|
+
validates :grade, presence: true, numericality: { integer_only: true, greater_than_or_equal_to: 0 }
|
45
|
+
scope :grade_is, ->(grade) { where grade: grade }
|
46
|
+
scope :grade_higher_than, ->(grade) { where "grade > :grade", grade: grade }
|
47
|
+
scope :grade_lower_than, ->(grade) { where "grade < :grade", grade: grade }
|
48
|
+
end
|
46
49
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
50
|
+
if columns_hash['priority'].present?&&:integer==columns_hash['priority'].type
|
51
|
+
validates :priority, presence: true, numericality: { integer_only: true, greater_than_or_equal_to: 0 }
|
52
|
+
scope :priority_is, ->(priority) { where priority: priority }
|
53
|
+
scope :priority_higher_than, ->(priority) { where "priority > :priority", priority: priority }
|
54
|
+
scope :priority_lower_than, ->(priority) { where "priority < :priority", priority: priority }
|
55
|
+
end
|
53
56
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
57
|
+
if columns_hash['slug'].present?&&:string==columns_hash['slug'].type
|
58
|
+
validates :slug, presence: true, length: { in: 1..columns_hash['slug'].limit }, uniqueness: true
|
59
|
+
scope :slug_is, ->(slug) { where slug: slug }
|
60
|
+
before_validation -> {
|
61
|
+
prefix = build_slug.to_s[0..(self.class.columns_hash['slug'].limit-37)]
|
62
|
+
unique = prefix
|
63
|
+
while includer.slug_is(unique).count>0
|
64
|
+
unique = "#{prefix}-#{::SecureRandom.uuid}"
|
65
|
+
end
|
66
|
+
self.slug = unique
|
67
|
+
}, on: :create
|
68
|
+
# on update: re-generate the slug if the slug was assigned to empty.
|
69
|
+
# to_query: escape characters
|
70
|
+
end
|
60
71
|
|
61
|
-
|
62
|
-
validates :slug, presence: true, length: { in: 1..columns_hash['slug'].limit }, uniqueness: true
|
63
|
-
scope :slug_is, ->(slug) { where slug: slug }
|
64
|
-
before_validation -> {
|
65
|
-
prefix = build_slug.to_s[0..(self.class.columns_hash['slug'].limit-37)]
|
66
|
-
unique = prefix
|
67
|
-
while includer.slug_is(unique).count>0
|
68
|
-
unique = "#{prefix}-#{::SecureRandom.uuid}"
|
69
|
-
end
|
70
|
-
self.slug = unique
|
71
|
-
}, on: :create
|
72
|
-
# on update: re-generate the slug if the slug was assigned to empty.
|
73
|
-
# to_query: escape characters
|
74
|
-
end
|
72
|
+
columns_hash.each do |column_name, hash|
|
75
73
|
|
76
|
-
|
77
|
-
|
78
|
-
name = column_name.to_s
|
79
|
-
|
80
|
-
if ('code'==name||name.ends_with?('_code'))&&:string==columns_hash[name].type
|
81
|
-
class_eval do
|
82
|
-
if columns_hash[name].null
|
83
|
-
validates name.to_sym, allow_blank: true, length: { maximum: columns_hash[name].limit }
|
84
|
-
scope "#{name}_length_is".to_sym, ->(length) { where "LENGTH(#{name}) = :length", length: length }
|
85
|
-
elsif columns_hash[name].limit<=4
|
86
|
-
validates name.to_sym, presence: true, length: { is: columns_hash[name].limit }
|
87
|
-
else
|
88
|
-
validates name.to_sym, presence: true, length: { maximum: columns_hash[name].limit }
|
89
|
-
end
|
90
|
-
scope "#{name}d_as".to_sym, ->(code) { where name => code }
|
91
|
-
scope "not_#{name}d_as".to_sym, ->(code) { where.not name => code }
|
92
|
-
scope "#{name}_starting_with".to_sym, ->(prefix) { where "#{name} LIKE :prefix", prefix: "#{prefix}%" }
|
93
|
-
scope "#{name}_ending_with".to_sym, ->(suffix) { where "#{name} LIKE :suffix", suffix: "%#{suffix}" }
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
if name.ends_with?('_at')&&:datetime==columns_hash[name].type
|
98
|
-
matched = /\A(.+)_at\z/.match name
|
99
|
-
class_eval do
|
100
|
-
scope :"#{matched[1]}_on", ->(date) { where name => date.beginning_of_day..date.end_of_day }
|
101
|
-
scope :"#{matched[1]}_during", ->(range) { where name => range }
|
102
|
-
scope :"#{matched[1]}_before", ->(time) { where "#{table_name}.#{name} < :time", time: time }
|
103
|
-
scope :"#{matched[1]}_not_after", ->(time) { where "#{table_name}.#{name} <= :time", time: time }
|
104
|
-
scope :"#{matched[1]}_after", ->(time) { where "#{table_name}.#{name} > :time", time: time }
|
105
|
-
scope :"#{matched[1]}_not_before", ->(time) { where "#{table_name}.#{name} >= :time", time: time }
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
if name.ends_with?('_state')&&:string==columns_hash[name].type
|
110
|
-
matched = /\A(.+)_state\z/.match name
|
111
|
-
class_eval do
|
112
|
-
scope :"#{matched[1]}_transited_to", ->(states) { where name => states }
|
113
|
-
end
|
114
|
-
end
|
74
|
+
name = column_name.to_s
|
115
75
|
|
76
|
+
if ('code'==name||name.ends_with?('_code'))&&:string==columns_hash[name].type
|
77
|
+
class_eval do
|
78
|
+
if columns_hash[name].null
|
79
|
+
validates name.to_sym, allow_blank: true, length: { maximum: columns_hash[name].limit }
|
80
|
+
scope "#{name}_length_is".to_sym, ->(length) { where "LENGTH(#{name}) = :length", length: length }
|
81
|
+
elsif columns_hash[name].limit<=4
|
82
|
+
validates name.to_sym, presence: true, length: { is: columns_hash[name].limit }
|
83
|
+
else
|
84
|
+
validates name.to_sym, presence: true, length: { maximum: columns_hash[name].limit }
|
116
85
|
end
|
86
|
+
scope "#{name}d_as".to_sym, ->(code) { where name => code }
|
87
|
+
scope "not_#{name}d_as".to_sym, ->(code) { where.not name => code }
|
88
|
+
scope "#{name}_starting_with".to_sym, ->(prefix) { where "#{name} LIKE :prefix", prefix: "#{prefix}%" }
|
89
|
+
scope "#{name}_ending_with".to_sym, ->(suffix) { where "#{name} LIKE :suffix", suffix: "%#{suffix}" }
|
90
|
+
end
|
91
|
+
end
|
117
92
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
93
|
+
if name.ends_with?('_at')&&:datetime==columns_hash[name].type
|
94
|
+
matched = /\A(.+)_at\z/.match name
|
95
|
+
class_eval do
|
96
|
+
scope :"#{matched[1]}_on", ->(date) { where name => date.beginning_of_day..date.end_of_day }
|
97
|
+
scope :"#{matched[1]}_during", ->(range) { where name => range }
|
98
|
+
scope :"#{matched[1]}_before", ->(time) { where "#{table_name}.#{name} < :time", time: time }
|
99
|
+
scope :"#{matched[1]}_not_after", ->(time) { where "#{table_name}.#{name} <= :time", time: time }
|
100
|
+
scope :"#{matched[1]}_after", ->(time) { where "#{table_name}.#{name} > :time", time: time }
|
101
|
+
scope :"#{matched[1]}_not_before", ->(time) { where "#{table_name}.#{name} >= :time", time: time }
|
102
|
+
end
|
103
|
+
end
|
125
104
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
105
|
+
if name.ends_with?('_state')&&:string==columns_hash[name].type
|
106
|
+
matched = /\A(.+)_state\z/.match name
|
107
|
+
class_eval do
|
108
|
+
validates name.to_sym, presence: true, length: { is: columns_hash[name].limit }
|
109
|
+
scope :"#{matched[1]}_transited_to", ->(states) { where name => states }
|
110
|
+
end
|
111
|
+
end
|
131
112
|
|
132
|
-
|
133
|
-
if respond_to? :name
|
134
|
-
name
|
135
|
-
elsif respond_to? :title
|
136
|
-
title
|
137
|
-
else
|
138
|
-
::SecureRandom.uuid
|
139
|
-
end
|
140
|
-
end
|
113
|
+
end
|
141
114
|
|
142
|
-
|
115
|
+
includer.define_singleton_method :default_scope do
|
116
|
+
includer.all.order("#{includer.table_name}.ordinal ASC") if includer.columns_hash['ordinal'].present?
|
117
|
+
includer.all.order("#{includer.table_name}.created_at ASC")
|
118
|
+
#relation = base.all
|
119
|
+
#scopes.each do |s| relation = relation.send s.to_sym end
|
120
|
+
#relation
|
121
|
+
end
|
143
122
|
|
144
|
-
|
123
|
+
def soft_destroy
|
124
|
+
self.closed_at = Time.now
|
125
|
+
self.defunct = true
|
126
|
+
self.save
|
127
|
+
end
|
145
128
|
|
146
|
-
|
147
|
-
|
148
|
-
|
129
|
+
def build_slug
|
130
|
+
if respond_to? :name
|
131
|
+
name
|
132
|
+
elsif respond_to? :title
|
133
|
+
title
|
134
|
+
else
|
135
|
+
::SecureRandom.uuid
|
136
|
+
end
|
137
|
+
end
|
149
138
|
|
150
|
-
|
151
|
-
names.each do |name|
|
152
|
-
name = name.to_s
|
153
|
-
instance_eval do
|
154
|
-
define_method(name) do
|
155
|
-
notation.try(:[], 'columns').try(:[], name)
|
156
|
-
end
|
157
|
-
define_method("#{name}=") do |value|
|
158
|
-
notation['columns'] ||= {}
|
159
|
-
notation['columns'][name] = value
|
160
|
-
end
|
161
|
-
end
|
162
|
-
end
|
163
|
-
end
|
139
|
+
end
|
164
140
|
|
165
|
-
|
166
|
-
names.each do |name|
|
167
|
-
name = name.to_s
|
168
|
-
instance_eval do
|
169
|
-
define_method("#{name}?") do
|
170
|
-
notation.try(:[], 'columns').try(:[], name)
|
171
|
-
end
|
172
|
-
define_method("#{name}=") do |value|
|
173
|
-
notation['columns'] ||= {}
|
174
|
-
notation['columns'][name] = value
|
175
|
-
end
|
176
|
-
end
|
177
|
-
end
|
178
|
-
end
|
141
|
+
module ClassMethods
|
179
142
|
|
180
|
-
|
143
|
+
def to_id(model)
|
144
|
+
model.respond_to?(:id) ? model.id : model
|
145
|
+
end
|
181
146
|
|
147
|
+
def notation_column(*names)
|
148
|
+
names.each do |name|
|
149
|
+
name = name.to_s
|
150
|
+
instance_eval do
|
151
|
+
define_method(name) do
|
152
|
+
notation.try(:[], 'columns').try(:[], name)
|
153
|
+
end
|
154
|
+
define_method("#{name}=") do |value|
|
155
|
+
notation['columns'] ||= {}
|
156
|
+
notation['columns'][name] = value
|
157
|
+
end
|
158
|
+
end
|
182
159
|
end
|
160
|
+
end
|
183
161
|
|
162
|
+
def notation_boolean_column(*names)
|
163
|
+
names.each do |name|
|
164
|
+
name = name.to_s
|
165
|
+
instance_eval do
|
166
|
+
define_method("#{name}?") do
|
167
|
+
notation.try(:[], 'columns').try(:[], name)
|
168
|
+
end
|
169
|
+
define_method("#{name}=") do |value|
|
170
|
+
notation['columns'] ||= {}
|
171
|
+
notation['columns'][name] = value
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
184
175
|
end
|
176
|
+
|
185
177
|
end
|
186
|
-
|
178
|
+
|
179
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Unidom::Common::Concerns::Sha1Digester
|
2
|
+
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do |includer|
|
6
|
+
|
7
|
+
def digest(message, pepper: nil)
|
8
|
+
self.class.digest message, pepper: pepper
|
9
|
+
end
|
10
|
+
|
11
|
+
def hex_digest(message, pepper: nil)
|
12
|
+
self.class.hex_digest message, pepper: pepper
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
module ClassMethods
|
18
|
+
|
19
|
+
def digest(message, pepper: nil)
|
20
|
+
message.present? ? Digest::SHA1.digest("#{message}_#{Rails.application.secrets[:secret_key_base]}_#{pepper}") : nil
|
21
|
+
end
|
22
|
+
|
23
|
+
def hex_digest(message, pepper: nil)
|
24
|
+
message.present? ? Unidom::Common::Numeration.hex(digest(message, pepper: pepper)) : nil
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Unidom::Common::Concerns::Sha2Digester
|
2
|
+
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do |includer|
|
6
|
+
|
7
|
+
def digest(message, pepper: nil)
|
8
|
+
self.class.digest message, pepper: pepper
|
9
|
+
end
|
10
|
+
|
11
|
+
def hex_digest(message, pepper: nil)
|
12
|
+
self.class.hex_digest message, pepper: pepper
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
module ClassMethods
|
18
|
+
|
19
|
+
def digest(message, pepper: nil)
|
20
|
+
message.present? ? Digest::SHA2.digest("#{message}_#{Rails.application.secrets[:secret_key_base]}_#{pepper}") : nil
|
21
|
+
end
|
22
|
+
|
23
|
+
def hex_digest(message, pepper: nil)
|
24
|
+
message.present? ? Unidom::Common::Numeration.hex(digest(message, pepper: pepper)) : nil
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
data/lib/unidom/common.rb
CHANGED
@@ -5,8 +5,8 @@ require 'unidom/common/numeration'
|
|
5
5
|
module Unidom
|
6
6
|
module Common
|
7
7
|
|
8
|
-
NULL_UUID = '00000000-0000-0000-0000-000000000000'
|
9
|
-
SELF = '~'
|
8
|
+
NULL_UUID = '00000000-0000-0000-0000-000000000000'.freeze
|
9
|
+
SELF = '~'.freeze
|
10
10
|
|
11
11
|
#OPENED_AT = Time.utc(1970).freeze
|
12
12
|
#CLOSED_AT = Time.utc(3000).freeze
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: unidom-common
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '1.
|
4
|
+
version: '1.3'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Topbit Du
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-09-
|
11
|
+
date: 2016-09-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -84,7 +84,9 @@ files:
|
|
84
84
|
- app/models/unidom/common/concerns/aes256_cryptor.rb
|
85
85
|
- app/models/unidom/common/concerns/md5_digester.rb
|
86
86
|
- app/models/unidom/common/concerns/model_extension.rb
|
87
|
+
- app/models/unidom/common/concerns/sha1_digester.rb
|
87
88
|
- app/models/unidom/common/concerns/sha256_digester.rb
|
89
|
+
- app/models/unidom/common/concerns/sha2_digester.rb
|
88
90
|
- app/models/unidom/common/concerns/sha384_digester.rb
|
89
91
|
- app/models/unidom/common/concerns/sha512_digester.rb
|
90
92
|
- app/views/layouts/unidom/common/application.html.erb
|