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.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<String> 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<ResponseObject.Instance> listInstancesDetails(@RequestParam List<String> id) {
throw new UnsupportedOperationException("Not implemented");
return id.stream().map(this::targetInstanceDetails).toList();
}
@PostMapping
ResponseEntity<Void> 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<Void> deleteInstance(@PathVariable String instanceId) {
throw new UnsupportedOperationException("Not implemented");
instanceService.remove(InstanceId.of(instanceId));
return ResponseEntity.ok().build();
}
@DeleteMapping("/list")
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")
ResponseObject.PickedRoom pickRoom(@PathVariable String instanceId, @RequestBody List<String> entities) {
throw new UnsupportedOperationException("Not implemented");
ResponseObject.PickedRoom pickRoom(@PathVariable String instanceId,
@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() {}
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) {}
}

View File

@ -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<Instance> all();

View File

@ -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

View File

@ -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);

View File

@ -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

View File

@ -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) {}