summaryrefslogtreecommitdiff
path: root/jws/epibazaar/shop/src/main/java
diff options
context:
space:
mode:
authorMartial Simon <msimon_fr@hotmail.com>2025-09-15 01:07:58 +0200
committerMartial Simon <msimon_fr@hotmail.com>2025-09-15 01:07:58 +0200
commit967be9e750221ab2ab783f95df79bb26d290a45e (patch)
tree6802900a5e975f9f68b169f0f503f040056d6952 /jws/epibazaar/shop/src/main/java
add: added projectsHEADmain
Diffstat (limited to 'jws/epibazaar/shop/src/main/java')
-rw-r--r--jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/converter/ShopConverter.java24
-rw-r--r--jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/data/model/ItemModel.java28
-rw-r--r--jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/data/model/ShopModel.java18
-rw-r--r--jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/data/repository/ItemRepository.java39
-rw-r--r--jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/data/repository/ShopRepository.java30
-rw-r--r--jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/domain/entity/ErwenEntity.java4
-rw-r--r--jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/domain/entity/StartEntity.java9
-rw-r--r--jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/domain/service/ErwenService.java4
-rw-r--r--jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/domain/service/ShopService.java79
-rw-r--r--jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/presentation/rest/HelloWorldResource.java19
-rw-r--r--jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/presentation/rest/ShopResource.java63
-rw-r--r--jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/presentation/subscriber/AggregateSubscriber.java41
12 files changed, 358 insertions, 0 deletions
diff --git a/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/converter/ShopConverter.java b/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/converter/ShopConverter.java
new file mode 100644
index 0000000..1b3e8cb
--- /dev/null
+++ b/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/converter/ShopConverter.java
@@ -0,0 +1,24 @@
+package fr.epita.assistants.shop.converter;
+
+import fr.epita.assistants.common.aggregate.ItemAggregate;
+import fr.epita.assistants.common.aggregate.ResetInventoryAggregate;
+import fr.epita.assistants.shop.data.model.ItemModel;
+import jakarta.enterprise.context.ApplicationScoped;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@ApplicationScoped
+public class ShopConverter {
+ public static Map<ItemAggregate.ResourceType, Float> DeleteItems(ResetInventoryAggregate items) {
+ Map<ItemAggregate.ResourceType, Float> map = new HashMap<>();
+ for (ItemAggregate i : items.getItems()) {
+ map.merge(i.getType(), i.getQuantity(), Float::sum);
+ }
+ return map;
+ }
+
+ public static ItemAggregate updatedItem(ItemModel item) {
+ return new ItemAggregate(item.getType(), item.getQuantity());
+ }
+}
diff --git a/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/data/model/ItemModel.java b/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/data/model/ItemModel.java
new file mode 100644
index 0000000..a16f7bc
--- /dev/null
+++ b/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/data/model/ItemModel.java
@@ -0,0 +1,28 @@
+package fr.epita.assistants.shop.data.model;
+
+import fr.epita.assistants.common.aggregate.ItemAggregate;
+import jakarta.persistence.*;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity
+@Setter
+@Table(name = "item")
+public class ItemModel {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ Long id;
+ @Enumerated(value = EnumType.STRING)
+ ItemAggregate.ResourceType type;
+ Float quantity;
+
+ public ItemModel(float quantity, ItemAggregate.ResourceType type) {
+ this.quantity = quantity;
+ this.type = type;
+ }
+} \ No newline at end of file
diff --git a/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/data/model/ShopModel.java b/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/data/model/ShopModel.java
new file mode 100644
index 0000000..5f1c3ff
--- /dev/null
+++ b/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/data/model/ShopModel.java
@@ -0,0 +1,18 @@
+package fr.epita.assistants.shop.data.model;
+import jakarta.persistence.*;
+import lombok.*;
+
+import java.time.LocalDateTime;
+
+@Getter
+@Setter
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Table(name = "shop")
+public class ShopModel {
+ Float priceMultiplier;
+ Float upgradePrice;
+ @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
+ Integer id;
+}
diff --git a/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/data/repository/ItemRepository.java b/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/data/repository/ItemRepository.java
new file mode 100644
index 0000000..c471eb4
--- /dev/null
+++ b/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/data/repository/ItemRepository.java
@@ -0,0 +1,39 @@
+package fr.epita.assistants.shop.data.repository;
+
+import fr.epita.assistants.common.aggregate.ItemAggregate;
+import fr.epita.assistants.shop.data.model.ItemModel;
+import io.quarkus.hibernate.orm.panache.PanacheRepository;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.transaction.Transactional;
+
+import java.util.Map;
+import java.util.Optional;
+
+@ApplicationScoped
+public class ItemRepository implements PanacheRepository<ItemModel> {
+ @Transactional
+ public void deleteItems(Map<ItemAggregate.ResourceType, Float> toDelete) {
+ for (ItemAggregate.ResourceType type : toDelete.keySet()) {
+ ItemModel item = find("type = ?1", type).firstResult();
+ if (item != null)
+ update("quantity = ?1 where type = ?2", item.getQuantity() - toDelete.get(type), type);
+ }
+ }
+
+ @Transactional
+ public Optional<ItemModel> exists(ItemAggregate.ResourceType type) {
+ return find("type = ?1", type).firstResultOptional();
+ }
+
+ @Transactional
+ public void addItem(ItemAggregate.ResourceType type, Float amount) {
+ ItemModel res = new ItemModel(amount, type);
+ persist(res);
+ }
+
+ // amount should already be the updated amount
+ @Transactional
+ public void fillInventory(ItemAggregate.ResourceType type, Float amount) {
+ update("quantity = ?1 where type = ?2", amount, type);
+ }
+}
diff --git a/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/data/repository/ShopRepository.java b/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/data/repository/ShopRepository.java
new file mode 100644
index 0000000..1bc7c78
--- /dev/null
+++ b/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/data/repository/ShopRepository.java
@@ -0,0 +1,30 @@
+package fr.epita.assistants.shop.data.repository;
+
+import fr.epita.assistants.common.api.request.StartRequest;
+import fr.epita.assistants.common.api.response.StartResponse;
+import fr.epita.assistants.common.utils.ErrorInfo;
+import fr.epita.assistants.shop.converter.ShopConverter;
+import fr.epita.assistants.shop.data.model.ShopModel;
+import fr.epita.assistants.shop.domain.service.ShopService;
+import io.quarkus.hibernate.orm.panache.PanacheRepository;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import jakarta.transaction.Transactional;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.core.Response;
+
+@ApplicationScoped
+public class ShopRepository implements PanacheRepository<ShopModel> {
+ @Transactional
+ public void clearDB() {
+ deleteAll();
+ }
+ @Transactional
+ public void addEntry(Float priceMultiplier, Float upgradePriceCost) {
+ ShopModel shop = new ShopModel();
+ shop.setUpgradePrice(upgradePriceCost);
+ shop.setPriceMultiplier(priceMultiplier);
+ persist(shop);
+ }
+}
diff --git a/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/domain/entity/ErwenEntity.java b/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/domain/entity/ErwenEntity.java
new file mode 100644
index 0000000..3bb22f1
--- /dev/null
+++ b/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/domain/entity/ErwenEntity.java
@@ -0,0 +1,4 @@
+package fr.epita.assistants.shop.domain.entity;
+
+public class ErwenEntity {
+}
diff --git a/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/domain/entity/StartEntity.java b/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/domain/entity/StartEntity.java
new file mode 100644
index 0000000..d26ac90
--- /dev/null
+++ b/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/domain/entity/StartEntity.java
@@ -0,0 +1,9 @@
+package fr.epita.assistants.shop.domain.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public class StartEntity {
+}
diff --git a/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/domain/service/ErwenService.java b/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/domain/service/ErwenService.java
new file mode 100644
index 0000000..b7e8ad7
--- /dev/null
+++ b/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/domain/service/ErwenService.java
@@ -0,0 +1,4 @@
+package fr.epita.assistants.shop.domain.service;
+
+public class ErwenService {
+}
diff --git a/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/domain/service/ShopService.java b/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/domain/service/ShopService.java
new file mode 100644
index 0000000..06ed11c
--- /dev/null
+++ b/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/domain/service/ShopService.java
@@ -0,0 +1,79 @@
+package fr.epita.assistants.shop.domain.service;
+
+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.command.CollectItemCommand;
+import fr.epita.assistants.common.command.ResetInventoryCommand;
+import fr.epita.assistants.common.command.SyncInventoryCommand;
+import fr.epita.assistants.shop.converter.ShopConverter;
+import fr.epita.assistants.shop.data.model.ItemModel;
+import fr.epita.assistants.shop.data.repository.ItemRepository;
+import fr.epita.assistants.shop.data.repository.ShopRepository;
+import io.smallrye.reactive.messaging.annotations.Broadcast;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import jakarta.transaction.Transactional;
+import org.eclipse.microprofile.config.inject.ConfigProperty;
+import org.eclipse.microprofile.reactive.messaging.Channel;
+import org.eclipse.microprofile.reactive.messaging.Emitter;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+@ApplicationScoped
+public class ShopService {
+ @ConfigProperty(name = "JWS_SHOP_PRICE")
+ String shopPrice;
+ @ConfigProperty(name = "JWS_UPGRADE_PRICE_COST")
+ String upgradePriceCost;
+ @Inject
+ ItemRepository itemRepository;
+ @Inject
+ ShopRepository shopRepository;
+
+ @Inject
+ @Channel("sync-inventory-command")
+ @Broadcast
+ Emitter<SyncInventoryCommand> syncInventoryCommandEmitter;
+
+ public void clearItems(ResetInventoryAggregate items) {
+ itemRepository.deleteItems(ShopConverter.DeleteItems(items));
+ }
+
+ public void collectItem(ItemAggregate agr) {
+ Optional<ItemModel> item = itemRepository.exists(agr.getType());
+ if (item.isPresent()) {
+ itemRepository.fillInventory(agr.getType(), agr.getQuantity());
+ } else {
+ itemRepository.addItem(agr.getType(), agr.getQuantity());
+ }
+ }
+
+ public void startShop() {
+ shopRepository.clearDB();
+ shopRepository.addEntry(1f, Float.parseFloat(upgradePriceCost));
+ syncInventoryCommandEmitter.send(new SyncInventoryCommand());
+ }
+
+ @Transactional
+ public void updateItems(SyncInventoryAggregate agr) {
+ for (ItemAggregate item : agr.getItems()) {
+ Optional<ItemModel> it = itemRepository.exists(item.getType());
+ if (it.isPresent()) {
+ itemRepository.fillInventory(item.getType(), item.getQuantity() + it.get().getQuantity());
+ } else {
+ itemRepository.addItem(item.getType(), item.getQuantity());
+ }
+ }
+ }
+
+ public void pay(Float newMoney) {
+ itemRepository.fillInventory(ItemAggregate.ResourceType.MONEY, newMoney);
+ }
+}
diff --git a/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/presentation/rest/HelloWorldResource.java b/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/presentation/rest/HelloWorldResource.java
new file mode 100644
index 0000000..e384c22
--- /dev/null
+++ b/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/presentation/rest/HelloWorldResource.java
@@ -0,0 +1,19 @@
+package fr.epita.assistants.shop.presentation.rest;
+
+import jakarta.ws.rs.*;
+import jakarta.ws.rs.core.MediaType;
+
+@Path("/hello")
+@Produces(MediaType.TEXT_PLAIN)
+@Consumes(MediaType.TEXT_PLAIN)
+public class HelloWorldResource {
+ @GET @Path("/")
+ public String helloWorld() {
+ return "Hello World!";
+ }
+
+ @GET @Path("/{name}")
+ public String helloWorld(@PathParam("name") String name) {
+ return "Hello " + name + "!";
+ }
+}
diff --git a/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/presentation/rest/ShopResource.java b/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/presentation/rest/ShopResource.java
new file mode 100644
index 0000000..71719d1
--- /dev/null
+++ b/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/presentation/rest/ShopResource.java
@@ -0,0 +1,63 @@
+package fr.epita.assistants.shop.presentation.rest;
+
+import fr.epita.assistants.common.api.request.ItemsRequest;
+import fr.epita.assistants.common.api.request.StartRequest;
+import fr.epita.assistants.common.utils.ErrorInfo;
+import fr.epita.assistants.shop.domain.service.ShopService;
+import jakarta.ws.rs.*;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.Response;
+
+@Path("/")
+@Produces(MediaType.APPLICATION_JSON)
+@Consumes(MediaType.APPLICATION_JSON)
+public class ShopResource {
+ private final ShopService shopService;
+
+ @jakarta.inject.Inject
+ public ShopResource(ShopService shopService) {
+ this.shopService = shopService;
+ }
+
+ @Path("/")
+ @GET
+ public Response getRoot() {
+ return Response.status(Response.Status.BAD_REQUEST).entity(new ErrorInfo("Not implemented")).build();
+ }
+ @Path("/")
+ @POST
+ public Response postRoot() {
+ return Response.status(Response.Status.BAD_REQUEST).entity(new ErrorInfo("Not implemented")).build();
+ }
+ @Path("resources")
+ @GET
+ public Response resources() {
+ return Response.status(Response.Status.BAD_REQUEST).entity(new ErrorInfo("Not implemented")).build();
+ }
+ @Path("start")
+ @POST
+ public Response start() {
+ shopService.startShop();
+ return Response.status(Response.Status.NO_CONTENT).build();
+ }
+ @Path("price")
+ @GET
+ public Response price() {
+ return Response.status(Response.Status.BAD_REQUEST).entity(new ErrorInfo("Not implemented")).build();
+ }
+ @Path("{id}")
+ @POST
+ public Response getShop(@PathParam("id") int id) {
+ return Response.status(Response.Status.BAD_REQUEST).entity(new ErrorInfo("Not implemented")).build();
+ }
+ @Path("sell/{id}")
+ @PATCH
+ public Response sellItems(@PathParam("id") int id, ItemsRequest itemsRequest) {
+ return Response.status(Response.Status.BAD_REQUEST).entity(new ErrorInfo("Not implemented")).build();
+ }
+ @Path("upgrade/price/{id}")
+ @PATCH
+ public Response upgradeShop(@PathParam("id") int id) {
+ return Response.status(Response.Status.BAD_REQUEST).entity(new ErrorInfo("Not implemented")).build();
+ }
+}
diff --git a/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/presentation/subscriber/AggregateSubscriber.java b/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/presentation/subscriber/AggregateSubscriber.java
new file mode 100644
index 0000000..26247b9
--- /dev/null
+++ b/jws/epibazaar/shop/src/main/java/fr/epita/assistants/shop/presentation/subscriber/AggregateSubscriber.java
@@ -0,0 +1,41 @@
+package fr.epita.assistants.shop.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.CollectItemCommand;
+import fr.epita.assistants.shop.domain.service.ShopService;
+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 AggregateSubscriber {
+ @Inject
+ ShopService shopService;
+
+ @Broadcast
+ @Incoming("sync-inventory-aggregate")
+ public void commandListener(SyncInventoryAggregate aggregate) {
+ shopService.updateItems(aggregate);
+ }
+
+ @Broadcast
+ @Incoming("upgrade-collect-rate-aggregate")
+ public void collectCommandListener(UpgradeItemProducerAggregate agr) {
+ shopService.pay(agr.getNewMoney());
+ }
+
+ @Broadcast
+ @Incoming("upgrade-movement-speed-aggregate")
+ public void moveCommandListener(UpgradeItemProducerAggregate agr) {
+ shopService.pay(agr.getNewMoney());
+ }
+
+ @Broadcast
+ @Incoming("upgrade-stamina-aggregate")
+ public void staminaCommandListener(UpgradeItemProducerAggregate agr) {
+ shopService.pay(agr.getNewMoney());
+ }
+}