@@ -32,14 +32,14 @@ def execute
32
32
33
33
def sort_data_types ( data_types )
34
34
# types without parent are already "in order" because they don't have a dependency
35
- sorted_types = data_types . reject { |dt | dt . parent_type_identifier . present? }
35
+ sorted_types = data_types . reject { |dt | dt . parent_type . present? }
36
36
unsorted_types = data_types - sorted_types
37
37
38
38
unsorted_types . size . times do
39
39
# find the next datatype that doesn't have a dependency on an unsorted type
40
40
next_datatype = unsorted_types . find do |to_sort |
41
41
unsorted_types . none? do |to_search |
42
- to_sort . parent_type_identifier == to_search . identifier
42
+ to_sort . parent_type &. data_type_identifier == to_search . identifier
43
43
end
44
44
end
45
45
sorted_types << next_datatype
@@ -49,20 +49,69 @@ def sort_data_types(data_types)
49
49
sorted_types + unsorted_types # any unsorted types also need to be processed. They might still fail validations
50
50
end
51
51
52
- def update_datatype ( data_type , _t )
52
+ def update_datatype ( data_type , t )
53
53
db_object = DataType . find_or_initialize_by ( runtime : current_runtime , identifier : data_type . identifier )
54
54
db_object . removed_at = nil
55
55
db_object . variant = data_type . variant . to_s . downcase
56
- if data_type . parent_type_identifier . present?
57
- # db_object.parent_type = find_datatype(data_type.parent_type_identifier, t)
58
- # TODO: wait for parenttype get properly introduced in grpc
59
- end
56
+ db_object . parent_type = find_data_type_identifier ( data_type . parent_type , t ) if data_type . parent_type . present?
60
57
db_object . rules = update_rules ( data_type . rules , db_object )
61
58
db_object . names = update_translations ( data_type . name , db_object . names )
62
59
db_object . generic_keys = data_type . generic_keys . to_a
63
60
db_object . save
64
61
end
65
62
63
+ def find_data_type_identifier ( identifier , t )
64
+ if identifier . data_type_identifier . present?
65
+ return create_data_type_identifier ( t , data_type_id : find_datatype ( identifier . data_type_identifier , t ) . id )
66
+ end
67
+
68
+ if identifier . generic_type . present?
69
+ data_type = find_datatype ( identifier . generic_type . data_type_identifier , t )
70
+
71
+ generic_type = GenericType . find_by (
72
+ runtime_id : current_runtime . id ,
73
+ data_type : data_type
74
+ )
75
+ if generic_type . nil?
76
+ generic_type = GenericType . create (
77
+ runtime_id : current_runtime . id ,
78
+ data_type : data_type
79
+ )
80
+ end
81
+
82
+ if generic_type . nil?
83
+ t . rollback_and_return! ServiceResponse . error (
84
+ message : "Could not find generic type with identifier #{ identifier . generic_type . data_type_identifier } " ,
85
+ payload : :no_generic_type_for_identifier
86
+ )
87
+ end
88
+
89
+ generic_type . assign_attributes ( generic_mappers : update_mappers ( identifier . generic_type . generic_mappers , nil ,
90
+ t ) )
91
+
92
+ return create_data_type_identifier ( t , generic_type_id : generic_type . id )
93
+ end
94
+ return create_data_type_identifier ( t , generic_key : identifier . generic_key ) if identifier . generic_key . present?
95
+
96
+ raise ArgumentError , "Invalid identifier: #{ identifier . inspect } "
97
+ end
98
+
99
+ def create_data_type_identifier ( t , **kwargs )
100
+ data_type_identifier = DataTypeIdentifier . find_by ( runtime_id : current_runtime . id , **kwargs )
101
+ if data_type_identifier . nil?
102
+ data_type_identifier = DataTypeIdentifier . create_or_find_by ( runtime_id : current_runtime . id , **kwargs )
103
+ end
104
+
105
+ if data_type_identifier . nil?
106
+ t . rollback_and_return! ServiceResponse . error (
107
+ message : "Could not find datatype identifier with #{ kwargs } " ,
108
+ payload : :no_datatype_identifier_for_generic_key
109
+ )
110
+ end
111
+
112
+ data_type_identifier
113
+ end
114
+
66
115
def find_datatype ( identifier , t )
67
116
data_type = DataType . find_or_initialize_by ( runtime : current_runtime , identifier : identifier )
68
117
0 commit comments