Init
This commit is contained in:
43
.github/workflows/build.yml
vendored
Normal file
43
.github/workflows/build.yml
vendored
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
name: Maven build
|
||||||
|
run-name: Build application with maven
|
||||||
|
on: [ push ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
MAVEN_ACCESS_TOKEN: ${{ secrets.CI_TOKEN }}
|
||||||
|
MAVEN_REPO_OWNER: ${{ gitea.actor }}
|
||||||
|
RELEASE_VERSION_BASE: 1.0
|
||||||
|
steps:
|
||||||
|
- name: Check out latest repository code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- uses: actions/setup-java@v4
|
||||||
|
with:
|
||||||
|
java-version: '21'
|
||||||
|
distribution: 'temurin'
|
||||||
|
|
||||||
|
- name: Set versions
|
||||||
|
run: |
|
||||||
|
VERSION_BASE=$RELEASE_VERSION_BASE
|
||||||
|
if [ "$GITHUB_REF_TYPE" = "tag" ]; then
|
||||||
|
VERSION_BASE="${GITHUB_REF_NAME}"
|
||||||
|
elif echo "$GITHUB_REF_NAME" | grep -qE '^release/'; then
|
||||||
|
VERSION_BASE="${GITHUB_REF_NAME#release/}"
|
||||||
|
fi
|
||||||
|
if [ "$GITHUB_REF_TYPE" = "branch" ]; then
|
||||||
|
BUILD_VERSION="${VERSION_BASE}-SNAPSHOT"
|
||||||
|
else
|
||||||
|
BUILD_VERSION="${VERSION_BASE}"
|
||||||
|
fi
|
||||||
|
./mvnw versions:set -DnewVersion=${BUILD_VERSION} -DprocessAllModules=true
|
||||||
|
|
||||||
|
- name: Build project
|
||||||
|
run: ./mvnw -s .mvn/settings.xml clean install -DskipTests
|
||||||
|
|
||||||
|
- name: Run tests
|
||||||
|
run: ./mvnw -s .mvn/settings.xml test
|
||||||
|
|
||||||
|
- name: Deploy project
|
||||||
|
run: ./mvnw -s .mvn/settings.xml deploy
|
||||||
52
bom/pom.xml
Normal file
52
bom/pom.xml
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>fr.cnd.compositor</groupId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
<artifactId>root</artifactId>
|
||||||
|
<relativePath>../pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<artifactId>bom</artifactId>
|
||||||
|
<name>Bom</name>
|
||||||
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<compiler-plugin.version>3.14.1</compiler-plugin.version>
|
||||||
|
<failsafe-plugin.version>${surefire-plugin.version}</failsafe-plugin.version>
|
||||||
|
<maven.compiler.release>21</maven.compiler.release>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
|
<quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
|
||||||
|
<quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
|
||||||
|
<quarkus.platform.version>3.31.3</quarkus.platform.version>
|
||||||
|
<quarkus.version>${quarkus.platform.version}</quarkus.version>
|
||||||
|
<skipITs>true</skipITs>
|
||||||
|
<surefire-plugin.version>3.5.4</surefire-plugin.version>
|
||||||
|
|
||||||
|
<!-- APP PROPS -->
|
||||||
|
<lombok.version>1.18.42</lombok.version>
|
||||||
|
<pebble.version>4.1.0</pebble.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencyManagement>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.pebbletemplates</groupId>
|
||||||
|
<artifactId>pebble</artifactId>
|
||||||
|
<version>${pebble.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<version>${lombok.version}</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</dependencyManagement>
|
||||||
|
|
||||||
|
</project>
|
||||||
76
builder/pom.xml
Normal file
76
builder/pom.xml
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>fr.cnd.compositor</groupId>
|
||||||
|
<artifactId>bom</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
<relativePath>../bom/pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<packaging>pom</packaging>
|
||||||
|
<artifactId>builder</artifactId>
|
||||||
|
<name>Builder - Ext</name>
|
||||||
|
|
||||||
|
<dependencyManagement>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.quarkus</groupId>
|
||||||
|
<artifactId>quarkus-bom</artifactId>
|
||||||
|
<version>${quarkus.version}</version>
|
||||||
|
<type>pom</type>
|
||||||
|
<scope>import</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</dependencyManagement>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<pluginManagement>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>io.quarkus</groupId>
|
||||||
|
<artifactId>quarkus-maven-plugin</artifactId>
|
||||||
|
<version>${quarkus.version}</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<version>${surefire-plugin.version}</version>
|
||||||
|
<configuration>
|
||||||
|
<systemPropertyVariables>
|
||||||
|
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
|
||||||
|
<maven.home>${maven.home}</maven.home>
|
||||||
|
<maven.repo>${settings.localRepository}</maven.repo>
|
||||||
|
</systemPropertyVariables>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-failsafe-plugin</artifactId>
|
||||||
|
<version>${failsafe-plugin.version}</version>
|
||||||
|
<configuration>
|
||||||
|
<systemPropertyVariables>
|
||||||
|
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
|
||||||
|
<maven.home>${maven.home}</maven.home>
|
||||||
|
<maven.repo>${settings.localRepository}</maven.repo>
|
||||||
|
</systemPropertyVariables>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>${compiler-plugin.version}</version>
|
||||||
|
<configuration>
|
||||||
|
<annotationProcessorPaths>
|
||||||
|
<path>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<version>${lombok.version}</version>
|
||||||
|
</path>
|
||||||
|
</annotationProcessorPaths>
|
||||||
|
<parameters>true</parameters>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</pluginManagement>
|
||||||
|
</build>
|
||||||
|
</project>
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package fr.cnd.compositor.blocks.models;
|
||||||
|
|
||||||
|
import lombok.*;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class BlockRenderDefinition {
|
||||||
|
String name;
|
||||||
|
Map<String, Object> inputs;
|
||||||
|
Map<String, List<BlockRenderDefinition>> slots;
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package fr.cnd.compositor.blocks.models;
|
||||||
|
|
||||||
|
import lombok.*;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class BlockRenderRequest {
|
||||||
|
Map<String, List<BlockRenderDefinition>> definitions;
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package fr.cnd.compositor.blocks.models;
|
||||||
|
|
||||||
|
import lombok.*;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class BlockRenderResult {
|
||||||
|
Map<String, List<String>> result;
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package fr.cnd.compositor.blocks.pebble;
|
||||||
|
|
||||||
|
import fr.cnd.compositor.blocks.models.BlockRenderDefinition;
|
||||||
|
import fr.cnd.compositor.blocks.specs.BlockTemplate;
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
import jakarta.inject.Inject;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public abstract class AbstractPebbleBlockTemplate implements BlockTemplate {
|
||||||
|
@Inject
|
||||||
|
PebbleBlockEngine engine;
|
||||||
|
|
||||||
|
public void setEngine(PebbleBlockEngine engine) {
|
||||||
|
this.engine = engine;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract Uni<String> getTemplate();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Uni<String> render(BlockRenderDefinition definition) {
|
||||||
|
final Map<String, Object> context = new HashMap<>(Optional.ofNullable(definition.getInputs()).orElse(new HashMap<>()));
|
||||||
|
return getTemplate()
|
||||||
|
.chain(template -> engine.render(template, context));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package fr.cnd.compositor.blocks.pebble;
|
||||||
|
|
||||||
|
import io.pebbletemplates.pebble.extension.AbstractExtension;
|
||||||
|
import io.pebbletemplates.pebble.extension.Function;
|
||||||
|
import jakarta.enterprise.context.ApplicationScoped;
|
||||||
|
import jakarta.inject.Inject;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@ApplicationScoped
|
||||||
|
public class PebbleBlocksExtension extends AbstractExtension {
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
PebbleSlotFunction pebbleSlotFunction;
|
||||||
|
public Map<String, Function> getFunctions() {
|
||||||
|
return Map.of("slot", pebbleSlotFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package fr.cnd.compositor.blocks.pebble;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import io.pebbletemplates.pebble.extension.Function;
|
||||||
|
import io.pebbletemplates.pebble.extension.escaper.SafeString;
|
||||||
|
import io.pebbletemplates.pebble.template.EvaluationContext;
|
||||||
|
import io.pebbletemplates.pebble.template.PebbleTemplate;
|
||||||
|
import jakarta.enterprise.context.ApplicationScoped;
|
||||||
|
import jakarta.inject.Inject;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@ApplicationScoped
|
||||||
|
public class PebbleSlotFunction implements Function {
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
ObjectMapper objectMapper;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SafeString execute(Map<String, Object> args, PebbleTemplate self, EvaluationContext context, int lineNumber) {
|
||||||
|
final Object slotsVar = context.getVariable("__slots__");
|
||||||
|
final Map<String, String> slots = objectMapper.convertValue(slotsVar, new TypeReference<>() {});
|
||||||
|
final String slotName = (String) args.get("name");
|
||||||
|
return slots != null && slots.containsKey(slotName) ? new SafeString(slots.get(slotName)) : new SafeString("");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getArgumentNames() {
|
||||||
|
return List.of("name");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package fr.cnd.compositor.blocks.specs;
|
||||||
|
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public interface BlockConfiguration {
|
||||||
|
Uni<String> getBlockTemplateName();
|
||||||
|
Uni<Map<String, Object>> mapInputs(Map<String, Object> inputs);
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package fr.cnd.compositor.blocks.specs;
|
||||||
|
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maps user-provided inputs to the final template context.
|
||||||
|
*/
|
||||||
|
public interface ContextMapping {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transforms the given user inputs into the context that will be passed to the template engine.
|
||||||
|
*
|
||||||
|
* @param inputs the raw user-provided input entries
|
||||||
|
* @return a {@link Uni} emitting the resulting template context
|
||||||
|
*/
|
||||||
|
Uni<Map<String, Object>> map(Map<String, Object> inputs);
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package fr.cnd.compositor.blocks.specs;
|
||||||
|
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
|
||||||
|
public interface ContextMappingResolver {
|
||||||
|
Uni<ContextMapping> resolveContextMapping(String contextMappingIdentifier);
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package fr.cnd.compositor.blocks.templates;
|
||||||
|
|
||||||
|
import fr.cnd.compositor.blocks.pebble.AbstractPebbleBlockTemplate;
|
||||||
|
import io.smallrye.common.annotation.Identifier;
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
import jakarta.enterprise.context.ApplicationScoped;
|
||||||
|
|
||||||
|
@Identifier("html")
|
||||||
|
@ApplicationScoped
|
||||||
|
public class HtmlBlockTemplate extends AbstractPebbleBlockTemplate {
|
||||||
|
@Override
|
||||||
|
public Uni<String> getTemplate() {
|
||||||
|
return Uni.createFrom().item("""
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>{{title}}</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
{{content}}
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
""");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
package fr.cnd.compositor.blocks.templates;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import fr.cnd.compositor.blocks.specs.BlockConfiguration;
|
||||||
|
import io.smallrye.common.annotation.Identifier;
|
||||||
|
import io.smallrye.mutiny.Uni;
|
||||||
|
import jakarta.enterprise.context.ApplicationScoped;
|
||||||
|
import jakarta.inject.Inject;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Identifier("product")
|
||||||
|
@ApplicationScoped
|
||||||
|
public class HtmlProductConfiguration implements BlockConfiguration {
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
ObjectMapper objectMapper;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Uni<String> getBlockTemplateName() {
|
||||||
|
return Uni.createFrom().item("html");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Uni<Map<String, Object>> mapInputs(Map<String, Object> inputs) {
|
||||||
|
Map<String, String> product = objectMapper.convertValue(inputs.getOrDefault("product", new HashMap<>()), new TypeReference<>() {});
|
||||||
|
|
||||||
|
return Uni.createFrom().item(Map.of(
|
||||||
|
"title", product.getOrDefault("title", ""),
|
||||||
|
"content", product.getOrDefault("name", "")
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
20
pom.xml
Normal file
20
pom.xml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>fr.cnd.compositor</groupId>
|
||||||
|
<artifactId>root</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
|
||||||
|
<name>Blocks</name>
|
||||||
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
|
<modules>
|
||||||
|
<module>bom</module>
|
||||||
|
<module>builder</module>
|
||||||
|
|
||||||
|
<module>modules/core</module>
|
||||||
|
</modules>
|
||||||
|
|
||||||
|
</project>
|
||||||
Reference in New Issue
Block a user