package pl.com.bottega.documentmanagement.api; import com.google.common.collect.Sets; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import pl.com.bottega.documentmanagement.domain.*; import pl.com.bottega.documentmanagement.domain.repositories.DocumentRepository; import pl.com.bottega.documentmanagement.domain.repositories.EmployeeRepository; import java.util.Set; import java.util.stream.Collectors; import static com.google.common.base.Preconditions.checkNotNull; /** * Created by maciuch on 12.06.16. */ @Service public class DocumentFlowProcess { private DocumentFactory documentFactory; private DocumentRepository documentRepository; private EmployeeRepository employeeRepository; private UserManager userManager; public DocumentFlowProcess(DocumentRepository documentRepository, UserManager userManager, DocumentFactory documentFactory, EmployeeRepository employeeRepository ) { this.documentRepository = documentRepository; this.userManager = userManager; this.documentFactory = documentFactory; this.employeeRepository = employeeRepository; } @Transactional @RequiresAuth(roles = "EDITOR") public DocumentNumber create(String title, String content) { checkNotNull(title); checkNotNull(content); Document document = documentFactory.create(title, content); documentRepository.save(document); return document.number(); } @Transactional @RequiresAuth(roles = "EDITOR") public void change(DocumentNumber documentNumber, String newTitle, String newContent) { checkNotNull(documentNumber); checkNotNull(newTitle); checkNotNull(newContent); Document document = documentRepository.load(documentNumber); document.change(newTitle, newContent); documentRepository.save(document); } @Transactional @RequiresAuth(roles = "MANAGER") public void verify(DocumentNumber documentNumber) { checkNotNull(documentNumber); Document document = documentRepository.load(documentNumber); document.verify(userManager.currentEmployee()); documentRepository.save(document); } @Transactional @RequiresAuth(roles = "MANAGER") public void publish(DocumentNumber documentNumber, Iterable<EmployeeId> ids) { checkNotNull(documentNumber); Document document = documentRepository.load(documentNumber); document.publish(userManager.currentEmployee(), getEmployees(ids)); } private Set<Employee> getEmployees(Iterable<EmployeeId> ids) { Set<Employee> employees = employeeRepository.findByEmployeeIds(ids); ids.forEach((id) -> { if (!employees.stream().anyMatch((employee) -> employee.employeeId().equals(id))) employees.add(new Employee(id)); }); return employees; } @Transactional @RequiresAuth(roles = "MANAGER") public void archive(DocumentNumber documentNumber) { checkNotNull(documentNumber); Document document = documentRepository.load(documentNumber); document.delete(userManager.currentEmployee()); documentRepository.save(document); } }