Merge branch '19146-can-write-manage'
[arvados.git] / services / api / app / models / jsonb_type.rb
1 # Copyright (C) The Arvados Authors. All rights reserved.
2 #
3 # SPDX-License-Identifier: AGPL-3.0
4
5 class JsonbType
6   # Emulate pre-rails5.0 behavior by having a interpreting NULL/nil as
7   # some other default value.
8   class WithDefault < ActiveModel::Type::Value
9     include ActiveModel::Type::Helpers::Mutable
10
11     def default_value
12       nil
13     end
14
15     def changed_in_place?(raw_old_value, value)
16       # Compare deserialized values for correctness, checking serialized values
17       # may include changes in ordering, inline whitespaces, etc.
18       deserialize(raw_old_value) != value
19     end
20
21     def deserialize(value)
22       if value.nil?
23         self.default_value
24       elsif value.is_a?(::String)
25         SafeJSON.load(value) rescue self.default_value
26       else
27         value
28       end
29     end
30
31     def serialize(value)
32       if value.nil?
33         self.default_value
34       else
35         SafeJSON.dump(value)
36       end
37     end
38   end
39
40   class Hash < JsonbType::WithDefault
41     def default_value
42       {}
43     end
44   end
45
46   class Array < JsonbType::WithDefault
47     def default_value
48       []
49     end
50   end
51 end