OrganizationService.java

package se.jobtechdev.personaldatagateway.api.service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import se.jobtechdev.personaldatagateway.api.generated.entities.OrganizationEntity;
import se.jobtechdev.personaldatagateway.api.repository.OrganizationRepository;
import se.jobtechdev.personaldatagateway.api.util.ApiExceptionFactory;
import se.jobtechdev.personaldatagateway.api.util.ProblemDetailsFactory;
import se.jobtechdev.personaldatagateway.api.util.TimeProvider;
import se.jobtechdev.personaldatagateway.api.util.UuidProvider;

import java.util.Optional;
import java.util.UUID;

@Component
public class OrganizationService {

  private static final Logger logger = LoggerFactory.getLogger(OrganizationService.class);

  private final OrganizationRepository organizationRepository;

  @Autowired
  public OrganizationService(OrganizationRepository organizationRepository) {
    this.organizationRepository = organizationRepository;
  }

  public Page<OrganizationEntity> getOrganizations(Pageable pageable) {
    return organizationRepository.findAll(pageable);
  }

  public Optional<OrganizationEntity> getOrganizationById(UUID id) {
    return organizationRepository.findById(id);
  }

  public Optional<OrganizationEntity> getOrganizationByOrgNr(String orgNr) {
    return organizationRepository.findByOrgNr(orgNr);
  }

  @Transactional
  public Optional<OrganizationEntity> createOrganization(String orgNr, String name) {
    final var organizationId = UuidProvider.uuid();
    final var now = TimeProvider.now();
    final var organization = new OrganizationEntity(organizationId, orgNr, name, now, now);

    OrganizationEntity saved;
    try {
      saved = organizationRepository.save(organization);
      return Optional.of(saved);
    } catch (DataIntegrityViolationException e) {
      final var exceptionClassName = e.getClass().getName();
      final var exceptionMessage = e.getMessage();
      logger.error("{} {}", exceptionClassName, exceptionMessage);
      throw ApiExceptionFactory.createApiException(
          ProblemDetailsFactory.createProblemDetails(HttpStatus.CONFLICT, e.getMessage()));
    }
  }

  @Transactional
  public OrganizationEntity save(OrganizationEntity organization) {
    return organizationRepository.save(organization);
  }

  @Transactional
  public OrganizationEntity update(OrganizationEntity organization) {
    final var updated = TimeProvider.now();
    organization.setUpdated(updated);
    return organizationRepository.save(organization);
  }
}