Skip to content
Esta página fue generada y traducida con asistencia de IA. Si encuentra alguna imprecisión, no dude en ayudar a mejorarla. Editar en GitHub

API de Subida

Fenfa proporciona dos endpoints de subida: una subida estándar para metadatos explícitos, y una subida inteligente que detecta automáticamente los metadatos del paquete subido.

Subida Estándar

POST /upload
Content-Type: multipart/form-data
X-Auth-Token: <upload_token or admin_token>

Campos de Solicitud

CampoRequeridoTipoDescripción
variant_idstringID de la variante objetivo (ej. var_def456)
app_filefileArchivo binario (IPA, APK, DMG, EXE, etc.)
versionNostringCadena de versión (ej. "1.2.0")
buildNointegerNúmero de build (ej. 120)
channelNostringCanal de distribución (ej. "internal", "beta")
min_osNostringVersión mínima del OS (ej. "15.0")
changelogNostringTexto de notas de la versión

Ejemplo

bash
curl -X POST http://localhost:8000/upload \
  -H "X-Auth-Token: YOUR_UPLOAD_TOKEN" \
  -F "variant_id=var_def456" \
  -F "app_file=@build/MyApp.ipa" \
  -F "version=1.2.0" \
  -F "build=120" \
  -F "channel=beta" \
  -F "min_os=15.0" \
  -F "changelog=Bug fixes and performance improvements"

Respuesta (201 Created)

json
{
  "ok": true,
  "data": {
    "app": {
      "id": "app_xxx",
      "name": "MyApp",
      "platform": "ios",
      "bundle_id": "com.example.myapp"
    },
    "release": {
      "id": "rel_b1cqa",
      "version": "1.2.0",
      "build": 120
    },
    "urls": {
      "page": "https://dist.example.com/products/myapp",
      "download": "https://dist.example.com/d/rel_b1cqa",
      "ios_manifest": "https://dist.example.com/ios/rel_b1cqa/manifest.plist",
      "ios_install": "itms-services://?action=download-manifest&url=https://dist.example.com/ios/rel_b1cqa/manifest.plist"
    }
  }
}

El objeto urls proporciona enlaces listos para usar:

  • page -- URL de la página de descarga del producto
  • download -- URL de descarga binaria directa
  • ios_manifest -- URL del manifest plist de iOS (solo variantes iOS)
  • ios_install -- URL de instalación itms-services:// completa (solo variantes iOS)

Subida Inteligente

POST /admin/api/smart-upload
Content-Type: multipart/form-data
X-Auth-Token: <admin_token>

La subida inteligente acepta los mismos campos que la subida estándar pero detecta automáticamente los metadatos del paquete subido.

Qué se Detecta Automáticamente

Para archivos IPA: bundle ID, versión (CFBundleShortVersionString), número de build (CFBundleVersion), icono de la app, versión mínima de iOS.

Para archivos APK: nombre del paquete, nombre de versión, código de versión, icono de la app, versión mínima del SDK.

Los formatos de escritorio (DMG, EXE, DEB, etc.) no soportan detección automática. Proporciona versión y build explícitamente.

Ejemplo

bash
curl -X POST http://localhost:8000/admin/api/smart-upload \
  -H "X-Auth-Token: YOUR_ADMIN_TOKEN" \
  -F "variant_id=var_def456" \
  -F "app_file=@build/MyApp.ipa"

Los campos proporcionados explícitamente sobreescriben los valores detectados automáticamente:

bash
curl -X POST http://localhost:8000/admin/api/smart-upload \
  -H "X-Auth-Token: YOUR_ADMIN_TOKEN" \
  -F "variant_id=var_def456" \
  -F "app_file=@build/MyApp.ipa" \
  -F "version=1.2.0-rc1" \
  -F "changelog=Release candidate 1"

Respuestas de Error

ID de Variante Ausente (400)

json
{
  "ok": false,
  "error": {
    "code": "BAD_REQUEST",
    "message": "variant_id is required"
  }
}

Token Inválido (401)

json
{
  "ok": false,
  "error": {
    "code": "UNAUTHORIZED",
    "message": "invalid or missing auth token"
  }
}

Variante No Encontrada (404)

json
{
  "ok": false,
  "error": {
    "code": "NOT_FOUND",
    "message": "variant not found"
  }
}

Ejemplos de CI/CD

GitHub Actions

yaml
- name: Upload iOS build to Fenfa
  run: |
    RESPONSE=$(curl -s -X POST ${{ secrets.FENFA_URL }}/upload \
      -H "X-Auth-Token: ${{ secrets.FENFA_UPLOAD_TOKEN }}" \
      -F "variant_id=${{ secrets.FENFA_IOS_VARIANT }}" \
      -F "app_file=@build/MyApp.ipa" \
      -F "version=${{ github.ref_name }}" \
      -F "build=${{ github.run_number }}" \
      -F "changelog=${{ github.event.head_commit.message }}")
    echo "Upload response: $RESPONSE"
    echo "Download URL: $(echo $RESPONSE | jq -r '.data.urls.page')"

GitLab CI

yaml
upload:
  stage: deploy
  script:
    - |
      curl -X POST ${FENFA_URL}/upload \
        -H "X-Auth-Token: ${FENFA_UPLOAD_TOKEN}" \
        -F "variant_id=${FENFA_VARIANT_ID}" \
        -F "app_file=@build/output/app-release.apk" \
        -F "version=${CI_COMMIT_TAG}" \
        -F "build=${CI_PIPELINE_IID}" \
        -F "channel=beta"
  only:
    - tags

Script de Shell

bash
#!/bin/bash
# upload.sh - Upload a build to Fenfa
FENFA_URL="https://dist.example.com"
TOKEN="your-upload-token"
VARIANT="var_def456"
FILE="$1"
VERSION="$2"

if [ -z "$FILE" ] || [ -z "$VERSION" ]; then
  echo "Usage: ./upload.sh <file> <version>"
  exit 1
fi

curl -X POST "${FENFA_URL}/upload" \
  -H "X-Auth-Token: ${TOKEN}" \
  -F "variant_id=${VARIANT}" \
  -F "app_file=@${FILE}" \
  -F "version=${VERSION}" \
  -F "build=$(date +%s)"

Siguientes Pasos

Released under the Apache-2.0 License.