From 9d706c6e114e0517cb215ebf6624bec180e6a7d0 Mon Sep 17 00:00:00 2001 From: Thomas Georgios Giannos Date: Thu, 7 Mar 2024 13:36:27 +0200 Subject: [PATCH] Adding new columns on Annotation entity --- .../enums/AnnotationProtectionType.java | 30 ++++++++ .../annotation/data/AnnotationEntity.java | 71 ++++++++++++++++++- .../AnnotationProtectionTypeConverter.java | 12 ++++ .../gr/cite/annotation/model/Annotation.java | 64 +++++++++++++++++ .../model/builder/AnnotationBuilder.java | 10 +++ .../annotation/query/AnnotationQuery.java | 39 ++++++++++ .../query/lookup/AnnotationLookup.java | 12 ++++ .../core/query/annotation.lookup.ts | 6 +- .../services/http/annotation.service.ts | 2 +- .../http/interceptors/base.interceptor.ts | 3 +- 10 files changed, 243 insertions(+), 6 deletions(-) create mode 100644 annotation-service/annotation/src/main/java/gr/cite/annotation/common/enums/AnnotationProtectionType.java create mode 100644 annotation-service/annotation/src/main/java/gr/cite/annotation/data/conventers/AnnotationProtectionTypeConverter.java diff --git a/annotation-service/annotation/src/main/java/gr/cite/annotation/common/enums/AnnotationProtectionType.java b/annotation-service/annotation/src/main/java/gr/cite/annotation/common/enums/AnnotationProtectionType.java new file mode 100644 index 000000000..d864ed8a9 --- /dev/null +++ b/annotation-service/annotation/src/main/java/gr/cite/annotation/common/enums/AnnotationProtectionType.java @@ -0,0 +1,30 @@ +package gr.cite.annotation.common.enums; + +import com.fasterxml.jackson.annotation.JsonValue; +import gr.cite.annotation.data.conventers.DatabaseEnum; + +import java.util.Map; + +public enum AnnotationProtectionType implements DatabaseEnum { + + Private((short) 0), + EntityAccessors((short) 1); + + private final Short value; + + AnnotationProtectionType(Short value) { + this.value = value; + } + + @JsonValue + public Short getValue() { + return value; + } + + private static final Map map = EnumUtils.getEnumValueMap(AnnotationProtectionType.class); + + public static AnnotationProtectionType of(Short i) { + return map.get(i); + } + +} diff --git a/annotation-service/annotation/src/main/java/gr/cite/annotation/data/AnnotationEntity.java b/annotation-service/annotation/src/main/java/gr/cite/annotation/data/AnnotationEntity.java index 8ea01ca22..352b8c94e 100644 --- a/annotation-service/annotation/src/main/java/gr/cite/annotation/data/AnnotationEntity.java +++ b/annotation-service/annotation/src/main/java/gr/cite/annotation/data/AnnotationEntity.java @@ -1,6 +1,8 @@ package gr.cite.annotation.data; +import gr.cite.annotation.common.enums.AnnotationProtectionType; import gr.cite.annotation.common.enums.IsActive; +import gr.cite.annotation.data.conventers.AnnotationProtectionTypeConverter; import gr.cite.annotation.data.conventers.IsActiveConverter; import jakarta.persistence.*; @@ -18,7 +20,7 @@ public class AnnotationEntity { public static final String _id = "id"; @Id - @Column(name = "id", columnDefinition = "uuid", nullable = false) + @Column(name = "entity_id", columnDefinition = "uuid", nullable = false) private UUID entityId; public static final String _entityId = "entityId"; @@ -33,12 +35,37 @@ public class AnnotationEntity { public static final String _anchor = "anchor"; - @Id @Column(name = "payload", nullable = false) private String payload; public static final String _payload = "payload"; + @Column(name = "subject_id", columnDefinition = "uuid", nullable = false) + private UUID subjectId; + + public static final String _subjectId = "subjectId"; + + @Column(name = "thread_id", columnDefinition = "uuid", nullable = false) + private UUID threadId; + + public static final String _threadId = "threadId"; + + @Column(name = "parent_id", columnDefinition = "uuid") + private UUID parentId; + + public static final String _parentId = "parentId"; + + @Column(name = "protection_type", nullable = false) + @Convert(converter = AnnotationProtectionTypeConverter.class) + private AnnotationProtectionType protectionType; + + public static final String _protectionType = "protectionType"; + + @Column(name = "time_stamp", nullable = false) + private Instant timeStamp; + + public static final String _timeStamp = "timeStamp"; + @Column(name = "\"created_at\"", nullable = false) private Instant createdAt; @@ -95,6 +122,46 @@ public class AnnotationEntity { this.payload = payload; } + public UUID getSubjectId() { + return subjectId; + } + + public void setSubjectId(UUID subjectId) { + this.subjectId = subjectId; + } + + public UUID getThreadId() { + return threadId; + } + + public void setThreadId(UUID threadId) { + this.threadId = threadId; + } + + public UUID getParentId() { + return parentId; + } + + public void setParentId(UUID parentId) { + this.parentId = parentId; + } + + public Instant getTimeStamp() { + return timeStamp; + } + + public void setTimeStamp(Instant timeStamp) { + this.timeStamp = timeStamp; + } + + public AnnotationProtectionType getProtectionType() { + return protectionType; + } + + public void setProtectionType(AnnotationProtectionType protectionType) { + this.protectionType = protectionType; + } + public Instant getCreatedAt() { return createdAt; } diff --git a/annotation-service/annotation/src/main/java/gr/cite/annotation/data/conventers/AnnotationProtectionTypeConverter.java b/annotation-service/annotation/src/main/java/gr/cite/annotation/data/conventers/AnnotationProtectionTypeConverter.java new file mode 100644 index 000000000..16ce5a15c --- /dev/null +++ b/annotation-service/annotation/src/main/java/gr/cite/annotation/data/conventers/AnnotationProtectionTypeConverter.java @@ -0,0 +1,12 @@ +package gr.cite.annotation.data.conventers; + +import gr.cite.annotation.common.enums.AnnotationProtectionType; +import jakarta.persistence.Converter; + +@Converter +public class AnnotationProtectionTypeConverter extends DatabaseEnumConverter{ + @Override + protected AnnotationProtectionType of(Short i) { + return AnnotationProtectionType.of(i); + } +} diff --git a/annotation-service/annotation/src/main/java/gr/cite/annotation/model/Annotation.java b/annotation-service/annotation/src/main/java/gr/cite/annotation/model/Annotation.java index 96cca0e73..adec1d0a3 100644 --- a/annotation-service/annotation/src/main/java/gr/cite/annotation/model/Annotation.java +++ b/annotation-service/annotation/src/main/java/gr/cite/annotation/model/Annotation.java @@ -1,6 +1,10 @@ package gr.cite.annotation.model; +import gr.cite.annotation.common.enums.AnnotationProtectionType; import gr.cite.annotation.common.enums.IsActive; +import gr.cite.annotation.data.conventers.AnnotationProtectionTypeConverter; +import jakarta.persistence.Column; +import jakarta.persistence.Convert; import java.time.Instant; import java.util.UUID; @@ -27,6 +31,26 @@ public class Annotation { public static final String _payload = "payload"; + private UUID subjectId; + + public static final String _subjectId = "subjectId"; + + private UUID threadId; + + public static final String _threadId = "threadId"; + + private UUID parentId; + + public static final String _parentId = "parentId"; + + private AnnotationProtectionType protectionType; + + public static final String _protectionType = "protectionType"; + + private Instant timeStamp; + + public static final String _timeStamp = "timeStamp"; + private Instant createdAt; public static final String _createdAt = "createdAt"; @@ -79,6 +103,46 @@ public class Annotation { this.payload = payload; } + public UUID getSubjectId() { + return subjectId; + } + + public void setSubjectId(UUID subjectId) { + this.subjectId = subjectId; + } + + public UUID getThreadId() { + return threadId; + } + + public void setThreadId(UUID threadId) { + this.threadId = threadId; + } + + public UUID getParentId() { + return parentId; + } + + public void setParentId(UUID parentId) { + this.parentId = parentId; + } + + public AnnotationProtectionType getProtectionType() { + return protectionType; + } + + public void setProtectionType(AnnotationProtectionType protectionType) { + this.protectionType = protectionType; + } + + public Instant getTimeStamp() { + return timeStamp; + } + + public void setTimeStamp(Instant timeStamp) { + this.timeStamp = timeStamp; + } + public Instant getCreatedAt() { return createdAt; } diff --git a/annotation-service/annotation/src/main/java/gr/cite/annotation/model/builder/AnnotationBuilder.java b/annotation-service/annotation/src/main/java/gr/cite/annotation/model/builder/AnnotationBuilder.java index 0354b3cae..2313b55ee 100644 --- a/annotation-service/annotation/src/main/java/gr/cite/annotation/model/builder/AnnotationBuilder.java +++ b/annotation-service/annotation/src/main/java/gr/cite/annotation/model/builder/AnnotationBuilder.java @@ -53,6 +53,16 @@ public class AnnotationBuilder extends BaseBuilder m.setAnchor(d.getAnchor()); if (fields.hasField(this.asIndexer(Annotation._payload))) m.setPayload(d.getPayload()); + if (fields.hasField(this.asIndexer(Annotation._subjectId))) + m.setSubjectId(d.getSubjectId()); + if (fields.hasField(this.asIndexer(Annotation._threadId))) + m.setThreadId(d.getThreadId()); + if (fields.hasField(this.asIndexer(Annotation._parentId))) + m.setParentId(d.getParentId()); + if (fields.hasField(this.asIndexer(Annotation._protectionType))) + m.setProtectionType(d.getProtectionType()); + if (fields.hasField(this.asIndexer(Annotation._timeStamp))) + m.setTimeStamp(d.getTimeStamp()); if (fields.hasField(this.asIndexer(Annotation._createdAt))) m.setCreatedAt(d.getCreatedAt()); if (fields.hasField(this.asIndexer(Annotation._updatedAt))) diff --git a/annotation-service/annotation/src/main/java/gr/cite/annotation/query/AnnotationQuery.java b/annotation-service/annotation/src/main/java/gr/cite/annotation/query/AnnotationQuery.java index 773fc7af4..8378c4f16 100644 --- a/annotation-service/annotation/src/main/java/gr/cite/annotation/query/AnnotationQuery.java +++ b/annotation-service/annotation/src/main/java/gr/cite/annotation/query/AnnotationQuery.java @@ -1,6 +1,7 @@ package gr.cite.annotation.query; import gr.cite.annotation.authorization.AuthorizationFlags; +import gr.cite.annotation.common.enums.AnnotationProtectionType; import gr.cite.annotation.common.enums.IsActive; import gr.cite.annotation.common.scope.user.UserScope; import gr.cite.annotation.data.AnnotationEntity; @@ -37,6 +38,8 @@ public class AnnotationQuery extends QueryBase { private Collection anchors; + private Collection threadIds; + private EnumSet authorize = EnumSet.of(AuthorizationFlags.None); private final UserScope userScope; @@ -143,6 +146,21 @@ public class AnnotationQuery extends QueryBase { return this; } + public AnnotationQuery threadIds(UUID value) { + this.threadIds = List.of(value); + return this; + } + + public AnnotationQuery threadIds(UUID... value) { + this.threadIds = Arrays.asList(value); + return this; + } + + public AnnotationQuery threadIds(Collection values) { + this.threadIds = values; + return this; + } + @Override protected Boolean isFalseQuery() { return this.isEmpty(this.ids) || this.isEmpty(this.excludedIds) || this.isEmpty(this.isActives) || this.isEmpty(this.entityIds); @@ -199,6 +217,12 @@ public class AnnotationQuery extends QueryBase { inClause.value(item); predicates.add(inClause); } + if (this.threadIds != null) { + CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(AnnotationEntity._threadId)); + for (UUID item : this.threadIds) + inClause.value(item); + predicates.add(inClause); + } if (!predicates.isEmpty()) { Predicate[] predicatesArray = predicates.toArray(new Predicate[0]); @@ -220,6 +244,16 @@ public class AnnotationQuery extends QueryBase { return AnnotationEntity._anchor; else if (item.match(Annotation._payload)) return AnnotationEntity._payload; + else if (item.match(Annotation._subjectId)) + return AnnotationEntity._subjectId; + else if (item.match(Annotation._threadId)) + return AnnotationEntity._threadId; + else if (item.match(Annotation._parentId)) + return AnnotationEntity._parentId; + else if (item.match(Annotation._protectionType)) + return AnnotationEntity._protectionType; + else if (item.match(Annotation._timeStamp)) + return AnnotationEntity._timeStamp; else if (item.match(Annotation._createdAt)) return AnnotationEntity._createdAt; else if (item.match(Annotation._updatedAt)) @@ -239,6 +273,11 @@ public class AnnotationQuery extends QueryBase { item.setEntityType(QueryBase.convertSafe(tuple, columns, AnnotationEntity._entityType, String.class)); item.setAnchor(QueryBase.convertSafe(tuple, columns, AnnotationEntity._anchor, String.class)); item.setPayload(QueryBase.convertSafe(tuple, columns, AnnotationEntity._payload, String.class)); + item.setSubjectId(QueryBase.convertSafe(tuple, columns, AnnotationEntity._subjectId, UUID.class)); + item.setThreadId(QueryBase.convertSafe(tuple, columns, AnnotationEntity._threadId, UUID.class)); + item.setParentId(QueryBase.convertSafe(tuple, columns, AnnotationEntity._parentId, UUID.class)); + item.setProtectionType(QueryBase.convertSafe(tuple, columns, AnnotationEntity._protectionType, AnnotationProtectionType.class)); + item.setTimeStamp(QueryBase.convertSafe(tuple, columns, AnnotationEntity._timeStamp, Instant.class)); item.setCreatedAt(QueryBase.convertSafe(tuple, columns, AnnotationEntity._createdAt, Instant.class)); item.setUpdatedAt(QueryBase.convertSafe(tuple, columns, AnnotationEntity._updatedAt, Instant.class)); item.setIsActive(QueryBase.convertSafe(tuple, columns, AnnotationEntity._isActive, IsActive.class)); diff --git a/annotation-service/annotation/src/main/java/gr/cite/annotation/query/lookup/AnnotationLookup.java b/annotation-service/annotation/src/main/java/gr/cite/annotation/query/lookup/AnnotationLookup.java index 97680d5b4..a5adf4dce 100644 --- a/annotation-service/annotation/src/main/java/gr/cite/annotation/query/lookup/AnnotationLookup.java +++ b/annotation-service/annotation/src/main/java/gr/cite/annotation/query/lookup/AnnotationLookup.java @@ -24,6 +24,8 @@ public class AnnotationLookup extends Lookup { private List anchors; + private List threadIds; + public String getLike() { return like; } @@ -80,6 +82,14 @@ public class AnnotationLookup extends Lookup { this.anchors = anchors; } + public List getThreadIds() { + return threadIds; + } + + public void setThreadIds(List threadIds) { + this.threadIds = threadIds; + } + public AnnotationQuery enrich(QueryFactory queryFactory) { AnnotationQuery query = queryFactory.query(AnnotationQuery.class); if (this.like != null) @@ -96,6 +106,8 @@ public class AnnotationLookup extends Lookup { query.entityTypes(this.entityTypes); if (this.anchors != null) query.anchors(this.anchors); + if (this.threadIds != null) + query.threadIds(this.threadIds); this.enrichCommon(query); diff --git a/dmp-frontend/src/annotation-service/core/query/annotation.lookup.ts b/dmp-frontend/src/annotation-service/core/query/annotation.lookup.ts index eda82fa6f..102c7c98e 100644 --- a/dmp-frontend/src/annotation-service/core/query/annotation.lookup.ts +++ b/dmp-frontend/src/annotation-service/core/query/annotation.lookup.ts @@ -7,10 +7,11 @@ export class AnnotationLookup extends Lookup implements AnnotationFilter { like: string; ids: Guid[]; excludedIds: Guid[]; - isActive: IsActive; + isActive: IsActive[]; entityIds: Guid[]; entityTypes: string[]; anchors: string[]; + groupIds: Guid[]; constructor() { super(); @@ -22,8 +23,9 @@ export interface AnnotationFilter { like: string; ids: Guid[]; excludedIds: Guid[]; - isActive: IsActive; + isActive: IsActive[]; entityIds: Guid[]; entityTypes: string[]; anchors: string[]; + groupIds: Guid[]; } \ No newline at end of file diff --git a/dmp-frontend/src/annotation-service/services/http/annotation.service.ts b/dmp-frontend/src/annotation-service/services/http/annotation.service.ts index 4062eeca4..fefcc2885 100644 --- a/dmp-frontend/src/annotation-service/services/http/annotation.service.ts +++ b/dmp-frontend/src/annotation-service/services/http/annotation.service.ts @@ -10,7 +10,7 @@ import { catchError } from "rxjs/operators"; @Injectable() export class AnnotationService { - private get apiBase(): string { return `${this.installationConfiguration.annotationServiceAddress}/annotation`; } + private get apiBase(): string { return `${this.installationConfiguration.annotationServiceAddress}annotation`; } constructor( private installationConfiguration: ConfigurationService, diff --git a/dmp-frontend/src/common/http/interceptors/base.interceptor.ts b/dmp-frontend/src/common/http/interceptors/base.interceptor.ts index 699e7ba92..f5693d882 100644 --- a/dmp-frontend/src/common/http/interceptors/base.interceptor.ts +++ b/dmp-frontend/src/common/http/interceptors/base.interceptor.ts @@ -27,6 +27,7 @@ export abstract class BaseInterceptor implements HttpInterceptor { return (req.params instanceof BaseHttpParams && req.params.interceptorContext && Array.isArray(req.params.interceptorContext.interceptAllRequests) && req.params.interceptorContext.interceptAllRequests.includes(this.type)) || req.url.startsWith(this.configurationService.server) - || req.url.startsWith(this.configurationService.notificationServiceAddress); + || req.url.startsWith(this.configurationService.notificationServiceAddress) + || req.url.startsWith(this.configurationService.annotationServiceAddress); } }