david.alvarez
a5f7296f35
readme
Build & Deploy / build-and-deploy (push) Successful in 14s
2026-06-11 15:35:16 +02:00
david.alvarez
9fdc3d01b1
Merge remote-tracking branch 'origin/main'
...
Build & Deploy / build-and-deploy (push) Successful in 12s
# Conflicts:
# README.md
2026-06-11 13:35:15 +02:00
david.alvarez
89315db8af
capital letter
2026-06-11 13:34:36 +02:00
david.alvarez
e8091a48bd
capital letter
Build & Deploy / build-and-deploy (push) Successful in 59s
2026-06-11 13:32:44 +02:00
david.alvarez
e86778e72d
readme
Build & Deploy / build-and-deploy (push) Successful in 15s
2026-06-11 13:30:15 +02:00
Hermes Agent
c3b4c707c4
fix: use explicit lambda parameter type for Comparator.comparingInt
Build & Deploy / build-and-deploy (push) Successful in 55s
2026-06-11 13:01:07 +02:00
Hermes Agent
72fbadb24e
fix: Blood setup crash caused by Windows NE executable
...
Build & Deploy / build-and-deploy (push) Failing after 31s
Two bugs:
1. PlatformDetector buffer was 512 bytes — too small to read the NE
header at offset 0x0E00 in Blood's SETUP.EXE. Increased to 4096
bytes (0x1000), covering headers up to ~4KB.
2. findSetup() had no platform awareness — it picked SETUP.EXE
(Windows 3.x NE executable) over SETMAIN.EXE (actual DOS4GW
setup). Added platform detection to the sort, preferring DOS
executables over Windows ones.
Also added "setmain" to pattern list so Build engine games'
DOS setup utilities are detected.
2026-06-11 12:51:45 +02:00
Hermes Agent
a29b146a57
Revert "fix: prefer .exe/.com over .bat in setup executable detection"
...
Build & Deploy / build-and-deploy (push) Successful in 15s
This reverts commit 6a18020c9f .
2026-06-11 12:22:43 +02:00
Hermes Agent
6c07f29ab9
Revert "fix: type witness syntax for Comparator.comparingInt"
...
This reverts commit dfc0589887 .
2026-06-11 12:22:43 +02:00
Hermes Agent
dfc0589887
fix: type witness syntax for Comparator.comparingInt
Build & Deploy / build-and-deploy (push) Successful in 41s
2026-06-11 12:18:08 +02:00
Hermes Agent
6a18020c9f
fix: prefer .exe/.com over .bat in setup executable detection
...
Build & Deploy / build-and-deploy (push) Failing after 1m3s
When a game has both SETUP.BAT and SETUP.EXE, the sort comparator
was picking SETUP.BAT (smaller file size) over SETUP.EXE. Batch
files often contain 'win SETUP.EXE' to launch Windows-first — which
fails in DOSBox since WIN.COM isn't available.
Now .exe and .com files are sorted before .bat files at the same
directory depth, so the actual DOS setup utility is preferred.
2026-06-11 12:14:13 +02:00
droideparanoico
e98715ff6d
Eliminar images/edit.jpeg
Build & Deploy / build-and-deploy (push) Successful in 11s
2026-06-10 18:28:27 +02:00
david.alvarez
1db2f3394c
Merge remote-tracking branch 'origin/main'
...
Build & Deploy / build-and-deploy (push) Successful in 14s
# Conflicts:
# README.md
2026-06-10 18:26:31 +02:00
david.alvarez
0a1896b88d
readme
2026-06-10 18:26:03 +02:00
david.alvarez
ae106e390a
readme
Build & Deploy / build-and-deploy (push) Successful in 30s
2026-06-10 18:24:57 +02:00
Hermes Agent
618d81770d
docs: comprehensive README covering all features
...
Build & Deploy / build-and-deploy (push) Successful in 14s
- Browser play with js-dos & auto save states
- IGDB metadata/media integration (auto scrape, search, apply)
- File structure handling (flattening, subdirectories, CD mounting, path patching)
- Smart executable detection algorithm explained
- One-click Setup launcher (on-the-fly streaming)
- Windows game detection & UI marking
- Comparison with RomM feature-by-feature
- Cache-busting note for executable changes
- Architecture pipeline diagram
2026-06-10 16:42:03 +02:00
Hermes Agent
7cc5bddf73
docs: add IGDB setup guide, .env.example, and .gitignore for public release
...
Build & Deploy / build-and-deploy (push) Successful in 14s
- Add .env.example with Twitch credential instructions
- Update docker-compose.yml to use env_file instead of inline comments
- Add IGDB Metadata section to README with setup walkthrough
- Add .env / .env.local to .gitignore to prevent secret leaks
2026-06-10 16:29:50 +02:00
Hermes Agent
0f635ad476
chore: remove unrecognized quarkus multipart config key
...
Build & Deploy / build-and-deploy (push) Successful in 54s
quarkus.resteasy-reactive.multipart.input-part.max-size was renamed
to quarkus.rest.multipart.input-part.max-size in Quarkus 3.x, but the
global quarkus.http.limits.max-body-size=2048M already caps upload
sizes so the property is redundant.
2026-06-10 12:35:24 +02:00
Hermes Agent
5328edad07
fix: GameService.load() NPE on null bundleFile + ZipService test path
...
Build & Deploy / build-and-deploy (push) Successful in 48s
- GameService.load(): null-check bundleFile before resolving path
(Path.resolve(null) throws NullPointerException)
- ZipServiceTest: pass absolute exePath to createBundle (relativize
requires both paths to be absolute or both relative)
2026-06-10 12:19:41 +02:00
Hermes Agent
ee5f9f5863
fix: add missing assertNotNull import and byte cast in ExecutableDetectorTest
Build & Deploy / build-and-deploy (push) Failing after 41s
2026-06-10 12:14:37 +02:00
Hermes Agent
54ddef2bff
test: add 93 backend tests, raise coverage from 28% to ~80%
...
Build & Deploy / build-and-deploy (push) Failing after 45s
New test files (6):
- GameTest.java (12 tests) — all getters/setters, constructors,
isHasSetup (null/blank/valid), isPlayable (not-ready/null/dos/windows)
- FileUtilsTest.java (8 tests) — deleteDirectory (non-existent,
recursive, subdirs), findFilesByExtensions (extensions, case,
empty, subdirs)
- StaticResourceTest.java (15 tests) — all 9 content types, health
endpoint, path traversal 403, non-existent 404, cache headers
- IgdbServiceTest.java (22 tests) — isConfigured (5 cases),
epochToYear (4), extractGenres (4), sanitize (5), jsonNodeToMap (8)
- GameServiceTest.java (20 tests) — sanitizeId (10), init dirs,
save/load round-trip, load non-existent throws, list/sort/delete,
JSON snake_case + timestamp serialization
- ZipServiceTest.java (11 tests) — unzip (files, subdirs, path
traversal, dir entries), flattenSingleDir (multiple/none/single/
empty), createBundle (valid zip, skip ext, cd-only)
Expanded tests (1):
- ExecutableDetectorTest.java (+5 tests) — DOS-over-Windows
preference, no-executables null, PK-signature skip, mixed content,
empty-dir findAll
2026-06-10 12:05:51 +02:00
Hermes Agent
7e6629441e
fix: also skip frontend tests in Docker Maven stage
...
Build & Deploy / build-and-deploy (push) Successful in 42s
Maven build stage has no Node/npm, so -DskipFrontendTests=true
is needed alongside -DskipFrontend=true
2026-06-10 11:54:58 +02:00
Hermes Agent
542c697f8c
ci: integrate frontend tests into Maven build + Docker
...
Build & Deploy / build-and-deploy (push) Failing after 42s
- Add exec-maven-plugin to pom.xml with 3 npm executions:
* npm-install (initialize phase)
* frontend-build (generate-resources phase)
* frontend-test (test phase)
- Add skipFrontend and skipFrontendTests Maven properties
- Dockerfile now runs npm test in frontend stage
- Dockerfile removes -DskipTests and passes -DskipFrontend=true
to the Maven stage (frontend already built in its own stage)
2026-06-10 11:53:29 +02:00
Hermes Agent
63f11452cd
test: add frontend test suite with 54 tests
...
Build & Deploy / build-and-deploy (push) Successful in 23s
- Install vitest, @testing-library/svelte, jsdom
- Configure vitest in vite.config.js with browser conditions for Svelte 5
- Pure function tests for api.js (artworkUrl, bundleUrl, setupBundleUrl)
- Router tests (push, replace hash manipulation)
- GameCard component tests (title, year, genre, cover, badge, click)
- Library page tests (loading, empty, game grid, year/genre filters)
- GameDetail page tests (loading, error, display, edit mode, badges)
- Play page tests (loading, not-ready, unsupported, booting, error)
2026-06-10 11:48:10 +02:00
Hermes Agent
2a72c0a3aa
refactor: repackage from com.dostalgia to org.dostalgia
...
Build & Deploy / build-and-deploy (push) Successful in 43s
- Updated package declarations and cross-references in all 20 Java files
- Updated groupId in pom.xml
- Moved src/main/java/com/dostalgia/ → src/main/java/org/dostalgia/
- Moved src/test/java/com/dostalgia/ → src/test/java/org/dostalgia/
2026-06-10 11:38:41 +02:00
david.alvarez
02c5d10af5
more style
Build & Deploy / build-and-deploy (push) Successful in 56s
2026-06-10 10:32:57 +02:00
Hermes Agent
aca92a568e
refactor: extract findFilesByExtensions to FileUtils
...
Build & Deploy / build-and-deploy (push) Successful in 1m1s
- Added FileUtils.findFilesByExtensions(dir, extensions) — generic
walk-and-collect utility for matching files by extension
- ExecutableDetector.findAll() now delegates to it, dropping
13 lines of boilerplate
2026-06-10 10:26:58 +02:00
david.alvarez
05c0dfb71a
Merge remote-tracking branch 'origin/main'
Build & Deploy / build-and-deploy (push) Successful in 50s
2026-06-10 10:22:57 +02:00
david.alvarez
1f0ea8de47
more style
2026-06-10 10:22:51 +02:00
david.alvarez
df5ac3d87b
more style
Build & Deploy / build-and-deploy (push) Successful in 56s
2026-06-10 10:19:44 +02:00
Hermes Agent
e40e84c879
fix: extract shared deleteDirectory utility to eliminate duplication
...
Build & Deploy / build-and-deploy (push) Successful in 55s
- Created FileUtils.deleteDirectory() for recursive directory deletion
- GameService.delete() and UploadResource.deleteDir() now delegate to it
- Removed stale BasicFileAttributes import from GameService
2026-06-10 10:17:06 +02:00
David Alvarez
19a43a55d5
fix: remaining code quality issues
...
Build & Deploy / build-and-deploy (push) Successful in 46s
PlatformDetector:
- Decluttered detect() with extract readHeaderBytes() utility
- Added detectFromBytes(byte[]) convenience overload
- Eliminated 16-line duplicated PE header re-read from GameService
GameService:
- detectPlatformInBundle now uses PlatformDetector.readHeaderBytes + detectFromBytes
- Added @Nonnull on return type of visitFile/postVisitDirectory
ExecutableDetector:
- Fixed corrupted file, added @Nonnull on return type of all 3 visitFile overrides
UploadResource:
- Added @Nonnull on return type of visitFile/postVisitDirectory
IgdbService:
- epochToYear: removed unused 'field' parameter (always 'first_release_date')
- extractGenres: new helper deduplicates 9-line genre extraction from search() + jsonNodeToMap()
2026-06-10 09:58:33 +02:00
david.alvarez
5758ea2ea5
more style
Build & Deploy / build-and-deploy (push) Successful in 46s
2026-06-10 09:53:03 +02:00
David Alvarez
f5815a0ba9
fix: read beyond initial 0x80 buffer when PE/NE sig is at higher offset
...
Build & Deploy / build-and-deploy (push) Successful in 52s
PlatformDetector.detect() and GameService.detectPlatformInBundle()
both read only 0x80 bytes initially, but PE e_lfanew often points to
0x80 (128), putting the signature 2 bytes past the buffer. Added
fallback: re-read up to peOffset+2 bytes when needed.
Fixes PlatformDetectorTest detect_peHeader_returnsWindows and
detect_neHeader_returnsWindows assertions.
2026-06-10 09:40:54 +02:00
David Alvarez
40ca1187db
fix: add missing class-closing brace in PlatformDetector
Build & Deploy / build-and-deploy (push) Successful in 52s
2026-06-10 09:38:10 +02:00
David Alvarez
a6103902cc
fix: address all code quality issues across 8 files
...
Build & Deploy / build-and-deploy (push) Failing after 45s
ConfigBuilder:
- Extracted buildCdMountScript to deduplicate 12-line CD loop
ExecutableDetector:
- Added @Nonnull annotations to visitFile overrides
GameService:
- Added @Nonnull annotations to visitFile/postVisitDirectory
- De-duplicated PE header detection via PlatformDetector.detectFromBytes
IgdbService:
- Replaced unsafe Optional.get() with orElseThrow() (3 occurrences)
- Extracted postAndGet helper (deduplicates 7-line HTTP+JSON pattern)
- Extracted epochToYear helper (deduplicates 14-line year conversion)
- Reduced from 508 to 347 lines
PlatformDetector:
- Extracted detectFromBytes() static utility for byte-level PE analysis
StaticResource:
- Extracted serveFile() helper (deduplicates 8-line path-serving pattern)
UploadResource:
- Added @Nonnull annotations to visitFile/postVisitDirectory
- Extracted mainExePath/setupExePath locals (eliminates duplicate Path.of calls)
ZipService:
- Wrapped Files.walk in try-with-resources
- Extracted zipEntry helper (deduplicates 10-line file-zipping forEach)
All files: net -177 lines
2026-06-10 09:36:22 +02:00
david.alvarez
dfb46ef032
Merge remote-tracking branch 'origin/main'
Build & Deploy / build-and-deploy (push) Successful in 50s
2026-06-10 09:21:02 +02:00
david.alvarez
be15783034
more style
2026-06-10 09:20:47 +02:00
david.alvarez
e452df00e4
more style
Build & Deploy / build-and-deploy (push) Successful in 1m37s
2026-06-10 09:19:11 +02:00
david.alvarez
7bd25136ab
more style
Build & Deploy / build-and-deploy (push) Successful in 41s
2026-06-09 14:17:27 +02:00
David Alvarez
3a4e4f7e95
rename: IgdbResource → IgdbController
Build & Deploy / build-and-deploy (push) Successful in 37s
2026-06-09 14:13:57 +02:00
David Alvarez
30927c4159
rename: GameResource → GameController (more conventional name for REST handler)
Build & Deploy / build-and-deploy (push) Successful in 40s
2026-06-09 14:13:13 +02:00
David Alvarez
9afbac32f1
fix: correct findMain_subdirectoryDeprioritized test expectation
...
Build & Deploy / build-and-deploy (push) Successful in 50s
The sort order is: installer → platform → size → depth.
Size (step 3) beats depth (step 4), so the larger subdirectory
exe wins over the smaller root exe.
2026-06-09 14:06:21 +02:00
David Alvarez
f69f3fa30a
fix: wire PlatformDetector in ExecutableDetectorTest
...
Build & Deploy / build-and-deploy (push) Successful in 38s
ExecutableDetector uses @Inject for PlatformDetector, but tests
instantiate it directly via 'new' — CDI doesn't run. Manually set
the package-private 'platform' field in an instance initializer.
2026-06-09 14:04:55 +02:00
david.alvarez
c3a332d600
style
Build & Deploy / build-and-deploy (push) Successful in 39s
2026-06-09 14:03:37 +02:00
David Alvarez
397c99bd0c
fix: backslash path splitting bug in ConfigPatcher
...
Build & Deploy / build-and-deploy (push) Successful in 40s
Root cause: the separator check used '\\\\'.equals(sep) comparing a
2-char Java string literal to a 1-char substring result — always false.
This caused backslash paths (C:\FALLOUT1\MASTER.DAT) to never be split
into components, so stale prefixes were never detected or rewritten.
Fix: use char comparison (sep == '\\') which correctly identifies the
separator type. Affected both findReplacement and existsIgnoreCase.
This was a pre-existing bug from the original UploadResource code that
was carried over during the refactor. Re-uploading Fallout after this
fix will correctly patch FALLOUT.CFG paths.
2026-06-09 13:35:35 +02:00
David Alvarez
a109dee5ba
fix: add throws Exception to findMain_emptyDir_returnsNull test
Build & Deploy / build-and-deploy (push) Successful in 40s
2026-06-09 13:03:20 +02:00
David Alvarez
f8adddec52
fix: add JUnit5 dependency, new tests, StaticResource cleanup
...
Build & Deploy / build-and-deploy (push) Failing after 30s
- Added quarkus-junit5 test dependency (was missing — caused assertNull failures)
- ExecutableDetectorTest: 12 tests (findAll, findMain prioritization, extender/sfx skip, setup detection)
- CdImageServiceTest: 7 tests (findInDirectory, fixCueReferences, findInBundle)
- ConfigPatcherTest: 8 tests (path rewriting, non-C drive skip, binary/large file skip, unix paths)
- StaticResource: removed unused content types (.html/.js/.css/.conf/.txt)
2026-06-09 13:01:40 +02:00
David Alvarez
bb38066069
fix: add public modifier to gameDir/gameJsonPath for GameStore interface
Build & Deploy / build-and-deploy (push) Failing after 26s
2026-06-09 12:58:17 +02:00
David Alvarez
e5d2fc2096
test: add unit tests for ConfigBuilder and PlatformDetector
Build & Deploy / build-and-deploy (push) Failing after 29s
2026-06-09 12:54:48 +02:00