implemented instance controller

This commit is contained in:
Andrey Terentev 2024-05-11 10:38:31 +07:00 committed by Andrey Terentev
parent 5c0b157414
commit fbda9c1675
7 changed files with 71 additions and 22 deletions

View File

@ -4,49 +4,79 @@ import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import ru.dragonestia.picker.controller.response.ResponseObject; 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.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.List;
import java.util.stream.Collectors;
@RestController @RestController
@RequestMapping("/instances") @RequestMapping("/instances")
@RequiredArgsConstructor @RequiredArgsConstructor
public class InstanceController { public class InstanceController {
private final InstanceService instanceService;
private final RoomService roomService;
private final EntityService entityService;
@GetMapping @GetMapping
List<String> listInstances() { List<String> listInstances() {
throw new UnsupportedOperationException("Not implemented"); return instanceService.all().stream().map(instance -> instance.getId().getValue()).toList();
} }
@GetMapping("/target/{instanceId}") @GetMapping("/target/{instanceId}")
ResponseObject.Instance targetInstanceDetails(@PathVariable String 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") @GetMapping("/list")
List<ResponseObject.Instance> listInstancesDetails(@RequestParam List<String> id) { List<ResponseObject.Instance> listInstancesDetails(@RequestParam List<String> id) {
throw new UnsupportedOperationException("Not implemented"); return id.stream().map(this::targetInstanceDetails).toList();
} }
@PostMapping @PostMapping
ResponseEntity<Void> createInstance(@RequestParam String instanceId, ResponseEntity<Void> createInstance(@RequestParam String instanceId,
@RequestParam PickingMethod method, @RequestParam PickingMethod method,
@RequestParam(defaultValue = "false") boolean persist) { @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}") @DeleteMapping("/target/{instanceId}")
ResponseEntity<Void> deleteInstance(@PathVariable String instanceId) { ResponseEntity<Void> deleteInstance(@PathVariable String instanceId) {
throw new UnsupportedOperationException("Not implemented"); instanceService.remove(InstanceId.of(instanceId));
return ResponseEntity.ok().build();
} }
@DeleteMapping("/list") @DeleteMapping("/list")
ResponseEntity<Void> deleteInstances(@RequestParam List<String> id) { ResponseEntity<Void> deleteInstances(@RequestParam List<String> id) {
throw new UnsupportedOperationException("Not implemented"); for (var instanceId: id) {
deleteInstance(instanceId);
}
return ResponseEntity.ok().build();
} }
@PostMapping("/target/{instanceId}/pick") @PostMapping("/target/{instanceId}/pick")
ResponseObject.PickedRoom pickRoom(@PathVariable String instanceId, @RequestBody List<String> entities) { ResponseObject.PickedRoom pickRoom(@PathVariable String instanceId,
throw new UnsupportedOperationException("Not implemented"); @RequestParam(defaultValue = "false") boolean dontReturnEntities,
@RequestBody List<String> entities) {
var room = roomService.pick(InstanceId.of(instanceId), entities.stream().map(EntityId::of).collect(Collectors.toSet()));
List<String> 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);
} }
} }

View File

@ -9,11 +9,26 @@ public final class ResponseObject {
private 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<EntityId> 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<String> entities) {}
public record Account(String id, List<String> permissions, boolean locked) {} public record Account(String id, List<String> permissions, boolean locked) {}
} }

View File

@ -15,7 +15,7 @@ public interface InstanceService {
void create(Instance instance) throws InvalidIdentifierException, AlreadyExistsException; void create(Instance instance) throws InvalidIdentifierException, AlreadyExistsException;
@PreAuthorize("hasRole('NODE_MANAGEMENT')") @PreAuthorize("hasRole('NODE_MANAGEMENT')")
void remove(Instance instance); void remove(InstanceId id);
List<Instance> all(); List<Instance> all();

View File

@ -29,13 +29,13 @@ public class InstanceServiceImpl implements InstanceService {
} }
@Override @Override
public void remove(Instance instance) { public void remove(InstanceId id) {
for (var room: roomRepository.all(instance.getId())) { for (var room: roomRepository.all(id)) {
storage.removeRoom(room); storage.removeRoom(room);
} }
instanceRepository.delete(instance.getId()); instanceRepository.delete(id);
storage.removeInstance(instance); storage.removeInstance(id);
} }
@Override @Override

View File

@ -1,6 +1,7 @@
package ru.dragonestia.picker.storage; package ru.dragonestia.picker.storage;
import ru.dragonestia.picker.model.instance.Instance; 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.model.room.Room;
public interface InstanceAndRoomStorage { public interface InstanceAndRoomStorage {
@ -9,7 +10,7 @@ public interface InstanceAndRoomStorage {
void saveInstance(Instance instance); void saveInstance(Instance instance);
void removeInstance(Instance instance); void removeInstance(InstanceId id);
void saveRoom(Room room); void saveRoom(Room room);

View File

@ -9,6 +9,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Profile; import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import ru.dragonestia.picker.model.instance.Instance; 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.model.room.Room;
import ru.dragonestia.picker.repository.InstanceRepository; import ru.dragonestia.picker.repository.InstanceRepository;
import ru.dragonestia.picker.repository.RoomRepository; import ru.dragonestia.picker.repository.RoomRepository;
@ -77,11 +78,12 @@ public class FileStorageImpl implements InstanceAndRoomStorage {
} }
@Override @Override
public void removeInstance(Instance instance) { public void removeInstance(InstanceId id) {
if (!instance.isPersist()) return; var file = new File(path + "/nodes/" + id + ".json");
new File(path + "/nodes/" + instance.getId() + ".json").delete(); 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 @SneakyThrows

View File

@ -3,6 +3,7 @@ package ru.dragonestia.picker.storage.impl;
import org.springframework.context.annotation.Profile; import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import ru.dragonestia.picker.model.instance.Instance; 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.model.room.Room;
import ru.dragonestia.picker.storage.InstanceAndRoomStorage; import ru.dragonestia.picker.storage.InstanceAndRoomStorage;
@ -17,7 +18,7 @@ public class NullStorageImpl implements InstanceAndRoomStorage {
public void saveInstance(Instance instance) {} public void saveInstance(Instance instance) {}
@Override @Override
public void removeInstance(Instance instance) {} public void removeInstance(InstanceId id) {}
@Override @Override
public void saveRoom(Room room) {} public void saveRoom(Room room) {}