Upsert playstore application¶
Summary¶
Source repository:
jef-systems/jef-playstore-backendSource SHA:
eb793550a12d9e11927e529c3cd85e40d94c5421Source run id:
29434262589Module:
PlaystoreLambda function:
jef-playstore-upsert-applicationHTTP method:
POSTInvocation mode:
syncPackage mode:
no-packageAPI category:
Playstore Complex Sync No Package POST APIsAPI path:
/playstore/complex-sync-no-packages/jef-playstore-upsert-applicationEndpoint URL:
https://api.jefoffice.com/playstore/complex-sync-no-packages/jef-playstore-upsert-applicationDocumentation 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 '{}'