DatasourceService.java

package se.jobtechdev.personaldatagateway.api.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import se.jobtechdev.personaldatagateway.api.exception.MalformedURLRuntimeException;
import se.jobtechdev.personaldatagateway.api.generated.entities.DatasourceEntity;
import se.jobtechdev.personaldatagateway.api.generated.entities.OrganizationEntity;
import se.jobtechdev.personaldatagateway.api.repository.DatasourceRepository;
import se.jobtechdev.personaldatagateway.api.util.TimeProvider;
import se.jobtechdev.personaldatagateway.api.util.UuidProvider;

import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.util.Optional;
import java.util.UUID;

@Component
public class DatasourceService {
  private final DatasourceRepository datasourceRepository;

  @SuppressWarnings("unused")
  @Autowired
  public DatasourceService(DatasourceRepository datasourceRepository) {
    this.datasourceRepository = datasourceRepository;
  }

  public Page<DatasourceEntity> getDatasources(Pageable pageable) {
    return datasourceRepository.findAll(pageable);
  }

  public Optional<DatasourceEntity> getDatasourceById(UUID id) {
    return datasourceRepository.findById(id);
  }

  @Transactional
  public Optional<DatasourceEntity> createDatasource(
      OrganizationEntity organization, String name, String path, String headers, String method) {
    final URL datatypeUrl;
    try {
      datatypeUrl =
          URI.create("http://example.com/datatypes/6871e92f-5374-4f83-b743-e9966913cbbb").toURL();
    } catch (MalformedURLException e) {
      throw new MalformedURLRuntimeException(e);
    }

    final var datasourceId = UuidProvider.uuid();
    final var now = TimeProvider.now();

    final var datasource =
        new DatasourceEntity(datasourceId, organization, name, datatypeUrl, path, now, now);
    datasource.setHeaders(headers);
    datasource.setMethod(method);
    final var saved = datasourceRepository.save(datasource);
    return Optional.of(saved);
  }

  @Transactional
  public DatasourceEntity save(DatasourceEntity datasource) {
    return datasourceRepository.save(datasource);
  }

  @Transactional
  public DatasourceEntity update(DatasourceEntity datasource) {
    final var updated = TimeProvider.now();
    datasource.setUpdated(updated);
    return datasourceRepository.save(datasource);
  }
}