diff options
Diffstat (limited to 'jws/epibazaar/shop/src/main/java/fr/epita')
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()); + } +} |
