Add item endpoints into virtual threads app.

This commit is contained in:
Florian THIERRY
2025-09-18 17:31:37 +02:00
parent 28b8f36935
commit 8f90eef5d4
9 changed files with 191 additions and 0 deletions

View File

@@ -0,0 +1,25 @@
package com.zeenea.experiments.virtualthreads.virtualthreadsapp.domain.item;
import com.zeenea.experiments.virtualthreads.virtualthreadsapp.domain.item.model.Item;
import com.zeenea.experiments.virtualthreads.virtualthreadsapp.domain.item.port.ItemPort;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class ItemService {
private final ItemPort itemPort;
public ItemService(ItemPort itemPort) {
this.itemPort = itemPort;
}
public List<Item> getAllItems() {
return itemPort.getAll();
}
public void create(String name, Boolean shared) {
Item newItem = new Item(name, shared);
itemPort.save(newItem);
}
}

View File

@@ -0,0 +1,22 @@
package com.zeenea.experiments.virtualthreads.virtualthreadsapp.domain.item.model;
import java.time.ZonedDateTime;
import java.util.UUID;
public record Item(
UUID id,
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

@@ -0,0 +1,11 @@
package com.zeenea.experiments.virtualthreads.virtualthreadsapp.domain.item.port;
import com.zeenea.experiments.virtualthreads.virtualthreadsapp.domain.item.model.Item;
import java.util.List;
public interface ItemPort {
List<Item> getAll();
void save(Item newItem);
}

View File

@@ -0,0 +1,34 @@
package com.zeenea.experiments.virtualthreads.virtualthreadsapp.exposition.item;
import com.zeenea.experiments.virtualthreads.virtualthreadsapp.domain.item.ItemService;
import com.zeenea.experiments.virtualthreads.virtualthreadsapp.exposition.item.model.CreateItemRequest;
import com.zeenea.experiments.virtualthreads.virtualthreadsapp.exposition.item.model.ItemDto;
import org.springframework.web.bind.annotation.*;
import java.util.List;
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 void createAnItem(@RequestBody CreateItemRequest request) {
itemService.create(request.name(), request.isShared());
}
@GetMapping
public List<ItemDto> getAll() {
return itemService.getAllItems()
.stream()
.map(ItemDto::new)
.toList();
}
}

View File

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

View File

@@ -0,0 +1,15 @@
package com.zeenea.experiments.virtualthreads.virtualthreadsapp.exposition.item.model;
import com.zeenea.experiments.virtualthreads.virtualthreadsapp.domain.item.model.Item;
import java.util.UUID;
public record ItemDto(
UUID id,
String name,
Boolean isShared
) {
public ItemDto(Item item) {
this(item.id(), item.name(), item.isShared());
}
}

View File

@@ -0,0 +1,32 @@
package com.zeenea.experiments.virtualthreads.virtualthreadsapp.infrastructure.item;
import com.zeenea.experiments.virtualthreads.virtualthreadsapp.domain.item.model.Item;
import com.zeenea.experiments.virtualthreads.virtualthreadsapp.domain.item.port.ItemPort;
import com.zeenea.experiments.virtualthreads.virtualthreadsapp.infrastructure.item.model.ItemJpaEntity;
import com.zeenea.experiments.virtualthreads.virtualthreadsapp.infrastructure.item.repository.ItemJpaRepository;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class ItemJpaAdapter implements ItemPort {
private final ItemJpaRepository itemJpaRepository;
public ItemJpaAdapter(ItemJpaRepository itemJpaRepository) {
this.itemJpaRepository = itemJpaRepository;
}
@Override
public List<Item> getAll() {
return itemJpaRepository.findAll()
.stream()
.map(ItemJpaEntity::toDomain)
.toList();
}
@Override
public void save(Item newItem) {
ItemJpaEntity newItemJpaEntity = new ItemJpaEntity(newItem);
itemJpaRepository.save(newItemJpaEntity);
}
}

View File

@@ -0,0 +1,39 @@
package com.zeenea.experiments.virtualthreads.virtualthreadsapp.infrastructure.item.model;
import com.zeenea.experiments.virtualthreads.virtualthreadsapp.domain.item.model.Item;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.time.ZonedDateTime;
import java.util.UUID;
@Entity
@Table(name = "item")
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class ItemJpaEntity {
@Id
private UUID id;
@Column(nullable = false)
private String name;
@Column
private ZonedDateTime sharedDate;
public ItemJpaEntity(Item item) {
id = item.id();
name = item.name();
sharedDate = item.sharedDate();
}
public Item toDomain() {
return new Item(id, name, sharedDate);
}
}

View File

@@ -0,0 +1,10 @@
package com.zeenea.experiments.virtualthreads.virtualthreadsapp.infrastructure.item.repository;
import com.zeenea.experiments.virtualthreads.virtualthreadsapp.infrastructure.item.model.ItemJpaEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.UUID;
@Repository
public interface ItemJpaRepository extends JpaRepository<ItemJpaEntity, UUID> {}