Upsert playstore application

Summary

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

  • Source SHA: eb793550a12d9e11927e529c3cd85e40d94c5421

  • Source run id: 29434262589

  • Module: Playstore

  • Lambda function: jef-playstore-upsert-application

  • HTTP method: POST

  • Invocation mode: sync

  • Package mode: no-package

  • API category: Playstore Complex Sync No Package POST APIs

  • API path: /playstore/complex-sync-no-packages/jef-playstore-upsert-application

  • Endpoint URL: https://api.jefoffice.com/playstore/complex-sync-no-packages/jef-playstore-upsert-application

  • Documentation scope: lambda-complex-sync-no-packages

Synchronous Lambda Complex Rule

This API is documented as a synchronous Lambda complex no-package API. API Gateway waits for the Lambda result and returns the final Lambda response.

Description

POST endpoint that upserts one application using stable domain_name + package_name ownership while resolving the current domain_id at runtime.

Payload Example

{
  "domain_name": "jefstore",
  "package_name": "com.jef.playstore",
  "name": "JEF Playstore",
  "version": "1.0.0",
  "version_code": 1,
  "is_mobile": true,
  "create_domain_if_missing": true,
  "domain_display_name": "JEF Store",
  "apk_s3_uri": "s3://jef-playstore-bucket-246715082475-ap-southeast-1-an/github-artifacts/com.jef.playstore/1.0.0/debug.apk",
  "apk_cloudfront_url": "https://dp7kzshybb1z1.cloudfront.net/github-artifacts/com.jef.playstore/1.0.0/debug.apk",
  "apk_object_key": "github-artifacts/com.jef.playstore/1.0.0/debug.apk",
  "apk_sha256": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
  "signing_certificate_sha256": "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789",
  "apk_size_bytes": 12345678,
  "build_type": "debug",
  "source_sha": 0
}

Payload Schema

{
  "root": {
    "type": "M",
    "required": true,
    "attributes": {
      "domain_name": {
        "type": "S",
        "required": false,
        "regex": "^[a-z0-9][a-z0-9.-]{1,120}$",
        "role": "stable_application_parent_identity"
      },
      "domain_id": {
        "type": "S",
        "required": false,
        "format": "uuidv4",
        "validation": "must_match_resolved_domain_id_when_domain_name_is_supplied"
      },
      "domain_display_name": {
        "type": "S",
        "required": false,
        "regex": "^[A-Za-z0-9 ._@:/#,+&()_-]{1,160}$"
      },
      "create_domain_if_missing": {
        "type": "BOOL",
        "required": false,
        "default": true
      },
      "package_name": {
        "type": "S",
        "required": true,
        "regex": "^[a-zA-Z][a-zA-Z0-9_]*(?:[.][a-zA-Z][a-zA-Z0-9_]*){1,}$"
      },
      "name": {
        "type": "S",
        "required": true,
        "regex": "^[A-Za-z0-9 ._@:/#,+&()_-]{1,160}$"
      },
      "version": {
        "type": "S",
        "required": true,
        "regex": "^[0-9]+[.][0-9]+[.][0-9]+(?:[-+][A-Za-z0-9.-]+)?$"
      },
      "version_code": {
        "type": "N",
        "required": false,
        "regex": "^[1-9][0-9]*$"
      },
      "is_mobile": {
        "type": "BOOL",
        "required": true
      },
      "apk_s3_uri": {
        "type": "S",
        "required": false,
        "regex": "^s3://[A-Za-z0-9._/-]{1,2000}$"
      },
      "apk_cloudfront_url": {
        "type": "S",
        "required": false,
        "regex": "^https://[A-Za-z0-9._~:/?#\\[\\]@!$&'()*+,;=%-]{1,2000}$"
      },
      "apk_object_key": {
        "type": "S",
        "required": false,
        "regex": "^[A-Za-z0-9._~!$&'()*+,;=:@/-]{1,1024}$"
      },
      "apk_sha256": {
        "type": "S",
        "required": false,
        "regex": "^[0-9a-fA-F]{64}$"
      },
      "signing_certificate_sha256": {
        "type": "S",
        "required": false,
        "regex": "^[0-9a-fA-F]{64}$"
      },
      "apk_size_bytes": {
        "type": "N",
        "required": false
      },
      "build_type": {
        "type": "S",
        "required": false,
        "regex": "^(debug|release)$"
      },
      "source_sha": {
        "type": "S",
        "required": false,
        "regex": "^[0-9a-fA-F]{7,64}$"
      }
    }
  },
  "notes": [
    "Supply domain_name for normal operation. domain_id-only input remains supported by resolving domain_name from the domains table.",
    "If both domain_id and domain_name are supplied, they must resolve to the same current domain record.",
    "If domain_name does not exist and create_domain_if_missing is true, the domain is created with a deterministic domain_id.",
    "application_id, created, and updated are generated server-side.",
    "The stable stored application identity is domain_name + package_name.",
    "domain_id is resolved at runtime and may change without changing application ownership.",
    "version_code, when supplied, must be a positive Android versionCode.",
    "signing_certificate_sha256, when supplied, is normalized to lowercase and stored with the application record.",
    "Existing publishers that omit the two new optional fields remain accepted; live release endpoints derive and verify the signer from the APK signing block."
  ]
}

Response Schema

{
  "root": {
    "type": "M",
    "required": true,
    "attributes": {
      "is_accepted": {
        "type": "BOOL",
        "required": true
      },
      "is_saved": {
        "type": "BOOL",
        "required": true
      },
      "exists": {
        "type": "BOOL",
        "required": true
      },
      "is_created": {
        "type": "BOOL",
        "required": false
      },
      "is_updated": {
        "type": "BOOL",
        "required": false
      },
      "is_idempotent": {
        "type": "BOOL",
        "required": false
      },
      "identity_repaired": {
        "type": "BOOL",
        "required": false
      },
      "domain_id_rotated": {
        "type": "BOOL",
        "required": false
      },
      "identity_lookup_source": {
        "type": "S",
        "required": false
      },
      "ok": {
        "type": "BOOL",
        "required": false
      },
      "retryable": {
        "type": "BOOL",
        "required": false
      },
      "repair_required": {
        "type": "BOOL",
        "required": false
      },
      "message_type": {
        "type": "S",
        "required": true
      },
      "message": {
        "type": "S",
        "required": true
      },
      "operation": {
        "type": "S",
        "required": true
      },
      "status_code": {
        "type": "N",
        "required": true
      },
      "domain_id": {
        "type": "S",
        "required": false
      },
      "domain_name": {
        "type": "S",
        "required": false
      },
      "domain_lookup_source": {
        "type": "S",
        "required": false
      },
      "domain_created": {
        "type": "BOOL",
        "required": false
      },
      "application_id": {
        "type": "S",
        "required": false
      },
      "package_name": {
        "type": "S",
        "required": false
      },
      "version": {
        "type": "S",
        "required": false
      },
      "version_code": {
        "type": "N",
        "required": false
      },
      "apk_s3_uri": {
        "type": "S",
        "required": false
      },
      "apk_cloudfront_url": {
        "type": "S",
        "required": false
      },
      "apk_object_key": {
        "type": "S",
        "required": false
      },
      "apk_sha256": {
        "type": "S",
        "required": false
      },
      "signing_certificate_sha256": {
        "type": "S",
        "required": false
      },
      "apk_size_bytes": {
        "type": "N",
        "required": false
      },
      "build_type": {
        "type": "S",
        "required": false
      },
      "source_sha": {
        "type": "S",
        "required": false
      },
      "failure_code": {
        "type": "S",
        "required": false
      },
      "failure_reason": {
        "type": "S",
        "required": false
      },
      "existing_domain_name": {
        "type": "S",
        "required": false
      },
      "existing_domain_id": {
        "type": "S",
        "required": false
      },
      "item": {
        "type": "M",
        "required": false,
        "attributes": {
          "application_id": {
            "type": "S",
            "required": true
          },
          "domain_name": {
            "type": "S",
            "required": true
          },
          "domain_id": {
            "type": "S",
            "required": true
          },
          "package_name": {
            "type": "S",
            "required": true
          },
          "name": {
            "type": "S",
            "required": true
          },
          "version": {
            "type": "S",
            "required": true
          },
          "version_code": {
            "type": "N",
            "required": false
          },
          "is_mobile": {
            "type": "BOOL",
            "required": true
          },
          "apk_s3_uri": {
            "type": "S",
            "required": false
          },
          "apk_cloudfront_url": {
            "type": "S",
            "required": false
          },
          "apk_object_key": {
            "type": "S",
            "required": false
          },
          "apk_sha256": {
            "type": "S",
            "required": false
          },
          "signing_certificate_sha256": {
            "type": "S",
            "required": false
          },
          "apk_size_bytes": {
            "type": "N",
            "required": false
          },
          "build_type": {
            "type": "S",
            "required": false
          },
          "source_sha": {
            "type": "S",
            "required": false
          },
          "created": {
            "type": "S",
            "required": true
          },
          "updated": {
            "type": "S",
            "required": true
          }
        }
      },
      "domain": {
        "type": "M",
        "required": false
      }
    }
  },
  "notes": [
    "Successful response item includes domain_name and the currently resolved domain_id.",
    "identity_repaired is true when missing/stale ownership fields were backfilled.",
    "domain_id_rotated is true when a non-empty older domain_id was replaced for the same domain_name.",
    "Existing application_id values are preserved during repair and rotation.",
    "Failure responses include failure_code and retryable.",
    "APK object keys are rejected when they do not match package_name, version, and build_type."
  ]
}

Request Payload

{
  "domain_name": "jefstore",
  "package_name": "com.jef.playstore",
  "name": "JEF Playstore",
  "version": "1.0.0",
  "version_code": 1,
  "is_mobile": true,
  "create_domain_if_missing": true,
  "domain_display_name": "JEF Store",
  "apk_s3_uri": "s3://jef-playstore-bucket-246715082475-ap-southeast-1-an/github-artifacts/com.jef.playstore/1.0.0/debug.apk",
  "apk_cloudfront_url": "https://dp7kzshybb1z1.cloudfront.net/github-artifacts/com.jef.playstore/1.0.0/debug.apk",
  "apk_object_key": "github-artifacts/com.jef.playstore/1.0.0/debug.apk",
  "apk_sha256": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
  "signing_certificate_sha256": "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789",
  "apk_size_bytes": 12345678,
  "build_type": "debug",
  "source_sha": 0
}

CMD curl

curl.exe -X POST "https://api.jefoffice.com/playstore/complex-sync-no-packages/jef-playstore-upsert-application" -H "Content-Type: application/json" --data-raw '{}'

PowerShell curl

curl.exe -X POST "https://api.jefoffice.com/playstore/complex-sync-no-packages/jef-playstore-upsert-application" -H "Content-Type: application/json" --data-raw '{}'