diff --git a/core/src/main/java/cz/muni/fi/pa165/core/common/DomainService.java b/core/src/main/java/cz/muni/fi/pa165/core/common/DomainService.java index 55fec5d0884d4191b45a32adfea9a4aa746d6bb1..1f3240a11a6c55677bb392bbfbd8efb36aca7571 100644 --- a/core/src/main/java/cz/muni/fi/pa165/core/common/DomainService.java +++ b/core/src/main/java/cz/muni/fi/pa165/core/common/DomainService.java @@ -95,6 +95,16 @@ public abstract class DomainService<T extends DomainObject> { getRepository().saveAll(entities); } + /** + * Deletes all entities by array of id's + */ + @Transactional + public void deleteAllById(String[] ids) { + for (String id: ids) { + deleteById(id); + } + } + /** * Deletes the entity with the given ID by setting its deletion datetime. * diff --git a/core/src/main/java/cz/muni/fi/pa165/core/device/DeviceController.java b/core/src/main/java/cz/muni/fi/pa165/core/device/DeviceController.java index d06588d84d150b029567280b727831a451f9b4f5..e892d591f9dc6848b5bd061b9e42f07c6434137a 100644 --- a/core/src/main/java/cz/muni/fi/pa165/core/device/DeviceController.java +++ b/core/src/main/java/cz/muni/fi/pa165/core/device/DeviceController.java @@ -1,5 +1,6 @@ package cz.muni.fi.pa165.core.device; +import cz.muni.fi.pa165.core.helpers.exceptions.EntityDeletionException; import cz.muni.fi.pa165.model.dto.device.DeviceCreateDto; import cz.muni.fi.pa165.model.dto.device.DeviceDto; import cz.muni.fi.pa165.model.dto.device.DeviceUpdateDto; @@ -8,6 +9,9 @@ import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.HttpStatusCode; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -19,6 +23,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.data.domain.Pageable; + +import javax.swing.*; import java.util.List; @RestController @@ -80,8 +86,8 @@ public class DeviceController { summary = "Delete device", description = "Deletes the device with the specified id.") @DeleteMapping("/{id}") - public DeviceDto deleteById( + public ResponseEntity<DeviceDto> deleteById( @PathVariable @Parameter(description = "The id of the device.") String id) { - return deviceFacade.deleteById(id); + return new ResponseEntity<>(deviceFacade.deleteById(id), HttpStatus.OK); } } diff --git a/core/src/main/java/cz/muni/fi/pa165/core/device/DeviceFacade.java b/core/src/main/java/cz/muni/fi/pa165/core/device/DeviceFacade.java index 83ebcbe6ddd4c713c3731e5ca6f29df9b8e3d131..3084375ac196254acc548bff37ba2d341fed7c8f 100644 --- a/core/src/main/java/cz/muni/fi/pa165/core/device/DeviceFacade.java +++ b/core/src/main/java/cz/muni/fi/pa165/core/device/DeviceFacade.java @@ -1,9 +1,11 @@ package cz.muni.fi.pa165.core.device; import cz.muni.fi.pa165.core.common.DomainFacade; +import cz.muni.fi.pa165.core.helpers.exceptions.EntityDeletionException; import cz.muni.fi.pa165.model.dto.device.DeviceCreateDto; import cz.muni.fi.pa165.model.dto.device.DeviceDto; import cz.muni.fi.pa165.model.dto.device.DeviceUpdateDto; +import lombok.SneakyThrows; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -17,4 +19,14 @@ public class DeviceFacade extends DomainFacade<Device, DeviceDto, DeviceCreateDt super(deviceService, deviceMapper); this.deviceService = deviceService; } + + @SneakyThrows + @Override + public DeviceDto deleteById(String id) { + Device device = deviceService.findById(id); + if (!device.getSmartMeterList().isEmpty()){ + throw new EntityDeletionException("Entity has some data"); + } + return new DeviceDto(); + } } diff --git a/core/src/main/java/cz/muni/fi/pa165/core/helpers/exceptions/EntityDeletionException.java b/core/src/main/java/cz/muni/fi/pa165/core/helpers/exceptions/EntityDeletionException.java new file mode 100644 index 0000000000000000000000000000000000000000..bee9ff576f0d1cdf53b0caad454220fe2a394887 --- /dev/null +++ b/core/src/main/java/cz/muni/fi/pa165/core/helpers/exceptions/EntityDeletionException.java @@ -0,0 +1,7 @@ +package cz.muni.fi.pa165.core.helpers.exceptions; + +public class EntityDeletionException extends Exception{ + public EntityDeletionException(String message) { + super(message); + } +} diff --git a/core/src/main/java/cz/muni/fi/pa165/core/metrics/MetricsFacade.java b/core/src/main/java/cz/muni/fi/pa165/core/metrics/MetricsFacade.java index e6e112aded8af539aaea8131a9c4bf9878cc06c1..debfc4d2f8225be4f0c632c855514d40d64c5dd5 100644 --- a/core/src/main/java/cz/muni/fi/pa165/core/metrics/MetricsFacade.java +++ b/core/src/main/java/cz/muni/fi/pa165/core/metrics/MetricsFacade.java @@ -1,6 +1,8 @@ package cz.muni.fi.pa165.core.metrics; import cz.muni.fi.pa165.core.common.DomainFacade; +import cz.muni.fi.pa165.core.smartmeter.SmartMeter; +import cz.muni.fi.pa165.core.smartmeter.SmartMeterService; import cz.muni.fi.pa165.model.dto.metrics.MetricsCreateDto; import cz.muni.fi.pa165.model.dto.metrics.MetricsDto; import cz.muni.fi.pa165.model.dto.metrics.MetricsUpdateDto; @@ -13,10 +15,22 @@ public class MetricsFacade extends DomainFacade<Metrics, MetricsCreateDto, MetricsUpdateDto> { private MetricsService metricsService; // For the "MetricsService" specific methods + private final SmartMeterService smartMeterService; @Autowired public MetricsFacade(MetricsService metricsService, - MetricsMapper metricsMapper) { + MetricsMapper metricsMapper, SmartMeterService smartMeterService) { super(metricsService, metricsMapper); this.metricsService = metricsService; + this.smartMeterService = smartMeterService; + } + + @Override + public MetricsDto create(MetricsCreateDto metricsCreateDto){ + Metrics metrics = mapper.fromCreateDto(metricsCreateDto); + SmartMeter smartMeter = smartMeterService.findById(metricsCreateDto.getSmartMeterId()); + metrics.setSmartMeter(smartMeter); + + Metrics metricsCreated = metricsService.create(metrics); + return mapper.toDto(metricsCreated); } } diff --git a/core/src/main/java/cz/muni/fi/pa165/core/smartmeter/SmartMeterFacade.java b/core/src/main/java/cz/muni/fi/pa165/core/smartmeter/SmartMeterFacade.java index 4312f57c888b5f412535cf896fbfb8de8ae0f5d5..325cfbc8fa2b1e2a1f2a1afc22c4165d347f8b37 100644 --- a/core/src/main/java/cz/muni/fi/pa165/core/smartmeter/SmartMeterFacade.java +++ b/core/src/main/java/cz/muni/fi/pa165/core/smartmeter/SmartMeterFacade.java @@ -1,11 +1,15 @@ package cz.muni.fi.pa165.core.smartmeter; import cz.muni.fi.pa165.core.common.DomainFacade; +import cz.muni.fi.pa165.core.device.DeviceService; +import cz.muni.fi.pa165.core.house.HouseService; +import cz.muni.fi.pa165.core.metrics.MetricsService; import cz.muni.fi.pa165.model.dto.smartDevice.SmartMeterCreateDto; import cz.muni.fi.pa165.model.dto.smartDevice.SmartMeterDto; import cz.muni.fi.pa165.model.dto.smartDevice.SmartMeterUpdateDto; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; @Component public class SmartMeterFacade extends DomainFacade<SmartMeter, @@ -13,12 +17,36 @@ public class SmartMeterFacade extends DomainFacade<SmartMeter, SmartMeterCreateDto, SmartMeterUpdateDto> { private final SmartMeterService smartMeterService; // For the "SmartMeterService" specific methods - + private final DeviceService deviceService; + private final HouseService houseService; + private final MetricsService metricsService; @Autowired public SmartMeterFacade(SmartMeterService smartMeterService, - SmartMeterMapper smartMeterMapper - ) { + SmartMeterMapper smartMeterMapper, + DeviceService deviceService, HouseService houseService, MetricsService metricsService) { super(smartMeterService, smartMeterMapper); this.smartMeterService = smartMeterService; + this.deviceService = deviceService; + this.houseService = houseService; + this.metricsService = metricsService; + } + + @Override + public SmartMeterDto create(SmartMeterCreateDto smartMeterCreateDto){ + SmartMeter smartMeter = mapper.fromCreateDto(smartMeterCreateDto); + smartMeter.setDevice(deviceService.findById(smartMeterCreateDto.getDeviceId())); + smartMeter.setHouse(houseService.findById(smartMeterCreateDto.getHouseId())); + return mapper.toDto(smartMeterService.create(smartMeter)); + } + + @Override + @Transactional + public SmartMeterDto deleteById(String id){ + // soft delete Smart Devices + SmartMeter smartMeter = smartMeterService.findById(id); + metricsService.deleteAllById((String[]) smartMeter.getMetricsList().stream().map(sm -> smartMeter.getId()).toArray()); + + SmartMeter smartMeterDeleted = smartMeterService.deleteById(smartMeter.getId()); + return mapper.toDto(smartMeterDeleted); } } diff --git a/core/src/main/java/cz/muni/fi/pa165/core/user/UserController.java b/core/src/main/java/cz/muni/fi/pa165/core/user/UserController.java index 317a298869e35105b831a027539e4c17ca7f7d35..ad867dbbbd7939a47d10167f63ef19758bab1e1a 100644 --- a/core/src/main/java/cz/muni/fi/pa165/core/user/UserController.java +++ b/core/src/main/java/cz/muni/fi/pa165/core/user/UserController.java @@ -131,6 +131,7 @@ public class UserController { }) public UserDto deleteById( @Parameter(description = "ID of the user to be deleted") @PathVariable String id) { + return userFacade.deleteById(id); } diff --git a/core/src/main/java/cz/muni/fi/pa165/core/user/roles/RoleController.java b/core/src/main/java/cz/muni/fi/pa165/core/user/roles/RoleController.java index 3abef5e887ffa31a77718d16d2976a239cb0180e..31a36ffdebc55bbf7e2159eea3914e3290fa596c 100644 --- a/core/src/main/java/cz/muni/fi/pa165/core/user/roles/RoleController.java +++ b/core/src/main/java/cz/muni/fi/pa165/core/user/roles/RoleController.java @@ -72,7 +72,6 @@ public class RoleController { public CompanyRoleDto createCompanyRole( @Parameter(description = "Role to be created") @RequestBody CompanyRoleDto roleDto) { return roleFacade.createCompanyRole(roleDto); - //return new CompanyRole(); } @Operation( diff --git a/model/src/main/java/cz/muni/fi/pa165/model/dto/metrics/MetricsCreateDto.java b/model/src/main/java/cz/muni/fi/pa165/model/dto/metrics/MetricsCreateDto.java index 5884c44ffd86481afffc74f5f84d62d5d9950beb..b4a683d80c667396bdc40772e3c51d2e4547ae49 100644 --- a/model/src/main/java/cz/muni/fi/pa165/model/dto/metrics/MetricsCreateDto.java +++ b/model/src/main/java/cz/muni/fi/pa165/model/dto/metrics/MetricsCreateDto.java @@ -8,4 +8,5 @@ import lombok.Setter; @Setter public class MetricsCreateDto extends DomainObjectDto { private double consumptionKWH; + private String smartMeterId; } diff --git a/model/src/main/java/cz/muni/fi/pa165/model/dto/smartDevice/SmartMeterCreateDto.java b/model/src/main/java/cz/muni/fi/pa165/model/dto/smartDevice/SmartMeterCreateDto.java index 4d3007de99e61fad394513a435d225bc6759b630..6854ff914a05e4d207a6fdede5d846c8c6502748 100644 --- a/model/src/main/java/cz/muni/fi/pa165/model/dto/smartDevice/SmartMeterCreateDto.java +++ b/model/src/main/java/cz/muni/fi/pa165/model/dto/smartDevice/SmartMeterCreateDto.java @@ -10,4 +10,6 @@ import lombok.Setter; @Setter public class SmartMeterCreateDto extends DomainObjectDto { private String name; + private String houseId; + private String deviceId; }