Add item creation and "get all" endpoints.

This commit is contained in:
Florian THIERRY
2025-09-18 17:17:44 +02:00
parent 076a224bcc
commit 4617f950bf
9 changed files with 62 additions and 6 deletions

View File

@@ -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<Item> getAllItems() {
return itemPort.getAll();
}
public Mono<Void> create(String name, Boolean shared) {
Item newItem = new Item(name, shared);
return itemPort.save(newItem);
}
}

View File

@@ -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;
}

View File

@@ -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<Item> getAll();
Mono<Void> save(Item newItem);
}

View File

@@ -5,7 +5,4 @@ import com.zeenea.experiments.virtualthreads.reactorapp.domain.item.model.Item;
import java.util.List;
public record Marketplace(
List<Catalog> catalogs,
List<Item> sharedItems
) {}
public record Marketplace(List<Catalog> catalogs, List<Item> sharedItems) {}

View File

@@ -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<Void> createAnItem(@RequestBody CreateItemRequest request) {
return itemService.create(request.name(), request.isShared());
}
@GetMapping
public Flux<ItemDto> getAll() {
return itemService.getAllItems()
.map(ItemDto::new);
}
}

View File

@@ -0,0 +1,3 @@
package com.zeenea.experiments.virtualthreads.reactorapp.exposition.item.model;
public record CreateItemRequest(String name, Boolean isShared) {}

View File

@@ -24,4 +24,12 @@ public class ItemJpaAdapter implements ItemPort {
.flatMapMany(Flux::fromIterable)
.map(ItemJpaEntity::toDomain);
}
@Override
public Mono<Void> save(Item newItem) {
ItemJpaEntity newItemJpaEntity = new ItemJpaEntity(newItem);
return Mono.fromCallable(() -> itemJpaRepository.save(newItemJpaEntity))
.subscribeOn(Schedulers.boundedElastic())
.then();
}
}

View File

@@ -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) {

View File

@@ -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
);