Skip to content

Commit 039cfa1

Browse files
committed
feat(handleJson): extract assignResourceRelationships function
- Extracted assignResourceRelationships function to assign embedded and reference properties to resource fields. - Refactored handleJson to utilize the new relationship assignment function. Signed-off-by: J3m5 <[email protected]>
1 parent af6243b commit 039cfa1

File tree

1 file changed

+40
-31
lines changed

1 file changed

+40
-31
lines changed

src/openapi3/handleJson.ts

Lines changed: 40 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,35 @@ import type {
1616
SchemaObjectDereferenced,
1717
} from "./dereferencedOpenApiv3.js";
1818

19+
/**
20+
* Assigns relationships between resources based on their fields.
21+
* Sets the field's `embedded` or `reference` property depending on its type.
22+
*
23+
* @param resources - Array of Resource objects to process.
24+
* @returns The same array of resources with relationships assigned.
25+
*/
26+
function assignResourceRelationships(resources: Resource[]) {
27+
for (const resource of resources) {
28+
for (const field of resource.fields ?? []) {
29+
const name = camelize(field.name).replace(/Ids?$/, "");
30+
31+
const guessedResource = resources.find(
32+
(res) => res.title === classify(name),
33+
);
34+
if (!guessedResource) {
35+
continue;
36+
}
37+
field.maxCardinality = field.type === "array" ? null : 1;
38+
if (field.type === "object" || field.arrayType === "object") {
39+
field.embedded = guessedResource;
40+
} else {
41+
field.reference = guessedResource;
42+
}
43+
}
44+
}
45+
return resources;
46+
}
47+
1948
function mergeResources(resourceA: Resource, resourceB: Resource) {
2049
for (const fieldB of resourceB.fields ?? []) {
2150
if (!resourceA.fields?.some((fieldA) => fieldA.name === fieldB.name)) {
@@ -154,8 +183,14 @@ export default async function handleJson(
154183

155184
const title = classify(baseName);
156185

157-
const showOperation = pathItem.get;
158-
const editOperation = pathItem.put || pathItem.patch;
186+
const {
187+
get: showOperation,
188+
put: putOperation,
189+
patch: patchOperation,
190+
delete: deleteOperation,
191+
} = pathItem;
192+
193+
const editOperation = putOperation || patchOperation;
159194
if (!showOperation && !editOperation) {
160195
continue;
161196
}
@@ -184,14 +219,8 @@ export default async function handleJson(
184219
resource = mergeResources(showResource, editResource);
185220
}
186221

187-
const {
188-
put: putOperation,
189-
patch: patchOperation,
190-
delete: deleteOperation,
191-
} = pathItem;
192222
const pathCollection = document.paths[`/${name}`];
193-
const listOperation = pathCollection && pathCollection.get;
194-
const createOperation = pathCollection && pathCollection.post;
223+
const { get: listOperation, post: createOperation } = pathCollection ?? {};
195224

196225
resource.operations = [
197226
...(showOperation
@@ -214,7 +243,7 @@ export default async function handleJson(
214243
: []),
215244
];
216245

217-
if (listOperation && listOperation.parameters) {
246+
if (listOperation?.parameters) {
218247
resource.parameters = listOperation.parameters.map(
219248
(parameter) =>
220249
new Parameter(
@@ -230,25 +259,5 @@ export default async function handleJson(
230259
resources.push(resource);
231260
}
232261

233-
// Guess embeddeds and references from property names
234-
for (const resource of resources) {
235-
for (const field of resource.fields ?? []) {
236-
const name = camelize(field.name).replace(/Ids?$/, "");
237-
238-
const guessedResource = resources.find(
239-
(res) => res.title === classify(name),
240-
);
241-
if (!guessedResource) {
242-
continue;
243-
}
244-
field.maxCardinality = field.type === "array" ? null : 1;
245-
if (field.type === "object" || field.arrayType === "object") {
246-
field.embedded = guessedResource;
247-
} else {
248-
field.reference = guessedResource;
249-
}
250-
}
251-
}
252-
253-
return resources;
262+
return assignResourceRelationships(resources);
254263
}

0 commit comments

Comments
 (0)