From 5bcccce8a49a2117014eb5dbd476b90cdcb15a63 Mon Sep 17 00:00:00 2001 From: Ricardo Carneiro Date: Mon, 30 Mar 2026 10:47:03 -0300 Subject: [PATCH] fix: login e termos de uso --- .claude/napkin.md | 21 +++ Views/Home/Developers.cshtml | 123 +++--------------- openapi.json | 240 +++++++++++++++++++++++++++++++++++ 3 files changed, 282 insertions(+), 102 deletions(-) create mode 100644 .claude/napkin.md create mode 100644 openapi.json diff --git a/.claude/napkin.md b/.claude/napkin.md new file mode 100644 index 0000000..50bcc5c --- /dev/null +++ b/.claude/napkin.md @@ -0,0 +1,21 @@ +# Napkin Runbook + +## Curation Rules +- Re-prioritize on every read. +- Keep recurring, high-value notes only. +- Max 10 items per category. +- Each item includes date + "Do instead". + +## Execution & Validation (Highest Priority) +_(empty — add entries as they emerge)_ + +## Shell & Command Reliability +1. **[2026-03-30] Windows paths in bash tools need forward slash style** + Do instead: use `C:/vscode/qrrapido` style, not `C:\...` or `/mnt/c/...` (WSL mount not available in this environment). + +## Domain Behavior Guardrails +_(empty — add entries as they emerge)_ + +## User Directives +1. **[2026-03-30] Diagnose before fixing** + Do instead: always present diagnosis and reasoning first; wait for user approval before touching code. diff --git a/Views/Home/Developers.cshtml b/Views/Home/Developers.cshtml index 15fe8e1..b337639 100644 --- a/Views/Home/Developers.cshtml +++ b/Views/Home/Developers.cshtml @@ -284,111 +284,30 @@ with open('qrcode.svg', 'wb') as f: - +
-
-

@T("Planos para cada escala", "Planes para cada escala", "Plans for every scale")

-

@T("De projetos pessoais a sistemas de alto volume.", "De proyectos personales a sistemas de alto volumen.", "From personal projects to high-volume systems.")

-
- -
- -
-
-
-
Free
-
-
-
R$0
-
    -
  • 10 req/min
  • -
  • 500 req/@T("mês","mes","month")
  • -
  • PNG + WebP
  • -
  • SVG
  • -
-
-
-
- - -
-
-
-
Starter
-
-
-
- - @T("Faça login para ver o preço", "Iniciá sesión para ver el precio", "Log in to see pricing") -
-
    -
  • 50 req/min
  • -
  • 10.000 req/@T("mês","mes","month")
  • -
  • PNG + WebP + SVG
  • -
  • @T("Suporte e-mail","Soporte e-mail","Email support")
  • -
-
-
-
- - -
-
-
-
Pro
- @T("Popular","Popular","Popular") -
-
-
- - @T("Faça login para ver o preço", "Iniciá sesión para ver el precio", "Log in to see pricing") -
-
    -
  • 200 req/min
  • -
  • 100.000 req/@T("mês","mes","month")
  • -
  • PNG + WebP + SVG
  • -
  • @T("Suporte prioritário","Soporte prioritario","Priority support")
  • -
-
-
-
- - -
-
-
-
Business
-
-
-
- - @T("Faça login para ver o preço", "Iniciá sesión para ver el precio", "Log in to see pricing") -
-
    -
  • 500 req/min
  • -
  • 500.000 req/@T("mês","mes","month")
  • -
  • PNG + WebP + SVG
  • -
  • @T("Suporte dedicado + SLA","Soporte dedicado + SLA","Dedicated support + SLA")
  • -
-
-
-
-
- - -
diff --git a/openapi.json b/openapi.json new file mode 100644 index 0000000..eb175a6 --- /dev/null +++ b/openapi.json @@ -0,0 +1,240 @@ +{ + "openapi": "3.0.1", + "info": { + "title": "QRRapido API", + "description": "**QRRapido** — Ultra-fast QR Code generation API.\n\nGenerate QR codes for URLs, Pix payments, Wi-Fi, vCards, WhatsApp, SMS and more.\n\n**PT-BR:** Gere QR codes para URLs, Pix, Wi-Fi, vCard, WhatsApp, SMS e muito mais.\n\n**Authentication:** All endpoints (except `/ping`) require an API key sent in the `X-API-Key` header.\nGet your key at [qrrapido.site/Developer](https://qrrapido.site/Developer).", + "contact": { + "name": "QRRapido", + "url": "https://qrrapido.site", + "email": "contato@qrrapido.site" + }, + "license": { + "name": "Commercial — see qrrapido.site/terms" + }, + "version": "v1" + }, + "paths": { + "/api/v1/QRManager/ping": { + "get": { + "tags": [ + "QRManager" + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/v1/QRManager/generate": { + "post": { + "tags": [ + "QRManager" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QRGenerationRequest" + } + }, + "text/json": { + "schema": { + "$ref": "#/components/schemas/QRGenerationRequest" + } + }, + "application/*+json": { + "schema": { + "$ref": "#/components/schemas/QRGenerationRequest" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QRResponseDto" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { } + } + } + }, + "402": { + "description": "Payment Required", + "content": { + "application/json": { + "schema": { } + } + } + }, + "429": { + "description": "Too Many Requests", + "content": { + "application/json": { + "schema": { } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "QRGenerationRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "nullable": true + }, + "content": { + "type": "string", + "nullable": true + }, + "quickStyle": { + "type": "string", + "nullable": true + }, + "primaryColor": { + "type": "string", + "nullable": true + }, + "backgroundColor": { + "type": "string", + "nullable": true + }, + "size": { + "type": "integer", + "format": "int32" + }, + "margin": { + "type": "integer", + "format": "int32" + }, + "cornerStyle": { + "type": "string", + "nullable": true + }, + "optimizeForSpeed": { + "type": "boolean" + }, + "language": { + "type": "string", + "nullable": true + }, + "isPremium": { + "type": "boolean" + }, + "hasLogo": { + "type": "boolean" + }, + "logo": { + "type": "string", + "format": "byte", + "nullable": true + }, + "logoSizePercent": { + "type": "integer", + "format": "int32", + "nullable": true + }, + "applyLogoColorization": { + "type": "boolean" + }, + "enableTracking": { + "type": "boolean" + }, + "outputFormat": { + "type": "string", + "nullable": true + } + }, + "additionalProperties": false + }, + "QRResponseDto": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "qrCodeBase64": { + "type": "string", + "nullable": true + }, + "qrId": { + "type": "string", + "nullable": true + }, + "message": { + "type": "string", + "nullable": true + }, + "errorCode": { + "type": "string", + "nullable": true + }, + "remainingCredits": { + "type": "integer", + "format": "int32" + }, + "remainingFreeQRs": { + "type": "integer", + "format": "int32" + }, + "fromCache": { + "type": "boolean" + }, + "newDeviceId": { + "type": "string", + "nullable": true + }, + "generationTimeMs": { + "type": "integer", + "format": "int64" + }, + "format": { + "type": "string", + "nullable": true + }, + "mimeType": { + "type": "string", + "nullable": true + } + }, + "additionalProperties": false + } + }, + "securitySchemes": { + "ApiKey": { + "type": "apiKey", + "description": "Your QRRapido API key. Obtain one at https://qrrapido.site/Developer", + "name": "X-API-Key", + "in": "header" + } + } + }, + "security": [ + { + "ApiKey": [ ] + } + ] +} \ No newline at end of file