From 3e6bbdc723efefb6365b440501ebacb8541b4f83 Mon Sep 17 00:00:00 2001 From: Rodrigo Verdiani Date: Sat, 15 Nov 2025 14:25:46 -0300 Subject: [PATCH] feat: add FlareSolverr client and configuration for session management --- .env | 1 + .../mangamochi/client/FlareSolverrClient.java | 71 +++++++++++++++++++ src/main/resources/application.yml | 9 +++ 3 files changed, 81 insertions(+) create mode 100644 src/main/java/com/magamochi/mangamochi/client/FlareSolverrClient.java diff --git a/.env b/.env index bb405b1..1167246 100644 --- a/.env +++ b/.env @@ -6,6 +6,7 @@ MINIO_ENDPOINT=http://omv2.badger-pirarucu.ts.net:9000 MINIO_USER=rov MINIO_PASS=!E9v4i0v3 +FLARESOLVERR_ENDPOINT=https://flare-solverr.badger-pirarucu.ts.net WEBSCRAPPER_ENDPOINT=http://mangamochi.badger-pirarucu.ts.net:8090/url MANGAMATCHER_ENDPOINT=http://mangamochi.badger-pirarucu.ts.net:8000/match-title diff --git a/src/main/java/com/magamochi/mangamochi/client/FlareSolverrClient.java b/src/main/java/com/magamochi/mangamochi/client/FlareSolverrClient.java new file mode 100644 index 0000000..d875759 --- /dev/null +++ b/src/main/java/com/magamochi/mangamochi/client/FlareSolverrClient.java @@ -0,0 +1,71 @@ +package com.magamochi.mangamochi.client; + +import io.github.resilience4j.retry.annotation.Retry; +import java.util.List; +import lombok.Builder; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +@FeignClient(name = "flare-solverr", url = "${flare-solverr.endpoint}/v1") +@Retry(name = "FlareSolverrRetry") +public interface FlareSolverrClient { + @PostMapping( + consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE) + GetResponse get(@RequestBody GetRequest request); + + @PostMapping( + consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE) + SessionCreateResponse createSession(@RequestBody SessionCreateRequest request); + + @PostMapping( + consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE) + SessionDestroyResponse destroySession(@RequestBody SessionDestroyRequest request); + + @PostMapping( + consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE) + SessionListResponse listSessions(@RequestBody SessionListRequest request); + + @Builder + class GetRequest { + @Builder.Default private String cmd = "request.get"; + + @Builder.Default private Integer maxTimeout = 120000; + + private String url; + + private String session; + } + + record GetResponse(String status, String message, Solution solution) { + public record Solution(String url, Integer status, String response) {} + } + + @Builder + class SessionCreateRequest { + @Builder.Default private String cmd = "sessions.create"; + } + + record SessionCreateResponse(String status, String message, String session) {} + + @Builder + class SessionDestroyRequest { + @Builder.Default private String cmd = "sessions.destroy"; + + private String session; + } + + record SessionDestroyResponse(String status, String message) {} + + @Builder + class SessionListRequest { + @Builder.Default private String cmd = "sessions.list"; + } + + record SessionListResponse(String status, String message, List sessions) {} +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 5370678..ce06f86 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -38,6 +38,9 @@ springdoc: web-scrapper: endpoint: ${WEBSCRAPPER_ENDPOINT} +flare-solverr: + endpoint: ${FLARESOLVERR_ENDPOINT} + minio: endpoint: ${MINIO_ENDPOINT} accessKey: ${MINIO_USER} @@ -59,6 +62,12 @@ manga-matcher: resilience4j: retry: instances: + FlareSolverrRetry: + max-attempts: 2 + wait-duration: + seconds: 5 + retry-exceptions: + - feign.FeignException MangaDexRetry: max-attempts: 5 wait-duration: