diff --git a/src/main/java/com/l2/shots/characters/Character.java b/src/main/java/com/l2/shots/characters/Character.java index fe63d47..57434a0 100644 --- a/src/main/java/com/l2/shots/characters/Character.java +++ b/src/main/java/com/l2/shots/characters/Character.java @@ -31,6 +31,12 @@ public class Character extends PanacheEntityBase { @Column(name = "level", nullable = false) public int level; + @Column(name = "inventory_slots", nullable = false) + public int inventorySlots = 80; + + @Column(name = "stack_limit", nullable = false) + public int stackLimit = 9999; + @Column(name = "created_at", nullable = false) public Instant createdAt; } diff --git a/src/main/java/com/l2/shots/characters/CharacterDto.java b/src/main/java/com/l2/shots/characters/CharacterDto.java index 64b5749..2588992 100644 --- a/src/main/java/com/l2/shots/characters/CharacterDto.java +++ b/src/main/java/com/l2/shots/characters/CharacterDto.java @@ -11,5 +11,7 @@ public record CharacterDto( String name, String characterClass, int level, + int inventorySlots, + int stackLimit, Instant createdAt) { -} +} \ No newline at end of file diff --git a/src/main/java/com/l2/shots/characters/CharacterIn.java b/src/main/java/com/l2/shots/characters/CharacterIn.java index c5d005f..1936b61 100644 --- a/src/main/java/com/l2/shots/characters/CharacterIn.java +++ b/src/main/java/com/l2/shots/characters/CharacterIn.java @@ -6,7 +6,9 @@ import io.quarkus.runtime.annotations.RegisterForReflection; public record CharacterIn( String name, String characterClass, - int level) { + int level, + Integer inventorySlots, + Integer stackLimit) { public CharacterIn { if (name == null || name.isBlank()) { @@ -25,4 +27,12 @@ public record CharacterIn( throw new IllegalArgumentException("level must be greater than 0"); } } -} + + public int effectiveInventorySlots() { + return inventorySlots != null && inventorySlots > 0 ? inventorySlots : 80; + } + + public int effectiveStackLimit() { + return stackLimit != null && stackLimit > 0 ? stackLimit : 9999; + } +} \ No newline at end of file diff --git a/src/main/java/com/l2/shots/characters/CharacterResource.java b/src/main/java/com/l2/shots/characters/CharacterResource.java index 558e883..0e21c5d 100644 --- a/src/main/java/com/l2/shots/characters/CharacterResource.java +++ b/src/main/java/com/l2/shots/characters/CharacterResource.java @@ -52,7 +52,9 @@ public class CharacterResource { CharacterIn validated = new CharacterIn( input.name(), input.characterClass(), - input.level()); + input.level(), + input.inventorySlots(), + input.stackLimit()); CharacterDto created = characterService.create(userId.get(), validated); return Response.status(201).entity(created).build(); } catch (IllegalArgumentException e) { @@ -84,6 +86,30 @@ public class CharacterResource { .orElse(Response.status(404).build()); } + @PUT + @Path("/{id}/inventory") + public Response updateInventory(@Context HttpHeaders headers, + @PathParam("id") String idStr, + UpdateInventoryRequest body) { + Optional userId = extractUserId(headers); + if (userId.isEmpty()) return Response.status(401).build(); + + UUID id; + try { + id = UUID.fromString(idStr); + } catch (IllegalArgumentException e) { + return Response.status(400).entity("{\"error\":\"id inválido\"}").build(); + } + + if (body == null || body.inventorySlots() <= 0 || body.stackLimit() <= 0) { + return Response.status(400).entity("{\"error\":\"slots y stackLimit deben ser mayores a 0\"}").build(); + } + + Optional updated = characterService.updateInventory(userId.get(), id, body.inventorySlots(), body.stackLimit()); + return updated.map(c -> Response.ok(c).build()) + .orElse(Response.status(404).build()); + } + @DELETE @Path("/{id}") public Response delete(@Context HttpHeaders headers, @PathParam("id") String idStr) { @@ -116,4 +142,6 @@ public class CharacterResource { } public record UpdateLevelRequest(int level) {} + + public record UpdateInventoryRequest(int inventorySlots, int stackLimit) {} } diff --git a/src/main/java/com/l2/shots/characters/CharacterService.java b/src/main/java/com/l2/shots/characters/CharacterService.java index 18cb70e..c6d47c1 100644 --- a/src/main/java/com/l2/shots/characters/CharacterService.java +++ b/src/main/java/com/l2/shots/characters/CharacterService.java @@ -33,6 +33,8 @@ public class CharacterService { entity.name = input.name(); entity.characterClass = input.characterClass(); entity.level = input.level(); + entity.inventorySlots = input.effectiveInventorySlots(); + entity.stackLimit = input.effectiveStackLimit(); entity.createdAt = Instant.now(); entity.persist(); return toDto(entity); @@ -46,6 +48,15 @@ public class CharacterService { return Optional.of(toDto(entity)); } + @Transactional + public Optional updateInventory(UUID userId, UUID id, int inventorySlots, int stackLimit) { + Character entity = Character.find("id = ?1 AND userId = ?2", id, userId).firstResult(); + if (entity == null) return Optional.empty(); + if (inventorySlots > 0) entity.inventorySlots = inventorySlots; + if (stackLimit > 0) entity.stackLimit = stackLimit; + return Optional.of(toDto(entity)); + } + @Transactional public void delete(UUID userId, UUID id) { Character entity = Character.find("id = ?1 AND userId = ?2", id, userId).firstResult(); @@ -67,6 +78,8 @@ public class CharacterService { entity.name, entity.characterClass, entity.level, + entity.inventorySlots, + entity.stackLimit, entity.createdAt); } -} +} \ No newline at end of file diff --git a/src/main/resources/META-INF/resources/static/js/api.js b/src/main/resources/META-INF/resources/static/js/api.js index 110e663..ac0bda2 100644 --- a/src/main/resources/META-INF/resources/static/js/api.js +++ b/src/main/resources/META-INF/resources/static/js/api.js @@ -143,6 +143,13 @@ window.api = { }); }, + updateCharacterInventory(id, inventorySlots, stackLimit) { + return this.request(`/api/characters/${id}/inventory`, { + method: 'PUT', + body: JSON.stringify({ inventorySlots, stackLimit }), + }); + }, + deleteCharacter(id) { return this.request(`/api/characters/${id}`, { method: 'DELETE' }); }, diff --git a/src/main/resources/db/migration/V4__character_inventory.sql b/src/main/resources/db/migration/V4__character_inventory.sql new file mode 100644 index 0000000..69a87c1 --- /dev/null +++ b/src/main/resources/db/migration/V4__character_inventory.sql @@ -0,0 +1,2 @@ +ALTER TABLE characters ADD COLUMN inventory_slots INT NOT NULL DEFAULT 80; +ALTER TABLE characters ADD COLUMN stack_limit INT NOT NULL DEFAULT 9999; \ No newline at end of file diff --git a/src/main/resources/templates/PageResource/personajes.html b/src/main/resources/templates/PageResource/personajes.html index 5dd396b..2413374 100644 --- a/src/main/resources/templates/PageResource/personajes.html +++ b/src/main/resources/templates/PageResource/personajes.html @@ -20,7 +20,7 @@

Agregar personaje

-
+
+ +
+ + + + + + +