// Path: demo-service-interface/src/main/java/app/demo/api/product/CreateProductRequest.java
// public class CreateProductRequest {
//     @NotNull(message = "id is required")
//     @Property(name = "id")
//     public String id;
// 
//     @NotNull(message = "name is required")
//     @Property(name = "name")
//     public String name;
// 
//     @Property(name = "desc")
//     public String description;
// }
// 
// Path: demo-service-interface/src/main/java/app/demo/api/product/ProductView.java
// public class ProductView {
//     @Property(name = "id")
//     public String id;
// 
//     @NotNull(message = "name is required")
//     @Property(name = "name")
//     public String name;
// 
//     @Property(name = "desc")
//     public String description;
// 
//     @Property(name = "created_time")
//     public LocalDateTime createdTime;
// }
// 
// Path: demo-service-interface/src/main/java/app/demo/api/product/SearchProductRequest.java
// public class SearchProductRequest {
//     @NotNull(message = "name is required")
//     @QueryParam(name = "name")
//     public String name;
// 
//     @QueryParam(name = "desc")
//     public String description;
// }
// 
// Path: demo-service-interface/src/main/java/app/demo/api/product/SearchProductResponse.java
// public class SearchProductResponse {
//     @Property(name = "products")
//     public List<ProductView> products;
// }
// 
// Path: demo-service-interface/src/main/java/app/demo/api/product/UpdateProductRequest.java
// public class UpdateProductRequest {
//     @Property(name = "name")
//     public String name;
// 
//     @Property(name = "desc")
//     public String description;
// }


import app.demo.api.product.CreateProductRequest;
import app.demo.api.product.ProductView;
import app.demo.api.product.SearchProductRequest;
import app.demo.api.product.SearchProductResponse;
import app.demo.api.product.UpdateProductRequest;
import core.framework.api.http.HTTPStatus;
import core.framework.api.web.service.GET;
import core.framework.api.web.service.PATCH;
import core.framework.api.web.service.POST;
import core.framework.api.web.service.Path;
import core.framework.api.web.service.PathParam;
import core.framework.api.web.service.ResponseStatus;
import java.util.Optional;
package app.demo.api;



/**
 * @author neo
 */
public interface ProductWebService {
    @GET
    @Path("/product")
    SearchProductResponse search(SearchProductRequest request);

    @GET
    @Path("/product/:id")
    Optional<ProductView> get(@PathParam("id") String id);

    @POST
    @Path("/product")
    @ResponseStatus(HTTPStatus.CREATED)
    void create(CreateProductRequest request);

    @PATCH
// Path: demo-service-interface/src/main/java/app/demo/api/product/CreateProductRequest.java
// public class CreateProductRequest {
//     @NotNull(message = "id is required")
//     @Property(name = "id")
//     public String id;
// 
//     @NotNull(message = "name is required")
//     @Property(name = "name")
//     public String name;
// 
//     @Property(name = "desc")
//     public String description;
// }
// 
// Path: demo-service-interface/src/main/java/app/demo/api/product/ProductView.java
// public class ProductView {
//     @Property(name = "id")
//     public String id;
// 
//     @NotNull(message = "name is required")
//     @Property(name = "name")
//     public String name;
// 
//     @Property(name = "desc")
//     public String description;
// 
//     @Property(name = "created_time")
//     public LocalDateTime createdTime;
// }
// 
// Path: demo-service-interface/src/main/java/app/demo/api/product/SearchProductRequest.java
// public class SearchProductRequest {
//     @NotNull(message = "name is required")
//     @QueryParam(name = "name")
//     public String name;
// 
//     @QueryParam(name = "desc")
//     public String description;
// }
// 
// Path: demo-service-interface/src/main/java/app/demo/api/product/SearchProductResponse.java
// public class SearchProductResponse {
//     @Property(name = "products")
//     public List<ProductView> products;
// }
// 
// Path: demo-service-interface/src/main/java/app/demo/api/product/UpdateProductRequest.java
// public class UpdateProductRequest {
//     @Property(name = "name")
//     public String name;
// 
//     @Property(name = "desc")
//     public String description;
// }


// Path: demo-service-interface/src/main/java/app/demo/api/ProductWebService.java
import app.demo.api.product.CreateProductRequest;
import app.demo.api.product.ProductView;
import app.demo.api.product.SearchProductRequest;
import app.demo.api.product.SearchProductResponse;
import app.demo.api.product.UpdateProductRequest;
import core.framework.api.http.HTTPStatus;
import core.framework.api.web.service.GET;
import core.framework.api.web.service.PATCH;
import core.framework.api.web.service.POST;
import core.framework.api.web.service.Path;
import core.framework.api.web.service.PathParam;
import core.framework.api.web.service.ResponseStatus;
import java.util.Optional;

package app.demo.api;



/**
 * @author neo
 */
public interface ProductWebService {
    @GET
    @Path("/product")
    SearchProductResponse search(SearchProductRequest request);

    @GET
    @Path("/product/:id")
    Optional<ProductView> get(@PathParam("id") String id);

    @POST
    @Path("/product")
    @ResponseStatus(HTTPStatus.CREATED)
    void create(CreateProductRequest request);

    @PATCH
    @Path("/product/:id")