Upsert playstore manifest

Summary

  • Source repository: jef-systems/jef-playstore-backend

  • Source SHA: 6ceeeefc95a4a88ab42d116f11f75b65357c4965

  • Source run id: 26344481220

  • Module: Playstore

  • Lambda function: playstore-manifest-upsert

  • HTTP method: POST

  • Invocation mode: async

  • Package mode: no-package

  • API category: Playstore Complex No Package Async POST APIs

  • API path: /playstore-manifest-upsert

  • Endpoint URL: https://efj8o1q96l.execute-api.ap-southeast-1.amazonaws.com/prod/playstore-manifest-upsert

  • Documentation scope: lambda-complex-no-packages

Async Confirmation Rule

This write API is documented as an async accepted request, not final write success. Use the corresponding GET API to confirm the final state.

Description

POST endpoint that accepts APK release metadata from the b1 Android APK build workflow and upserts one jef-playstore-manifests record by package_name using gsi_2 index get-by-package-name.

API Gateway Response

{
  "status_code": 202,
  "message": "This endpoint returns 202 when the request is accepted. The Lambda function continues processing asynchronously."
}

Payload Example

{
  "name": "JEF Demo App",
  "slug": "jef-demo-app",
  "version": "28",
  "package_name": "com.jef.demo",
  "scheme": "jefdemo",
  "icon": "./assets/images/icon.png",
  "idempotency_key": "8d4e7d32-2f6f-4d13-9b8e-0f4e98ef0001",
  "apk_sha256": "0000000000000000000000000000000000000000000000000000000000000000",
  "object_key": "github-artifacts/com.jef.demo/28/release.apk",
  "file_name": "release.apk"
}

Payload Schema

{
  "root": {
    "type": "M",
    "required": true,
    "attributes": {
      "name": {
        "type": "S",
        "required": true,
        "regex": "^[A-Za-z0-9 .,'_-]{1,120}$"
      },
      "slug": {
        "type": "S",
        "required": true,
        "regex": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
      },
      "version": {
        "type": "S",
        "required": true,
        "regex": "^(?:[0-9]+|[0-9]+[.][0-9]+[.][0-9]+)$"
      },
      "package_name": {
        "type": "S",
        "required": true,
        "regex": "^[a-zA-Z][a-zA-Z0-9_]*(?:[.][a-zA-Z][a-zA-Z0-9_]*){1,}$"
      },
      "scheme": {
        "type": "S",
        "required": false,
        "regex": "^[a-z][a-z0-9+.-]{1,80}$"
      },
      "icon": {
        "type": "S",
        "required": false,
        "regex": "^.{0,500}$"
      },
      "idempotency_key": {
        "type": "S",
        "required": true,
        "regex": "^[A-Za-z0-9._:-]{1,160}$"
      },
      "apk_sha256": {
        "type": "S",
        "required": true,
        "regex": "^[A-Fa-f0-9]{64}$"
      },
      "object_key": {
        "type": "S",
        "required": true,
        "regex": "^github-artifacts/[A-Za-z0-9_.]+/(?:[0-9]+|[0-9]+[.][0-9]+[.][0-9]+)/release[.]apk$"
      },
      "file_name": {
        "type": "S",
        "required": true,
        "regex": "^release[.]apk$"
      }
    }
  }
}

Response Schema

{
  "root": {
    "type": "M",
    "required": true,
    "attributes": {
      "is_accepted": {
        "type": "BOOL",
        "required": true
      },
      "is_saved": {
        "type": "BOOL",
        "required": true
      },
      "is_idempotent": {
        "type": "BOOL",
        "required": false
      },
      "exists": {
        "type": "BOOL",
        "required": true
      },
      "message_type": {
        "type": "S",
        "required": true
      },
      "message": {
        "type": "S",
        "required": true
      },
      "operation": {
        "type": "S",
        "required": true
      },
      "status_code": {
        "type": "N",
        "required": true
      },
      "package_name": {
        "type": "S",
        "required": false
      },
      "version": {
        "type": "S",
        "required": false
      },
      "object_key": {
        "type": "S",
        "required": false
      },
      "file_name": {
        "type": "S",
        "required": false
      },
      "apk_sha256": {
        "type": "S",
        "required": false
      },
      "manifest_id": {
        "type": "S",
        "required": false
      },
      "release_status": {
        "type": "S",
        "required": false
      },
      "failure_code": {
        "type": "S",
        "required": false
      },
      "failure_reason": {
        "type": "S",
        "required": false
      },
      "item": {
        "type": "M",
        "required": false
      }
    }
  }
}

Request Payload

{
  "name": "JEF Demo App",
  "slug": "jef-demo-app",
  "version": "28",
  "package_name": "com.jef.demo",
  "scheme": "jefdemo",
  "icon": "./assets/images/icon.png",
  "idempotency_key": "8d4e7d32-2f6f-4d13-9b8e-0f4e98ef0001",
  "apk_sha256": "0000000000000000000000000000000000000000000000000000000000000000",
  "object_key": "github-artifacts/com.jef.demo/28/release.apk",
  "file_name": "release.apk"
}

CMD curl

curl -X POST "https://efj8o1q96l.execute-api.ap-southeast-1.amazonaws.com/prod/playstore-manifest-upsert" \
  -H "Content-Type: application/json" \
  --data-raw '{"name":"JEF Demo App","slug":"jef-demo-app","version":"28","package_name":"com.jef.demo","scheme":"jefdemo","icon":"./assets/images/icon.png","idempotency_key":"8d4e7d32-2f6f-4d13-9b8e-0f4e98ef0001","apk_sha256":"0000000000000000000000000000000000000000000000000000000000000000","object_key":"github-artifacts/com.jef.demo/28/release.apk","file_name":"release.apk"}'

PowerShell curl

curl.exe -X POST "https://efj8o1q96l.execute-api.ap-southeast-1.amazonaws.com/prod/playstore-manifest-upsert" `
  -H "Content-Type: application/json" `
  --data-raw '{"name":"JEF Demo App","slug":"jef-demo-app","version":"28","package_name":"com.jef.demo","scheme":"jefdemo","icon":"./assets/images/icon.png","idempotency_key":"8d4e7d32-2f6f-4d13-9b8e-0f4e98ef0001","apk_sha256":"0000000000000000000000000000000000000000000000000000000000000000","object_key":"github-artifacts/com.jef.demo/28/release.apk","file_name":"release.apk"}'