Add rest client + domain module
All checks were successful
Maven build / build (push) Successful in 4m18s

This commit is contained in:
Guillaume Dugas
2026-02-19 22:18:46 +01:00
parent 9341b765f2
commit 7698739063
75 changed files with 770 additions and 686 deletions

View File

@@ -12,6 +12,10 @@
<name>Semrack Core - Runtime</name>
<dependencies>
<dependency>
<groupId>fr.codeanddata.semrack</groupId>
<artifactId>semrack</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-arc</artifactId>

View File

@@ -1,13 +0,0 @@
package fr.codeanddata.semrack.core;
import fr.codeanddata.semrack.core.models.IndexSearchResult;
import fr.codeanddata.semrack.core.models.Search;
import io.smallrye.mutiny.Uni;
public interface Index {
Uni<Long> count(Search request);
Uni<Boolean> exist(Search query);
Uni<Void> index(String documentId);
Uni<IndexSearchResult> search(Search search);
Uni<Void> clear(String documentId);
}

View File

@@ -1,17 +0,0 @@
package fr.codeanddata.semrack.core;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.enterprise.inject.spi.CDI;
public interface LookupExpression<T> {
String apply(Object params);
default T convert(Object params) {
return CDI.current().select(ObjectMapper.class).get().convertValue(params, new TypeReference<T>() {});
}
default T convert(Object params, Class<T> clazz) {
return CDI.current().select(ObjectMapper.class).get().convertValue(params, clazz);
}
}

View File

@@ -1,8 +0,0 @@
package fr.codeanddata.semrack.core;
import fr.codeanddata.semrack.core.models.ReadContext;
import io.smallrye.mutiny.Uni;
public interface ReadInterceptor {
Uni<Void> interceptSemdocRead(ReadContext context);
}

View File

@@ -1,8 +0,0 @@
package fr.codeanddata.semrack.core;
import fr.codeanddata.semrack.core.models.SearchContext;
import io.smallrye.mutiny.Uni;
public interface SearchInterceptor {
Uni<Void> interceptSemdocSearch(SearchContext context);
}

View File

@@ -1,13 +0,0 @@
package fr.codeanddata.semrack.core;
import fr.codeanddata.semrack.core.models.Document;
import fr.codeanddata.semrack.core.models.StorageGet;
import io.smallrye.mutiny.Uni;
import java.util.List;
public interface Storage {
Uni<Document> get(String uid, StorageGet request);
Uni<List<Document>> get(List<String> uids, StorageGet request);
Uni<Document> storeDocument(Document document);
}

View File

@@ -1,8 +0,0 @@
package fr.codeanddata.semrack.core;
import fr.codeanddata.semrack.core.models.WriteContext;
import io.smallrye.mutiny.Uni;
public interface WriteInterceptor {
Uni<Void> interceptSemdocWrite(WriteContext context);
}

View File

@@ -1,5 +0,0 @@
package fr.codeanddata.semrack.core.enums;
public enum SortDirection {
asc, desc
}

View File

@@ -1,18 +0,0 @@
package fr.codeanddata.semrack.core.exceptions;
public class SemrackException extends Exception {
public SemrackException() {
}
public SemrackException(String message) {
super(message);
}
public SemrackException(Throwable cause) {
super(cause);
}
public SemrackException(String message, Throwable cause) {
super(message, cause);
}
}

View File

@@ -1,18 +0,0 @@
package fr.codeanddata.semrack.core.exceptions;
public class SemrackRuntimeException extends RuntimeException {
public SemrackRuntimeException() {
}
public SemrackRuntimeException(String message) {
super(message);
}
public SemrackRuntimeException(Throwable cause) {
super(cause);
}
public SemrackRuntimeException(String message, Throwable cause) {
super(message, cause);
}
}

View File

@@ -2,8 +2,8 @@ package fr.codeanddata.semrack.core.interceptors;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import fr.codeanddata.semrack.core.WriteInterceptor;
import fr.codeanddata.semrack.core.models.WriteContext;
import fr.codeanddata.semrack.WriteInterceptor;
import fr.codeanddata.semrack.models.WriteContext;
import io.smallrye.mutiny.Uni;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;

View File

@@ -1,8 +1,8 @@
package fr.codeanddata.semrack.core.interceptors;
import fr.codeanddata.semrack.core.WriteInterceptor;
import fr.codeanddata.semrack.core.models.WriteContext;
import fr.codeanddata.semrack.core.models.Document;
import fr.codeanddata.semrack.WriteInterceptor;
import fr.codeanddata.semrack.models.WriteContext;
import fr.codeanddata.semrack.models.Document;
import fr.codeanddata.semrack.core.utils.UIDGenerator;
import io.smallrye.mutiny.Uni;
import jakarta.enterprise.context.ApplicationScoped;

View File

@@ -1,7 +1,7 @@
package fr.codeanddata.semrack.core.mappers;
import fr.codeanddata.semrack.core.models.Document;
import fr.codeanddata.semrack.core.models.PushDocument;
import fr.codeanddata.semrack.models.Document;
import fr.codeanddata.semrack.models.PushDocument;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingConstants;

View File

@@ -1,36 +0,0 @@
package fr.codeanddata.semrack.core.models;
import io.quarkus.runtime.annotations.RegisterForReflection;
import lombok.*;
import java.util.Map;
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@RegisterForReflection(serialization = true)
public class Document {
/**
* L'identifiant unique du document.
*/
String uid;
/**
* Les annotations sont créées par le système, au travers des extensions. Elles sont en lecture seule.
* Elles ont pour vocation d'aider au classement et à la recherche du document (tags, catégories, date de création, etc.).
*/
Map<String, Object> annotations;
/**
* Le contenu du document.
*/
Map<String, Object> metadata;
/**
*
*/
Map<String, Object> fields;
}

View File

@@ -1,15 +0,0 @@
package fr.codeanddata.semrack.core.models;
import lombok.*;
import java.util.List;
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class IndexSearchResult {
List<String> uids;
PaginationInfo pagination;
}

View File

@@ -1,13 +0,0 @@
package fr.codeanddata.semrack.core.models;
import lombok.*;
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Pagination {
Integer page;
Integer size;
}

View File

@@ -1,14 +0,0 @@
package fr.codeanddata.semrack.core.models;
import lombok.*;
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PaginationInfo {
long page;
long size;
long total;
}

View File

@@ -1,29 +0,0 @@
package fr.codeanddata.semrack.core.models;
import lombok.*;
import java.util.Map;
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PushDocument {
/**
* L'identifiant unique du document.
*/
String uid;
/**
* Les directives sont les paramètres d'extensions.
* Elles ont pour vocation de générer des actions sur les documents, comme le publish, etc...
*/
Map<String, Object> directives;
/**
* Le contenu du document.
*/
Map<String, Object> metadata;
}

View File

@@ -1,12 +0,0 @@
package fr.codeanddata.semrack.core.models;
import lombok.*;
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ReadContext {
Document currentDocument;
}

View File

@@ -1,20 +0,0 @@
package fr.codeanddata.semrack.core.models;
import lombok.*;
import java.util.List;
import java.util.Map;
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Search {
Map<String, Object> filter;
List<Sort> sort;
Pagination paginate;
Boolean annotations;
Boolean metadata;
Map<String, String> fields;
}

View File

@@ -1,15 +0,0 @@
package fr.codeanddata.semrack.core.models;
import lombok.*;
import java.util.Map;
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SearchContext {
Map<String, Object> search;
}

View File

@@ -1,15 +0,0 @@
package fr.codeanddata.semrack.core.models;
import lombok.*;
import java.util.List;
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class SearchResult {
List<Document> documents;
PaginationInfo pagination;
}

View File

@@ -1,14 +0,0 @@
package fr.codeanddata.semrack.core.models;
import fr.codeanddata.semrack.core.enums.SortDirection;
import lombok.*;
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Sort {
String field;
SortDirection direction;
}

View File

@@ -1,16 +0,0 @@
package fr.codeanddata.semrack.core.models;
import lombok.*;
import java.util.Map;
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class StorageGet {
Boolean metadataSource;
Boolean annotationsSource;
Map<String, String> fields;
}

View File

@@ -1,15 +0,0 @@
package fr.codeanddata.semrack.core.models;
import fr.codeanddata.semrack.core.utils.Traverser;
import lombok.*;
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class TraverserPath {
Traverser.PathTypes type;
String fullPath;
Object value;
}

View File

@@ -1,30 +0,0 @@
package fr.codeanddata.semrack.core.models;
import lombok.*;
import java.util.Map;
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WriteContext {
/**
* Previous stored document
*/
Document currentDocument;
/**
* Document to be store. It initialized with :
* - the currentDocument uid if exists, or a new one
* - the metadata to be persisted
*/
Document nextDocument;
/**
* The directives to be applied
*/
Map<String, Object> directives;
}

View File

@@ -1,10 +1,10 @@
package fr.codeanddata.semrack.core.repositories;
import fr.codeanddata.semrack.core.WriteInterceptor;
import fr.codeanddata.semrack.core.exceptions.SemrackRuntimeException;
import fr.codeanddata.semrack.core.models.*;
import fr.codeanddata.semrack.WriteInterceptor;
import fr.codeanddata.semrack.exceptions.SemrackRuntimeException;
import fr.codeanddata.semrack.core.storages.StorageProxy;
import fr.codeanddata.semrack.core.utils.UIDGenerator;
import fr.codeanddata.semrack.models.*;
import io.smallrye.mutiny.Uni;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.inject.Any;

View File

@@ -1,8 +1,8 @@
package fr.codeanddata.semrack.core.services;
import fr.codeanddata.semrack.core.Index;
import fr.codeanddata.semrack.core.models.IndexSearchResult;
import fr.codeanddata.semrack.core.models.Search;
import fr.codeanddata.semrack.Index;
import fr.codeanddata.semrack.models.IndexSearchResult;
import fr.codeanddata.semrack.models.Search;
import io.smallrye.mutiny.Uni;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;

View File

@@ -1,6 +1,6 @@
package fr.codeanddata.semrack.core.services;
import fr.codeanddata.semrack.core.LookupExpression;
import fr.codeanddata.semrack.LookupExpression;
import io.quarkus.runtime.StartupEvent;
import io.smallrye.common.annotation.Identifier;
import jakarta.enterprise.context.ApplicationScoped;

View File

@@ -1,11 +1,11 @@
package fr.codeanddata.semrack.core.storages;
import fr.codeanddata.semrack.core.Index;
import fr.codeanddata.semrack.core.Storage;
import fr.codeanddata.semrack.core.models.Search;
import fr.codeanddata.semrack.core.models.SearchResult;
import fr.codeanddata.semrack.core.models.Document;
import fr.codeanddata.semrack.core.models.StorageGet;
import fr.codeanddata.semrack.Index;
import fr.codeanddata.semrack.Storage;
import fr.codeanddata.semrack.models.Search;
import fr.codeanddata.semrack.models.SearchResult;
import fr.codeanddata.semrack.models.Document;
import fr.codeanddata.semrack.models.StorageGet;
import io.smallrye.mutiny.Uni;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;

View File

@@ -2,8 +2,8 @@ package fr.codeanddata.semrack.core.utils;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import fr.codeanddata.semrack.core.models.TraverserPath;
import io.vertx.core.json.Json;
import fr.codeanddata.semrack.enums.PathTypes;
import fr.codeanddata.semrack.models.TraverserPath;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
@@ -21,15 +21,6 @@ public class Traverser implements Function<Object, List<TraverserPath>> {
return parse("", o);
}
public enum PathTypes {
UNKNOWN,
STRING,
NUMBER,
BOOLEAN,
LIST,
OBJECT
}
List<TraverserPath> parse(String basePath, Object data) {
final List<TraverserPath> paths = new ArrayList<>();

View File

@@ -1,6 +1,6 @@
package fr.codeanddata.semrack.core.utils;
import fr.codeanddata.semrack.core.models.Document;
import fr.codeanddata.semrack.models.Document;
import jakarta.enterprise.context.ApplicationScoped;
import org.apache.commons.codec.digest.DigestUtils;