Repository navigation
fiscalapi 0.1.0: webhooks en tu terminal - #1
Merged
Merged
Conversation
- fiscalapi (.NET 10, PublishAot, System.CommandLine 2.0.13): --live, --api-base, --json, --verbose, --help, --version. - FiscalApiClient con JsonSerializerContext; ApiResponse -> ApiException; reintentos solo en GET (red, 408, 429, 5xx). - Códigos de salida 0/1/2/130 con un solo punto que atrapa errores; errores de uso solo en stderr. - dotnet test: Passed 41, Failed 0 (FiscalApiClientRetryTests: Passed 8). - publish linux-x64 AOT (Docker sdk:10.0-noble-aot): 0 IL/warning; --version -> 0.1.0. win-x64: sin linker de C++. - CI: build, test y publish AOT linux-x64 en cada PR (ubuntu-latest); actionlint sin hallazgos.
- Sin redirecciones (3xx -> ApiException); fábrica por instancia con handler compartido y timeout por cliente. - Reintentos solo por ConnectionError/ResponseEnded, 408, 429 y 5xx; timeout, TLS y DNS no se reintentan. - JsonException en 2xx sube como defecto; --verbose sin Set-Cookie/Proxy-Authorization, con headers de Content y fallas. - --json manda la ayuda a stderr; --version asíncrona; consola restaura su codificación; --api-base conserva el prefijo. - Rojo visto: 13 pruebas nuevas por aserción; 8 de tiempo/408/cancelación por mutación (FakeTimeProvider). - dotnet test (Debug y Release): Passed 64, Failed 0 (FiscalApiClientRetryTests: 17). Build Release: 0 avisos. - publish AOT linux-x64 (Docker sdk:10.0-noble-aot), normal y enraizado: 0 IL/warning; --version = 0.1.0. - CI: checkout v5.1.0 y setup-dotnet v5.4.0 por SHA, global.json 10.0.401, concurrency; actionlint sin hallazgos.
- login: API key y tenant key sin eco o por stdin, GET /api/v4/me/features, una entrada por host; logout local, siempre 0. - Almacenes con LibraryImport: advapi32 CredWriteW/CredReadW/CredDeleteW, llavero SecItem*, libsecret *v_sync; sin archivo plano. - FISCALAPI_API_KEY/FISCALAPI_TENANT_KEY ganan; sin almacén: texto aprobado, código 2. Credenciales fuera de --verbose y errores. - Rojo visto: 35 pruebas nuevas por NotImplementedException; StoredCredentialsFormatTests por mutación (3 en rojo). - dotnet test Release y Debug: Passed 106, Failed 0. Build Release: 0 avisos. - Windows: ida y vuelta real en Credential Manager; cmdkey /list sin entradas fiscalapi-cli al terminar. - Docker sdk:10.0-noble-aot: publish AOT linux-x64 normal y enraizado sin IL/warning; libsecret con gnome-keyring: 5/5. - CI: las pruebas corren en dbus-run-session con gnome-keyring; actionlint sin hallazgos. macOS solo compilado.
- M1: "no hay almacén" (2) separado de "bloqueado o no respondió" (1, con detalle); logout ya no lo oculta. - M2: --api-base con http solo para loopback; otro host es error de uso (2). B1: login revisa el almacén antes. - B5/B6: ConsoleSecretReader con teclas inyectables; sin BOM en stdin. API key inválida antes de la tenant key. - MaxLength 200: el blob nunca pasa de 2560 bytes ni con escapes JSON. GLib se carga una vez (Lazy). - Rojo visto: 21 pruebas nuevas; 7 más ya en verde cubren comportamiento previo. Verde: Passed 133, Failed 0. - Build Release: 0 avisos. Windows: CredentialStoreTests 6/6 reales; cmdkey /list sin entradas fiscalapi-cli. - Docker AOT linux-x64 normal y enraizado: 0 IL/warning; gnome-keyring 6/6; sin D-Bus o sin servicio: 2; bloqueado: 1. - CI: espera a org.freedesktop.secrets con tope (script), sin dbus-x11; actionlint y shellcheck sin hallazgos.
…onexión) - listen abre la escucha de CLI, hace long-polling, reenvía a --forward-to el cuerpo y los headers firmados byte a byte y acusa todo (statusCode o error). - Reenvíos con concurrencia acotada (16) y ordenados por evento; un 410 reabre la sesión, red/5xx reconectan con backoff y jitter (tope 30 s), un 409 sale con 1. - --events, --headers, --skip-verify (solo hacia --forward-to), --print-secret y --json (JSON Lines). - ExponentialBackoff y TransientHttpStatus se extraen de RetryPolicy; CliException.IsTransient. - Evidencia: 195 pruebas en verde (ListenCommandTests con Kestrel en proceso: API falsa y receptor); dotnet build -c Release sin avisos. - Publish AOT win-x64 y linux-x64 (Docker sdk:10.0-noble-aot, normal y con TrimmerRootAssembly) sin IL ni warning.
- M1: el cupo se toma al llegar el turno del evento; Enqueue nunca espera; lease vencido = no se reenvía ni se acusa. - M2: 409 al reabrir (candado) se reintenta con backoff; el 409 del long-polling sigue terminando. B4: 410 seguidos con backoff. - M3/B2: --events y --headers repetidos y --print-secret con opciones de reenvío son error de uso (2). - B1: Ctrl+C acusa lo que ya tenía resultado, un intento con 2 s. B5: código fuera de 100..599 = InvalidResponse. - B6: cuerpo o webhook-id inesperados se muestran con "?" y se acusan. Q1: cada destino decide su acuse. - Pruebas: P1 determinista, orden por evento, corte del acuse por lease, 401/403/404 = 1, ClosedPort sin TOCTOU. - Evidencia: 218 pruebas en verde 3 veces (Linux: 212 + 6 omitidas); build Release sin avisos. - AOT win-x64 y linux-x64 (normal y TrimmerRootAssembly) sin IL ni warning.
listen usa /api/v4/webhooks/cli-listener, /{id}/cli-deliveries y
/{id}/cli-deliveries/{deliveryId}/ack (antes /api/v4/webhook-endpoints/...),
por el cambio de contrato decidido por el usuario. La API falsa de
ListenCommandTests sirve la ruta nueva.
Evidencia: dotnet test, 218 correctas, 0 con error.
webhooks list|retrieve|create|update|delete|rotate-secret sobre /api/v4/webhooks y events list|retrieve|resend sobre /api/v4/events (D-28, D-33). --json deja el data tal cual (events retrieve, byte a byte); create y rotate-secret imprimen el secreto una vez; update lee y reemplaza solo lo pedido; delete pide confirmación o --yes. Los 400 de validación muestran el texto de cada falla. Evidencia: 63 pruebas nuevas (rojo 62/63 antes del código); dotnet test 281 correctas x3; build Release sin avisos; AOT win-x64 y linux-x64 (normal y con TrimmerRootAssembly) sin IL ni warning; binario nativo contra API falsa.
--person vacío es error de uso y --all-persons quita el filtro; Ctrl+C en la confirmación de delete sale con 130; --to con solo fecha incluye el día (UTC); el secreto de create/rotate-secret sale del JSON crudo aunque el modelo falle; update de una escucha de CLI sale con 1; sin IsEmpty, ApiResponse no genérico ni la guarda duplicada de data. Evidencia: 20 pruebas nuevas o ajustadas (rojo 18 antes del código); dotnet test 301 correctas x3; build Release sin avisos; AOT linux-x64 (normal y raíz) sin IL.
- release.yml: en cada tag v* (o workflow_dispatch) compila AOT win-x64, linux-x64 (AlmaLinux 8, glibc 2.28), osx-arm64 y osx-x64 en runners nativos, humo de --version, CredentialStoreTests en macOS con llavero de prueba, zip/tar.gz + SHA256SUMS y release en borrador. - Aviso de versión nueva (UpdateCheck): releases/latest como mucho cada 24 h, en paralelo al comando, tope de 2 s, nunca falla; apagado con --json, stderr redirigido, CI o FISCALAPI_NO_UPDATE_CHECK. - README: instalación con verificación de SHA-256, login, listen + trigger, webhooks/events, variables, códigos de salida y ConPTY. - Evidencia: rojo 85/86 antes del código; 387 pruebas en verde x3; build Release sin avisos. - AOT win-x64 y linux-x64 (noble-aot normal y con TrimmerRootAssembly; AlmaLinux 8) sin IL ni warning. - Linux: enlazado en AlmaLinux 8 pide GLIBC_2.17 (en Ubuntu 24.04, 2.34); corre en Ubuntu 18.04 y Debian 10. - Empaque y SHA256SUMS simulados en Docker: sha256sum -c OK y alteración detectada; actionlint y shellcheck sin hallazgos.
- M2/B4: workflow_dispatch falla si el tag ya existe (gh api, 404 = libre) o si la versión no coincide con el tag; ::error:: sin el valor sin validar. - B1: con Ctrl+C (130) se muestra el aviso solo si ya llegó, sin esperar la consulta. - B2: dotnet-install.sh se ejecuta solo con firma GPG válida de la llave 2B930AB1…FC7D3ACF (versionada, huella de Microsoft Learn). - B3/B5/menores: persist-credentials: false; PATH de Windows sin aplanar (REG_EXPAND_SZ); COPYFILE_DISABLE y una sola entrada por empaque; URL del repo en CliRepository; comentario de concurrency. - CredentialStoreTests también en Windows (Credential Manager) antes de empaquetar. - Evidencia: rojo 1/8 en CliApplicationUpdateCheckTests; 389 en verde x3; build sin avisos; AOT win-x64 y linux-x64 (AlmaLinux 8, GPG ok) sin IL. - GPG en Docker: firma, script, firma vacía, otra llave y llave del repo cambiada fallan; actionlint y shellcheck limpios.
- README como portada: qué es, instalación con verificación de SHA-256, inicio rápido (login → listen → trigger) y enlaces a docs/. - docs/: instalacion, autenticacion, listen, webhooks-y-eventos, trigger (esqueleto de CLI-005, marcado), salida-y-codigos y solucion-de-problemas. - Ejemplos de salida capturados del binario nativo contra una API falsa con los datos de las pruebas; textos de error del código y de fapi-back. - Evidencia: cada comando y opción documentados existen en --help (salvo trigger y su --person-id); 32 enlaces relativos y anclas resuelven. - markdownlint-cli2 0.18.1 en Docker: 0 hallazgos (MD013 a 120 columnas, como el repo); bloques de PATH de PowerShell probados sobre una variable de prueba.
Quita de comentarios y XML docs los IDs de planeación (CLI-, WH-, SDK-, FE-, D-), que apuntan a documentos privados. La ayuda de --events usa tipos reales, ApiCommandContext ya no enumera comandos y la prueba de trigger --live se renombra.
listen, webhooks y eventos, autenticación e instalación reescritos con formato de referencia (uso, opciones, ejemplos, errores). Corrige hechos: 403 sin Webhooks.Manage, logout con almacén bloqueado, reintentos de GET, --json de delete, reconexión de listen. trigger: 403 por permiso, texto del 429, resend con --webhook; ids de ejemplo como GUID coherentes en todos los docs.
|
Important Review skippedToo many files! This PR contains 160 files, which is 60 over the limit of 100. To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch. Upgrade to a paid plan to raise the limit. This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry. ⚙️ Run configuration
📒 Files selected for processing: 160
You can disable this status message by setting the
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. Comment |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Primera versión de
fiscalapi, el CLI de FiscalAPI para webhooks y eventos desde la terminal.Qué trae
login/logout: guarda o borra la API key y la tenant key en el almacén de credenciales del sistema.webhooks: administra los webhooks del tenant.events: consulta y reenvía los eventos de los últimos 30 días.listen: recibe los eventos en la terminal y los reenvía a tu servidor local (--forward-to).trigger <type>: dispara un evento de prueba hacia tulisteno hacia un webhook (solo en pruebas).Plataformas
Native AOT, un solo ejecutable sin dependencias:
win-x64,linux-x64(glibc 2.28 o más nueva),osx-arm64yosx-x64.Pipeline
build.yml: compila y corre las pruebas en cada PR.release.yml: un tagv*compila cada RID en un runner de su SO, corre el humo y deja un borrador con los 4 empaques ySHA256SUMS.Pruebas
login,webhooks,events,listen --forward-to,trigger,events resend), sin defectos.v0.1.0-rc.1(28631de) salió del pipeline real en verde en los 4 SO; empaques ySHA256SUMSverificados y humo en win-x64 y linux-x64.