diff --git a/java/pom.xml b/java/pom.xml
index 97b1ccf4..6a6f1a92 100644
--- a/java/pom.xml
+++ b/java/pom.xml
@@ -20,7 +20,7 @@
Demo project for Java
- 1.0.0
+ 1.0.2.2-RELEASE
1.0.3
11
diff --git a/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/CategoryController.java b/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/CategoryController.java
new file mode 100644
index 00000000..6314a874
--- /dev/null
+++ b/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/CategoryController.java
@@ -0,0 +1,81 @@
+package com.amido.stacks.workloads.menu.api.v1;
+
+import static org.springframework.http.HttpStatus.OK;
+
+import com.amido.stacks.core.api.annotations.CreateAPIResponses;
+import com.amido.stacks.core.api.annotations.DeleteAPIResponses;
+import com.amido.stacks.core.api.annotations.UpdateAPIResponses;
+import com.amido.stacks.core.api.dto.response.ResourceCreatedResponse;
+import com.amido.stacks.core.api.dto.response.ResourceUpdatedResponse;
+import com.amido.stacks.workloads.menu.api.v1.dto.request.CreateCategoryRequest;
+import com.amido.stacks.workloads.menu.api.v1.dto.request.UpdateCategoryRequest;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import java.util.UUID;
+import javax.validation.Valid;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestAttribute;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RequestMapping(
+ path = "/v1/menu/{id}/category",
+ produces = MediaType.APPLICATION_JSON_VALUE + "; charset=utf-8")
+@RestController
+public class CategoryController {
+
+ @PostMapping
+ @Operation(
+ tags = "Category",
+ summary = "Create a category in the menu",
+ description = "Adds a category to menu",
+ operationId = "AddMenuCategory")
+ @CreateAPIResponses
+ ResponseEntity addMenuCategory(
+ @Parameter(description = "Menu id", required = true) @PathVariable("id") UUID menuId,
+ @Valid @RequestBody CreateCategoryRequest body,
+ @Parameter(hidden = true) @RequestAttribute("CorrelationId") String correlationId) {
+
+ return new ResponseEntity<>(new ResourceCreatedResponse(UUID.randomUUID()), HttpStatus.CREATED);
+ }
+
+ @PutMapping("/{categoryId}")
+ @Operation(
+ tags = "Category",
+ summary = "Update a category in the menu",
+ description = "Update a category to menu",
+ operationId = "UpdateMenuCategory")
+ @UpdateAPIResponses
+ ResponseEntity updateMenuCategory(
+ @Parameter(description = "Menu id", required = true) @PathVariable("id") UUID menuId,
+ @Parameter(description = "Category id", required = true) @PathVariable("categoryId")
+ UUID categoryId,
+ @Valid @RequestBody UpdateCategoryRequest body,
+ @Parameter(hidden = true) @RequestAttribute("CorrelationId") String correlationId) {
+
+ return new ResponseEntity<>(new ResourceUpdatedResponse(UUID.randomUUID()), OK);
+ }
+
+ @DeleteMapping("/{categoryId}")
+ @Operation(
+ tags = "Category",
+ summary = "Removes a category and its items from menu",
+ description = "Removes a category and its items from menu",
+ operationId = "DeleteCategory")
+ @DeleteAPIResponses
+ ResponseEntity deleteCategory(
+ @Parameter(description = "Menu id", required = true) @PathVariable("id") UUID menuId,
+ @Parameter(description = "Category id", required = true) @PathVariable("categoryId")
+ UUID categoryId,
+ @Parameter(hidden = true) @RequestAttribute("CorrelationId") String correlationId) {
+
+ return new ResponseEntity<>(OK);
+ }
+}
diff --git a/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/CreateCategoryController.java b/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/CreateCategoryController.java
deleted file mode 100644
index 297debd2..00000000
--- a/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/CreateCategoryController.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package com.amido.stacks.workloads.menu.api.v1;
-
-import com.amido.stacks.core.api.dto.ErrorResponse;
-import com.amido.stacks.workloads.menu.api.v1.dto.request.CreateCategoryRequest;
-import com.amido.stacks.workloads.menu.api.v1.dto.response.ResourceCreatedResponse;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.media.Content;
-import io.swagger.v3.oas.annotations.media.Schema;
-import io.swagger.v3.oas.annotations.responses.ApiResponse;
-import io.swagger.v3.oas.annotations.security.SecurityRequirement;
-import java.util.UUID;
-import javax.validation.Valid;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestAttribute;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-
-@RequestMapping("/v1/menu/{id}/category")
-public interface CreateCategoryController {
-
- @PostMapping(consumes = "application/json", produces = "application/json; charset=utf-8")
- @Operation(
- tags = "Category",
- summary = "Create a category in the menu",
- security = @SecurityRequirement(name = "bearerAuth"),
- description = "Adds a category to menu",
- operationId = "AddMenuCategory",
- responses = {
- @ApiResponse(
- responseCode = "201",
- description = "Resource created",
- content =
- @Content(
- mediaType = "application/json",
- schema = @Schema(implementation = ResourceCreatedResponse.class))),
- @ApiResponse(
- responseCode = "400",
- description = "Bad Request",
- content =
- @Content(
- mediaType = "application/json",
- schema = @Schema(implementation = ErrorResponse.class))),
- @ApiResponse(
- responseCode = "401",
- description = "Unauthorized, Access token is missing or invalid",
- content =
- @Content(
- mediaType = "application/json",
- schema = @Schema(implementation = ErrorResponse.class))),
- @ApiResponse(
- responseCode = "403",
- description = "Forbidden, the user does not have permission to execute this operation",
- content =
- @Content(
- mediaType = "application/json",
- schema = @Schema(implementation = ErrorResponse.class))),
- @ApiResponse(
- responseCode = "409",
- description = "Conflict, an item already exists",
- content =
- @Content(
- mediaType = "application/json",
- schema = @Schema(implementation = ErrorResponse.class)))
- })
- ResponseEntity addMenuCategory(
- @Parameter(description = "Menu id", required = true) @PathVariable("id") UUID menuId,
- @Valid @RequestBody CreateCategoryRequest body,
- @Parameter(hidden = true) @RequestAttribute("CorrelationId") String correlationId);
-}
diff --git a/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/CreateItemController.java b/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/CreateItemController.java
deleted file mode 100644
index 78c52c3e..00000000
--- a/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/CreateItemController.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package com.amido.stacks.workloads.menu.api.v1;
-
-import com.amido.stacks.core.api.dto.ErrorResponse;
-import com.amido.stacks.workloads.menu.api.v1.dto.request.CreateItemRequest;
-import com.amido.stacks.workloads.menu.api.v1.dto.response.ResourceCreatedResponse;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.media.Content;
-import io.swagger.v3.oas.annotations.media.Schema;
-import io.swagger.v3.oas.annotations.responses.ApiResponse;
-import io.swagger.v3.oas.annotations.security.SecurityRequirement;
-import java.util.UUID;
-import javax.validation.Valid;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestAttribute;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-
-@RequestMapping("/v1/menu/{id}/category/{categoryId}/items")
-public interface CreateItemController {
-
- @PostMapping(consumes = "application/json", produces = "application/json; charset=utf-8")
- @Operation(
- tags = "Item",
- summary = "Add an item to an existing category in a menu",
- security = @SecurityRequirement(name = "bearerAuth"),
- description = "Adds a menu item",
- operationId = "AddMenuItem",
- responses = {
- @ApiResponse(
- responseCode = "201",
- description = "Resource created",
- content =
- @Content(
- mediaType = "application/json",
- schema = @Schema(implementation = ResourceCreatedResponse.class))),
- @ApiResponse(
- responseCode = "400",
- description = "Bad Request",
- content =
- @Content(
- mediaType = "application/json",
- schema = @Schema(implementation = ErrorResponse.class))),
- @ApiResponse(
- responseCode = "401",
- description = "Unauthorized, Access token is missing or invalid",
- content =
- @Content(
- mediaType = "application/json",
- schema = @Schema(implementation = ErrorResponse.class))),
- @ApiResponse(
- responseCode = "403",
- description = "Forbidden, the user does not have permission to execute this operation",
- content =
- @Content(
- mediaType = "application/json",
- schema = @Schema(implementation = ErrorResponse.class))),
- @ApiResponse(
- responseCode = "409",
- description = "Conflict, an item already exists",
- content =
- @Content(
- mediaType = "application/json",
- schema = @Schema(implementation = ErrorResponse.class)))
- })
- ResponseEntity addMenuItem(
- @Parameter(description = "Menu id", required = true) @PathVariable("id") UUID menuId,
- @Parameter(description = "Category id", required = true) @PathVariable("categoryId")
- UUID categoryId,
- @Valid @RequestBody CreateItemRequest body,
- @Parameter(hidden = true) @RequestAttribute("CorrelationId") String correlationId);
-}
diff --git a/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/CreateMenuController.java b/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/CreateMenuController.java
deleted file mode 100644
index c36124a1..00000000
--- a/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/CreateMenuController.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package com.amido.stacks.workloads.menu.api.v1;
-
-import com.amido.stacks.core.api.dto.ErrorResponse;
-import com.amido.stacks.workloads.menu.api.v1.dto.request.CreateMenuRequest;
-import com.amido.stacks.workloads.menu.api.v1.dto.response.ResourceCreatedResponse;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.media.Content;
-import io.swagger.v3.oas.annotations.media.Schema;
-import io.swagger.v3.oas.annotations.responses.ApiResponse;
-import io.swagger.v3.oas.annotations.security.SecurityRequirement;
-import javax.validation.Valid;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestAttribute;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-
-@RequestMapping("/v1/menu")
-public interface CreateMenuController {
-
- @PostMapping(consumes = "application/json", produces = "application/json; charset=utf-8")
- @Operation(
- tags = "Menu",
- summary = "Create a menu",
- security = @SecurityRequirement(name = "bearerAuth"),
- description = "Adds a menu",
- operationId = "CreateMenu",
- responses = {
- @ApiResponse(
- responseCode = "201",
- description = "Resource created",
- content =
- @Content(
- mediaType = "application/json",
- schema = @Schema(implementation = ResourceCreatedResponse.class))),
- @ApiResponse(
- responseCode = "400",
- description = "Bad Request",
- content =
- @Content(
- mediaType = "application/json",
- schema = @Schema(implementation = ErrorResponse.class))),
- @ApiResponse(
- responseCode = "401",
- description = "Unauthorized, Access token is missing or invalid",
- content =
- @Content(
- mediaType = "application/json",
- schema = @Schema(implementation = ErrorResponse.class))),
- @ApiResponse(
- responseCode = "403",
- description = "Forbidden, the user does not have permission to execute this operation",
- content =
- @Content(
- mediaType = "application/json",
- schema = @Schema(implementation = ErrorResponse.class))),
- @ApiResponse(
- responseCode = "409",
- description = "Conflict, an item already exists",
- content =
- @Content(
- mediaType = "application/json",
- schema = @Schema(implementation = ErrorResponse.class)))
- })
- ResponseEntity createMenu(
- @Valid @RequestBody CreateMenuRequest body,
- @Parameter(hidden = true) @RequestAttribute("CorrelationId") String correlationId);
-}
diff --git a/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/DeleteCategoryController.java b/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/DeleteCategoryController.java
deleted file mode 100644
index b0bb5961..00000000
--- a/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/DeleteCategoryController.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package com.amido.stacks.workloads.menu.api.v1;
-
-import com.amido.stacks.core.api.dto.ErrorResponse;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.media.Content;
-import io.swagger.v3.oas.annotations.media.Schema;
-import io.swagger.v3.oas.annotations.responses.ApiResponse;
-import io.swagger.v3.oas.annotations.security.SecurityRequirement;
-import java.util.UUID;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestAttribute;
-import org.springframework.web.bind.annotation.RequestMapping;
-
-/** @author ArathyKrishna */
-@RequestMapping("/v1/menu/{id}/category/{categoryId}")
-public interface DeleteCategoryController {
-
- @DeleteMapping(produces = "application/json; charset=utf-8")
- @Operation(
- tags = "Category",
- summary = "Removes a category and its items from menu",
- security = @SecurityRequirement(name = "bearerAuth"),
- description = "Removes a category and its items from menu",
- operationId = "DeleteCategory",
- responses = {
- @ApiResponse(
- responseCode = "200",
- description = "Success",
- content = @Content(mediaType = "application/json", schema = @Schema(hidden = true))),
- @ApiResponse(
- responseCode = "204",
- description = "No Content",
- content = @Content(schema = @Schema(hidden = true))),
- @ApiResponse(
- responseCode = "400",
- description = "Bad Request",
- content =
- @Content(
- mediaType = "application/json",
- schema = @Schema(implementation = ErrorResponse.class))),
- @ApiResponse(
- responseCode = "401",
- description = "Unauthorized, Access token is missing or invalid",
- content =
- @Content(
- mediaType = "application/json",
- schema = @Schema(implementation = ErrorResponse.class))),
- @ApiResponse(
- responseCode = "403",
- description = "Forbidden, the user does not have permission to execute this operation",
- content =
- @Content(
- mediaType = "application/json",
- schema = @Schema(implementation = ErrorResponse.class))),
- @ApiResponse(
- responseCode = "409",
- description = "Conflict, an item already exists",
- content =
- @Content(
- mediaType = "application/json",
- schema = @Schema(implementation = ErrorResponse.class)))
- })
- ResponseEntity deleteCategory(
- @Parameter(description = "Menu id", required = true) @PathVariable("id") UUID menuId,
- @Parameter(description = "Category id", required = true) @PathVariable("categoryId")
- UUID categoryId,
- @Parameter(hidden = true) @RequestAttribute("CorrelationId") String correlationId);
-}
diff --git a/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/DeleteItemController.java b/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/DeleteItemController.java
deleted file mode 100644
index 538b986d..00000000
--- a/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/DeleteItemController.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package com.amido.stacks.workloads.menu.api.v1;
-
-import com.amido.stacks.core.api.dto.ErrorResponse;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.media.Content;
-import io.swagger.v3.oas.annotations.media.Schema;
-import io.swagger.v3.oas.annotations.responses.ApiResponse;
-import io.swagger.v3.oas.annotations.security.SecurityRequirement;
-import java.util.UUID;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestAttribute;
-import org.springframework.web.bind.annotation.RequestMapping;
-
-/** @author ArathyKrishna */
-@RequestMapping("/v1/menu/{id}/category/{categoryId}/items/{itemId}")
-public interface DeleteItemController {
-
- @DeleteMapping(produces = "application/json; charset=utf-8")
- @Operation(
- tags = "Item",
- summary = "Removes an item from menu",
- security = @SecurityRequirement(name = "bearerAuth"),
- description = "Removes an item from menu",
- operationId = "DeleteMenuItem",
- responses = {
- @ApiResponse(
- responseCode = "200",
- description = "Success",
- content = @Content(mediaType = "application/json", schema = @Schema(hidden = true))),
- @ApiResponse(
- responseCode = "204",
- description = "No Content",
- content = @Content(schema = @Schema(hidden = true))),
- @ApiResponse(
- responseCode = "400",
- description = "Bad Request",
- content =
- @Content(
- mediaType = "application/json",
- schema = @Schema(implementation = ErrorResponse.class))),
- @ApiResponse(
- responseCode = "401",
- description = "Unauthorized, Access token is missing or invalid",
- content =
- @Content(
- mediaType = "application/json",
- schema = @Schema(implementation = ErrorResponse.class))),
- @ApiResponse(
- responseCode = "403",
- description = "Forbidden, the user does not have permission to execute this operation",
- content =
- @Content(
- mediaType = "application/json",
- schema = @Schema(implementation = ErrorResponse.class))),
- @ApiResponse(
- responseCode = "404",
- description = "Resource not found",
- content =
- @Content(
- mediaType = "application/json",
- schema = @Schema(implementation = ErrorResponse.class)))
- })
- ResponseEntity deleteItem(
- @Parameter(description = "Menu id", required = true) @PathVariable("id") UUID menuId,
- @Parameter(description = "Category id", required = true) @PathVariable("categoryId")
- UUID categoryId,
- @Parameter(description = "Item id", required = true) @PathVariable("itemId") UUID itemId,
- @Parameter(hidden = true) @RequestAttribute("CorrelationId") String correlationId);
-}
diff --git a/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/DeleteMenuController.java b/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/DeleteMenuController.java
deleted file mode 100644
index 70226a67..00000000
--- a/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/DeleteMenuController.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package com.amido.stacks.workloads.menu.api.v1;
-
-import com.amido.stacks.core.api.dto.ErrorResponse;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.media.Content;
-import io.swagger.v3.oas.annotations.media.Schema;
-import io.swagger.v3.oas.annotations.responses.ApiResponse;
-import io.swagger.v3.oas.annotations.security.SecurityRequirement;
-import java.util.UUID;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestAttribute;
-import org.springframework.web.bind.annotation.RequestMapping;
-
-/**
- * Controller for Deleting a menu
- *
- * @author ArathyKrishna
- */
-@RequestMapping("/v1/menu/{id}")
-public interface DeleteMenuController {
-
- @DeleteMapping(produces = "application/json; charset=utf-8")
- @Operation(
- tags = "Menu",
- summary = "Removes a Menu with all it's Categories and Items",
- security = @SecurityRequirement(name = "bearerAuth"),
- description = "Remove a menu from a restaurant",
- operationId = "DeleteMenu",
- responses = {
- @ApiResponse(
- responseCode = "200",
- description = "Success",
- content = @Content(mediaType = "application/json", schema = @Schema(hidden = true))),
- @ApiResponse(
- responseCode = "204",
- description = "No Content",
- content = @Content(schema = @Schema(hidden = true))),
- @ApiResponse(
- responseCode = "400",
- description = "Bad Request",
- content =
- @Content(
- mediaType = "application/json",
- schema = @Schema(implementation = ErrorResponse.class))),
- @ApiResponse(
- responseCode = "401",
- description = "Unauthorized, Access token is missing or invalid",
- content =
- @Content(
- mediaType = "application/json",
- schema = @Schema(implementation = ErrorResponse.class))),
- @ApiResponse(
- responseCode = "403",
- description = "Forbidden, the user does not have permission to execute this operation",
- content =
- @Content(
- mediaType = "application/json",
- schema = @Schema(implementation = ErrorResponse.class))),
- @ApiResponse(
- responseCode = "404",
- description = "Resource not found",
- content =
- @Content(
- mediaType = "application/json",
- schema = @Schema(implementation = ErrorResponse.class)))
- })
- ResponseEntity deleteMenu(
- @Parameter(description = "Menu id", required = true) @PathVariable("id") UUID menuId,
- @Parameter(hidden = true) @RequestAttribute("CorrelationId") String correlationId);
-}
diff --git a/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/ItemController.java b/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/ItemController.java
new file mode 100644
index 00000000..836be767
--- /dev/null
+++ b/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/ItemController.java
@@ -0,0 +1,85 @@
+package com.amido.stacks.workloads.menu.api.v1;
+
+import static org.springframework.http.HttpStatus.OK;
+
+import com.amido.stacks.core.api.annotations.CreateAPIResponses;
+import com.amido.stacks.core.api.annotations.DeleteAPIResponses;
+import com.amido.stacks.core.api.annotations.UpdateAPIResponses;
+import com.amido.stacks.core.api.dto.response.ResourceCreatedResponse;
+import com.amido.stacks.core.api.dto.response.ResourceUpdatedResponse;
+import com.amido.stacks.workloads.menu.api.v1.dto.request.CreateItemRequest;
+import com.amido.stacks.workloads.menu.api.v1.dto.request.UpdateItemRequest;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import java.util.UUID;
+import javax.validation.Valid;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestAttribute;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RequestMapping(
+ path = "/v1/menu/{id}/category/{categoryId}/items",
+ produces = MediaType.APPLICATION_JSON_VALUE + "; charset=utf-8")
+@RestController
+public class ItemController {
+
+ @PostMapping
+ @Operation(
+ tags = "Item",
+ summary = "Add an item to an existing category in a menu",
+ description = "Adds a menu item",
+ operationId = "AddMenuItem")
+ @CreateAPIResponses
+ ResponseEntity addMenuItem(
+ @Parameter(description = "Menu id", required = true) @PathVariable("id") UUID menuId,
+ @Parameter(description = "Category id", required = true) @PathVariable("categoryId")
+ UUID categoryId,
+ @Valid @RequestBody CreateItemRequest body,
+ @Parameter(hidden = true) @RequestAttribute("CorrelationId") String correlationId) {
+
+ return new ResponseEntity<>(new ResourceCreatedResponse(UUID.randomUUID()), HttpStatus.CREATED);
+ }
+
+ @PutMapping("/{itemId}")
+ @Operation(
+ tags = "Item",
+ summary = "Update an item in the menu",
+ description = "Update an item in the menu",
+ operationId = "UpdateMenuItem")
+ @UpdateAPIResponses
+ ResponseEntity updateItem(
+ @Parameter(description = "Menu id", required = true) @PathVariable("id") UUID menuId,
+ @Parameter(description = "Category id", required = true) @PathVariable("categoryId")
+ UUID categoryId,
+ @Parameter(description = "Item id", required = true) @PathVariable("itemId") UUID itemId,
+ @Valid @RequestBody UpdateItemRequest body,
+ @Parameter(hidden = true) @RequestAttribute("CorrelationId") String correlationId) {
+
+ return new ResponseEntity<>(new ResourceUpdatedResponse(UUID.randomUUID()), HttpStatus.OK);
+ }
+
+ @DeleteMapping("/{itemId}")
+ @Operation(
+ tags = "Item",
+ summary = "Removes an item from menu",
+ description = "Removes an item from menu",
+ operationId = "DeleteMenuItem")
+ @DeleteAPIResponses
+ ResponseEntity deleteItem(
+ @Parameter(description = "Menu id", required = true) @PathVariable("id") UUID menuId,
+ @Parameter(description = "Category id", required = true) @PathVariable("categoryId")
+ UUID categoryId,
+ @Parameter(description = "Item id", required = true) @PathVariable("itemId") UUID itemId,
+ @Parameter(hidden = true) @RequestAttribute("CorrelationId") String correlationId) {
+
+ return new ResponseEntity<>(OK);
+ }
+}
diff --git a/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/MenuController.java b/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/MenuController.java
new file mode 100644
index 00000000..760ef69f
--- /dev/null
+++ b/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/MenuController.java
@@ -0,0 +1,181 @@
+package com.amido.stacks.workloads.menu.api.v1;
+
+import static org.springframework.http.HttpStatus.OK;
+
+import com.amido.stacks.core.api.annotations.CreateAPIResponses;
+import com.amido.stacks.core.api.annotations.DeleteAPIResponses;
+import com.amido.stacks.core.api.annotations.ReadAPIResponses;
+import com.amido.stacks.core.api.annotations.SearchAPIResponses;
+import com.amido.stacks.core.api.annotations.UpdateAPIResponses;
+import com.amido.stacks.core.api.dto.response.ResourceCreatedResponse;
+import com.amido.stacks.core.api.dto.response.ResourceUpdatedResponse;
+import com.amido.stacks.workloads.menu.api.v1.dto.request.CreateMenuRequest;
+import com.amido.stacks.workloads.menu.api.v1.dto.request.UpdateMenuRequest;
+import com.amido.stacks.workloads.menu.api.v1.dto.response.MenuDTO;
+import com.amido.stacks.workloads.menu.api.v1.dto.response.SearchMenuResult;
+import com.amido.stacks.workloads.menu.domain.Category;
+import com.amido.stacks.workloads.menu.domain.Item;
+import com.amido.stacks.workloads.menu.domain.Menu;
+import com.amido.stacks.workloads.menu.mappers.MenuMapper;
+import com.amido.stacks.workloads.menu.mappers.SearchMenuResultItemMapper;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
+import javax.validation.Valid;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestAttribute;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RequestMapping(path = "/v1/menu", produces = MediaType.APPLICATION_JSON_VALUE + "; charset=utf-8")
+@RestController
+public class MenuController {
+
+ Logger logger = LoggerFactory.getLogger(MenuController.class);
+
+ @Autowired private MenuMapper menuMapper;
+
+ @Autowired private SearchMenuResultItemMapper searchMenuResultItemMapper;
+
+ @PostMapping
+ @Operation(
+ tags = "Menu",
+ summary = "Create a menu",
+ description = "Adds a menu",
+ operationId = "CreateMenu")
+ @CreateAPIResponses
+ ResponseEntity createMenu(
+ @Valid @RequestBody CreateMenuRequest body,
+ @Parameter(hidden = true) @RequestAttribute("CorrelationId") String correlationId) {
+
+ return new ResponseEntity<>(new ResourceCreatedResponse(UUID.randomUUID()), HttpStatus.CREATED);
+ }
+
+ @GetMapping
+ @Operation(
+ tags = "Menu",
+ summary = "Get or search a list of menus",
+ description =
+ "By passing in the appropriate options, you can search for available menus in the system")
+ @ApiResponse(
+ responseCode = "200",
+ description = "Search results matching criteria",
+ content =
+ @Content(
+ mediaType = MediaType.APPLICATION_JSON_VALUE,
+ schema = @Schema(implementation = SearchMenuResult.class)))
+ @SearchAPIResponses
+ ResponseEntity searchMenu(
+ @RequestParam(value = "searchTerm", required = false) String searchTerm,
+ @RequestParam(value = "restaurantId", required = false) UUID restaurantId,
+ @RequestParam(value = "pageSize", required = false, defaultValue = "20") Integer pageSize,
+ @RequestParam(value = "pageNumber", required = false, defaultValue = "1")
+ Integer pageNumber) {
+
+ List