Skip to content

Commit

Permalink
feat: add support for cloning
Browse files Browse the repository at this point in the history
  • Loading branch information
KaiVolland committed Dec 16, 2024
1 parent fd2ae0c commit 394d481
Show file tree
Hide file tree
Showing 7 changed files with 98 additions and 42 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
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 @@ -126,14 +127,20 @@ public MetadataCollection findOneByMetadataId(@PathVariable("metadataId") String
}

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

try {
String metadataId;
if (creationData.getCloneMetadataId() != null) {
return service.create(creationData.getTitle(), creationData.getMetadataProfile(), creationData.getCloneMetadataId());
metadataId = service.create(creationData.getTitle(), creationData.getMetadataProfile(), creationData.getCloneMetadataId());
} else {
return service.create(creationData.getTitle(), creationData.getMetadataProfile());
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());
Expand Down
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,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
@@ -1,5 +1,6 @@
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;
Expand Down Expand Up @@ -65,37 +66,62 @@ public Optional<MetadataCollection> findOneByMetadataId(String metadataId) {

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

ClientMetadata clientMetadata = new ClientMetadata();
TechnicalMetadata technicalMetadata = new TechnicalMetadata();
IsoMetadata isoMetadata = new IsoMetadata();
clientMetadata.setMetadataId(metadataId);
technicalMetadata.setMetadataId(metadataId);
isoMetadata.setMetadataId(metadataId);
isoMetadata.setTitle(title);
clientMetadata.setTitle(title);
technicalMetadata.setTitle(title);

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);

MetadataCollection metadataCollection = new MetadataCollection();
metadataCollection.setClientMetadata(clientMetadata.getData());
metadataCollection.setTechnicalMetadata(technicalMetadata.getData());
metadataCollection.setIsoMetadata(isoMetadata.getData());

return metadataCollection;
return metadataId;
}

@PreAuthorize("hasRole('ROLE_ADMIN') or hasPermission(#entity, 'CREATE')")
@Transactional(isolation = Isolation.SERIALIZABLE)
public MetadataCollection create(String title, MetadataProfile profile, String cloneMetadataId) {
throw new UnsupportedOperationException("Not implemented yet");
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')")
Expand Down

0 comments on commit 394d481

Please sign in to comment.