@@ -77,27 +77,27 @@ defmodule KeilaWeb.Api.Schema do
77
77
78
78
def schema_build ( properties , opts ) when is_map ( properties ) do
79
79
allowed_properties = Keyword . get ( opts , :only , :all )
80
- required_properties = required_properties ( properties , allowed_properties )
80
+ properties = do_schema_build ( properties , allowed_properties )
81
+
81
82
list? = Keyword . get ( opts , :list , false )
82
83
meta = Keyword . get ( opts , :meta , nil )
83
84
with_pagination? = Keyword . get ( opts , :with_pagination , false )
85
+ required = Keyword . get ( opts , :required , nil )
84
86
85
87
data_schema =
86
88
if list? do
87
89
% OpenApiSpex.Schema {
88
90
type: :array ,
89
91
items: % OpenApiSpex.Schema {
90
92
type: :object ,
91
- properties: do_schema_build ( properties , allowed_properties ) ,
92
- required: required_properties ,
93
+ properties: properties ,
93
94
additionalProperties: false
94
95
}
95
96
}
96
97
else
97
98
% OpenApiSpex.Schema {
98
99
type: :object ,
99
- properties: do_schema_build ( properties , allowed_properties ) ,
100
- required: required_properties ,
100
+ properties: properties ,
101
101
additionalProperties: false
102
102
}
103
103
end
@@ -110,6 +110,7 @@ defmodule KeilaWeb.Api.Schema do
110
110
}
111
111
|> maybe_add_meta ( meta )
112
112
|> maybe_put_pagination ( with_pagination? )
113
+ |> maybe_put_required ( required )
113
114
end
114
115
115
116
defp do_schema_build ( properties , allowed_properties \\ :all )
@@ -119,7 +120,6 @@ defmodule KeilaWeb.Api.Schema do
119
120
allowed_properties == :all || key in allowed_properties ,
120
121
into: % { } do
121
122
properties = do_schema_build ( Map . get ( property , :properties ) )
122
- required_properties = required_properties ( Map . get ( property , :properties ) )
123
123
124
124
items =
125
125
case do_schema_build ( Map . get ( property , :items ) ) do
@@ -135,8 +135,7 @@ defmodule KeilaWeb.Api.Schema do
135
135
enum: Map . get ( property , :enum ) ,
136
136
example: Map . get ( property , :example ) ,
137
137
properties: properties ,
138
- items: items ,
139
- required: required_properties
138
+ items: items
140
139
} }
141
140
end
142
141
end
@@ -153,24 +152,22 @@ defmodule KeilaWeb.Api.Schema do
153
152
154
153
defp maybe_put_pagination ( schema , true ) , do: maybe_add_meta ( schema , @ meta )
155
154
156
- defp required_properties ( properties , allowed_properties \\ :all )
157
-
158
- defp required_properties ( nil , _ ) , do: nil
159
- defp required_properties ( [ ] , _ ) , do: nil
160
-
161
- defp required_properties ( properties , allowed_properties ) do
162
- properties
163
- |> Enum . filter ( fn
164
- { key , % { required: true } } ->
165
- allowed_properties == :all || key in allowed_properties
166
-
167
- _ ->
168
- false
169
- end )
170
- |> Enum . map ( fn { key , _ } -> key end )
171
- |> then ( fn
172
- [ ] -> nil
173
- required_properties -> required_properties
155
+ defp maybe_put_required ( schema , nil ) , do: schema
156
+
157
+ defp maybe_put_required ( schema , required_fields ) do
158
+ Enum . reduce ( required_fields , schema , fn
159
+ field , schema when is_atom ( field ) ->
160
+ update_in ( schema , [ :properties , :data , Access . key! ( :required ) ] , fn
161
+ nil -> [ field ]
162
+ required -> [ field | required ]
163
+ end )
164
+
165
+ { path , required_fields } , schema when is_list ( path ) ->
166
+ put_in (
167
+ schema ,
168
+ [ :properties , :data , Access . key! ( :properties ) ] ++ path ++ [ Access . key! ( :required ) ] ,
169
+ required_fields
170
+ )
174
171
end )
175
172
end
176
173
end
0 commit comments