diff --git a/server/src/main/java/ru/dragonestia/picker/controller/InstanceController.java b/server/src/main/java/ru/dragonestia/picker/controller/InstanceController.java index 4c2109d..6eae3c0 100644 --- a/server/src/main/java/ru/dragonestia/picker/controller/InstanceController.java +++ b/server/src/main/java/ru/dragonestia/picker/controller/InstanceController.java @@ -4,49 +4,79 @@ import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import ru.dragonestia.picker.controller.response.ResponseObject; +import ru.dragonestia.picker.exception.DoesNotExistsException; +import ru.dragonestia.picker.model.entity.EntityId; +import ru.dragonestia.picker.model.instance.Instance; +import ru.dragonestia.picker.model.instance.InstanceId; import ru.dragonestia.picker.model.instance.type.PickingMethod; +import ru.dragonestia.picker.service.EntityService; +import ru.dragonestia.picker.service.InstanceService; +import ru.dragonestia.picker.service.RoomService; +import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; @RestController @RequestMapping("/instances") @RequiredArgsConstructor public class InstanceController { + private final InstanceService instanceService; + private final RoomService roomService; + private final EntityService entityService; + @GetMapping List listInstances() { - throw new UnsupportedOperationException("Not implemented"); + return instanceService.all().stream().map(instance -> instance.getId().getValue()).toList(); } @GetMapping("/target/{instanceId}") ResponseObject.Instance targetInstanceDetails(@PathVariable String instanceId) { - throw new UnsupportedOperationException("Not implemented"); + var id = InstanceId.of(instanceId); + return instanceService.find(id) + .map(ResponseObject.Instance::of) + .orElseThrow(() -> DoesNotExistsException.forInstance(id)); } @GetMapping("/list") List listInstancesDetails(@RequestParam List id) { - throw new UnsupportedOperationException("Not implemented"); + return id.stream().map(this::targetInstanceDetails).toList(); } @PostMapping ResponseEntity createInstance(@RequestParam String instanceId, @RequestParam PickingMethod method, @RequestParam(defaultValue = "false") boolean persist) { - throw new UnsupportedOperationException("Not implemented"); + instanceService.create(new Instance(InstanceId.of(instanceId), method, persist)); + return ResponseEntity.ok().build(); } @DeleteMapping("/target/{instanceId}") ResponseEntity deleteInstance(@PathVariable String instanceId) { - throw new UnsupportedOperationException("Not implemented"); + instanceService.remove(InstanceId.of(instanceId)); + return ResponseEntity.ok().build(); } @DeleteMapping("/list") ResponseEntity deleteInstances(@RequestParam List id) { - throw new UnsupportedOperationException("Not implemented"); + for (var instanceId: id) { + deleteInstance(instanceId); + } + return ResponseEntity.ok().build(); } @PostMapping("/target/{instanceId}/pick") - ResponseObject.PickedRoom pickRoom(@PathVariable String instanceId, @RequestBody List entities) { - throw new UnsupportedOperationException("Not implemented"); + ResponseObject.PickedRoom pickRoom(@PathVariable String instanceId, + @RequestParam(defaultValue = "false") boolean dontReturnEntities, + @RequestBody List entities) { + var room = roomService.pick(InstanceId.of(instanceId), entities.stream().map(EntityId::of).collect(Collectors.toSet())); + List returnEntities = new ArrayList<>(); + if (!dontReturnEntities) { + for (var entity: entityService.getRoomEntities(room)) { + returnEntities.add(entity.getId().getValue()); + } + } + return new ResponseObject.PickedRoom(ResponseObject.Room.of(room), returnEntities); } } diff --git a/server/src/main/java/ru/dragonestia/picker/controller/response/ResponseObject.java b/server/src/main/java/ru/dragonestia/picker/controller/response/ResponseObject.java index 0ca87fb..1dcab03 100644 --- a/server/src/main/java/ru/dragonestia/picker/controller/response/ResponseObject.java +++ b/server/src/main/java/ru/dragonestia/picker/controller/response/ResponseObject.java @@ -9,11 +9,26 @@ public final class ResponseObject { private ResponseObject() {} - public record Instance(String id, PickingMethod method, boolean persist) {} + public record Instance(String id, PickingMethod method, boolean persist) { - public record Room(String id, String nodeId, int slots, boolean locked, boolean persist, String payload) {} + public static ResponseObject.Instance of(ru.dragonestia.picker.model.instance.Instance instance) { + return new Instance(instance.getId().getValue(), instance.getPickingMethod(), instance.isPersist()); + } + } - public record PickedRoom(Room room, List entities) {} + public record Room(String id, String nodeId, int slots, boolean locked, boolean persist, String payload) { + + public static ResponseObject.Room of(ru.dragonestia.picker.model.room.Room room) { + return new Room(room.getId().getValue(), + room.getInstance().getId().getValue(), + room.getSlots(), + room.isLocked(), + room.isPersist(), + room.getPayload()); + } + } + + public record PickedRoom(Room room, List entities) {} public record Account(String id, List permissions, boolean locked) {} } diff --git a/server/src/main/java/ru/dragonestia/picker/service/InstanceService.java b/server/src/main/java/ru/dragonestia/picker/service/InstanceService.java index dcedbe8..9de58b4 100644 --- a/server/src/main/java/ru/dragonestia/picker/service/InstanceService.java +++ b/server/src/main/java/ru/dragonestia/picker/service/InstanceService.java @@ -15,7 +15,7 @@ public interface InstanceService { void create(Instance instance) throws InvalidIdentifierException, AlreadyExistsException; @PreAuthorize("hasRole('NODE_MANAGEMENT')") - void remove(Instance instance); + void remove(InstanceId id); List all(); diff --git a/server/src/main/java/ru/dragonestia/picker/service/impl/InstanceServiceImpl.java b/server/src/main/java/ru/dragonestia/picker/service/impl/InstanceServiceImpl.java index 6bb30ad..9788c6e 100644 --- a/server/src/main/java/ru/dragonestia/picker/service/impl/InstanceServiceImpl.java +++ b/server/src/main/java/ru/dragonestia/picker/service/impl/InstanceServiceImpl.java @@ -29,13 +29,13 @@ public class InstanceServiceImpl implements InstanceService { } @Override - public void remove(Instance instance) { - for (var room: roomRepository.all(instance.getId())) { + public void remove(InstanceId id) { + for (var room: roomRepository.all(id)) { storage.removeRoom(room); } - instanceRepository.delete(instance.getId()); - storage.removeInstance(instance); + instanceRepository.delete(id); + storage.removeInstance(id); } @Override diff --git a/server/src/main/java/ru/dragonestia/picker/storage/InstanceAndRoomStorage.java b/server/src/main/java/ru/dragonestia/picker/storage/InstanceAndRoomStorage.java index da5d787..ebe76e3 100644 --- a/server/src/main/java/ru/dragonestia/picker/storage/InstanceAndRoomStorage.java +++ b/server/src/main/java/ru/dragonestia/picker/storage/InstanceAndRoomStorage.java @@ -1,6 +1,7 @@ package ru.dragonestia.picker.storage; import ru.dragonestia.picker.model.instance.Instance; +import ru.dragonestia.picker.model.instance.InstanceId; import ru.dragonestia.picker.model.room.Room; public interface InstanceAndRoomStorage { @@ -9,7 +10,7 @@ public interface InstanceAndRoomStorage { void saveInstance(Instance instance); - void removeInstance(Instance instance); + void removeInstance(InstanceId id); void saveRoom(Room room); diff --git a/server/src/main/java/ru/dragonestia/picker/storage/impl/FileStorageImpl.java b/server/src/main/java/ru/dragonestia/picker/storage/impl/FileStorageImpl.java index 5844166..3c4d186 100644 --- a/server/src/main/java/ru/dragonestia/picker/storage/impl/FileStorageImpl.java +++ b/server/src/main/java/ru/dragonestia/picker/storage/impl/FileStorageImpl.java @@ -9,6 +9,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; import ru.dragonestia.picker.model.instance.Instance; +import ru.dragonestia.picker.model.instance.InstanceId; import ru.dragonestia.picker.model.room.Room; import ru.dragonestia.picker.repository.InstanceRepository; import ru.dragonestia.picker.repository.RoomRepository; @@ -77,11 +78,12 @@ public class FileStorageImpl implements InstanceAndRoomStorage { } @Override - public void removeInstance(Instance instance) { - if (!instance.isPersist()) return; - new File(path + "/nodes/" + instance.getId() + ".json").delete(); + public void removeInstance(InstanceId id) { + var file = new File(path + "/nodes/" + id + ".json"); + if (!file.exists()) return; + file.delete(); - log.info("Removed instance '%s' from disk storage".formatted(instance.getId())); + log.info("Removed instance '%s' from disk storage".formatted(id)); } @SneakyThrows diff --git a/server/src/main/java/ru/dragonestia/picker/storage/impl/NullStorageImpl.java b/server/src/main/java/ru/dragonestia/picker/storage/impl/NullStorageImpl.java index 8003503..a201d29 100644 --- a/server/src/main/java/ru/dragonestia/picker/storage/impl/NullStorageImpl.java +++ b/server/src/main/java/ru/dragonestia/picker/storage/impl/NullStorageImpl.java @@ -3,6 +3,7 @@ package ru.dragonestia.picker.storage.impl; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; import ru.dragonestia.picker.model.instance.Instance; +import ru.dragonestia.picker.model.instance.InstanceId; import ru.dragonestia.picker.model.room.Room; import ru.dragonestia.picker.storage.InstanceAndRoomStorage; @@ -17,7 +18,7 @@ public class NullStorageImpl implements InstanceAndRoomStorage { public void saveInstance(Instance instance) {} @Override - public void removeInstance(Instance instance) {} + public void removeInstance(InstanceId id) {} @Override public void saveRoom(Room room) {}