View Javadoc
1   package fr.tiogars.chat.domains.task.services;
2   
3   import java.util.Optional;
4   
5   import org.springframework.beans.factory.annotation.Autowired;
6   import org.springframework.stereotype.Service;
7   import org.springframework.transaction.annotation.Transactional;
8   
9   import fr.tiogars.chat.domains.task.entities.TaskEntity;
10  import fr.tiogars.chat.domains.task.models.CreateTaskRequest;
11  import fr.tiogars.chat.domains.task.models.Task;
12  import fr.tiogars.chat.domains.task.repositories.TaskRepository;
13  
14  /**
15   * Creates Tasks when their business code is available.
16   *
17   * @since 0.1.0
18   */
19  @Service
20  public class TaskCreateService {
21  
22      private final TaskRepository repository;
23  
24      @Autowired
25      private TaskReferences references;
26  
27      /**
28       * Creates a service using Spring Data auditing.
29       *
30       * @param repository domain record repository
31       */
32      @Autowired
33      public TaskCreateService(TaskRepository repository) {
34          this.repository = repository;
35      }
36  
37      /**
38       * Creates a Task when its code does not already exist.
39       *
40       * @param request business data to create
41       * @return created template, or an empty optional when the code exists
42       */
43      @Transactional
44      public Optional<Task> create(CreateTaskRequest request) {
45          if (repository.findByCode(request.code()).isPresent()) {
46              return Optional.empty();
47          }
48          TaskEntity entity = new TaskEntity(
49                  request.code(), request.label(), request.description());
50          entity.attributes(request.status(), request.priority(), request.dueDate(), request.assignedTo());
51          if (references != null) {
52              references.apply(entity, request.tagIds(), request.nomenclatureId());
53          }
54          return Optional.of(toRecord(repository.saveAndFlush(entity)));
55      }
56  
57      private static Task toRecord(TaskEntity entity) {
58          return new Task(
59                  entity.getId(),
60                  entity.getCode(),
61                  entity.getLabel(),
62                  entity.getDescription(),
63                  entity.getCreatedDate(),
64                  entity.getLastModifiedDate(),
65                  entity.getCreatedBy(),
66                  entity.getLastModifiedBy(),
67                  entity.getStatus(), entity.getPriority(), entity.getDueDate(), entity.getAssignedTo(),
68                  entity.getTagIds(), entity.getNomenclatureId());
69      }
70  }