diff --git a/.github/workflows/work-jar.yml b/.github/workflows/work-jar.yml index 207f555..f6222b4 100644 --- a/.github/workflows/work-jar.yml +++ b/.github/workflows/work-jar.yml @@ -3,7 +3,6 @@ on: push: branches: - main - - Feature/AtomicFactory permissions: contents: write pages: write diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..6fea68f --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/README.md b/README.md index c85e4b7..a4a5dcc 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ Changelog: --- -## 🌟 Why ConnectLib? +## Why ConnectLib? Imagine an API that doesn't just connect services, but becomes the conductor of your integrations. ConnectLib is designed to: @@ -76,17 +76,17 @@ Imagine an API that doesn't just connect services, but becomes the conductor of --- -## 🛠️ Main Features +## Main Features -- 🔌 **Centralized connector management** -- ⚡ **Automated job execution** -- 🧩 **Extensible and modular** -- 📊 **Detailed logs and monitoring** -- 🔒 **Built-in security** +- **Centralized connector management** +- **Automated job execution** +- **Extensible and modular** +- **Detailed logs and monitoring** +- **Built-in security** --- -## 🚦 Quick Start +## Quick Start 1. **Clone the project** ```bash @@ -104,13 +104,13 @@ Imagine an API that doesn't just connect services, but becomes the conductor of --- -## 🧑‍💻 Usage Example +## Usage Example More examples HERE: [ExampleUsages.java](src/main/java/fr/sandro642/github/example/ExampleUsages.java) --- -[build.gradle](build.gradle) -## 📚 Project Structure + +## Project Structure - `src/main/java/fr/sandro642/github/` : main source code - `src/test/java/fr/sandro642/github/test/` : unit tests @@ -118,7 +118,7 @@ More examples HERE: [ExampleUsages.java](src/main/java/fr/sandro642/github/examp --- -## 🤝 Contributing +## Contributing 1. Fork the repo 2. Create a branch (`feature/my-feature`) @@ -126,7 +126,7 @@ More examples HERE: [ExampleUsages.java](src/main/java/fr/sandro642/github/examp --- -## 📞 Contact +## Contact For any questions or suggestions: [sandro33810@gmail.com](mailto:sandro33810@gmail.com) diff --git a/build.gradle b/build.gradle index c8ed704..42e5508 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { } group = 'fr.sandro642.github' -version = '0.4.3.1-STABLE' +version = '0.4.6-STABLE' // Générer une classe de version automatiquement task generateVersionClass { diff --git a/src/main/java/fr/sandro642/github/example/ExampleUsages.java b/src/main/java/fr/sandro642/github/example/ExampleUsages.java deleted file mode 100644 index 2caacea..0000000 --- a/src/main/java/fr/sandro642/github/example/ExampleUsages.java +++ /dev/null @@ -1,107 +0,0 @@ -package fr.sandro642.github.example; - -import fr.sandro642.github.ConnectLib; -import fr.sandro642.github.api.ApiFactory; -import fr.sandro642.github.enums.LangType; -import fr.sandro642.github.enums.MethodType; -import fr.sandro642.github.enums.ResourceType; -import fr.sandro642.github.enums.VersionType; -import fr.sandro642.github.provider.RouteImport; - -import java.util.Map; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.TimeUnit; - -/** - * ExampleUsages is a placeholder class that can be used to demonstrate how to use the ConnectLib library. - * It can contain example methods or code snippets that show how to interact with the API, handle responses, - * and utilize the features provided by the ConnectLib library. - * - * @author Sandro642 - * @version 1.0 - */ - -public class ExampleUsages { - - private ConnectLib connectLib = new ConnectLib(); - - public enum ExampleRoutes implements RouteImport { - EXAMPLE_ROUTE("/api/example/route"); - - final String route; - - ExampleRoutes(String route) { - this.route = route; - } - - @Override - public String getRoute() { - return route; - } - } - - public void initializeLib() { - - // Optionally, you can specify routes if needed - connectLib.init(ResourceType.MAIN_RESOURCES, LangType.FRENCH, ExampleRoutes.class); - // You can also initialize without specifying routes - connectLib.init(ResourceType.MAIN_RESOURCES, LangType.FRENCH); - } - - // Example method to demonstrate usage - public void exampleMethodSync() { - try { - // This method can be used to demonstrate how to interact with the API - // For example, making a GET request to the EXAMPLE_ROUTE - CompletableFuture apiFactoryCompletableFuture = connectLib.JobGetInfos() - .getRoutes(VersionType.V1_BRANCH, MethodType.GET, ExampleRoutes.EXAMPLE_ROUTE) - .getResponse(); - - ApiFactory response = apiFactoryCompletableFuture.get(5, TimeUnit.SECONDS); - - System.out.println(response.display()); - System.out.println("Response Code: " + response.getData("code")); - System.out.println("Response Message: " + response.getData("message")); - System.out.println("Response Data: " + response.getSpecData("data", "exampleKey")); - System.out.println("Status Code: " + response.getStatusCode()); - } catch (Exception e) { - e.printStackTrace(); - } - } - - // Example method to demonstrate asynchronous usage - public void exampleMethodAsync() { - try { - // This method can be used to demonstrate how to interact with the API asynchronously - - CompletableFuture apiFactoryCompletableFuture = connectLib.JobGetInfos() - .getRoutes(VersionType.V1_BRANCH, MethodType.GET, ExampleRoutes.EXAMPLE_ROUTE) - .getResponse(); - - ApiFactory response = apiFactoryCompletableFuture.get(5, TimeUnit.SECONDS); - - System.out.println(response.display()); - System.out.println("Response Code: " + response.getData("code")); - System.out.println("Response Message: " + response.getData("message")); - System.out.println("Response Data: " + response.getSpecData("data", "exampleKey")); - } catch (Exception e) { - e.printStackTrace(); - } - } - - // Example to use all methods in JobGetInfos - public void exampleJobGetInfos() { - Map body = Map.of(); - Map params = Map.of(); - Map query = Map.of(); - - connectLib.JobGetInfos().getRoutes(VersionType.V1_BRANCH, MethodType.GET, ExampleRoutes.EXAMPLE_ROUTE, body, params, query); - connectLib.JobGetInfos().getRoutes(VersionType.V1_BRANCH, MethodType.POST, ExampleRoutes.EXAMPLE_ROUTE, body); - connectLib.JobGetInfos().getRoutes(VersionType.V1_BRANCH, MethodType.PUT, ExampleRoutes.EXAMPLE_ROUTE, null, params, query); - connectLib.JobGetInfos().getRoutes(VersionType.V1_BRANCH, MethodType.PATCH, ExampleRoutes.EXAMPLE_ROUTE); - connectLib.JobGetInfos().getRoutes(MethodType.GET, ExampleRoutes.EXAMPLE_ROUTE, body, params); - connectLib.JobGetInfos().getRoutes(MethodType.POST, ExampleRoutes.EXAMPLE_ROUTE, body); - connectLib.JobGetInfos().getRoutes(MethodType.DELETE, ExampleRoutes.EXAMPLE_ROUTE); - } - -} diff --git a/src/main/java/fr/sandro642/github/jobs/JobGetInfos.java b/src/main/java/fr/sandro642/github/jobs/JobGetInfos.java index 0f04bf3..857f59e 100644 --- a/src/main/java/fr/sandro642/github/jobs/JobGetInfos.java +++ b/src/main/java/fr/sandro642/github/jobs/JobGetInfos.java @@ -41,6 +41,8 @@ public class JobGetInfos { */ private URLProvider urlBranch; + private String fullRoute = ""; + /** * Constructor of JobGetInfos. * Initializes the ApiClient and loads the YAML configuration. @@ -59,29 +61,6 @@ private String getRouteName(Enum routeName) { return routeName.name().toLowerCase(); } - /** - * Get routes from the YAML file and builds the full URL. - * @param versionType Version of the API (V1_BRANCH, V2_BRANCH) - * @param methodType Type of HTTP method (GET, POST) - * @param routeName Name of the route in the YAML file - * @param body Body of the request for POST (can be null for GET) - * @return JobGetInfos for chaining - */ - public JobGetInfos getRoutes(VersionProvider versionType, MethodType methodType, Enum routeName, Map body) { - return getRoutes(versionType, methodType, getRouteName(routeName), body, null, null); - } - - /** - * Get routes from the YAML file and builds the full URL with parameters. - * @param versionType Version of the API (V1_BRANCH, V2_BRANCH) - * @param methodType Type of HTTP method (GET, POST) - * @param routeName Name of the route in the YAML file - * @return JobGetInfos for chaining - */ - public JobGetInfos getRoutes(VersionProvider versionType, MethodType methodType, Enum routeName) { - return getRoutes(versionType, methodType, getRouteName(routeName), null, null, null); - } - /** * Get routes from the YAML file and builds the full URL with a request body. * @param methodType Type of HTTP method (GET, POST) @@ -89,166 +68,84 @@ public JobGetInfos getRoutes(VersionProvider versionType, MethodType methodType, * @return JobGetInfos for chaining */ public JobGetInfos getRoutes(MethodType methodType, Enum routeName) { - return getRoutes(null, methodType, getRouteName(routeName), null, null, null); - } - - /** - * Get routes from the YAML file and builds the full URL with a request body and parameters. - * @param methodType Type of HTTP method (GET, POST) - * @param routeName Name of the route in the YAML file - * @param body Body of the request for POST (can be null for GET) - * @return JobGetInfos for chaining - */ - public JobGetInfos getRoutes(MethodType methodType, Enum routeName, Map body) { - return getRoutes(null, methodType, getRouteName(routeName), body, null, null); - } - - /** - * Get routes from the YAML file and builds the full URL with additional parameters. - * @param methodType Type of HTTP method (GET, POST) - * @param routeName Name of the route in the YAML file - * @param params Additional parameters for the request - * @return JobGetInfos for chaining - */ - public JobGetInfos getRoutes(MethodType methodType, Enum routeName, Map body, Map params) { - return getRoutes(null, methodType, getRouteName(routeName), body, params, null); - } - - /** - * Get routes from the YAML file and builds the full URL. - * @param methodType Type of HTTP method (GET, POST) - * @param routeName Name of the route in the YAML file - * @return JobGetInfos for chaining - */ - public JobGetInfos getRoutes(MethodType methodType, String routeName) { - return getRoutes(null, methodType, routeName, null, null, null); - } - - /** - * Récupère les routes depuis le fichier YAML et construit l'URL complète - * @param versionType Version de l'API (V1_BRANCH, V2_BRANCH) - * @param methodType Type de méthode HTTP (GET, POST) - * @param routeName Nom de la route dans le fichier YAML - * @return JobGetInfos pour chaînage - */ - public JobGetInfos getRoutes(VersionProvider versionType, MethodType methodType, String routeName) { - return getRoutes(versionType, methodType, routeName, null, null, null); + return getRoutes(null, methodType, getRouteName(routeName)); } /** * Get routes from the YAML file and builds the full URL with a request body. - * @param versionType Version of the API (V1_BRANCH, V2_BRANCH) + * @param versionType VersionProvider to specify API versioning * @param methodType Type of HTTP method (GET, POST) * @param routeName Name of the route in the YAML file - * @param body Body of the request for POST (can be null for GET) * @return JobGetInfos for chaining */ - public JobGetInfos getRoutes(VersionProvider versionType, MethodType methodType, String routeName, Map body) { - return getRoutes(versionType, methodType, routeName, body, null, null); - } - - /** - * Get routes from the YAML file and builds the full URL with a request body and parameters. - * @param methodType Type of HTTP method (GET, POST) - * @param routeName Name of the route in the YAML file - * @param body Body of the request for POST (can be null for GET) - * @param params Additional parameters for the request - * @param query Additional query parameters for the request - * @return JobGetInfos for chaining - */ - public JobGetInfos getRoutes(MethodType methodType, String routeName, Map body, Map params, Map query) { - return getRoutes(null, methodType, routeName, body, params, query); - } - - /** - * Get routes from the YAML file and builds the full URL with additional parameters. - * @param methodType Type of HTTP method (GET, POST) - * @param routeName Name of the route in the YAML file - * @param body Body of the request for POST (can be null for GET) - * @param params Additional parameters for the request - * @param query Additional query parameters for the request - * @return JobGetInfos for chaining - */ - public JobGetInfos getRoutes(MethodType methodType, Enum routeName, Map body, Map params, Map query) { - return getRoutes(null, methodType, getRouteName(routeName), body, params, query); - } - - /** - * Get routes from the YAML file and builds the full URL with additional parameters. - * @param versionType Version of the API (V1_BRANCH, V2_BRANCH) - * @param methodType Type of HTTP method (GET, POST) - * @param routeName Name of the route in the YAML file - * @param params Additional parameters for the request - * @param query Additional query parameters for the request - * @return JobGetInfos for chaining - */ - public JobGetInfos getRoutes(VersionProvider versionType, MethodType methodType, R routeName, Map body, Map params, Map query) { + public JobGetInfos getRoutes(VersionProvider versionType, MethodType methodType, R routeName) { try { String route = connectLib.getRoute(routeName.toString().toLowerCase()); - String fullRoute; - if (versionType != null && versionType.getVersion() != null) { String cleanRoute = route.startsWith("/") ? route.substring(1) : route; fullRoute = "/" + versionType.getVersion() + "/" + cleanRoute; } else { - fullRoute = route; + this.fullRoute = route; } - if (params != null && !params.isEmpty()) { - for (Map.Entry entry : params.entrySet()) { - String paramKey = "{" + entry.getKey() + "}"; - String paramValue = entry.getValue().toString(); - fullRoute = fullRoute.replace(paramKey, paramValue); - } - } + connectLib.StoreAndRetrieve().store.put("currentRoute", this.fullRoute); + connectLib.StoreAndRetrieve().store.put("currentMethod", methodType); - // New query string handling logic - if (query != null && !query.isEmpty()) { - // Pattern for capturing parameters between $ - Pattern pattern = Pattern.compile("\\$([^$]+)\\$"); - Matcher matcher = pattern.matcher(fullRoute); - - StringBuilder queryString = new StringBuilder("?"); - boolean firstParam = true; - - // Iterate through all matches (parameters between $) - while (matcher.find()) { - String paramName = matcher.group(1); // Get parameter name without $ - - // Check if this parameter exists in the query map - if (query.containsKey(paramName)) { - if (!firstParam) { - queryString.append("&"); - } - queryString.append(paramName).append("=").append(query.get(paramName)); - firstParam = false; - } - } + connectLib.Logger().INFO(connectLib.LangManager().getMessage(CategoriesType.JOBS_PACKAGE, "getroutes.maderoute", "route", fullRoute)); + } catch (Exception e) { + connectLib.Logger().ERROR(connectLib.LangManager().getMessage(CategoriesType.JOBS_PACKAGE, "getroutes.error", "exception", e.getMessage())); + } + return this; + } - // Append query string to the route only if parameters were added - if (queryString.length() > 1) { - // Clean the route by removing $parameter$ placeholders and extra & - String cleanRoute = fullRoute.replaceAll("\\$[^$]+\\$", "").replaceAll("&+", ""); - fullRoute = cleanRoute + queryString.toString(); - } - } + public JobGetInfos body(Map body) { + connectLib.StoreAndRetrieve().store.put("currentBody", body); + return this; + } - connectLib.StoreAndRetrieve().store.put("currentRoute", fullRoute); - connectLib.StoreAndRetrieve().store.put("currentMethod", methodType); + public JobGetInfos params(Map params) { + if (params == null || params.isEmpty()) return this; - if (body != null) { - connectLib.StoreAndRetrieve().store.put("currentBody", body); - } + for (Map.Entry entry : params.entrySet()) { + String paramKey = "{" + entry.getKey() + "}"; + String paramValue = entry.getValue() == null ? "" : entry.getValue().toString(); + this.fullRoute = this.fullRoute.replace(paramKey, paramValue); + } + + connectLib.StoreAndRetrieve().store.put("currentParams", params); + connectLib.StoreAndRetrieve().store.put("currentRoute", this.fullRoute); + return this; + } + + public JobGetInfos query(Map query) { + if (query == null || query.isEmpty()) return this; - if (params != null) { - connectLib.StoreAndRetrieve().store.put("currentParams", params); + Pattern pattern = Pattern.compile("\\$([^$]+)\\$"); + Matcher matcher = pattern.matcher(this.fullRoute); + + StringBuilder queryString = new StringBuilder("?"); + boolean firstParam = true; + + while (matcher.find()) { + String paramName = matcher.group(1); + if (query.containsKey(paramName)) { + if (!firstParam) { + queryString.append("&"); + } + Object value = query.get(paramName); + queryString.append(paramName).append("=").append(value == null ? "" : value.toString()); + firstParam = false; } + } - connectLib.Logger().INFO(connectLib.LangManager().getMessage(CategoriesType.JOBS_PACKAGE, "getroutes.maderoute", "route", fullRoute)); - } catch (Exception e) { - connectLib.Logger().ERROR(connectLib.LangManager().getMessage(CategoriesType.JOBS_PACKAGE, "getroutes.error", "exception", e.getMessage())); + if (queryString.length() > 1) { + String cleanRoute = this.fullRoute.replaceAll("\\$[^$]+\\$", "").replaceAll("&+", ""); + this.fullRoute = cleanRoute + queryString.toString(); } + + connectLib.StoreAndRetrieve().store.put("currentRoute", this.fullRoute); + connectLib.StoreAndRetrieve().store.put("currentQuery", query); return this; } @@ -270,7 +167,7 @@ public JobGetInfos urlBranch(URLProvider urlBranch) { * makes the API call, and returns the response as an ApiFactory object. * @return ApiFactory containing the response from the API, or null if an error occurs. */ - public CompletableFuture getResponse() { + public CompletableFuture execute() { try { String route = (String) connectLib.StoreAndRetrieve().store.get("currentRoute"); MethodType method = (MethodType) connectLib.StoreAndRetrieve().store.get("currentMethod"); diff --git a/src/main/java/fr/sandro642/github/provider/AtomicFactory.java b/src/main/java/fr/sandro642/github/provider/AtomicFactory.java new file mode 100644 index 0000000..fb272da --- /dev/null +++ b/src/main/java/fr/sandro642/github/provider/AtomicFactory.java @@ -0,0 +1,18 @@ +package fr.sandro642.github.provider; + +import fr.sandro642.github.api.ApiFactory; + +import java.util.Map; + +public abstract class AtomicFactory { + + private ApiFactory apiFactory; + + protected void getPhysx(ApiFactory apiFactory) { + this.apiFactory = apiFactory; + } + + protected Map rawPhysx() { + return apiFactory.getRawData(); + } +} diff --git a/src/test/java/fr/sandro642/github/test/MainTest.java b/src/test/java/fr/sandro642/github/test/MainTest.java index 78e3d51..ec9c30d 100644 --- a/src/test/java/fr/sandro642/github/test/MainTest.java +++ b/src/test/java/fr/sandro642/github/test/MainTest.java @@ -6,6 +6,7 @@ import fr.sandro642.github.enums.LangType; import fr.sandro642.github.enums.MethodType; import fr.sandro642.github.enums.ResourceType; +import fr.sandro642.github.provider.AtomicFactory; import fr.sandro642.github.provider.RouteImport; import fr.sandro642.github.provider.URLProvider; import fr.sandro642.github.provider.VersionProvider; @@ -28,7 +29,8 @@ public class MainTest { public enum TestRoutes implements RouteImport { HELLO("/hello"), GREET("greet$name$"), - REQUEST_TOKEN("/auth/request/token") + REQUEST_TOKEN("/auth/request/token"), + SESSION_PUSH("/auth/link/app/{sessionId}") ; final String route; @@ -43,6 +45,19 @@ public String getRoute() { } } + public class ClassheritFromFactory extends AtomicFactory { + + + + public ClassheritFromFactory(ApiFactory apiFactory) { + getPhysx(apiFactory); + } + + public Object getContent() { + return rawPhysx().get("content"); + } + } + /** * Example of URL branches, you can add multiple branches if you have multiple environments (dev, prod, etc.) */ @@ -94,7 +109,7 @@ public static void main(String[] args) { CompletableFuture apiFactoryCompletableFuture = connectLib.JobGetInfos() .getRoutes(MethodType.GET, TestRoutes.HELLO) - .getResponse(); + .execute(); ApiFactory response = apiFactoryCompletableFuture.get(5, TimeUnit.SECONDS); @@ -117,8 +132,8 @@ public void testUseFullRoute() { ); CompletableFuture factoryCompletableFuture = connectLib.JobGetInfos() - .getRoutes(MethodType.GET, TestRoutes.GREET, null, null, query) - .getResponse(); + .getRoutes(MethodType.GET, TestRoutes.GREET) + .execute(); ApiFactory response = factoryCompletableFuture.get(5, TimeUnit.SECONDS); @@ -145,7 +160,7 @@ public void testLangType() { */ //.urlBranch(ExampleUrlBranch.LOCALHOST) - .getResponse(); + .execute(); ApiFactory response = factoryCompletableFuture.get(5, TimeUnit.SECONDS); @@ -157,18 +172,25 @@ public void testLangType() { } } + private String code_session; + + @Test + public void testProd() { + connectLib.init(ResourceType.TEST_RESOURCES, LangType.ENGLISH, TestRoutes.class); + + testSpecData(); + + pushsession(); + } @Test public void testSpecData() { try { - connectLib.init(ResourceType.MAIN_RESOURCES, LangType.ENGLISH, TestRoutes.class) - .wanImplement("http://localhost:8080"); - CompletableFuture apiFactoryCompletableFuture = connectLib.JobGetInfos() .getRoutes(TestCustomVersion.V1_API, MethodType.GET, TestRoutes.REQUEST_TOKEN) .urlBranch(ExampleUrlBranch.PROD) - .getResponse(); + .execute(); ApiFactory apiFactory = apiFactoryCompletableFuture.get(5, TimeUnit.SECONDS); @@ -178,7 +200,7 @@ public void testSpecData() { System.out.println(apiFactory.getSpecData("data", "accessToken")); - Thread.sleep(20000); + this.code_session = (String) apiFactory.getSpecData("data", "sessionCode"); } catch (Exception e) { e.printStackTrace(); @@ -186,11 +208,11 @@ public void testSpecData() { } @Test - public void startAppServices() { + public void pushsession() { try { connectLib.Logger().showLogs(); connectLib.init(ResourceType.TEST_RESOURCES, LangType.ENGLISH, TestRoutes.class) - .wanImplement("http://localhost:8080"); + .wanImplement("http://localhost:8080", ""); Thread.sleep(20000); @@ -199,6 +221,27 @@ public void startAppServices() { } } + @Test + public void startAppServices() { + try { + connectLib.Logger().showLogs(); + connectLib.init(ResourceType.TEST_RESOURCES, LangType.ENGLISH, TestRoutes.class); + //.webServices(8080, "TestDashboard"); + + CompletableFuture apiFactoryCompletableFuture = connectLib.JobGetInfos() + .getRoutes(MethodType.GET, TestRoutes.HELLO) + .urlBranch(ExampleUrlBranch.POST_PROD) + .execute() + .thenApply(ClassheritFromFactory::new); + + ClassheritFromFactory classheritFromFactory = apiFactoryCompletableFuture.get(5, TimeUnit.SECONDS); + + System.out.println("Response: " + classheritFromFactory.getContent()); + + } catch (Exception e) { + e.printStackTrace(); + } + }