Implement changes for line items pull request #11
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Add Line Items Support to Place Order API
Summary
This PR introduces line items support to the Place Order API while maintaining full backward compatibility. The implementation follows a versioned API approach at the boundary layer, with a single, unversioned domain model.
Key Changes
🎯 API Versioning
version=1.0.0header): Maintains backward compatibility - existing clients continue to work unchangedPlaceOrderControllerhandles version routing automatically📦 Domain Model
LineItemvalue object (record) with validationOrderdomain record to includeList<LineItem>OrderAggregateJPA entity with@OneToManyrelationship toOrderLineItemEntityOrderLineItemEntityJPA entity for persistence🗄️ Database
orders.line_itemstable with foreign key toorders.ordersV20251115_1219__add_line_items.sql🔄 Mapping Layer (MapStruct)
LineItemMapper: ConvertsLineItemRequest→LineItem(domain)PlaceOrderCommandMapper: Maps V1/V2 requests toPlaceOrderCommandwith dependency injection viausesLineItemResponseMapper: Single mapper forLineItem→LineItemResponse(shared across endpoints)PlaceOrderResponseMapper: MapsOrder→PlaceOrderResponseV1/V2SearchOrderResponseMapper: MapsOrder→SearchOrderResponseOrderAggregateMapper: MapsOrderAggregate→Order(including line items)📝 DTOs
com.ead.payments.orders.place.request):PlaceOrderRequestV1: Renamed fromPlaceOrderRequest(backward compatible)PlaceOrderRequestV2: New version withList<LineItemRequest>LineItemRequest: Request DTO for line itemsPlaceOrderResponseV1: Response without line itemsPlaceOrderResponseV2: Response withList<LineItemResponse>SearchOrderResponse: Updated to includeList<LineItemResponse>LineItemResponse: Single shared response DTO incom.ead.payments.orders.response(used by both place and search endpoints)🎨 Package Structure
requestandresponsesub-packagesLineItemResponseto a single location (com.ead.payments.orders.response)usesparameter🧪 Testing
PlaceOrderRequestV1andPlaceOrderResponseV1shouldAllowToPlaceAnOrderWhenLineItemsAreProvided()verifying:📊 Observability
@Observedannotations for metrics tracking{"version", "1.0.0"}{"version", "2.0.0"}Technical Details
Amount Computation
amountdirectlyamountfrom line items (sum(unitPrice * quantity)) if not providedValidation
LineItemrecord constructorOrderAggregateconstructorBackward Compatibility
version=1.0.0headerlineItemslistMigration Notes
For API Clients
V1 Clients (No Changes Required)
V2 Clients (New)
Default Behavior: Requests without
versionheader default to V2Database Migration
Files Changed
Domain Layer
src/main/java/com/ead/payments/orders/LineItem.java(new)src/main/java/com/ead/payments/orders/Order.java(updated)src/main/java/com/ead/payments/orders/OrderAggregate.java(updated)src/main/java/com/ead/payments/orders/OrderLineItemEntity.java(new)src/main/java/com/ead/payments/orders/OrderPlacedEvent.java(updated)API Layer
src/main/java/com/ead/payments/orders/place/request/PlaceOrderRequestV1.java(renamed)src/main/java/com/ead/payments/orders/place/request/PlaceOrderRequestV2.java(new)src/main/java/com/ead/payments/orders/place/request/LineItemRequest.java(new)src/main/java/com/ead/payments/orders/place/response/PlaceOrderResponseV1.java(new)src/main/java/com/ead/payments/orders/place/response/PlaceOrderResponseV2.java(new)src/main/java/com/ead/payments/orders/response/LineItemResponse.java(new, shared)src/main/java/com/ead/payments/orders/search/SearchOrderResponse.java(updated)Mapping Layer
src/main/java/com/ead/payments/orders/place/mapping/LineItemMapper.java(new)src/main/java/com/ead/payments/orders/place/mapping/PlaceOrderCommandMapper.java(updated)src/main/java/com/ead/payments/orders/place/mapping/PlaceOrderResponseMapper.java(new)src/main/java/com/ead/payments/orders/mapping/LineItemResponseMapper.java(new)src/main/java/com/ead/payments/orders/mapping/OrderAggregateMapper.java(updated)src/main/java/com/ead/payments/orders/search/mapping/SearchOrderResponseMapper.java(new)Controllers & Services
src/main/java/com/ead/payments/orders/place/PlaceOrderController.java(updated)src/main/java/com/ead/payments/orders/search/SearchOrderController.java(updated)src/main/java/com/ead/payments/orders/place/PlaceOrderCommand.java(updated)src/main/java/com/ead/payments/orders/search/SearchOrderService.java(updated)Database
src/main/resources/db/migration/V20251115_1219__add_line_items.sql(new)Tests
src/test/java/com/ead/payments/orders/place/PlaceOrdersControllerTest.java(updated)Testing
Related Documentation
docs/OBJECT_TREE.mdfor complete object relationship diagramPlanToIntroduceLineItems.mdfor detailed design rationale