[WIP] EntityDoi table
This commit is contained in:
parent
7d624a2daa
commit
59e26dbb8d
|
@ -0,0 +1,9 @@
|
|||
package eu.eudat.data.dao.entities;
|
||||
|
||||
import eu.eudat.data.dao.DatabaseAccessLayer;
|
||||
import eu.eudat.data.entities.EntityDoi;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
public interface EntityDoiDao extends DatabaseAccessLayer<EntityDoi, UUID> {
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
package eu.eudat.data.dao.entities;
|
||||
|
||||
import eu.eudat.data.dao.DatabaseAccess;
|
||||
import eu.eudat.data.dao.databaselayer.service.DatabaseService;
|
||||
import eu.eudat.data.entities.EntityDoi;
|
||||
import eu.eudat.queryable.QueryableList;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
@Component("EntityDoiDao")
|
||||
public class EntityDoiDaoImpl extends DatabaseAccess<EntityDoi> implements EntityDoiDao {
|
||||
|
||||
@Autowired
|
||||
public EntityDoiDaoImpl(DatabaseService<EntityDoi> databaseService){
|
||||
super(databaseService);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public EntityDoi createOrUpdate(EntityDoi item) {
|
||||
return this.getDatabaseService().createOrUpdate(item, EntityDoi.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<EntityDoi> createOrUpdateAsync(EntityDoi item) {
|
||||
return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item));
|
||||
}
|
||||
|
||||
@Override
|
||||
public EntityDoi find(UUID id) {
|
||||
return this.getDatabaseService().getQueryable(EntityDoi.class).where((builder, root) -> builder.equal(root.get("id"), id)).getSingle();
|
||||
}
|
||||
|
||||
@Override
|
||||
public EntityDoi find(UUID id, String hint) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(EntityDoi item) {
|
||||
this.getDatabaseService().delete(item);
|
||||
}
|
||||
|
||||
@Override
|
||||
public QueryableList<EntityDoi> asQueryable() {
|
||||
return this.getDatabaseService().getQueryable(EntityDoi.class);
|
||||
}
|
||||
}
|
|
@ -184,6 +184,9 @@ public class DMP implements DataEntity<DMP, UUID> {
|
|||
@Column(name = "\"DOI\"")
|
||||
private String doi;
|
||||
|
||||
@OneToMany(mappedBy = "entityId", fetch = FetchType.LAZY)
|
||||
private Set<EntityDoi> dois;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "\"Project\"")
|
||||
private Project project;
|
||||
|
@ -346,6 +349,13 @@ public class DMP implements DataEntity<DMP, UUID> {
|
|||
this.doi = doi;
|
||||
}
|
||||
|
||||
public Set<EntityDoi> getDois() {
|
||||
return dois;
|
||||
}
|
||||
public void setDois(Set<EntityDoi> dois) {
|
||||
this.dois = dois;
|
||||
}
|
||||
|
||||
public Project getProject() {
|
||||
return project;
|
||||
}
|
||||
|
@ -381,6 +391,7 @@ public class DMP implements DataEntity<DMP, UUID> {
|
|||
if (entity.isPublic) this.setPublishedAt(new Date());
|
||||
if (entity.getUsers() != null) this.users = entity.getUsers();
|
||||
if (entity.getDoi() != null && entity.getDoi().trim().isEmpty()) this.doi = entity.doi;
|
||||
this.dois = entity.getDois();
|
||||
this.extraProperties = entity.getExtraProperties();
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,121 @@
|
|||
package eu.eudat.data.entities;
|
||||
|
||||
import eu.eudat.data.converters.DateToUTCConverter;
|
||||
import eu.eudat.data.entities.helpers.EntityBinder;
|
||||
import eu.eudat.queryable.queryableentity.DataEntity;
|
||||
import org.hibernate.annotations.Type;
|
||||
|
||||
import javax.persistence.*;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Entity
|
||||
@Table(name = "\"EntityDoi\"")
|
||||
public class EntityDoi implements DataEntity<EntityDoi, UUID> {
|
||||
public enum EntityType {
|
||||
DMP
|
||||
}
|
||||
|
||||
@Id
|
||||
@Column(name = "\"ID\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)")
|
||||
private UUID id;
|
||||
|
||||
@Enumerated(EnumType.STRING)
|
||||
@Type(type = "eu.eudat.configurations.typedefinition.PostgreSQLEnumType")
|
||||
@Column(name = "\"EntityType\"", nullable = false)
|
||||
private EntityType entityType;
|
||||
|
||||
@Column(name = "\"RepositoryId\"", nullable = false)
|
||||
private String repositoryId;
|
||||
|
||||
@Column(name = "\"Doi\"", nullable = false)
|
||||
private String doi;
|
||||
|
||||
@Column(name = "\"CreatedAt\"", nullable = false)
|
||||
@Convert(converter = DateToUTCConverter.class)
|
||||
private Date createdAt;
|
||||
|
||||
@Column(name = "\"UpdatedAt\"", nullable = false)
|
||||
@Convert(converter = DateToUTCConverter.class)
|
||||
private Date updatedAt;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "\"EntityId\"", nullable = false)
|
||||
private DMP entityId;
|
||||
|
||||
public UUID getId() {
|
||||
return id;
|
||||
}
|
||||
public void setId(UUID id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public EntityType getEntityType() {
|
||||
return entityType;
|
||||
}
|
||||
public void setEntityType(EntityType entityType) {
|
||||
this.entityType = entityType;
|
||||
}
|
||||
|
||||
public String getRepositoryId() {
|
||||
return repositoryId;
|
||||
}
|
||||
public void setRepositoryId(String repositoryId) {
|
||||
this.repositoryId = repositoryId;
|
||||
}
|
||||
|
||||
public String getDoi() {
|
||||
return doi;
|
||||
}
|
||||
public void setDoi(String doi) {
|
||||
this.doi = doi;
|
||||
}
|
||||
|
||||
public Date getCreatedAt() {
|
||||
return createdAt;
|
||||
}
|
||||
public void setCreatedAt(Date createdAt) {
|
||||
this.createdAt = createdAt;
|
||||
}
|
||||
|
||||
public Date getUpdatedAt() {
|
||||
return updatedAt;
|
||||
}
|
||||
public void setUpdatedAt(Date updatedAt) {
|
||||
this.updatedAt = updatedAt;
|
||||
}
|
||||
|
||||
public DMP getEntityId() {
|
||||
return entityId;
|
||||
}
|
||||
public void setEntityId(DMP entityId) {
|
||||
this.entityId = entityId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(EntityDoi doi) {
|
||||
this.entityType = doi.getEntityType();
|
||||
this.repositoryId = doi.getRepositoryId();
|
||||
this.doi = doi.getDoi();
|
||||
this.createdAt = doi.getCreatedAt();
|
||||
this.updatedAt = doi.getUpdatedAt();
|
||||
this.entityId = doi.getEntityId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public UUID getKeys() {
|
||||
return this.id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EntityDoi buildFromTuple(List<Tuple> tuple, List<String> fields, String base) {
|
||||
String currentBase = base.isEmpty() ? "" : base + ".";
|
||||
if (fields.contains(currentBase + "id")) this.id = EntityBinder.fromTuple(tuple, currentBase + "id");
|
||||
if (fields.contains(currentBase + "entityId"))
|
||||
this.entityId = tuple.stream().map(x -> new DMP().buildFromTuple(Arrays.asList(x), fields , base.isEmpty() ? "entityId" : base + "." + "entityId")).collect(Collectors.toList()).get(0);
|
||||
return this;
|
||||
}
|
||||
}
|
|
@ -6,6 +6,7 @@ import eu.eudat.logic.security.claims.ClaimedAuthorities;
|
|||
import eu.eudat.logic.services.ApiContext;
|
||||
import eu.eudat.models.data.doi.DepositCode;
|
||||
import eu.eudat.models.data.doi.DepositRequest;
|
||||
import eu.eudat.models.data.doi.Doi;
|
||||
import eu.eudat.models.data.helpers.responses.ResponseItem;
|
||||
import eu.eudat.models.data.security.Principal;
|
||||
import eu.eudat.types.ApiMessageCode;
|
||||
|
@ -49,13 +50,13 @@ public class DepositController extends BaseController {
|
|||
|
||||
@RequestMapping(method = RequestMethod.POST, value = {"/createDoi"})
|
||||
public @ResponseBody
|
||||
ResponseEntity<ResponseItem<String>> createDoi(@RequestBody DepositRequest depositRequest, @ClaimedAuthorities(claims = {Authorities.ADMIN, Authorities.MANAGER, Authorities.USER, Authorities.ANONYMOUS}) Principal principal) {
|
||||
ResponseEntity<ResponseItem<Doi>> createDoi(@RequestBody DepositRequest depositRequest, @ClaimedAuthorities(claims = {Authorities.ADMIN, Authorities.MANAGER, Authorities.USER, Authorities.ANONYMOUS}) Principal principal) {
|
||||
try {
|
||||
String doi = this.depositManager.deposit(depositRequest, principal);
|
||||
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<String>().status(ApiMessageCode.SUCCESS_MESSAGE).message("Successfully created DOI for Data Datamanagement Plan in question.").payload(doi));
|
||||
Doi doi = this.depositManager.deposit(depositRequest, principal);
|
||||
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<Doi>().status(ApiMessageCode.SUCCESS_MESSAGE).message("Successfully created DOI for Data Datamanagement Plan in question.").payload(doi));
|
||||
} catch (Exception e) {
|
||||
logger.error(e.getMessage(), e);
|
||||
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem<String>().status(ApiMessageCode.ERROR_MESSAGE).message("Failed to create DOI for the Data Management Plan: " + e.getMessage()));
|
||||
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem<Doi>().status(ApiMessageCode.ERROR_MESSAGE).message("Failed to create DOI for the Data Management Plan: " + e.getMessage()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -49,6 +49,7 @@ import eu.eudat.models.data.datasetwizard.DatasetWizardModel;
|
|||
import eu.eudat.models.data.datasetwizard.DatasetsToBeFinalized;
|
||||
import eu.eudat.models.data.dmp.*;
|
||||
import eu.eudat.models.data.doi.DepositRequest;
|
||||
import eu.eudat.models.data.doi.Doi;
|
||||
import eu.eudat.models.data.dynamicfields.DynamicFieldWithValue;
|
||||
import eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.DataManagementPlanProfile;
|
||||
import eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.Field;
|
||||
|
@ -2104,7 +2105,7 @@ public class DataManagementPlanManager {
|
|||
return finalDoi;
|
||||
}
|
||||
|
||||
public String createDoi(DepositRequest depositRequest, Principal principal) throws Exception {
|
||||
public Doi createDoi(DepositRequest depositRequest, Principal principal) throws Exception {
|
||||
DMP dmp = this.apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(UUID.fromString(depositRequest.getDmpId()));
|
||||
if (!isUserOwnerOfDmp(dmp, principal))
|
||||
throw new Exception("User is not authorized to invoke this action");
|
||||
|
@ -2150,13 +2151,29 @@ public class DataManagementPlanManager {
|
|||
return null;
|
||||
}
|
||||
}).orElse(null);
|
||||
Doi doiModel = null;
|
||||
if (finalDoi != null) {
|
||||
dmp.setDoi(finalDoi);
|
||||
|
||||
EntityDoi doiEntity = new EntityDoi();
|
||||
doiEntity.setId(UUID.randomUUID());
|
||||
doiEntity.setEntityType(EntityDoi.EntityType.DMP);
|
||||
doiEntity.setDoi(finalDoi);
|
||||
doiEntity.setRepositoryId(depositRequest.getRepositoryId());
|
||||
Date now = new Date();
|
||||
doiEntity.setCreatedAt(now);
|
||||
doiEntity.setUpdatedAt(now);
|
||||
doiEntity.setEntityId(dmp);
|
||||
apiContext.getOperationsContext().getDatabaseRepository().getEntityDoiDao().createOrUpdate(doiEntity);
|
||||
|
||||
dmp.getDois().add(doiEntity);
|
||||
apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(dmp);
|
||||
|
||||
doiModel = new Doi().fromDataModel(doiEntity);
|
||||
|
||||
}
|
||||
Files.deleteIfExists(file.getFile().toPath());
|
||||
|
||||
return finalDoi;
|
||||
return doiModel;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -9,6 +9,7 @@ import eu.eudat.logic.security.repositorydeposit.mapper.DMPToDepositMapper;
|
|||
import eu.eudat.logic.utilities.documents.helpers.FileEnvelope;
|
||||
import eu.eudat.logic.utilities.documents.pdf.PDFUtils;
|
||||
import eu.eudat.models.data.doi.DepositRequest;
|
||||
import eu.eudat.models.data.doi.Doi;
|
||||
import eu.eudat.models.data.security.Principal;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
@ -56,7 +57,7 @@ public class DepositManager {
|
|||
return repo.map(repositoryDeposit -> repositoryDeposit.authenticate(code)).orElse(null);
|
||||
}
|
||||
|
||||
public String deposit(DepositRequest depositRequest, Principal principal) throws Exception {
|
||||
public Doi deposit(DepositRequest depositRequest, Principal principal) throws Exception {
|
||||
return this.dataManagementPlanManager.createDoi(depositRequest, principal);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -60,5 +60,7 @@ public interface DatabaseRepository {
|
|||
|
||||
FileUploadDao getFileUploadDao();
|
||||
|
||||
EntityDoiDao getEntityDoiDao();
|
||||
|
||||
<T> void detachEntity(T entity);
|
||||
}
|
||||
|
|
|
@ -39,6 +39,7 @@ public class DatabaseRepositoryImpl implements DatabaseRepository {
|
|||
private LockDao lockDao;
|
||||
private NotificationDao notificationDao;
|
||||
private FileUploadDao fileUploadDao;
|
||||
private EntityDoiDao entityDoiDao;
|
||||
|
||||
private EntityManager entityManager;
|
||||
|
||||
|
@ -317,6 +318,15 @@ public class DatabaseRepositoryImpl implements DatabaseRepository {
|
|||
this.fileUploadDao = fileUploadDao;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EntityDoiDao getEntityDoiDao() {
|
||||
return entityDoiDao;
|
||||
}
|
||||
|
||||
@Autowired
|
||||
public void setEntityDoiDao(EntityDoiDao entityDoiDao) {
|
||||
this.entityDoiDao = entityDoiDao;
|
||||
}
|
||||
|
||||
public <T> void detachEntity(T entity) {
|
||||
this.entityManager.detach(entity);
|
||||
|
|
|
@ -4,6 +4,7 @@ import eu.eudat.data.entities.*;
|
|||
import eu.eudat.logic.utilities.builders.XmlBuilder;
|
||||
import eu.eudat.models.DataModel;
|
||||
import eu.eudat.models.data.datasetwizard.DatasetWizardModel;
|
||||
import eu.eudat.models.data.doi.Doi;
|
||||
import eu.eudat.models.data.dynamicfields.DynamicFieldWithValue;
|
||||
import eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.DataManagementPlanProfile;
|
||||
import eu.eudat.models.data.funder.Funder;
|
||||
|
@ -41,6 +42,7 @@ public class DataManagementPlan implements DataModel<DMP, DataManagementPlan> {
|
|||
private Map<String, Object> properties;
|
||||
private List<UserInfoListingModel> users;
|
||||
private String doi;
|
||||
private List<Doi> dois;
|
||||
private Project project;
|
||||
private Funder funder;
|
||||
private Boolean isPublic;
|
||||
|
@ -201,6 +203,13 @@ public class DataManagementPlan implements DataModel<DMP, DataManagementPlan> {
|
|||
this.doi = doi;
|
||||
}
|
||||
|
||||
public List<Doi> getDois() {
|
||||
return dois;
|
||||
}
|
||||
public void setDois(List<Doi> dois) {
|
||||
this.dois = dois;
|
||||
}
|
||||
|
||||
public Project getProject() {
|
||||
return project;
|
||||
}
|
||||
|
@ -281,6 +290,7 @@ public class DataManagementPlan implements DataModel<DMP, DataManagementPlan> {
|
|||
this.associatedUsers = entity.getUsers() != null ? entity.getUsers().stream().map(item -> new UserListingModel().fromDataModel(item.getUser())).collect(Collectors.toList()) : new ArrayList<>();
|
||||
this.users = entity.getUsers() != null ? entity.getUsers().stream().map(item -> new UserInfoListingModel().fromDataModel(item)).collect(Collectors.toList()) : new ArrayList<>();
|
||||
this.doi = entity.getDoi();
|
||||
this.dois = entity.getDois() != null ? entity.getDois().stream().map(item -> new Doi().fromDataModel(item)).collect(Collectors.toList()): new ArrayList<>();
|
||||
|
||||
if (entity.getProject() != null) {
|
||||
this.project = new Project();
|
||||
|
@ -377,6 +387,7 @@ public class DataManagementPlan implements DataModel<DMP, DataManagementPlan> {
|
|||
this.associatedUsers = entity.getUsers() != null ? entity.getUsers().stream().map(item -> new UserListingModel().fromDataModel(item.getUser())).collect(Collectors.toList()) : new ArrayList<>();
|
||||
this.users = entity.getUsers() != null ? entity.getUsers().stream().map(item -> new UserInfoListingModel().fromDataModel(item)).collect(Collectors.toList()) : new ArrayList<>();
|
||||
this.doi = entity.getDoi();
|
||||
this.dois = entity.getDois() != null ? entity.getDois().stream().map(item -> new Doi().fromDataModel(item)).collect(Collectors.toList()): new ArrayList<>();
|
||||
this.grant.fromDataModel(entity.getGrant());
|
||||
|
||||
if (entity.getProject() != null) {
|
||||
|
|
|
@ -0,0 +1,85 @@
|
|||
package eu.eudat.models.data.doi;
|
||||
|
||||
import eu.eudat.data.entities.EntityDoi;
|
||||
import eu.eudat.models.DataModel;
|
||||
import eu.eudat.models.data.dmp.DataManagementPlan;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.UUID;
|
||||
|
||||
public class Doi implements DataModel<EntityDoi, Doi> {
|
||||
private UUID id;
|
||||
private String repositoryId;
|
||||
private String doi;
|
||||
private Date createdAt;
|
||||
private Date updatedAt;
|
||||
private DataManagementPlan dmp;
|
||||
|
||||
public UUID getId() {
|
||||
return id;
|
||||
}
|
||||
public void setId(UUID id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getRepositoryId() {
|
||||
return repositoryId;
|
||||
}
|
||||
public void setRepositoryId(String repositoryId) {
|
||||
this.repositoryId = repositoryId;
|
||||
}
|
||||
|
||||
public String getDoi() {
|
||||
return doi;
|
||||
}
|
||||
public void setDoi(String doi) {
|
||||
this.doi = doi;
|
||||
}
|
||||
|
||||
public Date getCreatedAt() {
|
||||
return createdAt;
|
||||
}
|
||||
public void setCreatedAt(Date createdAt) {
|
||||
this.createdAt = createdAt;
|
||||
}
|
||||
|
||||
public Date getUpdatedAt() {
|
||||
return updatedAt;
|
||||
}
|
||||
public void setUpdatedAt(Date updatedAt) {
|
||||
this.updatedAt = updatedAt;
|
||||
}
|
||||
|
||||
public DataManagementPlan getDmp() {
|
||||
return dmp;
|
||||
}
|
||||
public void setDmp(DataManagementPlan dmp) {
|
||||
this.dmp = dmp;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Doi fromDataModel(EntityDoi entity) {
|
||||
this.id = entity.getId();
|
||||
this.repositoryId = entity.getRepositoryId();
|
||||
this.doi = entity.getDoi();
|
||||
this.createdAt = entity.getCreatedAt();
|
||||
this.updatedAt = entity.getUpdatedAt();
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EntityDoi toDataModel() throws Exception {
|
||||
EntityDoi entityDoi = new EntityDoi();
|
||||
entityDoi.setId(this.id);
|
||||
entityDoi.setRepositoryId(this.repositoryId);
|
||||
entityDoi.setDoi(this.doi);
|
||||
entityDoi.setCreatedAt(this.createdAt);
|
||||
entityDoi.setUpdatedAt(this.updatedAt);
|
||||
return entityDoi;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHint() {
|
||||
return null;
|
||||
}
|
||||
}
|
|
@ -8,6 +8,7 @@ import eu.eudat.models.data.dataset.DatasetOverviewModel;
|
|||
import eu.eudat.models.data.dmp.AssociatedProfile;
|
||||
import eu.eudat.models.data.dmp.Organisation;
|
||||
import eu.eudat.models.data.dmp.Researcher;
|
||||
import eu.eudat.models.data.doi.Doi;
|
||||
import eu.eudat.models.data.grant.GrantOverviewModel;
|
||||
|
||||
import java.util.Date;
|
||||
|
@ -36,6 +37,7 @@ public class DataManagementPlanOverviewModel implements DataModel<DMP, DataManag
|
|||
private boolean isPublic;
|
||||
private Date publishedAt;
|
||||
private String doi;
|
||||
private List<Doi> dois;
|
||||
|
||||
|
||||
public String getId() {
|
||||
|
@ -171,6 +173,13 @@ public class DataManagementPlanOverviewModel implements DataModel<DMP, DataManag
|
|||
this.doi = doi;
|
||||
}
|
||||
|
||||
public List<Doi> getDois() {
|
||||
return dois;
|
||||
}
|
||||
public void setDois(List<Doi> dois) {
|
||||
this.dois = dois;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DataManagementPlanOverviewModel fromDataModel(DMP entity) {
|
||||
this.id = entity.getId().toString();
|
||||
|
@ -180,6 +189,9 @@ public class DataManagementPlanOverviewModel implements DataModel<DMP, DataManag
|
|||
if (entity.getResearchers() != null) {
|
||||
this.researchers = entity.getResearchers().stream().map(item -> new Researcher().fromDataModel(item)).collect(Collectors.toList());
|
||||
}
|
||||
if(entity.getDois() != null){
|
||||
this.dois = entity.getDois().stream().map(item -> new Doi().fromDataModel(item)).collect(Collectors.toList());
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
|
@ -209,6 +221,7 @@ public class DataManagementPlanOverviewModel implements DataModel<DMP, DataManag
|
|||
this.isPublic = entity.isPublic();
|
||||
this.publishedAt = entity.getPublishedAt();
|
||||
this.doi = entity.getDoi();
|
||||
this.dois = entity.getDois().stream().map(item -> new Doi().fromDataModel(item)).collect(Collectors.toList());
|
||||
|
||||
return this;
|
||||
}
|
||||
|
|
|
@ -926,6 +926,27 @@ CREATE TABLE public."FileUpload"
|
|||
|
||||
ALTER TABLE public."FileUpload" OWNER TO :POSTGRES_USER;
|
||||
|
||||
--
|
||||
-- Name: EntityDoi; Type: TABLE; Schema: public; Owner: :POSTGRES_USER
|
||||
--
|
||||
|
||||
CREATE TYPE DoiEntityType AS ENUM ('DMP');
|
||||
|
||||
CREATE TABLE public."EntityDoi"
|
||||
(
|
||||
"ID" uuid NOT NULL,
|
||||
"EntityType" DoiEntityType NOT NULL,
|
||||
"RepositoryId" character varying(150) NOT NULL,
|
||||
"Doi" character varying(50) NOt NULL,
|
||||
"CreatedAt" timestamp(6) with time zone DEFAULT now() NOT NULL,
|
||||
"UpdatedAt" timestamp(6) with time zone DEFAULT now() NOT NULL,
|
||||
"EntityId" uuid NOT NULL,
|
||||
CONSTRAINT "Doi_pkey" PRIMARY KEY ("ID"),
|
||||
CONSTRAINT fk_doi_entityId FOREIGN KEY ("EntityId") REFERENCES public."DMP"("ID")
|
||||
);
|
||||
|
||||
ALTER TABLE public."EntityDoi" OWNER TO :POSTGRES_USER;
|
||||
|
||||
--
|
||||
-- Name: Content Content_pkey; Type: CONSTRAINT; Schema: public; Owner: :POSTGRES_USER
|
||||
--
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
DO $$DECLARE
|
||||
this_version CONSTANT varchar := '00.00.010';
|
||||
BEGIN
|
||||
PERFORM * FROM "DBVersion" WHERE version = this_version;
|
||||
IF FOUND THEN RETURN; END IF;
|
||||
|
||||
CREATE TYPE DoiEntityType AS ENUM ('DMP');
|
||||
|
||||
CREATE TABLE public."EntityDoi"
|
||||
(
|
||||
"ID" uuid NOT NULL,
|
||||
"EntityType" DoiEntityType NOT NULL,
|
||||
"RepositoryId" character varying(150) NOT NULL,
|
||||
"Doi" character varying(50) NOt NULL,
|
||||
"CreatedAt" timestamp(6) with time zone DEFAULT now() NOT NULL,
|
||||
"UpdatedAt" timestamp(6) with time zone DEFAULT now() NOT NULL,
|
||||
"EntityId" uuid NOT NULL,
|
||||
CONSTRAINT "Doi_pkey" PRIMARY KEY ("ID"),
|
||||
CONSTRAINT fk_doi_entityId FOREIGN KEY ("EntityId") REFERENCES public."DMP"("ID")
|
||||
);
|
||||
|
||||
/*ALTER TABLE public."EntityDoi" OWNER TO :POSTGRES_USER;*/
|
||||
|
||||
INSERT INTO public."DBVersion" VALUES ('DMPDB', '00.00.010', '2022-10-27 10:50:00.000000+02', now(), 'Add Doi Table for depositions');
|
||||
|
||||
END$$;
|
|
@ -0,0 +1,14 @@
|
|||
DO $$DECLARE
|
||||
this_version CONSTANT varchar := '00.00.011';
|
||||
BEGIN
|
||||
PERFORM * FROM "DBVersion" WHERE version = this_version;
|
||||
IF FOUND THEN RETURN; END IF;
|
||||
|
||||
INSERT INTO public."EntityDoi" ("ID", "EntityType", "RepositoryId", "Doi", "CreatedAt", "UpdatedAt", "EntityId")
|
||||
SELECT uuid_generate_v4(), 'DMP', 'Zenodo', public."DMP"."DOI", now(), now(), public."DMP"."ID"
|
||||
FROM public."DMP"
|
||||
WHERE public."DMP"."DOI" IS NOT NULL;
|
||||
|
||||
INSERT INTO public."DBVersion" VALUES ('DMPDB', '00.00.011', '2022-10-27 10:50:00.000000+02', now(), 'Migrate DMP.DOI to EntityDoi table');
|
||||
|
||||
END$$;
|
|
@ -0,0 +1,11 @@
|
|||
DO $$DECLARE
|
||||
this_version CONSTANT varchar := '00.00.012';
|
||||
BEGIN
|
||||
PERFORM * FROM "DBVersion" WHERE version = this_version;
|
||||
IF FOUND THEN RETURN; END IF;
|
||||
|
||||
ALTER TABLE public."DMP" DROP COLUMN 'DOI';
|
||||
|
||||
INSERT INTO public."DBVersion" VALUES ('DMPDB', '00.00.012', '2022-10-27 10:50:00.000000+02', now(), 'Delete doi column from dmp table');
|
||||
|
||||
END$$;
|
|
@ -4,6 +4,7 @@ import { DmpAssociatedProfileModel } from "../dmp-profile/dmp-associated-profile
|
|||
import { ResearcherModel } from "../researcher/researcher";
|
||||
import { GrantOverviewModel } from "../grant/grant-overview";
|
||||
import { DatasetOverviewModel } from "../dataset/dataset-overview";
|
||||
import { DoiModel } from "../doi/doi";
|
||||
|
||||
export interface DmpOverviewModel {
|
||||
id: string;
|
||||
|
@ -26,4 +27,5 @@ export interface DmpOverviewModel {
|
|||
finalizedAt: Date;
|
||||
publishedAt: Date;
|
||||
doi: string;
|
||||
dois: DoiModel[];
|
||||
}
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
export interface DoiModel {
|
||||
id: string;
|
||||
repositoryId: string;
|
||||
doi: string;
|
||||
createdAt: Date;
|
||||
updatedAt: Date;
|
||||
}
|
|
@ -2,6 +2,7 @@ import { HttpClient, HttpHeaders } from '@angular/common/http';
|
|||
import { Injectable } from '@angular/core';
|
||||
import { DepositConfigurationModel } from '@app/core/model/deposit/deposit-configuration';
|
||||
import { DepositCode, DepositRequest } from '@app/core/model/deposit/deposit-request';
|
||||
import { DoiModel } from '@app/core/model/doi/doi';
|
||||
import { Observable } from 'rxjs';
|
||||
import { ConfigurationService } from '../configuration/configuration.service';
|
||||
import { BaseHttpService } from '../http/base-http.service';
|
||||
|
@ -27,11 +28,11 @@ export class DepositRepositoriesService {
|
|||
return this.http.post<string>(this.actionUrl + 'getAccessToken', depositCode, { headers: this.headers });
|
||||
}
|
||||
|
||||
createDoi(repositoryId: string, dmpId: string, accessToken: string | null): Observable<string> {
|
||||
createDoi(repositoryId: string, dmpId: string, accessToken: string | null): Observable<DoiModel> {
|
||||
const depositRequest = new DepositRequest();
|
||||
depositRequest.repositoryId = repositoryId;
|
||||
depositRequest.dmpId = dmpId;
|
||||
depositRequest.accessToken = accessToken;
|
||||
return this.http.post<string>(this.actionUrl + 'createDoi', depositRequest, { headers: this.headers });
|
||||
return this.http.post<DoiModel>(this.actionUrl + 'createDoi', depositRequest, { headers: this.headers });
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@ import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dial
|
|||
import { DepositConfigurationStatus } from '@app/core/common/enum/deposit-configuration-status';
|
||||
import { DepositConfigurationModel } from '@app/core/model/deposit/deposit-configuration';
|
||||
import { DmpOverviewModel } from '@app/core/model/dmp/dmp-overview';
|
||||
import { DoiModel } from '@app/core/model/doi/doi';
|
||||
import { DepositRepositoriesService } from '@app/core/services/deposit-repositories/deposit-repositories.service';
|
||||
import { DmpService } from '@app/core/services/dmp/dmp.service';
|
||||
import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service';
|
||||
|
@ -21,7 +22,7 @@ import { takeUntil } from 'rxjs/operators';
|
|||
export class DmpDepositDialogComponent extends BaseComponent implements OnInit {
|
||||
|
||||
inputRepos: DepositConfigurationModel[];
|
||||
outputRepos: string[];
|
||||
outputRepos: DoiModel[];
|
||||
dmp: DmpOverviewModel;
|
||||
|
||||
constructor(
|
||||
|
@ -37,9 +38,16 @@ export class DmpDepositDialogComponent extends BaseComponent implements OnInit {
|
|||
super();
|
||||
this.inputRepos = data['depositRepos'][0];
|
||||
this.dmp = data['depositRepos'][1];
|
||||
for(var i = 0; i < this.dmp.dois.length; i++){
|
||||
this.inputRepos = this.inputRepos.filter(r => this.hasDoi(r, this.dmp.dois, i));
|
||||
}
|
||||
this.outputRepos = [];
|
||||
}
|
||||
|
||||
hasDoi(repo, dois, i){
|
||||
return repo.repositoryId !== dois[i].repositoryId;
|
||||
}
|
||||
|
||||
ngOnInit(): void {
|
||||
}
|
||||
|
||||
|
@ -76,6 +84,10 @@ export class DmpDepositDialogComponent extends BaseComponent implements OnInit {
|
|||
.subscribe(doi =>{
|
||||
this.onDOICallbackSuccess();
|
||||
this.outputRepos.push(doi);
|
||||
this.inputRepos = this.inputRepos.filter(function(x) { return x.repositoryId !== repo.repositoryId; });
|
||||
if(this.inputRepos.length == 0){
|
||||
this.close();
|
||||
}
|
||||
}, error => this.onDeleteCallbackError(error));
|
||||
break;
|
||||
}
|
||||
|
@ -106,6 +118,10 @@ export class DmpDepositDialogComponent extends BaseComponent implements OnInit {
|
|||
.subscribe(doi =>{
|
||||
this.onDOICallbackSuccess();
|
||||
this.outputRepos.push(doi);
|
||||
this.inputRepos = this.inputRepos.filter(function(x) { return x.repositoryId !== repo.repositoryId; });
|
||||
if(this.inputRepos.length == 0){
|
||||
this.close();
|
||||
}
|
||||
}, error => this.onDeleteCallbackError(error));
|
||||
});
|
||||
// this.userService.registerDOIToken(result.oauthCode, this.configurationService.app + 'oauth2')
|
||||
|
|
|
@ -114,21 +114,41 @@
|
|||
<div *ngIf="!hasDoi(dmp)" class="row d-flex flex-column ml-0 mr-0 mb-3">
|
||||
<p class="doi-label">{{'DMP-EDITOR.TITLE.SUBTITLE' | translate}}</p>
|
||||
<div class="doi-panel">
|
||||
<p *ngIf="!hasDoi(dmp)" class="mb-0 ml-3">
|
||||
<textarea #doi class="doi-txt">{{ dmp.doi }}</textarea>
|
||||
</p>
|
||||
<div class="d-flex justify-content-end">
|
||||
<mat-select class="mb-0 ml-3" placeholder="{{ dmp.dois[0].doi }}">
|
||||
<mat-option *ngFor="let x of dmp.dois">
|
||||
{{x.repositoryId}}
|
||||
</mat-option>
|
||||
</mat-select>
|
||||
<div class="d-flex justify-content-end ml-3">
|
||||
<button (click)="copyDoi(doi)" mat-mini-fab class="mr-2 d-flex justify-content-center align-items-center" matTooltip="{{'DMP-LISTING.ACTIONS.COPY' | translate}}" matTooltipPosition="above">
|
||||
<mat-icon class="mat-mini-fab-icon">content_copy</mat-icon>
|
||||
</button>
|
||||
<button mat-mini-fab class="mr-2 d-flex justify-content-center align-items-center" matTooltip="{{'GRANT-EDITOR.ACTIONS.VISIT-WEBSITE' | translate}}" matTooltipPosition="above">
|
||||
<a [href]="createDoiLink(dmp.doi)" class="doi-link" target="_blank">
|
||||
<a [href]="createDoiLink(dmp.dois[0].doi)" class="doi-link" target="_blank">
|
||||
<mat-icon class="mat-mini-fab-icon">launch</mat-icon>
|
||||
</a>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div *ngIf="!hasDoi(dmp)" class="row d-flex flex-column ml-0 mr-0 mb-3">
|
||||
<p class="doi-label">{{'DMP-EDITOR.TITLE.SUBTITLE' | translate}}</p>
|
||||
<div class="doi-panel">
|
||||
<p *ngIf="!hasDoi(dmp)" class="mb-0 ml-3">
|
||||
<textarea #doi class="doi-txt">{{ dmp.dois[0].doi }}</textarea>
|
||||
</p>
|
||||
<div class="d-flex justify-content-end">
|
||||
<button (click)="copyDoi(doi)" mat-mini-fab class="mr-2 d-flex justify-content-center align-items-center" matTooltip="{{'DMP-LISTING.ACTIONS.COPY' | translate}}" matTooltipPosition="above">
|
||||
<mat-icon class="mat-mini-fab-icon">content_copy</mat-icon>
|
||||
</button>
|
||||
<button mat-mini-fab class="mr-2 d-flex justify-content-center align-items-center" matTooltip="{{'GRANT-EDITOR.ACTIONS.VISIT-WEBSITE' | translate}}" matTooltipPosition="above">
|
||||
<a [href]="createDoiLink(dmp.dois[0].doi)" class="doi-link" target="_blank">
|
||||
<mat-icon class="mat-mini-fab-icon">launch</mat-icon>
|
||||
</a>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div> -->
|
||||
<div class="frame mb-3 pt-4 pl-3 pr-5 pb-1">
|
||||
<div *ngIf="isDraftDmp(dmp) && isUserOwner && !lockStatus">
|
||||
<div class="row ml-0 mr-0 pl-4 d-flex align-items-center" (click)="finalize(dmp)">
|
||||
|
@ -141,7 +161,7 @@
|
|||
<hr class="hr-line">
|
||||
</div>
|
||||
</div>
|
||||
<div *ngIf="hasDoi(dmp) && isFinalizedDmp(dmp) && !this.isPublicView && isUserOwner" (click)="deposit()" class="row ml-0 mr-0 pl-4 pb-3 d-flex align-items-center">
|
||||
<div *ngIf="(hasDoi(dmp) || moreDeposit()) && isFinalizedDmp(dmp) && !this.isPublicView && isUserOwner" (click)="deposit()" class="row ml-0 mr-0 pl-4 pb-3 d-flex align-items-center">
|
||||
<button mat-mini-fab class="frame-btn">
|
||||
<mat-icon class="mat-mini-fab-icon">archive</mat-icon>
|
||||
</button>
|
||||
|
|
|
@ -44,6 +44,7 @@ import { PopupNotificationDialogComponent } from '@app/library/notification/popu
|
|||
import { DepositRepositoriesService } from '@app/core/services/deposit-repositories/deposit-repositories.service';
|
||||
import { DmpDepositDialogComponent } from '../editor/dmp-deposit-dialog/dmp-deposit-dialog.component';
|
||||
import { DepositConfigurationModel } from '@app/core/model/deposit/deposit-configuration';
|
||||
import { DoiModel } from '@app/core/model/doi/doi';
|
||||
|
||||
@Component({
|
||||
selector: 'app-dmp-overview',
|
||||
|
@ -71,7 +72,7 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit {
|
|||
@ViewChild('doi')
|
||||
doi: ElementRef;
|
||||
|
||||
depositRepos: DepositConfigurationModel[];
|
||||
depositRepos: DepositConfigurationModel[] = [];
|
||||
|
||||
formGroup: FormGroup;
|
||||
|
||||
|
@ -151,6 +152,12 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit {
|
|||
});
|
||||
}
|
||||
});
|
||||
this.depositRepositoriesService.getAvailableRepos()
|
||||
.pipe(takeUntil(this._destroyed))
|
||||
.subscribe(
|
||||
repos => {
|
||||
this.depositRepos = repos;
|
||||
});
|
||||
}
|
||||
|
||||
onFetchingDeletedCallbackError(redirectRoot: string) {
|
||||
|
@ -450,7 +457,7 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit {
|
|||
}
|
||||
|
||||
hasDoi(dmp: DmpOverviewModel) {
|
||||
return dmp.doi == null ? true : false;
|
||||
return (this.dmp.dois == null || this.dmp.dois.length == 0) ? true : false;
|
||||
}
|
||||
|
||||
getAccessUrl(): string {
|
||||
|
@ -585,30 +592,28 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit {
|
|||
}
|
||||
|
||||
deposit(){
|
||||
this.depositRepositoriesService.getAvailableRepos()
|
||||
.pipe(takeUntil(this._destroyed))
|
||||
.subscribe(
|
||||
repos => {
|
||||
this.depositRepos = repos;
|
||||
const dialogRef = this.dialog.open(DmpDepositDialogComponent, {
|
||||
maxWidth: '600px',
|
||||
restoreFocus: false,
|
||||
autoFocus: false,
|
||||
data: {
|
||||
depositRepos: [this.depositRepos, this.dmp],
|
||||
message: "Select repositories to deposit",//this.language.instant('GENERAL.CONFIRMATION-DIALOG.FINALIZE-ITEM'),
|
||||
confirmButton: "Proceed to authentication",//this.language.instant('DMP-FINALISE-DIALOG.SUBMIT'),
|
||||
cancelButton: "Cancel",//this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CANCEL'),
|
||||
}
|
||||
});
|
||||
dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe((result: string[]) => {
|
||||
if (result) {
|
||||
this.dmp.doi = result[0];
|
||||
this.hasDOIToken = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
);
|
||||
const dialogRef = this.dialog.open(DmpDepositDialogComponent, {
|
||||
maxWidth: '600px',
|
||||
disableClose: true,
|
||||
restoreFocus: false,
|
||||
autoFocus: false,
|
||||
data: {
|
||||
depositRepos: [this.depositRepos, this.dmp],
|
||||
message: "Select repositories to deposit",//this.language.instant('GENERAL.CONFIRMATION-DIALOG.FINALIZE-ITEM'),
|
||||
confirmButton: "Proceed to authentication",//this.language.instant('DMP-FINALISE-DIALOG.SUBMIT'),
|
||||
cancelButton: "Cancel",//this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CANCEL'),
|
||||
}
|
||||
});
|
||||
dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe((result: DoiModel[]) => {
|
||||
if (result.length > 0) {
|
||||
this.dmp.dois.push(...result);
|
||||
this.hasDOIToken = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
moreDeposit(){
|
||||
return (this.dmp.dois.length < this.depositRepos.length) ? true : false;
|
||||
}
|
||||
|
||||
finalize(dmp: DmpOverviewModel) {
|
||||
|
|
Loading…
Reference in New Issue