diff --git a/reactor-app/src/main/java/com/zeenea/experiments/virtualthreads/reactorapp/domain/item/ItemService.java b/reactor-app/src/main/java/com/zeenea/experiments/virtualthreads/reactorapp/domain/item/ItemService.java index b8916c4..9dda0c1 100644 --- a/reactor-app/src/main/java/com/zeenea/experiments/virtualthreads/reactorapp/domain/item/ItemService.java +++ b/reactor-app/src/main/java/com/zeenea/experiments/virtualthreads/reactorapp/domain/item/ItemService.java @@ -4,6 +4,7 @@ import com.zeenea.experiments.virtualthreads.reactorapp.domain.item.model.Item; import com.zeenea.experiments.virtualthreads.reactorapp.domain.item.port.ItemPort; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; @Service public class ItemService { @@ -16,4 +17,9 @@ public class ItemService { public Flux getAllItems() { return itemPort.getAll(); } + + public Mono create(String name, Boolean shared) { + Item newItem = new Item(name, shared); + return itemPort.save(newItem); + } } diff --git a/reactor-app/src/main/java/com/zeenea/experiments/virtualthreads/reactorapp/domain/item/model/Item.java b/reactor-app/src/main/java/com/zeenea/experiments/virtualthreads/reactorapp/domain/item/model/Item.java index 16031a6..263ea70 100644 --- a/reactor-app/src/main/java/com/zeenea/experiments/virtualthreads/reactorapp/domain/item/model/Item.java +++ b/reactor-app/src/main/java/com/zeenea/experiments/virtualthreads/reactorapp/domain/item/model/Item.java @@ -8,6 +8,14 @@ public record Item( String name, ZonedDateTime sharedDate ) { + public Item(String name, Boolean shared) { + this( + UUID.randomUUID(), + name, + shared ? ZonedDateTime.now() : null + ); + } + public boolean isShared() { return sharedDate != null; } diff --git a/reactor-app/src/main/java/com/zeenea/experiments/virtualthreads/reactorapp/domain/item/port/ItemPort.java b/reactor-app/src/main/java/com/zeenea/experiments/virtualthreads/reactorapp/domain/item/port/ItemPort.java index 3540e3e..3007a12 100644 --- a/reactor-app/src/main/java/com/zeenea/experiments/virtualthreads/reactorapp/domain/item/port/ItemPort.java +++ b/reactor-app/src/main/java/com/zeenea/experiments/virtualthreads/reactorapp/domain/item/port/ItemPort.java @@ -2,7 +2,9 @@ package com.zeenea.experiments.virtualthreads.reactorapp.domain.item.port; import com.zeenea.experiments.virtualthreads.reactorapp.domain.item.model.Item; import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; public interface ItemPort { Flux getAll(); + Mono save(Item newItem); } diff --git a/reactor-app/src/main/java/com/zeenea/experiments/virtualthreads/reactorapp/domain/marketplace/model/Marketplace.java b/reactor-app/src/main/java/com/zeenea/experiments/virtualthreads/reactorapp/domain/marketplace/model/Marketplace.java index cc8e049..9eabd6f 100644 --- a/reactor-app/src/main/java/com/zeenea/experiments/virtualthreads/reactorapp/domain/marketplace/model/Marketplace.java +++ b/reactor-app/src/main/java/com/zeenea/experiments/virtualthreads/reactorapp/domain/marketplace/model/Marketplace.java @@ -5,7 +5,4 @@ import com.zeenea.experiments.virtualthreads.reactorapp.domain.item.model.Item; import java.util.List; -public record Marketplace( - List catalogs, - List sharedItems -) {} +public record Marketplace(List catalogs, List sharedItems) {} diff --git a/reactor-app/src/main/java/com/zeenea/experiments/virtualthreads/reactorapp/exposition/item/ItemController.java b/reactor-app/src/main/java/com/zeenea/experiments/virtualthreads/reactorapp/exposition/item/ItemController.java new file mode 100644 index 0000000..e5cfaf1 --- /dev/null +++ b/reactor-app/src/main/java/com/zeenea/experiments/virtualthreads/reactorapp/exposition/item/ItemController.java @@ -0,0 +1,32 @@ +package com.zeenea.experiments.virtualthreads.reactorapp.exposition.item; + +import com.zeenea.experiments.virtualthreads.reactorapp.domain.item.ItemService; +import com.zeenea.experiments.virtualthreads.reactorapp.exposition.item.model.CreateItemRequest; +import com.zeenea.experiments.virtualthreads.reactorapp.exposition.marketplace.model.ItemDto; +import org.springframework.web.bind.annotation.*; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import static org.springframework.http.HttpStatus.CREATED; + +@RestController +@RequestMapping("/api/items") +public class ItemController { + private final ItemService itemService; + + public ItemController(ItemService itemService) { + this.itemService = itemService; + } + + @PostMapping + @ResponseStatus(CREATED) + public Mono createAnItem(@RequestBody CreateItemRequest request) { + return itemService.create(request.name(), request.isShared()); + } + + @GetMapping + public Flux getAll() { + return itemService.getAllItems() + .map(ItemDto::new); + } +} diff --git a/reactor-app/src/main/java/com/zeenea/experiments/virtualthreads/reactorapp/exposition/item/model/CreateItemRequest.java b/reactor-app/src/main/java/com/zeenea/experiments/virtualthreads/reactorapp/exposition/item/model/CreateItemRequest.java new file mode 100644 index 0000000..828e1d6 --- /dev/null +++ b/reactor-app/src/main/java/com/zeenea/experiments/virtualthreads/reactorapp/exposition/item/model/CreateItemRequest.java @@ -0,0 +1,3 @@ +package com.zeenea.experiments.virtualthreads.reactorapp.exposition.item.model; + +public record CreateItemRequest(String name, Boolean isShared) {} diff --git a/reactor-app/src/main/java/com/zeenea/experiments/virtualthreads/reactorapp/infrastructure/item/ItemJpaAdapter.java b/reactor-app/src/main/java/com/zeenea/experiments/virtualthreads/reactorapp/infrastructure/item/ItemJpaAdapter.java index d86b685..fc55501 100644 --- a/reactor-app/src/main/java/com/zeenea/experiments/virtualthreads/reactorapp/infrastructure/item/ItemJpaAdapter.java +++ b/reactor-app/src/main/java/com/zeenea/experiments/virtualthreads/reactorapp/infrastructure/item/ItemJpaAdapter.java @@ -24,4 +24,12 @@ public class ItemJpaAdapter implements ItemPort { .flatMapMany(Flux::fromIterable) .map(ItemJpaEntity::toDomain); } + + @Override + public Mono save(Item newItem) { + ItemJpaEntity newItemJpaEntity = new ItemJpaEntity(newItem); + return Mono.fromCallable(() -> itemJpaRepository.save(newItemJpaEntity)) + .subscribeOn(Schedulers.boundedElastic()) + .then(); + } } diff --git a/reactor-app/src/main/java/com/zeenea/experiments/virtualthreads/reactorapp/infrastructure/item/model/ItemJpaEntity.java b/reactor-app/src/main/java/com/zeenea/experiments/virtualthreads/reactorapp/infrastructure/item/model/ItemJpaEntity.java index cbe7a8c..545173d 100644 --- a/reactor-app/src/main/java/com/zeenea/experiments/virtualthreads/reactorapp/infrastructure/item/model/ItemJpaEntity.java +++ b/reactor-app/src/main/java/com/zeenea/experiments/virtualthreads/reactorapp/infrastructure/item/model/ItemJpaEntity.java @@ -24,7 +24,7 @@ public class ItemJpaEntity { private UUID id; @Column(nullable = false) private String name; - @Column(nullable = false) + @Column private ZonedDateTime sharedDate; public ItemJpaEntity(Item item) { diff --git a/virtual-threads-app/src/main/resources/sql/init_database.sql b/src/main/sql/init_database.sql similarity index 84% rename from virtual-threads-app/src/main/resources/sql/init_database.sql rename to src/main/sql/init_database.sql index ba068eb..ebf638b 100644 --- a/virtual-threads-app/src/main/resources/sql/init_database.sql +++ b/src/main/sql/init_database.sql @@ -10,5 +10,5 @@ CREATE TABLE IF NOT EXISTS catalog ( CREATE TABLE IF NOT EXISTS item ( id UUID NOT NULL PRIMARY KEY, name VARCHAR NOT NULL, - shared_date TIMESTAMP WITH TIME ZONE NOT NULL + shared_date TIMESTAMP WITH TIME ZONE NULL ); \ No newline at end of file