Introduce admin CRUD and public version check APIs for Play Store/App Store releases with force or optional update policies, and update profile dropdown seed data for countries, regions, and learner profile fields. Co-authored-by: Cursor <cursoragent@cursor.com>
849 lines
24 KiB
JSON
849 lines
24 KiB
JSON
{
|
|
"info": {
|
|
"_postman_id": "c4e8a1b2-7f3d-4a9e-b6c1-2d8f9e0a1b2c",
|
|
"name": "Mobile App Versions - Complete Flow",
|
|
"description": "Complete collection for mobile app version management: public version check (Play Store / App Store) and admin CRUD with force vs optional update policies.",
|
|
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
|
|
},
|
|
"auth": {
|
|
"type": "bearer",
|
|
"bearer": [
|
|
{
|
|
"key": "token",
|
|
"value": "{{access_token}}",
|
|
"type": "string"
|
|
}
|
|
]
|
|
},
|
|
"variable": [
|
|
{
|
|
"key": "base_url",
|
|
"value": "http://localhost:8080"
|
|
},
|
|
{
|
|
"key": "access_token",
|
|
"value": ""
|
|
},
|
|
{
|
|
"key": "app_version_id",
|
|
"value": ""
|
|
},
|
|
{
|
|
"key": "app_version_id_optional",
|
|
"value": ""
|
|
},
|
|
{
|
|
"key": "client_version_code",
|
|
"value": "10"
|
|
}
|
|
],
|
|
"item": [
|
|
{
|
|
"name": "01 - Admin App Version CRUD",
|
|
"item": [
|
|
{
|
|
"name": "Create Android Version (FORCE update)",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test(\"Status code is 201\", function () {",
|
|
" pm.response.to.have.status(201);",
|
|
"});",
|
|
"const body = pm.response.json();",
|
|
"pm.test(\"App version ID exists\", function () {",
|
|
" pm.expect(body.data.id).to.be.a(\"number\");",
|
|
"});",
|
|
"pm.test(\"Update type is FORCE\", function () {",
|
|
" pm.expect(body.data.update_type).to.eql(\"FORCE\");",
|
|
"});",
|
|
"pm.collectionVariables.set(\"app_version_id\", body.data.id);"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"method": "POST",
|
|
"header": [
|
|
{
|
|
"key": "Content-Type",
|
|
"value": "application/json",
|
|
"type": "text"
|
|
}
|
|
],
|
|
"body": {
|
|
"mode": "raw",
|
|
"raw": "{\n \"platform\": \"ANDROID\",\n \"version_name\": \"1.3.0\",\n \"version_code\": 15,\n \"update_type\": \"FORCE\",\n \"release_notes\": \"Critical security update and performance improvements.\",\n \"store_url\": \"https://play.google.com/store/apps/details?id=com.yimaru.app\",\n \"min_supported_version_code\": 12,\n \"status\": \"ACTIVE\"\n}"
|
|
},
|
|
"url": {
|
|
"raw": "{{base_url}}/api/v1/admin/app-versions",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"v1",
|
|
"admin",
|
|
"app-versions"
|
|
]
|
|
}
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "Create Android Version (OPTIONAL update)",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test(\"Status code is 201\", function () {",
|
|
" pm.response.to.have.status(201);",
|
|
"});",
|
|
"const body = pm.response.json();",
|
|
"pm.collectionVariables.set(\"app_version_id_optional\", body.data.id);"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"method": "POST",
|
|
"header": [
|
|
{
|
|
"key": "Content-Type",
|
|
"value": "application/json",
|
|
"type": "text"
|
|
}
|
|
],
|
|
"body": {
|
|
"mode": "raw",
|
|
"raw": "{\n \"platform\": \"ANDROID\",\n \"version_name\": \"1.2.0\",\n \"version_code\": 12,\n \"update_type\": \"OPTIONAL\",\n \"release_notes\": \"Minor bug fixes.\",\n \"store_url\": \"https://play.google.com/store/apps/details?id=com.yimaru.app\",\n \"status\": \"ACTIVE\"\n}"
|
|
},
|
|
"url": {
|
|
"raw": "{{base_url}}/api/v1/admin/app-versions",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"v1",
|
|
"admin",
|
|
"app-versions"
|
|
]
|
|
}
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "Create iOS Version (OPTIONAL update)",
|
|
"request": {
|
|
"method": "POST",
|
|
"header": [
|
|
{
|
|
"key": "Content-Type",
|
|
"value": "application/json",
|
|
"type": "text"
|
|
}
|
|
],
|
|
"body": {
|
|
"mode": "raw",
|
|
"raw": "{\n \"platform\": \"IOS\",\n \"version_name\": \"1.3.0\",\n \"version_code\": 15,\n \"update_type\": \"OPTIONAL\",\n \"release_notes\": \"New lessons and UI polish.\",\n \"store_url\": \"https://apps.apple.com/app/id000000000\",\n \"status\": \"ACTIVE\"\n}"
|
|
},
|
|
"url": {
|
|
"raw": "{{base_url}}/api/v1/admin/app-versions",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"v1",
|
|
"admin",
|
|
"app-versions"
|
|
]
|
|
}
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "List App Versions (Admin - All)",
|
|
"request": {
|
|
"method": "GET",
|
|
"header": [],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/v1/admin/app-versions?limit=20&offset=0",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"v1",
|
|
"admin",
|
|
"app-versions"
|
|
],
|
|
"query": [
|
|
{
|
|
"key": "limit",
|
|
"value": "20"
|
|
},
|
|
{
|
|
"key": "offset",
|
|
"value": "0"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "List App Versions (Admin - ANDROID only)",
|
|
"request": {
|
|
"method": "GET",
|
|
"header": [],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/v1/admin/app-versions?platform=ANDROID&limit=20&offset=0",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"v1",
|
|
"admin",
|
|
"app-versions"
|
|
],
|
|
"query": [
|
|
{
|
|
"key": "platform",
|
|
"value": "ANDROID"
|
|
},
|
|
{
|
|
"key": "limit",
|
|
"value": "20"
|
|
},
|
|
{
|
|
"key": "offset",
|
|
"value": "0"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "List App Versions (Admin - ACTIVE only)",
|
|
"request": {
|
|
"method": "GET",
|
|
"header": [],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/v1/admin/app-versions?status=ACTIVE&limit=20&offset=0",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"v1",
|
|
"admin",
|
|
"app-versions"
|
|
],
|
|
"query": [
|
|
{
|
|
"key": "status",
|
|
"value": "ACTIVE"
|
|
},
|
|
{
|
|
"key": "limit",
|
|
"value": "20"
|
|
},
|
|
{
|
|
"key": "offset",
|
|
"value": "0"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "Get App Version By ID (Admin)",
|
|
"request": {
|
|
"method": "GET",
|
|
"header": [],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/v1/admin/app-versions/{{app_version_id}}",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"v1",
|
|
"admin",
|
|
"app-versions",
|
|
"{{app_version_id}}"
|
|
]
|
|
}
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "Update App Version (Admin - change to OPTIONAL)",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test(\"Status code is 200\", function () {",
|
|
" pm.response.to.have.status(200);",
|
|
"});",
|
|
"const body = pm.response.json();",
|
|
"pm.test(\"Update type is OPTIONAL\", function () {",
|
|
" pm.expect(body.data.update_type).to.eql(\"OPTIONAL\");",
|
|
"});"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"method": "PUT",
|
|
"header": [
|
|
{
|
|
"key": "Content-Type",
|
|
"value": "application/json",
|
|
"type": "text"
|
|
}
|
|
],
|
|
"body": {
|
|
"mode": "raw",
|
|
"raw": "{\n \"update_type\": \"OPTIONAL\",\n \"release_notes\": \"Updated policy: optional update for this release.\"\n}"
|
|
},
|
|
"url": {
|
|
"raw": "{{base_url}}/api/v1/admin/app-versions/{{app_version_id}}",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"v1",
|
|
"admin",
|
|
"app-versions",
|
|
"{{app_version_id}}"
|
|
]
|
|
}
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "Update App Version (Admin - set INACTIVE)",
|
|
"request": {
|
|
"method": "PUT",
|
|
"header": [
|
|
{
|
|
"key": "Content-Type",
|
|
"value": "application/json",
|
|
"type": "text"
|
|
}
|
|
],
|
|
"body": {
|
|
"mode": "raw",
|
|
"raw": "{\n \"status\": \"INACTIVE\"\n}"
|
|
},
|
|
"url": {
|
|
"raw": "{{base_url}}/api/v1/admin/app-versions/{{app_version_id_optional}}",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"v1",
|
|
"admin",
|
|
"app-versions",
|
|
"{{app_version_id_optional}}"
|
|
]
|
|
}
|
|
},
|
|
"response": []
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"name": "02 - Public Mobile Version Check",
|
|
"item": [
|
|
{
|
|
"name": "Check Version - Client up to date",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test(\"Status code is 200\", function () {",
|
|
" pm.response.to.have.status(200);",
|
|
"});",
|
|
"const body = pm.response.json();",
|
|
"pm.test(\"No update available\", function () {",
|
|
" pm.expect(body.data.update_available).to.eql(false);",
|
|
"});"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"auth": {
|
|
"type": "noauth"
|
|
},
|
|
"method": "GET",
|
|
"header": [],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/v1/app/version/check?platform=ANDROID&version_code=15",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"v1",
|
|
"app",
|
|
"version",
|
|
"check"
|
|
],
|
|
"query": [
|
|
{
|
|
"key": "platform",
|
|
"value": "ANDROID"
|
|
},
|
|
{
|
|
"key": "version_code",
|
|
"value": "15"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "Check Version - Update available (optional)",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test(\"Status code is 200\", function () {",
|
|
" pm.response.to.have.status(200);",
|
|
"});",
|
|
"const body = pm.response.json();",
|
|
"pm.test(\"Update available\", function () {",
|
|
" pm.expect(body.data.update_available).to.eql(true);",
|
|
"});"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"auth": {
|
|
"type": "noauth"
|
|
},
|
|
"method": "GET",
|
|
"header": [],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/v1/app/version/check?platform=ANDROID&version_code={{client_version_code}}",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"v1",
|
|
"app",
|
|
"version",
|
|
"check"
|
|
],
|
|
"query": [
|
|
{
|
|
"key": "platform",
|
|
"value": "ANDROID"
|
|
},
|
|
{
|
|
"key": "version_code",
|
|
"value": "{{client_version_code}}"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "Check Version - Force update (below min_supported)",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test(\"Status code is 200\", function () {",
|
|
" pm.response.to.have.status(200);",
|
|
"});",
|
|
"const body = pm.response.json();",
|
|
"pm.test(\"Force update required\", function () {",
|
|
" pm.expect(body.data.force_update).to.eql(true);",
|
|
"});"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"auth": {
|
|
"type": "noauth"
|
|
},
|
|
"method": "GET",
|
|
"header": [],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/v1/app/version/check?platform=ANDROID&version_code=5",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"v1",
|
|
"app",
|
|
"version",
|
|
"check"
|
|
],
|
|
"query": [
|
|
{
|
|
"key": "platform",
|
|
"value": "ANDROID"
|
|
},
|
|
{
|
|
"key": "version_code",
|
|
"value": "5"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "Check Version - iOS",
|
|
"request": {
|
|
"auth": {
|
|
"type": "noauth"
|
|
},
|
|
"method": "GET",
|
|
"header": [],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/v1/app/version/check?platform=IOS&version_code=10",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"v1",
|
|
"app",
|
|
"version",
|
|
"check"
|
|
],
|
|
"query": [
|
|
{
|
|
"key": "platform",
|
|
"value": "IOS"
|
|
},
|
|
{
|
|
"key": "version_code",
|
|
"value": "10"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"response": []
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"name": "03 - Validation & Auth Errors",
|
|
"item": [
|
|
{
|
|
"name": "Create Version Missing platform - Expect 400",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test(\"Status code is 400\", function () {",
|
|
" pm.response.to.have.status(400);",
|
|
"});"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"method": "POST",
|
|
"header": [
|
|
{
|
|
"key": "Content-Type",
|
|
"value": "application/json",
|
|
"type": "text"
|
|
}
|
|
],
|
|
"body": {
|
|
"mode": "raw",
|
|
"raw": "{\n \"version_name\": \"1.0.0\",\n \"version_code\": 1,\n \"update_type\": \"OPTIONAL\"\n}"
|
|
},
|
|
"url": {
|
|
"raw": "{{base_url}}/api/v1/admin/app-versions",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"v1",
|
|
"admin",
|
|
"app-versions"
|
|
]
|
|
}
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "Create Version Invalid update_type - Expect 400",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test(\"Status code is 400\", function () {",
|
|
" pm.response.to.have.status(400);",
|
|
"});"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"method": "POST",
|
|
"header": [
|
|
{
|
|
"key": "Content-Type",
|
|
"value": "application/json",
|
|
"type": "text"
|
|
}
|
|
],
|
|
"body": {
|
|
"mode": "raw",
|
|
"raw": "{\n \"platform\": \"ANDROID\",\n \"version_name\": \"1.0.0\",\n \"version_code\": 1,\n \"update_type\": \"MANDATORY\"\n}"
|
|
},
|
|
"url": {
|
|
"raw": "{{base_url}}/api/v1/admin/app-versions",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"v1",
|
|
"admin",
|
|
"app-versions"
|
|
]
|
|
}
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "Check Version Missing platform - Expect 400",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test(\"Status code is 400\", function () {",
|
|
" pm.response.to.have.status(400);",
|
|
"});"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"auth": {
|
|
"type": "noauth"
|
|
},
|
|
"method": "GET",
|
|
"header": [],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/v1/app/version/check?version_code=10",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"v1",
|
|
"app",
|
|
"version",
|
|
"check"
|
|
],
|
|
"query": [
|
|
{
|
|
"key": "version_code",
|
|
"value": "10"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "Check Version Invalid version_code - Expect 400",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test(\"Status code is 400\", function () {",
|
|
" pm.response.to.have.status(400);",
|
|
"});"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"auth": {
|
|
"type": "noauth"
|
|
},
|
|
"method": "GET",
|
|
"header": [],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/v1/app/version/check?platform=ANDROID&version_code=0",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"v1",
|
|
"app",
|
|
"version",
|
|
"check"
|
|
],
|
|
"query": [
|
|
{
|
|
"key": "platform",
|
|
"value": "ANDROID"
|
|
},
|
|
{
|
|
"key": "version_code",
|
|
"value": "0"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "List Admin Versions Without Auth - Expect 401/403",
|
|
"request": {
|
|
"auth": {
|
|
"type": "noauth"
|
|
},
|
|
"method": "GET",
|
|
"header": [],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/v1/admin/app-versions",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"v1",
|
|
"admin",
|
|
"app-versions"
|
|
]
|
|
}
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "Get Missing App Version (Admin) - Expect 404",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test(\"Status code is 404\", function () {",
|
|
" pm.response.to.have.status(404);",
|
|
"});"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"method": "GET",
|
|
"header": [],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/v1/admin/app-versions/99999999",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"v1",
|
|
"admin",
|
|
"app-versions",
|
|
"99999999"
|
|
]
|
|
}
|
|
},
|
|
"response": []
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"name": "04 - Cleanup",
|
|
"item": [
|
|
{
|
|
"name": "Delete App Version (FORCE/updated)",
|
|
"request": {
|
|
"method": "DELETE",
|
|
"header": [],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/v1/admin/app-versions/{{app_version_id}}",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"v1",
|
|
"admin",
|
|
"app-versions",
|
|
"{{app_version_id}}"
|
|
]
|
|
}
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "Delete App Version (OPTIONAL/inactive)",
|
|
"request": {
|
|
"method": "DELETE",
|
|
"header": [],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/v1/admin/app-versions/{{app_version_id_optional}}",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"v1",
|
|
"admin",
|
|
"app-versions",
|
|
"{{app_version_id_optional}}"
|
|
]
|
|
}
|
|
},
|
|
"response": []
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|