.. AUTO-GENERATED FILE. DO NOT EDIT. 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 --------------- .. code-block:: json { "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 -------------- .. code-block:: json { "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 --------------- .. code-block:: json { "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 --------------- .. code-block:: json { "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 -------- .. code-block:: bat 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 --------------- .. code-block:: powershell curl.exe -X POST "https://api.jefoffice.com/playstore/complex-sync-no-packages/jef-playstore-upsert-application" -H "Content-Type: application/json" --data-raw '{}'