From 967be9e750221ab2ab783f95df79bb26d290a45e Mon Sep 17 00:00:00 2001 From: Martial Simon Date: Mon, 15 Sep 2025 01:07:58 +0200 Subject: add: added projects --- .../inventory/converter/InventoryConverter.java | 24 +++++++++ .../assistants/inventory/data/model/ItemModel.java | 25 +++++++++ .../inventory/data/repository/ItemRepository.java | 48 ++++++++++++++++++ .../inventory/domain/entity/ItemEntity.java | 13 +++++ .../inventory/domain/entity/ItemsEntity.java | 13 +++++ .../inventory/domain/service/InventoryService.java | 59 ++++++++++++++++++++++ .../presentation/subscriber/CommandSubscriber.java | 59 ++++++++++++++++++++++ .../src/main/resources/application.properties | 11 ++++ .../src/main/resources/db/migration/V1__Init.sql | 7 +++ 9 files changed, 259 insertions(+) create mode 100644 jws/epibazaar/inventory/src/main/java/fr/epita/assistants/inventory/converter/InventoryConverter.java create mode 100644 jws/epibazaar/inventory/src/main/java/fr/epita/assistants/inventory/data/model/ItemModel.java create mode 100644 jws/epibazaar/inventory/src/main/java/fr/epita/assistants/inventory/data/repository/ItemRepository.java create mode 100644 jws/epibazaar/inventory/src/main/java/fr/epita/assistants/inventory/domain/entity/ItemEntity.java create mode 100644 jws/epibazaar/inventory/src/main/java/fr/epita/assistants/inventory/domain/entity/ItemsEntity.java create mode 100644 jws/epibazaar/inventory/src/main/java/fr/epita/assistants/inventory/domain/service/InventoryService.java create mode 100644 jws/epibazaar/inventory/src/main/java/fr/epita/assistants/inventory/presentation/subscriber/CommandSubscriber.java create mode 100644 jws/epibazaar/inventory/src/main/resources/application.properties create mode 100644 jws/epibazaar/inventory/src/main/resources/db/migration/V1__Init.sql (limited to 'jws/epibazaar/inventory/src/main') diff --git a/jws/epibazaar/inventory/src/main/java/fr/epita/assistants/inventory/converter/InventoryConverter.java b/jws/epibazaar/inventory/src/main/java/fr/epita/assistants/inventory/converter/InventoryConverter.java new file mode 100644 index 0000000..62c7994 --- /dev/null +++ b/jws/epibazaar/inventory/src/main/java/fr/epita/assistants/inventory/converter/InventoryConverter.java @@ -0,0 +1,24 @@ +package fr.epita.assistants.inventory.converter; + +import fr.epita.assistants.common.aggregate.ItemAggregate; +import fr.epita.assistants.common.api.response.ItemResponse; +import fr.epita.assistants.common.api.response.ItemsResponse; +import fr.epita.assistants.inventory.data.model.ItemModel; +import fr.epita.assistants.inventory.domain.entity.ItemEntity; +import fr.epita.assistants.inventory.domain.entity.ItemsEntity; + +public class InventoryConverter { + public static ItemAggregate updatedItem(ItemModel item) { + return new ItemAggregate(item.getType(), item.getQuantity()); + } + + public static ItemResponse EntityToResponse(ItemEntity e) { + return new ItemResponse(e.getId(), e.getQuantity(), e.getType()); + } + + public static ItemsResponse EntityToResponse(ItemsEntity e) { + if (e == null) + return null; + return new ItemsResponse(e.getItems().stream().map(InventoryConverter::EntityToResponse).toList()); + } +} diff --git a/jws/epibazaar/inventory/src/main/java/fr/epita/assistants/inventory/data/model/ItemModel.java b/jws/epibazaar/inventory/src/main/java/fr/epita/assistants/inventory/data/model/ItemModel.java new file mode 100644 index 0000000..29a182b --- /dev/null +++ b/jws/epibazaar/inventory/src/main/java/fr/epita/assistants/inventory/data/model/ItemModel.java @@ -0,0 +1,25 @@ +package fr.epita.assistants.inventory.data.model; + +import fr.epita.assistants.common.aggregate.ItemAggregate; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.persistence.*; +import lombok.*; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Setter +@Table(name = "item") +public class ItemModel { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + Long id; + Float quantity; + @Enumerated(value = EnumType.STRING) + ItemAggregate.ResourceType type; + + public ItemModel(float quantity, ItemAggregate.ResourceType type) { + this.quantity = quantity; + this.type = type; + } +} diff --git a/jws/epibazaar/inventory/src/main/java/fr/epita/assistants/inventory/data/repository/ItemRepository.java b/jws/epibazaar/inventory/src/main/java/fr/epita/assistants/inventory/data/repository/ItemRepository.java new file mode 100644 index 0000000..129c815 --- /dev/null +++ b/jws/epibazaar/inventory/src/main/java/fr/epita/assistants/inventory/data/repository/ItemRepository.java @@ -0,0 +1,48 @@ +package fr.epita.assistants.inventory.data.repository; + +import fr.epita.assistants.common.aggregate.ItemAggregate; +import fr.epita.assistants.inventory.data.model.ItemModel; +import io.quarkus.hibernate.orm.panache.PanacheRepository; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.transaction.Transactional; + +import java.util.List; +import java.util.Optional; + +@ApplicationScoped +public class ItemRepository implements PanacheRepository { + + @Transactional + public void clearDB() { + deleteAll(); + } + + @Transactional + public List getItems() { + return find("where quantity > 0").stream().toList(); + } + + @Transactional + public Optional exists(ItemAggregate.ResourceType type) { + return find("type = ?1", type).firstResultOptional(); + } + + @Transactional + public ItemModel addItem(ItemAggregate.ResourceType type, Float amount) { + ItemModel res = new ItemModel(amount, type); + persist(res); + return res; + } + + // amount should already be the updated amount + @Transactional + public ItemModel fillInventory(ItemAggregate.ResourceType type, Float amount) { + update("quantity = ?1 where type = ?2", amount, type); + return new ItemModel(amount, type); + } + + @Transactional + public List getMoney() { + return find("where type = ?1", ItemAggregate.ResourceType.MONEY).stream().toList(); + } +} diff --git a/jws/epibazaar/inventory/src/main/java/fr/epita/assistants/inventory/domain/entity/ItemEntity.java b/jws/epibazaar/inventory/src/main/java/fr/epita/assistants/inventory/domain/entity/ItemEntity.java new file mode 100644 index 0000000..028d09e --- /dev/null +++ b/jws/epibazaar/inventory/src/main/java/fr/epita/assistants/inventory/domain/entity/ItemEntity.java @@ -0,0 +1,13 @@ +package fr.epita.assistants.inventory.domain.entity; + +import fr.epita.assistants.common.aggregate.ItemAggregate; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class ItemEntity { + long id; + float quantity; + ItemAggregate.ResourceType type; +} diff --git a/jws/epibazaar/inventory/src/main/java/fr/epita/assistants/inventory/domain/entity/ItemsEntity.java b/jws/epibazaar/inventory/src/main/java/fr/epita/assistants/inventory/domain/entity/ItemsEntity.java new file mode 100644 index 0000000..c0a96ac --- /dev/null +++ b/jws/epibazaar/inventory/src/main/java/fr/epita/assistants/inventory/domain/entity/ItemsEntity.java @@ -0,0 +1,13 @@ +package fr.epita.assistants.inventory.domain.entity; + +import fr.epita.assistants.inventory.domain.entity.ItemEntity; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.List; + +@Getter +@AllArgsConstructor +public class ItemsEntity { + List items; +} diff --git a/jws/epibazaar/inventory/src/main/java/fr/epita/assistants/inventory/domain/service/InventoryService.java b/jws/epibazaar/inventory/src/main/java/fr/epita/assistants/inventory/domain/service/InventoryService.java new file mode 100644 index 0000000..fc25abf --- /dev/null +++ b/jws/epibazaar/inventory/src/main/java/fr/epita/assistants/inventory/domain/service/InventoryService.java @@ -0,0 +1,59 @@ +package fr.epita.assistants.inventory.domain.service; + +import fr.epita.assistants.common.aggregate.ItemAggregate; +import fr.epita.assistants.common.aggregate.ResetInventoryAggregate; +import fr.epita.assistants.common.command.CollectItemCommand; +import fr.epita.assistants.inventory.converter.InventoryConverter; +import fr.epita.assistants.inventory.data.model.ItemModel; +import fr.epita.assistants.inventory.data.repository.ItemRepository; +import fr.epita.assistants.inventory.domain.entity.ItemEntity; +import fr.epita.assistants.inventory.domain.entity.ItemsEntity; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +import java.util.List; +import java.util.Optional; + +@ApplicationScoped +public class InventoryService { + @Inject + ItemRepository itemRepository; + + public ResetInventoryAggregate resetInventory() { + ResetInventoryAggregate res = + new ResetInventoryAggregate(itemRepository.getItems().stream().map(m -> new ItemAggregate(m.getType() + , m.getQuantity())).toList()); + itemRepository.clearDB(); + return res; + } + + public ItemAggregate collectItem(CollectItemCommand cmd) { + Optional item = itemRepository.exists(cmd.getType()); + if (item.isPresent()) { + ItemModel updated = itemRepository.fillInventory(cmd.getType(), + cmd.getCollectRateMultiplier() * cmd.getType().getItemInfo().getCollectQuantity() + item.get().getQuantity()); + return InventoryConverter.updatedItem(updated); + } else { + ItemModel newItem = itemRepository.addItem(cmd.getType(), + cmd.getCollectRateMultiplier() * cmd.getType().getItemInfo().getCollectQuantity()); + return InventoryConverter.updatedItem(newItem); + } + } + + public ItemsEntity getAllItems() { + return new ItemsEntity(itemRepository.getItems().stream().map(m -> new ItemEntity(m.getId(), + m.getQuantity(), m.getType())).toList()); + } + + public Double getMoney() { + List entries = itemRepository.getMoney(); + if (entries.isEmpty()) + return null; + return entries.stream().mapToDouble(m -> m.getQuantity().doubleValue()).sum(); + } + + public Float pay(Float price) { + itemRepository.fillInventory(ItemAggregate.ResourceType.MONEY, getMoney().floatValue() - price); + return getMoney().floatValue(); + } +} diff --git a/jws/epibazaar/inventory/src/main/java/fr/epita/assistants/inventory/presentation/subscriber/CommandSubscriber.java b/jws/epibazaar/inventory/src/main/java/fr/epita/assistants/inventory/presentation/subscriber/CommandSubscriber.java new file mode 100644 index 0000000..3a95a3a --- /dev/null +++ b/jws/epibazaar/inventory/src/main/java/fr/epita/assistants/inventory/presentation/subscriber/CommandSubscriber.java @@ -0,0 +1,59 @@ +package fr.epita.assistants.inventory.presentation.subscriber; + +import fr.epita.assistants.common.aggregate.ItemAggregate; +import fr.epita.assistants.common.aggregate.ResetInventoryAggregate; +import fr.epita.assistants.common.aggregate.SyncInventoryAggregate; +import fr.epita.assistants.common.aggregate.UpgradeItemProducerAggregate; +import fr.epita.assistants.common.command.*; +import fr.epita.assistants.inventory.domain.service.InventoryService; +import io.smallrye.reactive.messaging.annotations.Broadcast; +import jakarta.inject.Inject; +import org.eclipse.microprofile.reactive.messaging.Incoming; +import org.eclipse.microprofile.reactive.messaging.Outgoing; + +public class CommandSubscriber { + @Inject + InventoryService inventoryService; + + @Broadcast + @Incoming("reset-inventory-command") + @Outgoing("reset-inventory-aggregate") + public ResetInventoryAggregate commandListener(ResetInventoryCommand cmd) { + return inventoryService.resetInventory(); + } + + @Broadcast + @Incoming("collect-item-command") + @Outgoing("collect-item-aggregate") + public ItemAggregate commandListener(CollectItemCommand cmd) { + return inventoryService.collectItem(cmd); + } + + @Broadcast + @Incoming("sync-inventory-command") + @Outgoing("sync-inventory-aggregate") + public SyncInventoryAggregate commandListener(SyncInventoryCommand cmd) { + return new SyncInventoryAggregate(inventoryService.getAllItems().getItems().stream().map(e -> new ItemAggregate(e.getType(), e.getQuantity())).toList()); + } + + @Broadcast + @Incoming("upgrade-collect-rate-command") + @Outgoing("upgrade-collect-rate-aggregate") + public UpgradeItemProducerAggregate commandListener(UpgradeCollectRateCommand cmd) { + return new UpgradeItemProducerAggregate(inventoryService.pay(cmd.getPrice())); + } + + @Broadcast + @Incoming("upgrade-movement-speed-command") + @Outgoing("upgrade-movement-speed-aggregate") + public UpgradeItemProducerAggregate commandListener(UpgradeMovementSpeedCommand cmd) { + return new UpgradeItemProducerAggregate(inventoryService.pay(cmd.getPrice())); + } + + @Broadcast + @Incoming("upgrade-stamina-command") + @Outgoing("upgrade-stamina-aggregate") + public UpgradeItemProducerAggregate commandListener(UpgradeStaminaCommand cmd) { + return new UpgradeItemProducerAggregate(inventoryService.pay(cmd.getPrice())); + } +} diff --git a/jws/epibazaar/inventory/src/main/resources/application.properties b/jws/epibazaar/inventory/src/main/resources/application.properties new file mode 100644 index 0000000..fedcdd0 --- /dev/null +++ b/jws/epibazaar/inventory/src/main/resources/application.properties @@ -0,0 +1,11 @@ +%dev.quarkus.http.port=8999 +quarkus.datasource.db-kind=postgresql +quarkus.datasource.username=postgres +quarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5432/inventory?currentSchema=public +quarkus.transaction-manager.default-transaction-timeout=3000s +quarkus.hibernate-orm.log.queries-slower-than-ms=200 +quarkus.hibernate-orm.database.generation=drop-and-create + +quarkus.kafka.devservices.image-name=reg.undercloud.cri.epita.fr/docker/redpandadata/redpanda:v24.1.2 +quarkus.devservices.enabled=true +%test.quarkus.devservices.enabled=false diff --git a/jws/epibazaar/inventory/src/main/resources/db/migration/V1__Init.sql b/jws/epibazaar/inventory/src/main/resources/db/migration/V1__Init.sql new file mode 100644 index 0000000..3c1e091 --- /dev/null +++ b/jws/epibazaar/inventory/src/main/resources/db/migration/V1__Init.sql @@ -0,0 +1,7 @@ +CREATE TABLE IF NOT EXISTS "item" +( + id SERIAL PRIMARY KEY NOT NULL, + + type VARCHAR(64) NOT NULL, + quantity FLOAT NOT NULL +); -- cgit v1.2.3