]> git.frustrated-labs.net Git - masterly-api/commitdiff
feat: add application skeleton classes main
authorAlexander Goussas <[email protected]>
Mon, 18 May 2026 04:00:47 +0000 (23:00 -0500)
committerAlexander Goussas <[email protected]>
Mon, 18 May 2026 04:00:47 +0000 (23:00 -0500)
src/main/java/io/github/aloussase/GreetingResource.java [deleted file]
src/main/java/io/github/aloussase/application/controller/SearchResource.java [new file with mode: 0644]
src/main/java/io/github/aloussase/config/AppConfig.java [new file with mode: 0644]
src/main/java/io/github/aloussase/domain/entity/MastersInfo.java [new file with mode: 0644]
src/main/java/io/github/aloussase/domain/repository/CompositeSource.java [new file with mode: 0644]
src/main/java/io/github/aloussase/domain/repository/LocalSource.java [new file with mode: 0644]
src/main/java/io/github/aloussase/domain/repository/RemoteSource.java [new file with mode: 0644]
src/main/java/io/github/aloussase/domain/repository/Source.java [new file with mode: 0644]
src/main/java/io/github/aloussase/domain/service/SearchService.java [new file with mode: 0644]

diff --git a/src/main/java/io/github/aloussase/GreetingResource.java b/src/main/java/io/github/aloussase/GreetingResource.java
deleted file mode 100644 (file)
index 9ac0cc9..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-package io.github.aloussase;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.Produces;
-import jakarta.ws.rs.core.MediaType;
-
-@Path("/hello")
-public class GreetingResource {
-
-    @GET
-    @Produces(MediaType.TEXT_PLAIN)
-    public String hello() {
-        return "Hello from Quarkus REST";
-    }
-}
diff --git a/src/main/java/io/github/aloussase/application/controller/SearchResource.java b/src/main/java/io/github/aloussase/application/controller/SearchResource.java
new file mode 100644 (file)
index 0000000..5098bce
--- /dev/null
@@ -0,0 +1,23 @@
+package io.github.aloussase.application.controller;
+
+import io.github.aloussase.domain.service.SearchService;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.core.MediaType;
+
+@Path("/search")
+public class SearchResource {
+
+    private final SearchService searchService;
+
+    public SearchResource(SearchService searchService) {
+        this.searchService = searchService;
+    }
+
+    @GET
+    @Produces(MediaType.TEXT_PLAIN)
+    public String search() {
+        return "Hello from Quarkus REST";
+    }
+}
diff --git a/src/main/java/io/github/aloussase/config/AppConfig.java b/src/main/java/io/github/aloussase/config/AppConfig.java
new file mode 100644 (file)
index 0000000..bcbf3a4
--- /dev/null
@@ -0,0 +1,18 @@
+package io.github.aloussase.config;
+
+import io.github.aloussase.domain.repository.CompositeSource;
+import io.github.aloussase.domain.service.SearchService;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.ws.rs.Produces;
+
+
+public class AppConfig {
+
+    @Produces
+    @ApplicationScoped
+    public SearchService providesSearchService() {
+        final var cs = new CompositeSource();
+        return new SearchService(cs);
+    }
+
+}
diff --git a/src/main/java/io/github/aloussase/domain/entity/MastersInfo.java b/src/main/java/io/github/aloussase/domain/entity/MastersInfo.java
new file mode 100644 (file)
index 0000000..e44125a
--- /dev/null
@@ -0,0 +1,9 @@
+package io.github.aloussase.domain.entity;
+
+public record MastersInfo(
+        String mastersName,
+        String shortDescription,
+        String institution,
+        String infoUrl
+) {
+}
diff --git a/src/main/java/io/github/aloussase/domain/repository/CompositeSource.java b/src/main/java/io/github/aloussase/domain/repository/CompositeSource.java
new file mode 100644 (file)
index 0000000..02a7fbf
--- /dev/null
@@ -0,0 +1,37 @@
+package io.github.aloussase.domain.repository;
+
+import io.github.aloussase.domain.entity.MastersInfo;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * A {@link  Source} that can invoke multiple other sources.
+ */
+public class CompositeSource implements Source {
+    private List<Source> sources;
+
+    /**
+     * Add a new source.
+     *
+     * @param source The source to add.
+     * @return The {@code CompositeSource} instance for fluent chaining.
+     */
+    public CompositeSource addSource(Source source) {
+        sources.add(source);
+        return this;
+    }
+
+    public List<Source> getSources() {
+        return Collections.unmodifiableList(sources);
+    }
+
+    @Override
+    public List<MastersInfo> search(String query) {
+        // TODO: Parallelize this.
+        return sources
+                .stream()
+                .flatMap(s -> s.search(query).stream())
+                .toList();
+    }
+}
diff --git a/src/main/java/io/github/aloussase/domain/repository/LocalSource.java b/src/main/java/io/github/aloussase/domain/repository/LocalSource.java
new file mode 100644 (file)
index 0000000..22124b3
--- /dev/null
@@ -0,0 +1,4 @@
+package io.github.aloussase.domain.repository;
+
+public interface LocalSource extends Source {
+}
diff --git a/src/main/java/io/github/aloussase/domain/repository/RemoteSource.java b/src/main/java/io/github/aloussase/domain/repository/RemoteSource.java
new file mode 100644 (file)
index 0000000..f7de707
--- /dev/null
@@ -0,0 +1,8 @@
+package io.github.aloussase.domain.repository;
+
+/**
+ * A {@link Source} that works by fetching {@link  io.github.aloussase.domain.entity.MastersInfo}
+ * from a third party provider via HTTP.
+ */
+public interface RemoteSource extends Source {
+}
diff --git a/src/main/java/io/github/aloussase/domain/repository/Source.java b/src/main/java/io/github/aloussase/domain/repository/Source.java
new file mode 100644 (file)
index 0000000..4d92ac7
--- /dev/null
@@ -0,0 +1,15 @@
+package io.github.aloussase.domain.repository;
+
+import io.github.aloussase.domain.entity.MastersInfo;
+
+import java.util.List;
+
+public interface Source {
+    /**
+     * Search for {@link MastersInfo} using the provided query.
+     *
+     * @param query A query to be interpreted by the implementation
+     * @return A list of masters info that matched the query.
+     */
+    List<MastersInfo> search(String query);
+}
diff --git a/src/main/java/io/github/aloussase/domain/service/SearchService.java b/src/main/java/io/github/aloussase/domain/service/SearchService.java
new file mode 100644 (file)
index 0000000..be2d642
--- /dev/null
@@ -0,0 +1,19 @@
+package io.github.aloussase.domain.service;
+
+import io.github.aloussase.domain.entity.MastersInfo;
+import io.github.aloussase.domain.repository.Source;
+
+import java.util.List;
+
+public class SearchService {
+
+    private final Source source;
+
+    public SearchService(Source source) {
+        this.source = source;
+    }
+
+    public List<MastersInfo> search(String query) {
+        return source.search(query);
+    }
+}