diff --git a/readme.md b/readme.md index 86508df..0dbc592 100644 --- a/readme.md +++ b/readme.md @@ -121,7 +121,7 @@ ArchUnit role rules (`RoleAnnotationRules`) and `src/test/resources/contract/aut | `PUT` | `/api/library/games/{appid}/status` (status only, keeps rating, notes, priority) | JWT | | `PUT` | `/api/library/games/{appid}/finished-hint` (`{dismissed: ENDING\|PLAYTIME}`, "Not yet"; `204`) | JWT | | `PUT` | `/api/library/games/{appid}/hidden` (`{hidden}`; `409 MANUAL_GAME` for a game added by hand) | JWT | -| `POST` | `/api/library/imports` (`{source: TEXT\|CSV\|SEARCH, rows: [{title, platform, playtimeMinutes, status, igdbId}]}`, 1–1000 rows; `202 {id}` in `QUEUED`, `409 IMPORT_RUNNING`, `503 IGDB_OFF`) | JWT | +| `POST` | `/api/library/imports` (`{source: TEXT\|CSV\|SEARCH\|GALAXY\|GROUVEE\|HLTB\|PLAYNITE\|BOOKMARKLET, rows: [{title, platform, playtimeMinutes, status, igdbId}]}`, 1–1000 rows; `202 {id}` in `QUEUED`, `409 IMPORT_RUNNING`, `503 IGDB_OFF`) | JWT | | `GET` | `/api/library/imports` (`{imports}`, the last 20), `/api/library/imports/{id}` (status, progress counts, `ahead` while it waits in a queue, `attempts`; the rows with their candidates while `READY`) | JWT | | `POST` | `/api/library/imports/{id}/save` (`{rows: [{lineNo, igdbId, platform, status, playtimeMinutes}]}`; `202`, then poll until `SAVED`; `409 IMPORT_NOT_READY`) | JWT | | `POST` | `/api/library/imports/{id}/retry` (a `FAILED` import; `202`, `409 IMPORT_NOT_FAILED` / `IMPORT_RUNNING`) | JWT | diff --git a/src/main/java/core_service/modules/library/domain/GameImport.java b/src/main/java/core_service/modules/library/domain/GameImport.java index ccaa448..cd11683 100644 --- a/src/main/java/core_service/modules/library/domain/GameImport.java +++ b/src/main/java/core_service/modules/library/domain/GameImport.java @@ -18,7 +18,11 @@ public record GameImport(long id, long userId, Source source, Status status, int int saved, int added, boolean running, int attempts, Step step, Instant createdAt, Instant queuedAt, Instant savedAt) { - public enum Source { TEXT, CSV, SEARCH } + /** + * Where the lines came from. GALAXY, GROUVEE, HLTB and PLAYNITE are exports the Frontend reads; BOOKMARKLET is + * the list read on a store page. Core treats them all alike. + */ + public enum Source { TEXT, CSV, SEARCH, GALAXY, GROUVEE, HLTB, PLAYNITE, BOOKMARKLET } public enum Status { QUEUED, MATCHING, READY, SAVING, SAVED, UNDONE, FAILED } diff --git a/src/test/java/core_service/modules/library/api/GameImportControllerTest.java b/src/test/java/core_service/modules/library/api/GameImportControllerTest.java index ca03e52..2e295eb 100644 --- a/src/test/java/core_service/modules/library/api/GameImportControllerTest.java +++ b/src/test/java/core_service/modules/library/api/GameImportControllerTest.java @@ -12,6 +12,8 @@ import core_service.shared.test.AbstractMockedAdaptersTest; import com.jayway.jsonpath.JsonPath; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.provider.ValueSource; +import org.junit.jupiter.params.ParameterizedTest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc; import org.springframework.http.MediaType; @@ -195,6 +197,14 @@ class GameImportControllerTest extends AbstractMockedAdaptersTest { verify(igdbApiService, never()).searchGames(any()); } + @ParameterizedTest + @ValueSource(strings = {"GALAXY", "GROUVEE", "HLTB", "PLAYNITE", "BOOKMARKLET"}) + void create_ExportAndBookmarkletSources_AreStored(String source) throws Exception { + long id = createReady("{\"source\": \"" + source + "\", \"rows\": [{\"title\": \"Elden Ring\"}]}"); + + assertEquals(source, jdbc.queryForObject("select source from game_import where id = ?", String.class, id)); + } + @Test void create_TooManyRowsOrNoTitle_Is400() throws Exception { String row = "{\"title\": \"Game\"}";