package net.petrikainulainen.springdata.jpa.todo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Optional;
/**
* @author Petri Kainulainen
*/
@Service
final class RepositoryTodoService implements TodoCrudService {
private static final Logger LOGGER = LoggerFactory.getLogger(RepositoryTodoService.class);
private final TodoRepository repository;
@Autowired
RepositoryTodoService(TodoRepository repository) {
this.repository = repository;
}
@Transactional
@Override
public TodoDTO create(TodoDTO newTodoEntry) {
LOGGER.info("Creating a new todo entry by using information: {}", newTodoEntry);
Todo created = Todo.getBuilder()
.description(newTodoEntry.getDescription())
.title(newTodoEntry.getTitle())
.build();
created = repository.save(created);
LOGGER.info("Created a new todo entry: {}", created);
return TodoMapper.mapEntityIntoDTO(created);
}
@Transactional
@Override
public TodoDTO delete(Long id) {
LOGGER.info("Deleting a todo entry with id: {}", id);
Optional<Todo> deleted = repository.deleteById(id);
LOGGER.info("Deleted todo entry: {}", deleted);
Todo returned = deleted.orElseThrow(() -> new TodoNotFoundException(id));
return TodoMapper.mapEntityIntoDTO(returned);
}
@Transactional(readOnly = true)
@Override
public List<TodoDTO> findAll() {
LOGGER.info("Finding all todo entries.");
List<Todo> todoEntries = repository.findAll();
LOGGER.info("Found {} todo entries", todoEntries.size());
return TodoMapper.mapEntitiesIntoDTOs(todoEntries);
}
@Transactional(readOnly = true)
@Override
public TodoDTO findById(Long id) {
LOGGER.info("Finding todo entry by using id: {}", id);
Todo todoEntry = findTodoEntryById(id);
LOGGER.info("Found todo entry: {}", todoEntry);
return TodoMapper.mapEntityIntoDTO(todoEntry);
}
@Transactional
@Override
public TodoDTO update(TodoDTO updatedTodoEntry) {
LOGGER.info("Updating the information of a todo entry by using information: {}", updatedTodoEntry);
Todo updated = findTodoEntryById(updatedTodoEntry.getId());
updated.update(updatedTodoEntry.getTitle(), updatedTodoEntry.getDescription());
//We need to flush the changes or otherwise the returned object
//doesn't contain the updated audit information.
repository.flush();
LOGGER.info("Updated the information of the todo entry: {}", updated);
return TodoMapper.mapEntityIntoDTO(updated);
}
private Todo findTodoEntryById(Long id) {
Optional<Todo> todoResult = repository.findOne(id);
return todoResult.orElseThrow(() -> new TodoNotFoundException(id));
}
}