Skip to content

feat: Add API versioning for v2#5

Merged
Perafan18 merged 3 commits intomasterfrom
feature/v2-api-versioning
Nov 10, 2025
Merged

feat: Add API versioning for v2#5
Perafan18 merged 3 commits intomasterfrom
feature/v2-api-versioning

Conversation

@Perafan18
Copy link
Owner

@Perafan18 Perafan18 commented Nov 9, 2025

  • Move all endpoints to /api/v1 namespace
  • Use sinatra-contrib for namespace support
  • Set JSON content type for all API v1 endpoints
  • Maintain backward compatibility with root endpoint

API changes:

  • POST /chain → POST /api/v1/chain
  • POST /chain/:id/block → POST /api/v1/chain/:id/block
  • POST /chain/:id/block/:block_id/valid → POST /api/v1/chain/:id/block/:block_id/valid

This allows for future API versions while maintaining stability for v1 consumers.

🤖 Generated with Claude Code

Summary by CodeRabbit

Notas de Lanzamiento

  • Nuevas Características

    • Todos los endpoints de la API ahora están organizados bajo el espacio de nombres /api/v1; las respuestas de API se devuelven en JSON consistentemente. Se añadieron rutas para crear cadenas, añadir y recuperar bloques, y validar bloques dentro de la versión v1.
  • Chores

    • Se añadió una dependencia de soporte al proyecto para habilitar el versionado de la API.

- Move all endpoints to /api/v1 namespace
- Use sinatra-contrib for namespace support
- Set JSON content type for all API v1 endpoints
- Maintain backward compatibility with root endpoint

API changes:
- POST /chain → POST /api/v1/chain
- POST /chain/:id/block → POST /api/v1/chain/:id/block
- POST /chain/:id/block/:block_id/valid → POST /api/v1/chain/:id/block/:block_id/valid

This allows for future API versions while maintaining stability
for v1 consumers.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
@coderabbitai
Copy link

coderabbitai bot commented Nov 9, 2025

Walkthrough

Se añade la gema sinatra-contrib y se reubican los endpoints HTTP dentro del namespace /api/v1 en main.rb; se añade un before que fija content_type :json. Las pruebas en spec/api_spec.rb se actualizan para usar las nuevas rutas y nuevas respuestas incluyen campos de minería (nonce, difficulty).

Changes

Cohort / Archivo(s) Resumen
Gemfile — dependencia
\Gemfile``
Se añade gem 'sinatra-contrib', '~> 4.0.0' justo después de la entrada sinatra.
API / Namespacing
\main.rb``
Se requiere sinatra/namespace; se envuelven rutas bajo namespace '/api/v1'; se añade before que establece content_type :json; endpoints: POST /api/v1/chain, POST /api/v1/chain/:id/block, POST /api/v1/chain/:id/block/:block_id/valid (validación), y GET /api/v1/chain/:id/block/:block_id (detalles).
Tests actualizados
\spec/api_spec.rb``
Se actualizan rutas de tests a /api/v1/*; se añaden/ajustan aserciones para campos de minería (nonce, difficulty, valid_hash) en respuestas de creación/validación/consulta de bloques.

Sequence Diagram(s)

sequenceDiagram
    participant Test as Cliente de prueba
    participant API as Sinatra (app)

    rect rgb(200,220,240)
    note over Test,API: Flujo antiguo (antes del cambio)
    Test->>API: POST /chain
    API-->>Test: JSON respuesta (chain_id)
    Test->>API: POST /chain/:id/block
    API-->>Test: JSON respuesta (block_id, block_hash)
    Test->>API: POST /chain/:id/block/:block_id/valid
    API-->>Test: JSON validación
    end

    rect rgb(240,230,210)
    note over Test,API: Flujo nuevo (namespaceado /api/v1)
    Test->>API: POST /api/v1/chain
    API->>API: before { content_type :json }
    API-->>Test: JSON respuesta (chain_id)
    Test->>API: POST /api/v1/chain/:id/block
    API-->>Test: JSON respuesta (chain_id, block_id, block_hash, nonce, difficulty)
    Test->>API: GET /api/v1/chain/:id/block/:block_id
    API-->>Test: JSON detalles (nonce, difficulty, valid_hash)
    Test->>API: POST /api/v1/chain/:id/block/:block_id/valid
    API-->>Test: JSON validación
    end
Loading

Estimated code review effort

🎯 3 (Moderado) | ⏱️ ~25 minutes

Áreas a revisar con atención:

  • Verificar que sinatra/namespace está requerido correctamente y que el namespace '/api/v1' cubre todas las rutas API esperadas.
  • Confirmar que el before para content_type :json no afecta rutas no-API (root u otras).
  • Revisar las respuestas JSON nuevas (nonce, difficulty, valid_hash) y consistencia con los tests actualizados.

Possibly related PRs

Poema

🐰 Salté desde mi madriguera en señal,
rutas a la vista bajo /api/v1,
con sinatra-contrib canto en JSON,
bloques minados con nonce y razón,
¡brinca la prueba y celebra la acción!

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Title check ⚠️ Warning El título hace referencia a 'v2', pero los cambios implementan versioning '/api/v1', creando una discrepancia directa entre el título y el contenido real. Cambiar el título a 'feat: Add API versioning for v1' o similar que refleje con precisión la versión implementada en los cambios.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feature/v2-api-versioning

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Resolved conflicts in Gemfile and main.rb
- Combined sinatra-contrib with testing gems
- Maintained /api/v1 namespace structure
- Updated all API tests to use /api/v1 routes
- All tests passing (16 examples, 0 failures)
- RuboCop clean (8 files, no offenses)
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
main.rb (1)

13-15: Considera eliminar el before block global para evitar redundancia.

Este before block global establece content_type :json para todas las peticiones POST, incluyendo potenciales endpoints futuros que no sean de la API. Dado que ya existe un before block específico dentro del namespace /api/v1 (líneas 24-26) que establece el mismo content type, este bloque global puede ser redundante y podría causar confusión.

Aplica este diff para eliminar el before block redundante:

-# Set default content type for JSON responses
-before do
-  content_type :json if request.post?
-end
-
 get '/' do
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e137378 and d60dbda.

⛔ Files ignored due to path filters (1)
  • Gemfile.lock is excluded by !**/*.lock
📒 Files selected for processing (3)
  • Gemfile (1 hunks)
  • main.rb (2 hunks)
  • spec/api_spec.rb (4 hunks)
🧰 Additional context used
🧬 Code graph analysis (2)
spec/api_spec.rb (1)
src/blockchain.rb (1)
  • add_block (20-24)
main.rb (2)
src/blockchain.rb (1)
  • add_block (20-24)
src/block.rb (1)
  • valid_data? (44-46)
🔇 Additional comments (4)
main.rb (2)

4-4: ¡Bien hecho!

La adición del require para sinatra/namespace es necesaria y correcta para habilitar el soporte de namespaces utilizado en este archivo.


22-63: ¡Implementación del namespace correcta!

La estructura del namespace está bien implementada. Los endpoints se han movido correctamente bajo /api/v1, y el before block específico del namespace establece apropiadamente el content type JSON. Las respuestas mantienen la misma funcionalidad y formato que antes.

spec/api_spec.rb (1)

22-80: ¡Actualización de tests correcta y consistente!

Todos los paths de los tests se han actualizado correctamente para usar el prefijo /api/v1, manteniendo la misma lógica de prueba y estructura. Los cambios son consistentes con la implementación del namespace en main.rb.

Gemfile (1)

11-11: La versión de sinatra-contrib es válida y está libre de vulnerabilidades.

La verificación confirma que sinatra-contrib 4.0.1 está disponible y no tiene advisories de seguridad conocidos. La restricción ~> 4.0.0 en el Gemfile es apropiada y permitirá actualizaciones de parches (4.0.1, etc.) mientras evita cambios incompatibles. La adición es segura y necesaria para el soporte de namespaces.

Resolved conflicts and integrated PoW features:
- Added difficulty validation with validate_difficulty helper
- Integrated PoW fields (nonce, difficulty) in API responses
- Added GET /api/v1/chain/:id/block/:block_id endpoint
- Updated tests to include PoW fields and new GET endpoint
- All endpoints now under /api/v1 namespace
- All tests passing (17 examples, 0 failures)
- RuboCop clean (8 files, no offenses)
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
main.rb (1)

13-15: Considera eliminar este bloque before redundante.

Este bloque before global establece content_type :json para todas las peticiones POST, pero:

  • El único endpoint fuera del namespace es GET / (línea 17)
  • El namespace /api/v1 tiene su propio before (líneas 24-26) que establece JSON para todas las peticiones

Este código es redundante y podría causar confusión sobre dónde se aplica el content type.

Aplica este diff para eliminar el bloque redundante:

-# Set default content type for JSON responses
-before do
-  content_type :json if request.post?
-end
-
 get '/' do
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d60dbda and 2dc8c46.

📒 Files selected for processing (2)
  • main.rb (2 hunks)
  • spec/api_spec.rb (5 hunks)
🧰 Additional context used
🧬 Code graph analysis (2)
spec/api_spec.rb (1)
src/blockchain.rb (1)
  • add_block (22-34)
main.rb (2)
src/blockchain.rb (1)
  • add_block (22-34)
src/block.rb (2)
  • valid_data? (50-52)
  • valid_hash? (74-77)
🔇 Additional comments (10)
spec/api_spec.rb (4)

22-32: LGTM: Migración correcta del endpoint.

La prueba se ha actualizado correctamente para usar la nueva ruta con namespace /api/v1. La lógica de validación permanece intacta.


34-56: Buena cobertura de los nuevos campos de minería.

Las pruebas se actualizan correctamente con:

  • Rutas migradas al namespace /api/v1
  • Nuevas aserciones para nonce y difficulty en la respuesta
  • El valor esperado de difficulty: 2 coincide con el valor por defecto en blockchain.rb:21

58-83: LGTM: Pruebas de validación actualizadas correctamente.

Las rutas se migran al namespace /api/v1 manteniendo la cobertura de casos válidos e inválidos.


85-103: Excelente adición de prueba para el nuevo endpoint GET.

Esta nueva prueba proporciona cobertura completa para el endpoint de recuperación de detalles de bloque, verificando:

  • Todos los campos del bloque
  • Información de minería (nonce, difficulty, valid_hash)
  • Estructura de respuesta JSON

El endpoint correspondiente está implementado en main.rb:67-88.

main.rb (6)

4-4: LGTM: Dependencia necesaria para el namespace.

El require de sinatra/namespace es correcto y necesario para la funcionalidad de versionado de la API.


22-26: LGTM: Estructura correcta del namespace v1.

El namespace /api/v1 con su bloque before garantiza que todas las respuestas de la API tengan el content type JSON correcto.


28-32: LGTM: Endpoint de creación de blockchain correctamente implementado.

El endpoint crea y persiste un nuevo blockchain usando save! para garantizar el manejo de errores, y retorna el ID en formato JSON.


34-48: LGTM: Endpoint de adición de bloques bien implementado.

El endpoint implementa correctamente:

  • Validación de dificultad con validate_difficulty
  • Creación de bloque con parámetro de dificultad opcional
  • Respuesta completa con información de minería (nonce, difficulty)

La implementación coincide con las expectativas de las pruebas y el método add_block en blockchain.rb:21-33.


50-65: LGTM: Endpoint de validación correctamente migrado.

El endpoint de validación mantiene la lógica correcta:

  • Encuentra el bloque específico en la cadena
  • Usa block.valid_data? (definido en block.rb:49-51) para validar
  • Retorna resultado de validación en formato JSON

67-88: Excelente adición del endpoint GET para detalles del bloque.

Este nuevo endpoint proporciona acceso completo a la información del bloque, incluyendo:

  • Todos los campos del bloque (index, data, hash, previous_hash)
  • Información de minería (nonce, difficulty)
  • Validación del hash con block.valid_hash? (implementado en block.rb:73-76)
  • Timestamp de creación

La respuesta está bien estructurada y coincide con las pruebas en spec/api_spec.rb:85-103.

@Perafan18 Perafan18 merged commit 9f69abf into master Nov 10, 2025
2 checks passed
@Perafan18 Perafan18 deleted the feature/v2-api-versioning branch November 10, 2025 04:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant