diff --git a/src/main/java/app/smartpot/api/actuators/controller/ActuatorController.java b/src/main/java/app/smartpot/api/actuators/controller/ActuatorController.java new file mode 100644 index 0000000..fc3413c --- /dev/null +++ b/src/main/java/app/smartpot/api/actuators/controller/ActuatorController.java @@ -0,0 +1,97 @@ +package app.smartpot.api.actuators.controller; + +import app.smartpot.api.responses.ErrorResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import app.smartpot.api.actuators.model.dto.ActuatorDTO; +import app.smartpot.api.actuators.service.ActuatorService; + +@RestController +@RequestMapping("/Actuators") +public class ActuatorController { + + // TODO: Documentar mejor, por ejemplo como en UserController + + private final ActuatorService serviceActuator; + + @Autowired + public ActuatorController(ActuatorService serviceActuator) { + this.serviceActuator = serviceActuator; + } + + + /** + * Obtiene todos los actuadores almacenados en el sistema. + * + * @return Lista de todos los actuadores existentes + */ + @GetMapping("/All") + public ResponseEntity getAllActuators() { + try { + return new ResponseEntity<>(serviceActuator.getAllActuators(), HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>(new ErrorResponse("Error al buscar los actuadores [" + e.getMessage() + "]", HttpStatus.NOT_FOUND.value()), HttpStatus.NOT_FOUND); + } + } + + /** + * Obtiene el actuador con el identificador proporcionado. + * + * @param id Es el identificador del actuador + * @return El actuador que tenga la id suministrada + */ + @GetMapping("/{id}") + public ResponseEntity getActuatorById(@PathVariable String id) { + try { + return new ResponseEntity<>(serviceActuator.getActuatorById(id), HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>(new ErrorResponse("Error al buscar los actuadores [" + e.getMessage() + "]", HttpStatus.NOT_FOUND.value()), HttpStatus.NOT_FOUND); + } + } + + /** + * Obtiene todos los actuadores almacenados en el sistema para un cultivo especificado. + * + * @param id Es el identificador del cultivo + * @return Lista de todos los actuadores existentes + */ + @GetMapping("/crop/{id}") + public ResponseEntity getActuatorByCrop(@PathVariable String id) { + try { + return new ResponseEntity<>(serviceActuator.getActuatorsByCrop(id), HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>(new ErrorResponse("Error al buscar el actuadores [" + e.getMessage() + "]", HttpStatus.NOT_FOUND.value()), HttpStatus.NOT_FOUND); + } + + } + + @PostMapping("/Create") + public ResponseEntity createActuator(@RequestBody ActuatorDTO actuator) { + try { + return new ResponseEntity<>(serviceActuator.createActuator(actuator), HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>(new ErrorResponse("Error al crear el actuador [" + e.getMessage() + "]", HttpStatus.NOT_FOUND.value()), HttpStatus.NOT_FOUND); + } + } + + @PutMapping("/Update/{id}") + public ResponseEntity updateActuator(@PathVariable String id, @RequestBody ActuatorDTO actuator) { + try { + return new ResponseEntity<>(serviceActuator.updateActuator(serviceActuator.getActuatorById(id).getId(), actuator), HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>(new ErrorResponse("Error al actualizar el actuador [" + e.getMessage() + "]", HttpStatus.NOT_FOUND.value()), HttpStatus.NOT_FOUND); + } + } + + @DeleteMapping("/Delete/{id}") + public ResponseEntity deleteActuator(@PathVariable String id) { + try { + return new ResponseEntity<>(serviceActuator.deleteActuatorById(serviceActuator.getActuatorById(id).getId()), HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>(new ErrorResponse("Error al eliminar el actuador [" + e.getMessage() + "]", HttpStatus.NOT_FOUND.value()), HttpStatus.NOT_FOUND); + } + } + +} diff --git a/src/main/java/app/smartpot/api/actuators/mapper/ActuatorMapper.java b/src/main/java/app/smartpot/api/actuators/mapper/ActuatorMapper.java new file mode 100644 index 0000000..3de202a --- /dev/null +++ b/src/main/java/app/smartpot/api/actuators/mapper/ActuatorMapper.java @@ -0,0 +1,31 @@ +package app.smartpot.api.actuators.mapper; + +import org.bson.types.ObjectId; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; +import app.smartpot.api.actuators.model.dto.ActuatorDTO; +import app.smartpot.api.actuators.model.entity.Actuator; + +@Mapper(componentModel = "spring") +public interface ActuatorMapper { + ActuatorMapper INSTANCE = Mappers.getMapper(ActuatorMapper.class); + + @Mapping(source = "id", target = "id", qualifiedByName = "stringToObjectId") + @Mapping(source = "crop", target = "crop", qualifiedByName = "stringToObjectId") + Actuator toEntity(ActuatorDTO recordDTO); + + @Mapping(source = "id", target = "id", qualifiedByName = "objectIdToString") + @Mapping(source = "crop", target = "crop", qualifiedByName = "objectIdToString") + ActuatorDTO toDTO(Actuator history); + + @org.mapstruct.Named("objectIdToString") + default String objectIdToString(ObjectId objectId) { + return objectId != null ? objectId.toHexString() : null; + } + + @org.mapstruct.Named("stringToObjectId") + default ObjectId stringToObjectId(String id) { + return id != null ? new ObjectId(id) : null; + } +} diff --git a/src/main/java/app/smartpot/api/actuators/model/dto/ActuatorDTO.java b/src/main/java/app/smartpot/api/actuators/model/dto/ActuatorDTO.java new file mode 100644 index 0000000..29656cf --- /dev/null +++ b/src/main/java/app/smartpot/api/actuators/model/dto/ActuatorDTO.java @@ -0,0 +1,20 @@ +package app.smartpot.api.actuators.model.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import app.smartpot.api.actuators.model.entity.ActuatorType; + +@Data +public class ActuatorDTO { + @Schema(description = "ID único de la instrucción del actuador, generado automáticamente por la base de datos.", + example = "676ae2a9b909de5f9607fcb6", hidden = true) + private String id = null; + + @Schema(description = "Identificador del cultivo asociado.", + example = "") + private String crop; + + @Schema(description = "Tipo de actuador que se desea activar.", + example = "WATER_PUMP") + private ActuatorType type; +} diff --git a/src/main/java/app/smartpot/api/actuators/model/entity/Actuator.java b/src/main/java/app/smartpot/api/actuators/model/entity/Actuator.java new file mode 100644 index 0000000..1b0b8da --- /dev/null +++ b/src/main/java/app/smartpot/api/actuators/model/entity/Actuator.java @@ -0,0 +1,30 @@ +package app.smartpot.api.actuators.model.entity; + +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.bson.types.ObjectId; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; +import org.springframework.data.mongodb.core.mapping.Field; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Document(collection = "actuadores") +public class Actuator { + @Id + @Field("_id") + private ObjectId id; + + @NotNull(message = "El registro debe estar asociado a un cultivo") + @Field("crop") + private ObjectId crop; + + @NotNull(message = "El tipo de actuador no puede ser nulo") + @Field("type") + private ActuatorType type; +} diff --git a/src/main/java/app/smartpot/api/actuators/model/entity/ActuatorType.java b/src/main/java/app/smartpot/api/actuators/model/entity/ActuatorType.java new file mode 100644 index 0000000..0c06962 --- /dev/null +++ b/src/main/java/app/smartpot/api/actuators/model/entity/ActuatorType.java @@ -0,0 +1,5 @@ +package app.smartpot.api.actuators.model.entity; + +public enum ActuatorType { + UV_LIGHT, WATER_PUMP, HUMIDIFIER +} diff --git a/src/main/java/app/smartpot/api/actuators/repository/ActuatorRepository.java b/src/main/java/app/smartpot/api/actuators/repository/ActuatorRepository.java new file mode 100644 index 0000000..9ae0148 --- /dev/null +++ b/src/main/java/app/smartpot/api/actuators/repository/ActuatorRepository.java @@ -0,0 +1,36 @@ +package app.smartpot.api.actuators.repository; + +import jakarta.validation.constraints.NotNull; +import org.bson.types.ObjectId; +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.data.mongodb.repository.Query; +import org.springframework.stereotype.Repository; +import app.smartpot.api.actuators.model.entity.Actuator; + +import java.util.List; +import java.util.Optional; + +@Repository +public interface ActuatorRepository extends MongoRepository { + + /** + * Busca el registro de actuador con la id espesificada + * + * @param id El identificado del registro del actuador. + * @return Devuelve el actuador, en caso de ser encontrado. + */ + @Query("{'_id': ?0}") + Optional findById( + @NotNull(message = "Se necesita el id del actuador") + ObjectId id); + + /** + * Busca los registros de actuadorres con el identificador del cultivo espesificado + * + * @param crop El identificado del cultivo relacionado a registros del actuadores. + * @return Devuelve una lista de actuadores. + */ + List findByCrop( + @NotNull(message = "El registro debe estar asociado a un cultivo") + ObjectId crop); +} diff --git a/src/main/java/app/smartpot/api/actuators/service/ActuatorService.java b/src/main/java/app/smartpot/api/actuators/service/ActuatorService.java new file mode 100644 index 0000000..4b657ff --- /dev/null +++ b/src/main/java/app/smartpot/api/actuators/service/ActuatorService.java @@ -0,0 +1,21 @@ +package app.smartpot.api.actuators.service; + +import app.smartpot.api.actuators.model.dto.ActuatorDTO; + +import java.util.List; + +public interface ActuatorService { + List getAllActuators() throws Exception; + + ActuatorDTO getActuatorById(String id) throws Exception; + + List getActuatorsByCrop(String crop) throws Exception; + + ActuatorDTO createActuator(ActuatorDTO actuator) throws Exception; + + ActuatorDTO updateActuator(String id , ActuatorDTO actuator) throws Exception; + + String deleteActuatorById(String id) throws Exception; + + //ResponseEntity deleteActuators(List ids); +} diff --git a/src/main/java/app/smartpot/api/actuators/service/ActuatorServiceImpl.java b/src/main/java/app/smartpot/api/actuators/service/ActuatorServiceImpl.java new file mode 100644 index 0000000..9d37b46 --- /dev/null +++ b/src/main/java/app/smartpot/api/actuators/service/ActuatorServiceImpl.java @@ -0,0 +1,111 @@ +package app.smartpot.api.actuators.service; + +import jakarta.validation.ValidationException; +import lombok.Builder; +import lombok.Data; +import org.bson.types.ObjectId; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import app.smartpot.api.actuators.mapper.ActuatorMapper; +import app.smartpot.api.actuators.model.dto.ActuatorDTO; +import app.smartpot.api.actuators.repository.ActuatorRepository; +import app.smartpot.api.crops.service.CropService; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@Data +@Builder +@Service +public class ActuatorServiceImpl implements ActuatorService { + + private final ActuatorRepository actuatorRepository; + private final CropService serviceCrop; + private final ActuatorMapper actuatorMapper; + + @Autowired + public ActuatorServiceImpl(ActuatorRepository actuatorRepository, CropService serviceCrop, ActuatorMapper actuatorMapper) { + this.actuatorRepository = actuatorRepository; + this.serviceCrop = serviceCrop; + this.actuatorMapper = actuatorMapper; + } + + @Override + public List getAllActuators() throws Exception { + return Optional.of(actuatorRepository.findAll()) + .filter(actuators -> !actuators.isEmpty()) + .map(actuators -> actuators.stream() + .map(actuatorMapper::toDTO) + .collect(Collectors.toList())) + .orElseThrow(() -> new Exception("No existe ningún actuador")); + } + + @Override + public ActuatorDTO getActuatorById(String id) throws Exception { + return Optional.of(id) + .map(ValidId -> { + if (!ObjectId.isValid(id)) { + throw new ValidationException("Id invalido"); + } + return new ObjectId(ValidId); + }) + .map(actuatorRepository::findById) + .filter(Optional::isPresent) + .map(Optional::get) + .map(actuatorMapper::toDTO) + .orElseThrow(() -> new Exception("El Actuador no existe")); + } + + @Override + public List getActuatorsByCrop(String crop) throws Exception { + return Optional.of(crop) + .map(id -> { + if (!ObjectId.isValid(id)) { + throw new ValidationException("Id de crop invalido"); + } + return new ObjectId(id); + }) + .map(actuatorRepository::findByCrop) + .filter(users -> !users.isEmpty()) + .map(actuators -> actuators.stream() + .map(actuatorMapper::toDTO) + .collect(Collectors.toList()) + ) + .orElseThrow(() -> new Exception("El actuador no existe")); + } + + @Override + public ActuatorDTO createActuator(ActuatorDTO actuator) throws Exception { + return Optional.of(actuator) + .map(actuatorMapper::toEntity) + .map(actuatorRepository::save) + .map(actuatorMapper::toDTO) + .orElseThrow(() -> new IllegalStateException("El Usuario ya existe")); + } + + @Override + public ActuatorDTO updateActuator(String id, ActuatorDTO actuator) throws Exception { + ActuatorDTO existingActuator = getActuatorById(id); + return Optional.of(actuator) + .map(updated -> { + existingActuator.setType(updated.getType()); + return existingActuator; + }) + .map(actuatorMapper::toEntity) + .map(actuatorRepository::save) + .map(actuatorMapper::toDTO) + .orElseThrow(() -> new Exception("El usuario no se pudo actualizar")); + } + + @Override + public String deleteActuatorById(String id) throws Exception { + return Optional.of(getActuatorById(id)) + .map(user -> { + actuatorRepository.deleteById(new ObjectId(user.getId())); + return "El Usuario con ID '" + id + "' fue eliminado."; + }) + .orElseThrow(() -> new Exception("El Usuario no existe.")); + } + +} diff --git a/src/main/java/app/smartpot/api/commands/controller/CommandController.java b/src/main/java/app/smartpot/api/commands/controller/CommandController.java index 8fd2317..cf54b85 100644 --- a/src/main/java/app/smartpot/api/commands/controller/CommandController.java +++ b/src/main/java/app/smartpot/api/commands/controller/CommandController.java @@ -17,7 +17,7 @@ import org.springframework.web.bind.annotation.*; @RestController -@RequestMapping("/Comandos") +@RequestMapping("/Commands") public class CommandController { private final CommandService commandService; @@ -70,6 +70,27 @@ public ResponseEntity getAllCommand() { } } + @GetMapping("/crop/{crop}") + @Operation(summary = "Obtener todos los comandos de un cultivo", + description = "Recupera todos los comandos asociados a un cultivo en el sistema. " + + "En caso de no haber comandos, se devolverá una excepción.", + responses = { + @ApiResponse(description = "Comandos encontrados", + responseCode = "200", + content = @Content(mediaType = "application/json", + array = @ArraySchema(schema = @Schema(implementation = CommandDTO.class)))), + @ApiResponse(responseCode = "404", + description = "No se encontraron Comandos registrados.", + content = @Content(mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class))) + }) + public ResponseEntity getCommandsByCrop(@PathVariable String crop) { + try { + return new ResponseEntity<>(commandService.getCommandsByCrop(crop), HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>(new ErrorResponse("Error al obtener los comandos [" + e.getMessage() + "]", HttpStatus.INTERNAL_SERVER_ERROR.value()), HttpStatus.INTERNAL_SERVER_ERROR); + } + } + @GetMapping("/id/{id}") @Operation(summary = "Buscar comando por ID", description = "Recupera un comando utilizando su ID único. " @@ -82,7 +103,7 @@ public ResponseEntity getAllCommand() { description = "Comando no encontrado con el ID especificado.", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class))) }) - public ResponseEntity getUserById(@PathVariable String id) { + public ResponseEntity getCommandById(@PathVariable String id) { try { return new ResponseEntity<>(commandService.getCommandById(id), HttpStatus.OK); } catch (Exception e) { diff --git a/src/main/java/app/smartpot/api/commands/mapper/CommandMapper.java b/src/main/java/app/smartpot/api/commands/mapper/CommandMapper.java index 29cac85..2ab1cc0 100644 --- a/src/main/java/app/smartpot/api/commands/mapper/CommandMapper.java +++ b/src/main/java/app/smartpot/api/commands/mapper/CommandMapper.java @@ -13,10 +13,12 @@ public interface CommandMapper { @Mapping(source = "id", target = "id", qualifiedByName = "stringToObjectId") @Mapping(source = "crop", target = "crop", qualifiedByName = "stringToObjectId") + @Mapping(source = "actuator", target = "actuator", qualifiedByName = "stringToObjectId") Command toEntity(CommandDTO commandDTO); @Mapping(source = "id", target = "id", qualifiedByName = "objectIdToString") @Mapping(source = "crop", target = "crop", qualifiedByName = "objectIdToString") + @Mapping(source = "actuator", target = "actuator", qualifiedByName = "objectIdToString") CommandDTO toDTO(Command command); @org.mapstruct.Named("objectIdToString") diff --git a/src/main/java/app/smartpot/api/commands/model/dto/CommandDTO.java b/src/main/java/app/smartpot/api/commands/model/dto/CommandDTO.java index c68efb6..a0545bc 100644 --- a/src/main/java/app/smartpot/api/commands/model/dto/CommandDTO.java +++ b/src/main/java/app/smartpot/api/commands/model/dto/CommandDTO.java @@ -1,6 +1,7 @@ package app.smartpot.api.commands.model.dto; import lombok.Data; +import app.smartpot.api.commands.model.entity.CommandStatus; import java.io.Serializable; @@ -8,7 +9,8 @@ public class CommandDTO implements Serializable { private String id; private String commandType; - private String status; + private String actuator; + private CommandStatus status; private String dateCreated; private String dateExecuted; private String response; diff --git a/src/main/java/app/smartpot/api/commands/model/entity/Command.java b/src/main/java/app/smartpot/api/commands/model/entity/Command.java index dc34df4..3bb6f1d 100644 --- a/src/main/java/app/smartpot/api/commands/model/entity/Command.java +++ b/src/main/java/app/smartpot/api/commands/model/entity/Command.java @@ -10,6 +10,7 @@ import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; +import app.smartpot.api.commands.model.entity.CommandStatus; import java.util.Date; @@ -36,8 +37,12 @@ public class Command { @Field("commandType") private String commandType; + @NotNull + @Field("actuator") + private ObjectId actuator; + @Field("status") - private String status; + private CommandStatus status; @NotNull(message = "La fecha de creación no puede estar vacía") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX") @@ -48,15 +53,14 @@ public class Command { @Field("dateExecuted") private Date dateExecuted; - @Field("response") private String response; @NotNull(message = "El comando debe ejecutarse en un cultivo") + //@DBRef @Field("crop") private ObjectId crop; - } /* diff --git a/src/main/java/app/smartpot/api/commands/model/entity/CommandStatus.java b/src/main/java/app/smartpot/api/commands/model/entity/CommandStatus.java new file mode 100644 index 0000000..4d65c7c --- /dev/null +++ b/src/main/java/app/smartpot/api/commands/model/entity/CommandStatus.java @@ -0,0 +1,5 @@ +package app.smartpot.api.commands.model.entity; + +public enum CommandStatus { + EXECUTED, PENDING, FAILED, ABORTED +} diff --git a/src/main/java/app/smartpot/api/commands/service/CommandService.java b/src/main/java/app/smartpot/api/commands/service/CommandService.java index d36d0b1..a46b9f6 100644 --- a/src/main/java/app/smartpot/api/commands/service/CommandService.java +++ b/src/main/java/app/smartpot/api/commands/service/CommandService.java @@ -52,6 +52,15 @@ public interface CommandService { */ List getAllCommands() throws Exception; + /** + * Retrieves all commands for a crop in the system. + * + * @param crop the unique identifier of the crop + * @return a list of {@link CommandDTO} representing all commands. + * @throws Exception if an error occurs during retrieval or if no commands exist. + */ + List getCommandsByCrop(String crop) throws Exception; + /** * Retrieves a specific command by its ID. * diff --git a/src/main/java/app/smartpot/api/commands/service/CommandServiceImpl.java b/src/main/java/app/smartpot/api/commands/service/CommandServiceImpl.java index 75f0f6e..4e0e5cd 100644 --- a/src/main/java/app/smartpot/api/commands/service/CommandServiceImpl.java +++ b/src/main/java/app/smartpot/api/commands/service/CommandServiceImpl.java @@ -2,8 +2,10 @@ import app.smartpot.api.commands.mapper.CommandMapper; import app.smartpot.api.commands.model.dto.CommandDTO; +import app.smartpot.api.commands.model.entity.CommandStatus; import app.smartpot.api.commands.repository.CommandRepository; import app.smartpot.api.crops.service.CropService; +import jakarta.validation.ValidationException; import lombok.Builder; import lombok.Data; import org.bson.types.ObjectId; @@ -17,6 +19,7 @@ import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; @@ -105,6 +108,30 @@ public List getAllCommands() throws Exception { .orElseThrow(() -> new Exception("No existe ningún comando")); } + /** + * Retrieves all commands for a crop from the repository and maps them to DTOs. + *

+ * This method is cached to improve performance when retrieving the list of commands. + * The cache is identified by the key 'crop_' under the 'commands' cache. + *

+ * + * @param crop the unique identifier of the crop to retrieve the commands + * @return a list of {@code CommandDTO} objects representing all commands + * @throws Exception if no commands exist in the repository + */ + @Override + @Cacheable(value = "commands", key = "'crop_'+#crop") + public List getCommandsByCrop(String crop) throws Exception { + return Optional.of(crop) + .map(ObjectId::new) + .map(commandRepository::findByCropId) + .filter(commands -> !commands.isEmpty()) + .map(crops -> crops.stream() + .map(commandMapper::toDTO) + .collect(Collectors.toList())) + .orElseThrow(() -> new Exception("No existe ningún comando")); + } + /** * Retrieves a command by its unique identifier and maps it to a DTO. *

@@ -145,10 +172,20 @@ public CommandDTO getCommandById(String id) throws Exception { @Transactional public CommandDTO createCommand(CommandDTO commandDTO) throws IllegalStateException { return Optional.of(commandDTO) + .map(valid -> { + try { + if (!Objects.equals(cropService.getCropById(commandDTO.getCrop()).getId(), commandDTO.getCrop())) { + throw new ValidationException("Actuator crop is different to Command Crop"); + } + return commandDTO; + } catch (Exception e) { + throw new RuntimeException(e); + } + }) .map(dto -> { SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); dto.setDateCreated(formatter.format(new Date())); - dto.setStatus("PENDING"); + dto.setStatus(CommandStatus.PENDING); return dto; }) .map(commandMapper::toEntity) @@ -174,10 +211,10 @@ public CommandDTO createCommand(CommandDTO commandDTO) throws IllegalStateExcept @CachePut(value = "commands", key = "'id:'+#id") public CommandDTO executeCommand(String id, String response) throws Exception { return Optional.of(getCommandById(id)) - .map(commandDTO -> { + .map( commandDTO -> { SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); commandDTO.setDateCreated(formatter.format(new Date())); - commandDTO.setStatus("EXECUTED"); + commandDTO.setStatus(CommandStatus.EXECUTED); commandDTO.setResponse(response); return commandDTO; }) diff --git a/src/main/java/app/smartpot/api/Records/Controller/RecordController.java b/src/main/java/app/smartpot/api/records/controller/RecordController.java similarity index 100% rename from src/main/java/app/smartpot/api/Records/Controller/RecordController.java rename to src/main/java/app/smartpot/api/records/controller/RecordController.java diff --git a/src/main/java/app/smartpot/api/Records/Mapper/RecordMapper.java b/src/main/java/app/smartpot/api/records/mapper/RecordMapper.java similarity index 100% rename from src/main/java/app/smartpot/api/Records/Mapper/RecordMapper.java rename to src/main/java/app/smartpot/api/records/mapper/RecordMapper.java diff --git a/src/main/java/app/smartpot/api/Records/Model/DTO/CropRecordDTO.java b/src/main/java/app/smartpot/api/records/model/dto/CropRecordDTO.java similarity index 100% rename from src/main/java/app/smartpot/api/Records/Model/DTO/CropRecordDTO.java rename to src/main/java/app/smartpot/api/records/model/dto/CropRecordDTO.java diff --git a/src/main/java/app/smartpot/api/Records/Model/DTO/MeasuresDTO.java b/src/main/java/app/smartpot/api/records/model/dto/MeasuresDTO.java similarity index 100% rename from src/main/java/app/smartpot/api/Records/Model/DTO/MeasuresDTO.java rename to src/main/java/app/smartpot/api/records/model/dto/MeasuresDTO.java diff --git a/src/main/java/app/smartpot/api/Records/Model/DTO/RecordDTO.java b/src/main/java/app/smartpot/api/records/model/dto/RecordDTO.java similarity index 100% rename from src/main/java/app/smartpot/api/Records/Model/DTO/RecordDTO.java rename to src/main/java/app/smartpot/api/records/model/dto/RecordDTO.java diff --git a/src/main/java/app/smartpot/api/Records/Model/Entity/DateRange.java b/src/main/java/app/smartpot/api/records/model/entity/DateRange.java similarity index 100% rename from src/main/java/app/smartpot/api/Records/Model/Entity/DateRange.java rename to src/main/java/app/smartpot/api/records/model/entity/DateRange.java diff --git a/src/main/java/app/smartpot/api/Records/Model/Entity/History.java b/src/main/java/app/smartpot/api/records/model/entity/History.java similarity index 100% rename from src/main/java/app/smartpot/api/Records/Model/Entity/History.java rename to src/main/java/app/smartpot/api/records/model/entity/History.java diff --git a/src/main/java/app/smartpot/api/Records/Model/Entity/Measures.java b/src/main/java/app/smartpot/api/records/model/entity/Measures.java similarity index 100% rename from src/main/java/app/smartpot/api/Records/Model/Entity/Measures.java rename to src/main/java/app/smartpot/api/records/model/entity/Measures.java diff --git a/src/main/java/app/smartpot/api/Records/Repository/RecordRepository.java b/src/main/java/app/smartpot/api/records/repository/RecordRepository.java similarity index 100% rename from src/main/java/app/smartpot/api/Records/Repository/RecordRepository.java rename to src/main/java/app/smartpot/api/records/repository/RecordRepository.java diff --git a/src/main/java/app/smartpot/api/Records/Service/RecordService.java b/src/main/java/app/smartpot/api/records/service/RecordService.java similarity index 100% rename from src/main/java/app/smartpot/api/Records/Service/RecordService.java rename to src/main/java/app/smartpot/api/records/service/RecordService.java diff --git a/src/main/java/app/smartpot/api/Records/Service/RecordServiceImpl.java b/src/main/java/app/smartpot/api/records/service/RecordServiceImpl.java similarity index 100% rename from src/main/java/app/smartpot/api/Records/Service/RecordServiceImpl.java rename to src/main/java/app/smartpot/api/records/service/RecordServiceImpl.java