Skip to content

Commit

Permalink
Merge pull request #5 from gdi-be/create-interface
Browse files Browse the repository at this point in the history
Introduces create interface
  • Loading branch information
KaiVolland authored Dec 16, 2024
2 parents 218f6f4 + 394d481 commit dd59fd7
Show file tree
Hide file tree
Showing 11 changed files with 172 additions and 31 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package de.terrestris.mde.mde_importer.importer;

import de.terrestris.mde.mde_backend.enumeration.MetadataProfile;
import de.terrestris.mde.mde_backend.jpa.ClientMetadataRepository;
import de.terrestris.mde.mde_backend.jpa.IsoMetadataRepository;
import de.terrestris.mde.mde_backend.jpa.TechnicalMetadataRepository;
Expand Down Expand Up @@ -34,7 +35,6 @@
import java.util.stream.Stream;

import static de.terrestris.mde.mde_backend.model.json.JsonIsoMetadata.InspireTheme.*;
import static de.terrestris.mde.mde_backend.model.json.JsonIsoMetadata.MetadataProfile.*;
import static de.terrestris.utils.xml.XmlUtils.*;

@Component
Expand Down Expand Up @@ -171,10 +171,10 @@ private void parseDatasetMetadata(XMLStreamReader reader) throws XMLStreamExcept
skipToElement(reader, "Metadaten");
var type = reader.getAttributeValue(null, "metadatenTyp");
if (type.equals("ISO")) {
json.setMetadataProfile(ISO);
json.setMetadataProfile(MetadataProfile.ISO);
}
if (type.equals("INSPIRE")) {
json.setMetadataProfile(INSPIRE_IDENTIFIED);
json.setMetadataProfile(MetadataProfile.INSPIRE_IDENTIFIED);
}
skipToElement(reader, "Titel");
metadata.setTitle(reader.getElementText());
Expand Down Expand Up @@ -345,8 +345,8 @@ private static void extractConformanceResult(XMLStreamReader reader, JsonIsoMeta
}
if (reader.getLocalName().equals("Boolean")) {
json.setValid(Boolean.parseBoolean(reader.getElementText()));
if (json.isValid() && json.getMetadataProfile().equals(INSPIRE_IDENTIFIED)) {
json.setMetadataProfile(INSPIRE_HARMONISED);
if (json.isValid() && json.getMetadataProfile().equals(MetadataProfile.INSPIRE_IDENTIFIED)) {
json.setMetadataProfile(MetadataProfile.INSPIRE_HARMONISED);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import de.terrestris.mde.mde_backend.enumeration.MetadataType;
import de.terrestris.mde.mde_backend.model.BaseMetadata;
import de.terrestris.mde.mde_backend.model.dto.MetadataCollection;
import de.terrestris.mde.mde_backend.model.dto.MetadataCreationData;
import de.terrestris.mde.mde_backend.model.dto.MetadataCreationResponse;
import de.terrestris.mde.mde_backend.model.dto.MetadataJsonPatch;
import de.terrestris.mde.mde_backend.service.MetadataCollectionService;
import io.swagger.v3.oas.annotations.Operation;
Expand Down Expand Up @@ -124,6 +126,38 @@ public MetadataCollection findOneByMetadataId(@PathVariable("metadataId") String
}
}

@PostMapping("/")
public MetadataCreationResponse create(@RequestBody MetadataCreationData creationData) {

try {
String metadataId;
if (creationData.getCloneMetadataId() != null) {
metadataId = service.create(creationData.getTitle(), creationData.getMetadataProfile(), creationData.getCloneMetadataId());
} else {
metadataId = service.create(creationData.getTitle(), creationData.getMetadataProfile());
}
MetadataCreationResponse response = new MetadataCreationResponse();
response.setMetadataId(metadataId);
response.setTitle(creationData.getTitle());

return response;
// TODO: Add more specific exception handling
} catch (Exception e) {
log.error("Error while creating metadata: {}", e.getMessage());
log.trace("Full stack trace: ", e);

throw new ResponseStatusException(
HttpStatus.INTERNAL_SERVER_ERROR,
messageSource.getMessage(
"BaseController.INTERNAL_SERVER_ERROR",
null,
LocaleContextHolder.getLocale()
),
e
);
}
}

@PatchMapping("/{metadataId}")
public BaseMetadata updateJsonValue(@RequestBody MetadataJsonPatch patch, @PathVariable("metadataId") String metadataId) {
MetadataType metadataType = patch.getType();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package de.terrestris.mde.mde_backend.enumeration;

public enum MetadataProfile {
ISO,
INSPIRE_HARMONISED,
INSPIRE_IDENTIFIED
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,12 @@
import jakarta.persistence.Table;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.hibernate.annotations.Type;

@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@Entity
@Table(name = "client_metadata")
@Data
Expand All @@ -21,4 +23,11 @@ public class ClientMetadata extends BaseMetadata {
@ToString.Exclude
private JsonClientMetadata data;

public ClientMetadata (String title, String metadataId) {
super();
setTitle(title);
setMetadataId(metadataId);
setData(new JsonClientMetadata());
}

}
Original file line number Diff line number Diff line change
@@ -1,39 +1,30 @@
package de.terrestris.mde.mde_backend.model;

import com.fasterxml.jackson.annotation.JsonTypeInfo;
import de.terrestris.mde.mde_backend.model.json.JsonIsoMetadata;
import io.hypersistence.utils.hibernate.type.json.JsonBinaryType;
import jakarta.persistence.Cacheable;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import lombok.*;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.Type;

@EqualsAndHashCode(callSuper = true)
@DynamicUpdate
@NoArgsConstructor
@Entity
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "isometadata")
@Table(name = "iso_metadata")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString(callSuper = true)
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "@type"
)
@Data
public class IsoMetadata extends BaseMetadata {

@Column
@Type(JsonBinaryType.class)
@ToString.Exclude
private JsonIsoMetadata data;

public IsoMetadata (String title, String metadataId) {
super();
setTitle(title);
setMetadataId(metadataId);
setData(new JsonIsoMetadata());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,12 @@
import jakarta.persistence.Table;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.hibernate.annotations.Type;

@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@Entity
@Table(name = "technical_metadata")
@Data
Expand All @@ -21,4 +23,11 @@ public class TechnicalMetadata extends BaseMetadata {
@ToString.Exclude
private JsonTechnicalMetadata data;

public TechnicalMetadata (String title, String metadataId) {
super();
setTitle(title);
setMetadataId(metadataId);
setData(new JsonTechnicalMetadata());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@
@AllArgsConstructor
public class MetadataCollection {

JsonTechnicalMetadata technicalMetadata;

JsonClientMetadata clientMetadata;

JsonTechnicalMetadata technicalMetadata;

JsonIsoMetadata isoMetadata;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package de.terrestris.mde.mde_backend.model.dto;

import com.fasterxml.jackson.annotation.JsonInclude;
import de.terrestris.mde.mde_backend.enumeration.MetadataProfile;
import jakarta.validation.constraints.Null;
import lombok.Data;

@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class MetadataCreationData {

private MetadataProfile metadataProfile;

private String title;

@Null
private String cloneMetadataId;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package de.terrestris.mde.mde_backend.model.dto;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;

@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class MetadataCreationResponse {

private String title;

private String metadataId;

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import de.terrestris.mde.mde_backend.enumeration.MetadataProfile;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
Expand All @@ -19,12 +20,6 @@
@AllArgsConstructor
public class JsonIsoMetadata {

public enum MetadataProfile {
ISO,
INSPIRE_HARMONISED,
INSPIRE_IDENTIFIED
}

public enum InspireTheme {
AD,
AU,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package de.terrestris.mde.mde_backend.service;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.github.fge.jsonpatch.JsonPatchException;
import de.terrestris.mde.mde_backend.enumeration.MetadataProfile;
import de.terrestris.mde.mde_backend.jpa.ClientMetadataRepository;
import de.terrestris.mde.mde_backend.jpa.IsoMetadataRepository;
import de.terrestris.mde.mde_backend.jpa.TechnicalMetadataRepository;
Expand All @@ -25,6 +27,7 @@
import java.io.IOException;
import java.util.NoSuchElementException;
import java.util.Optional;
import java.util.UUID;

@Service
public class MetadataCollectionService {
Expand Down Expand Up @@ -61,6 +64,66 @@ public Optional<MetadataCollection> findOneByMetadataId(String metadataId) {
return Optional.of(metadataCollection);
}

@PreAuthorize("hasRole('ROLE_ADMIN') or hasPermission(#entity, 'CREATE')")
@Transactional(isolation = Isolation.SERIALIZABLE)
public String create(String title, MetadataProfile profile) {
String metadataId = UUID.randomUUID().toString();

ClientMetadata clientMetadata = new ClientMetadata(title, metadataId);
TechnicalMetadata technicalMetadata = new TechnicalMetadata(title, metadataId);
IsoMetadata isoMetadata = new IsoMetadata(title, metadataId);
isoMetadata.getData().setMetadataProfile(profile);

clientMetadataRepository.save(clientMetadata);
technicalMetadataRepository.save(technicalMetadata);
isoMetadataRepository.save(isoMetadata);

return metadataId;
}

@PreAuthorize("hasRole('ROLE_ADMIN') or hasPermission(#entity, 'CREATE')")
@Transactional(isolation = Isolation.SERIALIZABLE)
public String create(String title, MetadataProfile profile, String cloneMetadataId) throws IOException {
String metadataId = UUID.randomUUID().toString();

ClientMetadata clientMetadata = new ClientMetadata(title, metadataId);
TechnicalMetadata technicalMetadata = new TechnicalMetadata(title, metadataId);
IsoMetadata isoMetadata = new IsoMetadata(title, metadataId);

IsoMetadata oIso = isoMetadataRepository.findByMetadataId(cloneMetadataId)
.orElseThrow(() -> new NoSuchElementException("IsoMetadata not found for metadataId: " + cloneMetadataId));
ClientMetadata oClient = clientMetadataRepository.findByMetadataId(cloneMetadataId)
.orElseThrow(() -> new NoSuchElementException("ClientMetadata not found for metadataId: " + cloneMetadataId));
TechnicalMetadata oTechnical = technicalMetadataRepository.findByMetadataId(cloneMetadataId)
.orElseThrow(() -> new NoSuchElementException("TechnicalMetadata not found for metadataId: " + cloneMetadataId));

JsonIsoMetadata clonedIsoData = objectMapper.readValue(
objectMapper.writeValueAsString(oIso.getData()),
new TypeReference<JsonIsoMetadata>() {}
);
clonedIsoData.setMetadataProfile(profile);

JsonClientMetadata clonedClientData = objectMapper.readValue(
objectMapper.writeValueAsString(oClient.getData()),
new TypeReference<JsonClientMetadata>() {}
);

JsonTechnicalMetadata clonedTechnicalData = objectMapper.readValue(
objectMapper.writeValueAsString(oTechnical.getData()),
new TypeReference<JsonTechnicalMetadata>() {}
);

isoMetadata.setData(clonedIsoData);
clientMetadata.setData(clonedClientData);
technicalMetadata.setData(clonedTechnicalData);

clientMetadataRepository.save(clientMetadata);
technicalMetadataRepository.save(technicalMetadata);
isoMetadataRepository.save(isoMetadata);

return metadataId;
}

@PreAuthorize("hasRole('ROLE_ADMIN') or hasPermission(#entity, 'UPDATE')")
@Transactional(isolation = Isolation.SERIALIZABLE)
public IsoMetadata updateIsoJsonValue(String metadataId, String key, JsonNode value) throws IOException, IllegalArgumentException {
Expand Down

0 comments on commit dd59fd7

Please sign in to comment.