diff --git a/.gitignore b/.gitignore
index 8861b7c42adb9738d898f8990ab9efcab5398128..a922e244006cab76b9feaf1c9e22bb23f20e4bf3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -41,4 +41,6 @@ nb-configuration.xml
/config/**/*secret.properties
/node_modules
-/src/test/resources/schemas
\ No newline at end of file
+/src/test/resources/schemas
+/.apt_generated/
+/.apt_generated_tests/
diff --git a/Makefile b/Makefile
index 4b4c69aaadd00ad698606a260230844bbabafeb5..f51c76585c35f6d66fbf2725cf957ef3282c5884 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,11 @@
+SHELL = /bin/bash
+pre-setup:;
+ @echo "Creating environment file from template"
+ @rm -f .env && envsubst < config/.env.sample > .env
setup:;
- rm .env && envsubst < config/.env.sample > .env
- rm ./config/secret.properties && envsubst < config/secret.properties.sample > config/secret.properties
- rm ./config/foundationdb/secret.properties && envsubst < config/foundationdb/secret.properties.sample > config/foundationdb/secret.properties
+ @echo "Generating secret files from templates using environment file + variables"
+ @source .env && rm -f ./config/secret.properties && envsubst < config/secret.properties.sample > config/secret.properties
+ @source .env && rm -f ./config/foundationdb/secret.properties && envsubst < config/foundationdb/secret.properties.sample > config/foundationdb/secret.properties
clean:;
mvn clean
install-yarn:;
diff --git a/config/.env.sample b/config/.env.sample
index b22b1d4ea4b5cb65fb110115f3968333113f5be1..9734bb7e8eb811259a6837c5c5368786382bc7c5 100644
--- a/config/.env.sample
+++ b/config/.env.sample
@@ -1,3 +1,15 @@
-WGAPI_MYSQL_PASSWORD=$MYSQL_PASSWORD
-WGAPI_MYSQL_PORT=3306
-CONFIG_SECRET_PATH=$PWD/config/secret.properties
\ No newline at end of file
+export WGAPI_MYSQL_PASSWORD=$MARIADB_PASSWORD
+export WGAPI_MYSQL_PORT=$MARIADB_PORT
+export CONFIG_SECRET_PATH=$PWD/config/secret.properties
+
+export FOUNDATIONDB_DB_NAME=eclipsefoundation
+
+export KEYCLOAK_FOUNDATIONDB_REALM_URL=https://auth.eclipse.org/auth/realms/foundation
+
+# WG API -> FDB API connection settings.
+export WGAPI_OIDCCLIENT_CLIENT_ID=sample
+export WGAPI_OIDCCLIENT_CLIENT_CREDENTIALS=sample
+
+# FoundationDB API OIDC connection settings
+export FOUNDATION_OIDC_CLIENT_ID=sample
+export FOUNDATION_OIDC_CLIENT_CREDENTIALS=sample
\ No newline at end of file
diff --git a/config/foundationdb/secret.properties.sample b/config/foundationdb/secret.properties.sample
index 9b86eb8eef85d2450b4026beb52695d9ce8f5124..c363d69e9dd070b470e6dc9515434b1aa37c393d 100644
--- a/config/foundationdb/secret.properties.sample
+++ b/config/foundationdb/secret.properties.sample
@@ -1,9 +1,9 @@
quarkus.datasource.jdbc.url=jdbc:mariadb://localhost:$FOUNDATIONDB_DB_PORT/$FOUNDATIONDB_DB_NAME
-quarkus.datasource.username=$MYSQL_USER
-quarkus.datasource.password=$MYSQL_PASSWORD
+quarkus.datasource.username=$MARIADB_USER
+quarkus.datasource.password=$MARIADB_PASSWORD
-quarkus.oauth2.introspection-url=http://localhost:8080/auth/realms/foundation
-quarkus.oauth2.client-id=foundation
-quarkus.oauth2.client-secret=sample
+quarkus.oidc.auth-server-url=$KEYCLOAK_FOUNDATIONDB_REALM_URL
+quarkus.oidc.client-id=$FOUNDATION_OIDC_CLIENT_ID
+quarkus.oidc.credentials.secret=$FOUNDATION_OIDC_CLIENT_CREDENTIALS
quarkus.http.port=8095
\ No newline at end of file
diff --git a/config/secret.properties.sample b/config/secret.properties.sample
index fbf2905808813fea3dd7e5b17a27119331cf7003..92347366677c56baa3c4e81e112330552b3c355a 100644
--- a/config/secret.properties.sample
+++ b/config/secret.properties.sample
@@ -1,7 +1,3 @@
-quarkus.oidc.auth-server-url=http://keycloak/auth/realms/foundation
-quarkus.oidc.client-id=working_groups_api
-quarkus.oidc.credentials.secret=sample
-
-#
-#
-#
\ No newline at end of file
+quarkus.oidc-client.auth-server-url=$KEYCLOAK_FOUNDATIONDB_REALM_URL
+quarkus.oidc-client.client-id=$WGAPI_OIDCCLIENT_CLIENT_ID
+quarkus.oidc-client.credentials.secret=$WGAPI_OIDCCLIENT_CLIENT_CREDENTIALS
diff --git a/pom.xml b/pom.xml
index cca2712ab298d05e60dd75caadcc4c74dca8d83f..839d361cfa0b4c88ccf34d993d684d11020eb1ee 100644
--- a/pom.xml
+++ b/pom.xml
@@ -14,9 +14,10 @@
io.quarkus.platform
2.6.3.Final
3.0.0-M5
- 1.8.2
- 5.5.6.Final
- 0.6.3-SNAPSHOT
+ 1.8.2
+ 5.5.6.Final
+ 0.6.3-SNAPSHOT
+ 1.0-SNAPSHOT
@@ -54,11 +55,6 @@
-
- org.eclipsefoundation
- quarkus-persistence
- ${eclipse-api-version}
-
io.quarkus
quarkus-resteasy
@@ -69,7 +65,7 @@
io.quarkus
- quarkus-oidc
+ quarkus-oidc-client
io.quarkus
diff --git a/src/main/java/org/eclipsefoundation/wg/api/SysAPI.java b/src/main/java/org/eclipsefoundation/wg/api/SysAPI.java
new file mode 100644
index 0000000000000000000000000000000000000000..d9f2e7163edd2f74ba410bfd7079a8a89a324818
--- /dev/null
+++ b/src/main/java/org/eclipsefoundation/wg/api/SysAPI.java
@@ -0,0 +1,33 @@
+package org.eclipsefoundation.wg.api;
+
+import javax.annotation.security.RolesAllowed;
+import javax.ws.rs.BeanParam;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
+import org.eclipsefoundation.core.service.APIMiddleware.BaseAPIParameters;
+
+import io.quarkus.oidc.client.filter.OidcClientFilter;
+
+/**
+ * FoundationDB API system API binding.
+ *
+ * @author Martin Lowe
+ *
+ */
+@Path("sys")
+@OidcClientFilter
+@Produces(MediaType.APPLICATION_JSON)
+@RegisterRestClient(configKey = "fdndb-api")
+public interface SysAPI {
+
+ @GET
+ @Path("relations")
+ @RolesAllowed("fdb_read_sys")
+ Response get(@BeanParam BaseAPIParameters baseParams, @QueryParam("type") String type);
+}
diff --git a/src/main/java/org/eclipsefoundation/wg/api/SysRelationData.java b/src/main/java/org/eclipsefoundation/wg/api/SysRelationData.java
new file mode 100644
index 0000000000000000000000000000000000000000..b649e40e25bd12d678bdb5e3e771c292c461b4a1
--- /dev/null
+++ b/src/main/java/org/eclipsefoundation/wg/api/SysRelationData.java
@@ -0,0 +1,42 @@
+package org.eclipsefoundation.wg.api;
+
+import javax.annotation.Nullable;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
+import com.google.auto.value.AutoValue;
+
+@AutoValue
+@JsonDeserialize(builder = AutoValue_SysRelationData.Builder.class)
+public abstract class SysRelationData {
+ public abstract String getRelation();
+
+ public abstract String getDescription();
+
+ public abstract boolean isActive();
+
+ public abstract String getType();
+
+ @Nullable
+ public abstract String getSortOrder();
+
+ public static Builder builder() {
+ return new AutoValue_SysRelationData.Builder();
+ }
+
+ @AutoValue.Builder
+ @JsonPOJOBuilder(withPrefix = "set")
+ public abstract static class Builder {
+ public abstract Builder setRelation(String relation);
+
+ public abstract Builder setDescription(String description);
+
+ public abstract Builder setActive(boolean isActive);
+
+ public abstract Builder setType(String type);
+
+ public abstract Builder setSortOrder(@Nullable String sortOrder);
+
+ public abstract SysRelationData build();
+ }
+}
diff --git a/src/main/java/org/eclipsefoundation/wg/services/SystemDataService.java b/src/main/java/org/eclipsefoundation/wg/services/SystemDataService.java
new file mode 100644
index 0000000000000000000000000000000000000000..974116ab259a636bff82dcac7657ec121e4580a6
--- /dev/null
+++ b/src/main/java/org/eclipsefoundation/wg/services/SystemDataService.java
@@ -0,0 +1,63 @@
+package org.eclipsefoundation.wg.services;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+
+import org.eclipse.microprofile.rest.client.inject.RestClient;
+import org.eclipsefoundation.core.service.APIMiddleware;
+import org.eclipsefoundation.core.service.CachingService;
+import org.eclipsefoundation.wg.api.SysAPI;
+import org.eclipsefoundation.wg.api.SysRelationData;
+import org.jboss.resteasy.specimpl.MultivaluedMapImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Service interface to retrieve system data from the foundation DB service.
+ *
+ * @author Martin Lowe
+ *
+ */
+public interface SystemDataService {
+
+ /**
+ * Get the relation data from the system data endpoint for foundationdb. Retrieves only data related to the WG
+ * relations needed by this service.
+ *
+ * @return list of sys relation data for working group type relations.
+ */
+ List get();
+
+ @ApplicationScoped
+ public static class DefaultSystemDataService implements SystemDataService {
+ public static final Logger LOGGER = LoggerFactory.getLogger(DefaultSystemDataService.class);
+
+ public static final String WORKING_GROUPS_RELATION_TYPE = "WG";
+
+ @Inject
+ CachingService cache;
+ @Inject
+ APIMiddleware middle;
+
+ @RestClient
+ @Inject
+ SysAPI sysAPI;
+
+ @Override
+ public List get() {
+ Optional> relations = cache.get(WORKING_GROUPS_RELATION_TYPE,
+ new MultivaluedMapImpl<>(), SysRelationData.class,
+ () -> middle.getAll(i -> sysAPI.get(i, WORKING_GROUPS_RELATION_TYPE), SysRelationData.class));
+ if (relations.isEmpty()) {
+ LOGGER.warn("Could not find any relations for type '{}', there may be a connection error",
+ WORKING_GROUPS_RELATION_TYPE);
+ return Collections.emptyList();
+ }
+ return relations.get();
+ }
+ }
+}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 7f6dfba86e264acb6608e5e299ac9699fef4aac5..f5c5d93fb271fa10f7702b4d922afe59716ed8bb 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -1,2 +1,4 @@
-quarkus.oauth.enabled=false
+fdndb-api/mp-rest/url=http://localhost:8095
+fdndb-api/mp-rest/scope=javax.inject.Singleton
+
quarkus.oidc.enabled=false
\ No newline at end of file