Skip to content

Commit 0c5fed1

Browse files
Merge pull request #7 from agile-learning-institute/refactor_processing_operations_structure
Standardized processing operations output.
2 parents cf54518 + ed8c91d commit 0c5fed1

13 files changed

+460
-120
lines changed

docs/openapi.yaml

Lines changed: 62 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,7 @@ paths:
3737
content:
3838
application/json:
3939
schema:
40-
description: List of processing logs
41-
type: array
42-
items:
43-
type: string
40+
$ref: '#/components/schemas/processing_results'
4441
'500':
4542
description: Processing error
4643
content:
@@ -95,10 +92,7 @@ paths:
9592
content:
9693
application/json:
9794
schema:
98-
description: List of processing logs
99-
type: array
100-
items:
101-
type: string
95+
$ref: '#/components/schemas/processing_results'
10296
'404':
10397
description: Collection not found
10498
content:
@@ -292,6 +286,65 @@ components:
292286
type: array
293287
items:
294288
description: Aggregate pipelines are defined at https://www.mongodb.com/docs/manual/aggregation/
289+
processing_results:
290+
description: Array of processing operation results
291+
type: array
292+
items:
293+
type: object
294+
description: Result of a single processing operation
295+
required:
296+
- operation
297+
- status
298+
properties:
299+
operation:
300+
description: Type of operation performed
301+
type: string
302+
enum:
303+
- evaluate_version
304+
- remove_schema
305+
- drop_index
306+
- run_migration
307+
- create_index
308+
- apply_schema
309+
- load_test_data
310+
- update_version
311+
- collection_processing
312+
- version_processing
313+
- overall_status
314+
status:
315+
description: Operation status
316+
type: string
317+
enum:
318+
- success
319+
- error
320+
- skipped
321+
collection:
322+
description: Collection name affected by the operation
323+
type: string
324+
message:
325+
description: Human-readable status message
326+
type: string
327+
details_type:
328+
description: Type of details for complex operations
329+
type: string
330+
enum:
331+
- schema
332+
- index
333+
- migration
334+
- test_data
335+
- version
336+
- error
337+
- overall
338+
details:
339+
description: Operation-specific details (object or array)
340+
oneOf:
341+
- type: object
342+
additionalProperties: true
343+
- type: array
344+
items:
345+
type: object
346+
additionalProperties: true
347+
additionalProperties: true
295348
config:
296349
type: object
297350
properties:
@@ -335,3 +388,4 @@ components:
335388
type: array
336389
items:
337390
type: string
391+

stage0_mongodb_api/managers/config_manager.py

Lines changed: 127 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,11 @@ def process_all_collections(self) -> Dict[str, List[Dict]]:
185185
results[collection_name] = [{
186186
"operation": "collection_processing",
187187
"collection": collection_name,
188-
"error": str(e),
188+
"message": f"Error processing collection: {str(e)}",
189+
"details_type": "error",
190+
"details": {
191+
"error": str(e)
192+
},
189193
"status": "error"
190194
}]
191195
any_collection_failed = True
@@ -198,12 +202,15 @@ def process_all_collections(self) -> Dict[str, List[Dict]]:
198202
for collection_name in results.keys():
199203
results[collection_name].append({
200204
"operation": "overall_status",
201-
"status": overall_status,
202205
"message": overall_message,
203-
"collections_processed": len(self.collection_configs),
204-
"collections_failed": sum(1 for result in results.values()
205-
if any(isinstance(op, dict) and op.get("status") == "error"
206-
for op in result))
206+
"details_type": "overall",
207+
"details": {
208+
"collections_processed": len(self.collection_configs),
209+
"collections_failed": sum(1 for result in results.values()
210+
if any(isinstance(op, dict) and op.get("status") == "error"
211+
for op in result))
212+
},
213+
"status": overall_status
207214
})
208215

209216
return results
@@ -241,7 +248,17 @@ def process_collection_versions(self, collection_name: str) -> List[Dict]:
241248
for version_config in versions:
242249
current_version = VersionManager.get_current_version(collection_name)
243250
version_number = VersionNumber(version_config.get("version"))
244-
operations.append(f"Evaluating version {version_number}")
251+
operations.append({
252+
"operation": "evaluate_version",
253+
"collection": collection_name,
254+
"message": f"Evaluating version {version_number}",
255+
"details_type": "version",
256+
"details": {
257+
"version": str(version_number),
258+
"current_version": current_version
259+
},
260+
"status": "success"
261+
})
245262

246263
# Only process versions greater than current version
247264
if version_number > current_version:
@@ -257,14 +274,30 @@ def process_collection_versions(self, collection_name: str) -> List[Dict]:
257274
current_version = VersionNumber(self.version_manager.get_current_version(collection_name))
258275
else:
259276
logger.info(f"Skipping version {str(version_number)} for {collection_name} - already processed")
277+
operations.append({
278+
"operation": "evaluate_version",
279+
"collection": collection_name,
280+
"message": f"Skipping version {version_number} - already processed",
281+
"details_type": "version",
282+
"details": {
283+
"version": str(version_number),
284+
"current_version": current_version,
285+
"skipped": True
286+
},
287+
"status": "skipped"
288+
})
260289

261290
except Exception as e:
262291
logger.error(f"Error during version processing for {collection_name}: {str(e)}")
263292
operations.append({
264293
"operation": "version_processing",
265294
"collection": collection_name,
266-
"version": "unknown",
267-
"error": f"Error during version processing: {str(e)}",
295+
"message": f"Error during version processing: {str(e)}",
296+
"details_type": "error",
297+
"details": {
298+
"error": str(e),
299+
"version": "unknown"
300+
},
268301
"status": "error"
269302
})
270303

@@ -284,54 +317,100 @@ def _process_version(self, collection_name: str, version_config: Dict) -> List[D
284317

285318
try:
286319
# Required: Remove existing schema validation
287-
operations.append(f"Removing schema validation for {collection_name}")
288-
operations.append(self.schema_manager.remove_schema(collection_name))
320+
operations.append({
321+
"operation": "remove_schema",
322+
"collection": collection_name,
323+
"message": f"Removing schema validation for {collection_name}",
324+
"status": "success"
325+
})
326+
remove_result = self.schema_manager.remove_schema(collection_name)
327+
operations.append(remove_result)
289328
self._assert_no_errors(operations)
290329

291330
# Optional: Process drop_indexes if present
292331
if "drop_indexes" in version_config:
293332
for index in version_config["drop_indexes"]:
294-
operations.append(f"Dropping index {index} for {collection_name}")
295-
operations.append(self.index_manager.drop_index(collection_name, index))
333+
operations.append({
334+
"operation": "drop_index",
335+
"collection": collection_name,
336+
"message": f"Dropping index {index} for {collection_name}",
337+
"status": "success"
338+
})
339+
drop_result = self.index_manager.drop_index(collection_name, index)
340+
operations.append(drop_result)
296341
self._assert_no_errors(operations)
297342

298343
# Optional: Process aggregations if present
299344
if "aggregations" in version_config:
300345
for migration in version_config["aggregations"]:
301346
pipeline_name = migration.get("name", "unnamed_pipeline")
302-
operations.append(f"Running Aggregation Pipeline '{pipeline_name}' for {collection_name}")
303-
operations.append(self.migration_manager.run_migration(collection_name, migration))
347+
operations.append({
348+
"operation": "run_migration",
349+
"collection": collection_name,
350+
"message": f"Running Aggregation Pipeline '{pipeline_name}' for {collection_name}",
351+
"status": "success"
352+
})
353+
migration_result = self.migration_manager.run_migration(collection_name, migration)
354+
operations.append(migration_result)
304355
self._assert_no_errors(operations)
305356

306357
# Optional: Process add_indexes if present
307358
if "add_indexes" in version_config:
308-
operations.append(f"Creating indexes for {collection_name}")
309-
operations.append(self.index_manager.create_index(collection_name, version_config["add_indexes"]))
359+
operations.append({
360+
"operation": "create_index",
361+
"collection": collection_name,
362+
"message": f"Creating indexes for {collection_name}",
363+
"status": "success"
364+
})
365+
create_result = self.index_manager.create_index(collection_name, version_config["add_indexes"])
366+
operations.append(create_result)
310367
self._assert_no_errors(operations)
311368

312369
# Required: Apply schema validation
313-
operations.append(f"Applying schema for {collection_name}")
314-
operations.append(self.schema_manager.apply_schema(f"{collection_name}.{version_config.get("version")}"))
370+
operations.append({
371+
"operation": "apply_schema",
372+
"collection": collection_name,
373+
"message": f"Applying schema for {collection_name}",
374+
"status": "success"
375+
})
376+
apply_result = self.schema_manager.apply_schema(f"{collection_name}.{version_config.get("version")}")
377+
operations.append(apply_result)
315378
self._assert_no_errors(operations)
316379

317380
# Optional: Load test data if enabled and present
318381
if "test_data" in version_config and self.config.LOAD_TEST_DATA:
319-
operations.append(f"Loading test data for {collection_name} - {version_config['test_data']}")
320-
operations.append(self._load_test_data(collection_name, version_config["test_data"]))
382+
operations.append({
383+
"operation": "load_test_data",
384+
"collection": collection_name,
385+
"message": f"Loading test data for {collection_name} - {version_config['test_data']}",
386+
"status": "success"
387+
})
388+
test_data_result = self._load_test_data(collection_name, version_config["test_data"])
389+
operations.append(test_data_result)
321390
self._assert_no_errors(operations)
322391

323392
# Update version if version string is present
324-
operations.append(f"Updating version for {collection_name}")
325-
operations.append(self.version_manager.update_version(collection_name, version_config["version"]))
393+
operations.append({
394+
"operation": "update_version",
395+
"collection": collection_name,
396+
"message": f"Updating version for {collection_name}",
397+
"status": "success"
398+
})
399+
version_result = self.version_manager.update_version(collection_name, version_config["version"])
400+
operations.append(version_result)
326401
self._assert_no_errors(operations)
327402

328403
except Exception as e:
329404
logger.error(f"Error processing version for {collection_name}: {str(e)}")
330405
operations.append({
331-
"status": "error",
332406
"operation": "version_processing",
333407
"collection": collection_name,
334-
"error": str(e)
408+
"message": f"Error processing version: {str(e)}",
409+
"details_type": "error",
410+
"details": {
411+
"error": str(e)
412+
},
413+
"status": "error"
335414
})
336415

337416
return operations
@@ -344,7 +423,7 @@ def _load_test_data(self, collection_name: str, test_data_file: str) -> Dict:
344423
test_data_file: Name of the test data file
345424
346425
Returns:
347-
Dict containing operation result with proper error handling for bulk write errors
426+
Dict containing operation result in consistent format
348427
"""
349428
from stage0_py_utils.mongo_utils.mongo_io import TestDataLoadError
350429
try:
@@ -354,18 +433,29 @@ def _load_test_data(self, collection_name: str, test_data_file: str) -> Dict:
354433
return {
355434
"operation": "load_test_data",
356435
"collection": collection_name,
357-
"test_data": str(data_file),
358-
"results": results,
436+
"message": f"Test data loaded successfully from {test_data_file}",
437+
"details_type": "test_data",
438+
"details": {
439+
"test_data_file": str(data_file),
440+
"results": results,
441+
"documents_loaded": results.get("documents_loaded", 0),
442+
"inserted_ids": results.get("inserted_ids", []),
443+
"acknowledged": results.get("acknowledged", False)
444+
},
359445
"status": "success"
360446
}
361447

362448
except TestDataLoadError as e:
363449
return {
364450
"operation": "load_test_data",
365451
"collection": collection_name,
366-
"test_data": str(data_file),
367-
"error": str(e),
368-
"details": e.details,
452+
"message": str(e),
453+
"details_type": "error",
454+
"details": {
455+
"error": str(e),
456+
"test_data_file": str(data_file),
457+
"details": e.details
458+
},
369459
"status": "error"
370460
}
371461
except Exception as e:
@@ -374,8 +464,12 @@ def _load_test_data(self, collection_name: str, test_data_file: str) -> Dict:
374464
return {
375465
"operation": "load_test_data",
376466
"collection": collection_name,
377-
"test_data": str(data_file),
378-
"error": error_message,
467+
"message": error_message,
468+
"details_type": "error",
469+
"details": {
470+
"error": error_message,
471+
"test_data_file": str(data_file)
472+
},
379473
"status": "error"
380474
}
381475

0 commit comments

Comments
 (0)