feat: búsqueda por ISBN exacta al escanear códigos de barras #9

Closed
HBB wants to merge 0 commits from HBB:feat/isbn-scan into main
First-time contributor

El escáner metía los dígitos del ISBN en la búsqueda por texto (coincidencia difusa contra 13 dígitos). Ahora, si el código escaneado es un ISBN válido (10/13), se consulta primero el endpoint estable /isbn/.json (coincidencia local exacta) y se recae en la búsqueda por texto —que sí encuentra ediciones remotas vía conectores— si no hay resultado local, conservando el flujo "escanear un libro que aún no tengo".
La detección de ISBN se extrae a IsbnUtils, con 18 pruebas unitarias JUnit y sin dependencias nuevas.
Nota: para libros ya federados, key es el remote_id remoto, por lo que abrir la ficha consulta el servidor de origen — comportamiento a revisar.

El escáner metía los dígitos del ISBN en la búsqueda por texto (coincidencia difusa contra 13 dígitos). Ahora, si el código escaneado es un ISBN válido (10/13), se consulta primero el endpoint estable /isbn/<isbn>.json (coincidencia local exacta) y se recae en la búsqueda por texto —que sí encuentra ediciones remotas vía conectores— si no hay resultado local, conservando el flujo "escanear un libro que aún no tengo". La detección de ISBN se extrae a IsbnUtils, con 18 pruebas unitarias JUnit y sin dependencias nuevas. Nota: para libros ya federados, key es el remote_id remoto, por lo que abrir la ficha consulta el servidor de origen — comportamiento a revisar.
El escáner de códigos de barras metía los dígitos del ISBN directamente en la
búsqueda por texto, dependiendo de una coincidencia difusa de fulltext contra
una cadena de 13 dígitos. Ahora, cuando el contenido escaneado es un ISBN válido
(10 o 13 dígitos), se consulta primero el endpoint JSON estable
`/isbn/<isbn>.json`, que da una coincidencia local exacta.

Como ese endpoint solo consulta la base de datos local (no los conectores
remotos), si no hay resultado local se recurre a la búsqueda por texto anterior,
que sí encuentra ediciones remotas para resolver. Así se conserva el flujo
"escanear un libro que aún no tengo" y se gana precisión y robustez en el caso
habitual sin nuevas dependencias frágiles.
La lógica que decidía si un código escaneado es un ISBN estaba en línea dentro
de SearchScreen y no era testeable. Se extrae a IsbnUtils (puro, sin dependencias
de Android) con dos funciones: normalize() —reduce la cadena a dígitos y la 'X' de
control— e isIsbn() —comprueba la forma: 13 dígitos, o 9 dígitos más un dígito de
control que puede ser 'X'—.

La detección es ahora un poco más estricta que la versión en línea: una 'X' solo
se acepta como dígito de control final de un ISBN-10, no incrustada en un EAN-13.
Ningún código de barras de libro real se ve afectado.

Se añaden 18 pruebas unitarias JUnit que corren en la JVM sin dependencias nuevas
(./gradlew :app:testDebugUnitTest).
Owner

Incluido, Gracias

Incluido, Gracias
ferlagod closed this pull request 2026-07-22 13:01:29 +00:00

Pull request closed

Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
ferlagod/rocinante_android!9
No description provided.