test: add Bruno API collections for sync features
- Add device registration and management API tests - Add conflicts resolution API tests - Add queue management API tests - Add KOReader sync protocol tests - Add Kobo sync protocol tests
This commit is contained in:
@@ -0,0 +1,127 @@
|
||||
meta {
|
||||
name: "Bookmann Conflicts API"
|
||||
type: "collection"
|
||||
environment: {
|
||||
development: {
|
||||
base_url: "http://localhost:8765/api"
|
||||
},
|
||||
production: {
|
||||
base_url: "https://your-domain.com/api"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# List Conflicts
|
||||
@name("List Unresolved Conflicts")
|
||||
GET {{environment.base_url}}/conflicts?status=unresolved
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
@name("List All Conflicts")
|
||||
GET {{environment.base_url}}/conflicts?status=all
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
@name("List Resolved Conflicts")
|
||||
GET {{environment.base_url}}/conflicts?status=resolved
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
@name("List Progress Conflicts")
|
||||
GET {{environment.base_url}}/conflicts?status=unresolved&type=progress
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
@name("List Note Conflicts")
|
||||
GET {{environment.base_url}}/conflicts?status=unresolved&type=note
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
@name("List Highlight Conflicts")
|
||||
GET {{environment.base_url}}/conflicts?status=unresolved&type=highlight
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
# Get Conflict Details
|
||||
@name("Get Conflict Details")
|
||||
GET {{environment.base_url}}/conflicts/{{conflict_id}}
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
# Resolve Conflict
|
||||
@name("Resolve - Keep KOReader Progress")
|
||||
POST {{environment.base_url}}/conflicts/{{conflict_id}}/resolve
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"winner": "koreader",
|
||||
"apply_to_all_future_conflicts": false,
|
||||
"reason": "KOReader was most recently updated"
|
||||
}
|
||||
|
||||
@name("Resolve - Keep Kobo Progress")
|
||||
POST {{environment.base_url}}/conflicts/{{conflict_id}}/resolve
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"winner": "kobo",
|
||||
"apply_to_all_future_conflicts": false,
|
||||
"reason": "Kobo has more progress"
|
||||
}
|
||||
|
||||
@name("Resolve - Keep Web Progress")
|
||||
POST {{environment.base_url}}/conflicts/{{conflict_id}}/resolve
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"winner": "web",
|
||||
"apply_to_all_future_conflicts": false,
|
||||
"reason": "Web interface has most recent data"
|
||||
}
|
||||
|
||||
@name("Resolve - Manual Override")
|
||||
POST {{environment.base_url}}/conflicts/{{conflict_id}}/resolve
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"winner": "manual",
|
||||
"manual_data": {
|
||||
"percentage": 0.43,
|
||||
"epubcfi": "epubcfi(/6/4/2:20)",
|
||||
"chapter": 3
|
||||
},
|
||||
"apply_to_all_future_conflicts": false,
|
||||
"reason": "User specified custom progress"
|
||||
}
|
||||
|
||||
@name("Resolve - Manual Override with Page")
|
||||
POST {{environment.base_url}}/conflicts/{{conflict_id}}/resolve
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"winner": "manual",
|
||||
"manual_data": {
|
||||
"percentage": 0.43,
|
||||
"page": 89,
|
||||
"epubcfi": "epubcfi(/6/4/2:20)"
|
||||
},
|
||||
"apply_to_all_future_conflicts": false,
|
||||
"reason": "User specified page number"
|
||||
}
|
||||
|
||||
@name("Resolve - Apply to All Future Conflicts")
|
||||
POST {{environment.base_url}}/conflicts/{{conflict_id}}/resolve
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"winner": "koreader",
|
||||
"apply_to_all_future_conflicts": true,
|
||||
"reason": "Always prefer KOReader for future conflicts"
|
||||
}
|
||||
|
||||
# Delete Conflict
|
||||
@name("Delete Conflict")
|
||||
DELETE {{environment.base_url}}/conflicts/{{conflict_id}}
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
@name("Dismiss Conflict")
|
||||
DELETE {{environment.base_url}}/conflicts/{{conflict_id}}
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
# Batch Operations
|
||||
@name("Dismiss All Resolved Conflicts")
|
||||
DELETE {{environment.base_url}}/conflicts/dismiss-resolved
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
@@ -0,0 +1,48 @@
|
||||
meta {
|
||||
name: Approve Device Registration
|
||||
type: http
|
||||
seq: 6
|
||||
}
|
||||
|
||||
get {
|
||||
url: {{base_url}}/api/devices/approve/{{registration_id}}
|
||||
body: none
|
||||
auth: bearer
|
||||
}
|
||||
|
||||
headers: {
|
||||
Authorization: Bearer {{token}}
|
||||
}
|
||||
|
||||
docs {
|
||||
## Approve Device Registration
|
||||
|
||||
Approves a pending device registration request.
|
||||
|
||||
**Method:** GET
|
||||
|
||||
**Endpoint:** /api/devices/approve/:registration_id
|
||||
|
||||
**Authentication:** Bearer token
|
||||
|
||||
**Path Parameters:**
|
||||
- `registration_id` (string): Registration request UUID
|
||||
|
||||
**Response:**
|
||||
- Success message with approved device details
|
||||
|
||||
**Status Codes:**
|
||||
- 200: Success
|
||||
- 401: Unauthorized
|
||||
- 404: Registration not found
|
||||
- 400: Invalid registration status
|
||||
|
||||
**Example Response:**
|
||||
```json
|
||||
{
|
||||
"message": "Device registration approved",
|
||||
"device_id": "uuid",
|
||||
"device_name": "My Kobo"
|
||||
}
|
||||
```
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
meta {
|
||||
name: List Pending Device Registrations
|
||||
type: http
|
||||
seq: 5
|
||||
}
|
||||
|
||||
get {
|
||||
url: {{base_url}}/api/devices/pending
|
||||
body: none
|
||||
auth: bearer
|
||||
}
|
||||
|
||||
headers: {
|
||||
Authorization: Bearer {{token}}
|
||||
}
|
||||
|
||||
docs {
|
||||
## List Pending Device Registrations
|
||||
|
||||
Retrieves all pending device registration requests awaiting approval.
|
||||
|
||||
**Method:** GET
|
||||
|
||||
**Endpoint:** /api/devices/pending
|
||||
|
||||
**Authentication:** Bearer token
|
||||
|
||||
**Response:**
|
||||
- Array of pending device registrations
|
||||
|
||||
**Status Codes:**
|
||||
- 200: Success
|
||||
- 401: Unauthorized
|
||||
|
||||
**Example Response:**
|
||||
```json
|
||||
[
|
||||
{
|
||||
"id": "uuid",
|
||||
"device_name": "My Kobo",
|
||||
"device_type": "kobo",
|
||||
"user_id": "uuid",
|
||||
"created_at": "2024-01-01T00:00:00Z"
|
||||
}
|
||||
]
|
||||
```
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
meta {
|
||||
name: Reject Device Registration
|
||||
type: http
|
||||
seq: 7
|
||||
}
|
||||
|
||||
post {
|
||||
url: {{base_url}}/api/devices/reject/{{registration_id}}
|
||||
body: none
|
||||
auth: bearer
|
||||
}
|
||||
|
||||
headers: {
|
||||
Authorization: Bearer {{token}}
|
||||
}
|
||||
|
||||
docs {
|
||||
## Reject Device Registration
|
||||
|
||||
Rejects a pending device registration request.
|
||||
|
||||
**Method:** POST
|
||||
|
||||
**Endpoint:** /api/devices/reject/:registration_id
|
||||
|
||||
**Authentication:** Bearer token
|
||||
|
||||
**Path Parameters:**
|
||||
- `registration_id` (string): Registration request UUID
|
||||
|
||||
**Response:**
|
||||
- Success message confirming rejection
|
||||
|
||||
**Status Codes:**
|
||||
- 200: Success
|
||||
- 401: Unauthorized
|
||||
- 404: Registration not found
|
||||
- 400: Invalid registration status
|
||||
|
||||
**Example Response:**
|
||||
```json
|
||||
{
|
||||
"message": "Device registration rejected",
|
||||
"registration_id": "uuid"
|
||||
}
|
||||
```
|
||||
}
|
||||
@@ -0,0 +1,134 @@
|
||||
meta {
|
||||
name: "Bookmann Device Management API"
|
||||
type: "collection"
|
||||
environment: {
|
||||
development: {
|
||||
base_url: "http://localhost:8765/api"
|
||||
},
|
||||
production: {
|
||||
base_url: "https://your-domain.com/api"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Register Device
|
||||
@name("Register Device")
|
||||
POST {{environment.base_url}}/devices/register
|
||||
Content-Type: application/json
|
||||
{
|
||||
"device_name": "My Kobo Clara",
|
||||
"device_type": "kobo",
|
||||
"device_identifier": "N1234567890123"
|
||||
}
|
||||
|
||||
@name("Register KOReader Device")
|
||||
POST {{environment.base_url}}/devices/register
|
||||
Content-Type: application/json
|
||||
{
|
||||
"device_name": "My Kindle Paperwhite",
|
||||
"device_type": "koreader",
|
||||
"device_identifier": "G090GP123456789"
|
||||
}
|
||||
|
||||
@name("Register Web Device")
|
||||
POST {{environment.base_url}}/devices/register
|
||||
Content-Type: application/json
|
||||
{
|
||||
"device_name": "Chrome Browser",
|
||||
"device_type": "web",
|
||||
"device_identifier": "web-client-abc123"
|
||||
}
|
||||
|
||||
# Check Registration Status
|
||||
@name("Check Pending Registration")
|
||||
POST {{environment.base_url}}/devices/register/status
|
||||
Content-Type: application/json
|
||||
{
|
||||
"registration_id": "registration-uuid-here"
|
||||
}
|
||||
|
||||
@name("Check Approved Registration")
|
||||
POST {{environment.base_url}}/devices/register/status
|
||||
Content-Type: application/json
|
||||
{
|
||||
"registration_id": "registration-uuid-here"
|
||||
}
|
||||
|
||||
# List Devices (requires authentication)
|
||||
@name("List User Devices")
|
||||
GET {{environment.base_url}}/devices
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
@name("Get Device Details")
|
||||
GET {{environment.base_url}}/devices/{{device_id}}
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
# Update Device Settings
|
||||
@name("Update Device Settings")
|
||||
PUT {{environment.base_url}}/devices/{{device_id}}
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"device_name": "Updated Device Name",
|
||||
"sync_enabled": true,
|
||||
"auto_sync": true,
|
||||
"sync_frequency_minutes": 10
|
||||
}
|
||||
|
||||
@name("Disable Device Sync")
|
||||
PUT {{environment.base_url}}/devices/{{device_id}}
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"device_name": "My Kobo Clara",
|
||||
"sync_enabled": false,
|
||||
"auto_sync": false,
|
||||
"sync_frequency_minutes": 30
|
||||
}
|
||||
|
||||
@name("Update Sync Frequency")
|
||||
PUT {{environment.base_url}}/devices/{{device_id}}
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"device_name": "My Kobo Clara",
|
||||
"sync_enabled": true,
|
||||
"auto_sync": true,
|
||||
"sync_frequency_minutes": 15
|
||||
}
|
||||
|
||||
# Delete/Revoke Device
|
||||
@name("Delete Device")
|
||||
DELETE {{environment.base_url}}/devices/{{device_id}}
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
# Get Pending Registrations
|
||||
@name("Get Pending Registrations")
|
||||
GET {{environment.base_url}}/devices/pending
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
# Approve Device Registration
|
||||
@name("Approve Device Registration")
|
||||
GET {{environment.base_url}}/devices/approve/{{registration_id}}
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
@name("Approve Registration - KOReader")
|
||||
GET {{environment.base_url}}/devices/approve/reg-uuid-123
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
@name("Approve Registration - Kobo")
|
||||
GET {{environment.base_url}}/devices/approve/reg-uuid-456
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
# Reject Device Registration
|
||||
@name("Reject Device Registration")
|
||||
POST {{environment.base_url}}/devices/reject/{{registration_id}}
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
@name("Reject Registration - KOReader")
|
||||
POST {{environment.base_url}}/devices/reject/reg-uuid-123
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
@name("Reject Registration - Kobo")
|
||||
POST {{environment.base_url}}/devices/reject/reg-uuid-456
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
@@ -0,0 +1,47 @@
|
||||
meta {
|
||||
name: Clear Device Queue
|
||||
type: http
|
||||
seq: 6
|
||||
}
|
||||
|
||||
delete {
|
||||
url: {{base_url}}/api/queue/devices/{{device_id}}/clear
|
||||
body: none
|
||||
auth: bearer
|
||||
}
|
||||
|
||||
headers: {
|
||||
Authorization: Bearer {{token}}
|
||||
}
|
||||
|
||||
docs {
|
||||
## Clear Device Queue
|
||||
|
||||
Clears all queue items for a specific device.
|
||||
|
||||
**Method:** DELETE
|
||||
|
||||
**Endpoint:** /api/queue/devices/:device_id/clear
|
||||
|
||||
**Authentication:** Bearer token
|
||||
|
||||
**Path Parameters:**
|
||||
- `device_id` (string): Device UUID
|
||||
|
||||
**Response:**
|
||||
- Success message with count of cleared items
|
||||
|
||||
**Status Codes:**
|
||||
- 200: Success
|
||||
- 401: Unauthorized
|
||||
- 404: Device not found
|
||||
|
||||
**Example Response:**
|
||||
```json
|
||||
{
|
||||
"message": "Queue cleared",
|
||||
"device_id": "uuid",
|
||||
"cleared_count": 10
|
||||
}
|
||||
```
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
meta {
|
||||
name: Delete Queue Item
|
||||
type: http
|
||||
seq: 5
|
||||
}
|
||||
|
||||
delete {
|
||||
url: {{base_url}}/api/queue/items/{{item_id}}
|
||||
body: none
|
||||
auth: bearer
|
||||
}
|
||||
|
||||
headers: {
|
||||
Authorization: Bearer {{token}}
|
||||
}
|
||||
|
||||
docs {
|
||||
## Delete Queue Item
|
||||
|
||||
Deletes a queue item from the sync queue.
|
||||
|
||||
**Method:** DELETE
|
||||
|
||||
**Endpoint:** /api/queue/items/:item_id
|
||||
|
||||
**Authentication:** Bearer token
|
||||
|
||||
**Path Parameters:**
|
||||
- `item_id` (string): Queue item UUID
|
||||
|
||||
**Response:**
|
||||
- Success message confirming deletion
|
||||
|
||||
**Status Codes:**
|
||||
- 200: Success
|
||||
- 401: Unauthorized
|
||||
- 404: Queue item not found
|
||||
|
||||
**Example Response:**
|
||||
```json
|
||||
{
|
||||
"message": "Queue item deleted",
|
||||
"item_id": "uuid"
|
||||
}
|
||||
```
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
meta {
|
||||
name: Get Device Queue Stats
|
||||
type: http
|
||||
seq: 2
|
||||
}
|
||||
|
||||
get {
|
||||
url: {{base_url}}/api/queue/devices/{{device_id}}/stats
|
||||
body: none
|
||||
auth: bearer
|
||||
}
|
||||
|
||||
headers: {
|
||||
Authorization: Bearer {{token}}
|
||||
}
|
||||
|
||||
docs {
|
||||
## Get Device Queue Stats
|
||||
|
||||
Retrieves statistics for a specific device's sync queue.
|
||||
|
||||
**Method:** GET
|
||||
|
||||
**Endpoint:** /api/queue/devices/:device_id/stats
|
||||
|
||||
**Authentication:** Bearer token
|
||||
|
||||
**Path Parameters:**
|
||||
- `device_id` (string): Device UUID
|
||||
|
||||
**Response:**
|
||||
- Queue statistics including pending, completed, and failed counts
|
||||
|
||||
**Status Codes:**
|
||||
- 200: Success
|
||||
- 401: Unauthorized
|
||||
- 404: Device not found
|
||||
|
||||
**Example Response:**
|
||||
```json
|
||||
{
|
||||
"device_id": "uuid",
|
||||
"total_items": 10,
|
||||
"pending": 3,
|
||||
"completed": 5,
|
||||
"failed": 2
|
||||
}
|
||||
```
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
meta {
|
||||
name: List All Queue Items (Admin)
|
||||
type: http
|
||||
seq: 1
|
||||
}
|
||||
|
||||
get {
|
||||
url: {{base_url}}/api/queue/items
|
||||
body: none
|
||||
auth: bearer
|
||||
}
|
||||
|
||||
headers: {
|
||||
Authorization: Bearer {{token}}
|
||||
}
|
||||
|
||||
docs {
|
||||
## List All Queue Items (Admin)
|
||||
|
||||
Retrieves all queue items across all devices (admin only).
|
||||
|
||||
**Method:** GET
|
||||
|
||||
**Endpoint:** /api/queue/items
|
||||
|
||||
**Authentication:** Bearer token (admin role required)
|
||||
|
||||
**Response:**
|
||||
- Array of queue items with device and status information
|
||||
|
||||
**Status Codes:**
|
||||
- 200: Success
|
||||
- 401: Unauthorized
|
||||
- 403: Forbidden - admin role required
|
||||
|
||||
**Example Response:**
|
||||
```json
|
||||
[
|
||||
{
|
||||
"id": "uuid",
|
||||
"device_id": "uuid",
|
||||
"item_type": "progress",
|
||||
"status": "pending",
|
||||
"created_at": "2024-01-01T00:00:00Z"
|
||||
}
|
||||
]
|
||||
```
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
meta {
|
||||
name: List Device Queue Items
|
||||
type: http
|
||||
seq: 3
|
||||
}
|
||||
|
||||
get {
|
||||
url: {{base_url}}/api/queue/devices/{{device_id}}/items
|
||||
body: none
|
||||
auth: bearer
|
||||
}
|
||||
|
||||
headers: {
|
||||
Authorization: Bearer {{token}}
|
||||
}
|
||||
|
||||
docs {
|
||||
## List Device Queue Items
|
||||
|
||||
Retrieves all queue items for a specific device.
|
||||
|
||||
**Method:** GET
|
||||
|
||||
**Endpoint:** /api/queue/devices/:device_id/items
|
||||
|
||||
**Authentication:** Bearer token
|
||||
|
||||
**Path Parameters:**
|
||||
- `device_id` (string): Device UUID
|
||||
|
||||
**Response:**
|
||||
- Array of queue items for the specified device
|
||||
|
||||
**Status Codes:**
|
||||
- 200: Success
|
||||
- 401: Unauthorized
|
||||
- 404: Device not found
|
||||
|
||||
**Example Response:**
|
||||
```json
|
||||
[
|
||||
{
|
||||
"id": "uuid",
|
||||
"device_id": "uuid",
|
||||
"item_type": "progress",
|
||||
"status": "pending",
|
||||
"data": {},
|
||||
"created_at": "2024-01-01T00:00:00Z",
|
||||
"updated_at": "2024-01-01T00:00:00Z"
|
||||
}
|
||||
]
|
||||
```
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
meta {
|
||||
name: Retry Queue Item
|
||||
type: http
|
||||
seq: 4
|
||||
}
|
||||
|
||||
post {
|
||||
url: {{base_url}}/api/queue/items/{{item_id}}/retry
|
||||
body: none
|
||||
auth: bearer
|
||||
}
|
||||
|
||||
headers: {
|
||||
Authorization: Bearer {{token}}
|
||||
}
|
||||
|
||||
docs {
|
||||
## Retry Queue Item
|
||||
|
||||
Retries a failed queue item.
|
||||
|
||||
**Method:** POST
|
||||
|
||||
**Endpoint:** /api/queue/items/:item_id/retry
|
||||
|
||||
**Authentication:** Bearer token
|
||||
|
||||
**Path Parameters:**
|
||||
- `item_id` (string): Queue item UUID
|
||||
|
||||
**Response:**
|
||||
- Success message indicating retry initiated
|
||||
|
||||
**Status Codes:**
|
||||
- 200: Success
|
||||
- 401: Unauthorized
|
||||
- 404: Queue item not found
|
||||
- 400: Invalid item status
|
||||
|
||||
**Example Response:**
|
||||
```json
|
||||
{
|
||||
"message": "Queue item retry initiated",
|
||||
"item_id": "uuid"
|
||||
}
|
||||
```
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
meta {
|
||||
name: "Bookmann Sync Queue API"
|
||||
type: "collection"
|
||||
environment: {
|
||||
development: {
|
||||
base_url: "http://localhost:8765/api"
|
||||
},
|
||||
production: {
|
||||
base_url: "https://your-domain.com/api"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# List Queue Items
|
||||
@name("List All Queue Items")
|
||||
GET {{environment.base_url}}/queue/items
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
@name("List Queue Items - With Pagination")
|
||||
GET {{environment.base_url}}/queue/items?limit=50&offset=0
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
@name("Filter by Status - Pending")
|
||||
GET {{environment.base_url}}/queue/items?status=pending
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
@name("Filter by Status - Failed")
|
||||
GET {{environment.base_url}}/queue/items?status=failed
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
@name("Filter by Status - Completed")
|
||||
GET {{environment.base_url}}/queue/items?status=completed
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
@name("Filter by Type - Progress")
|
||||
GET {{environment.base_url}}/queue/items?status=all&type=progress
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
@name("Filter by Type - Notes")
|
||||
GET {{environment.base_url}}/queue/items?status=all&type=note
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
@name("Filter by Type - Highlights")
|
||||
GET {{environment.base_url}}/queue/items?status=all&type=highlight
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
@name("Filter by Type - Bookmarks")
|
||||
GET {{environment.base_url}}/queue/items?status=all&type=bookmark
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
# Process Queue Item
|
||||
@name("Process Queue Item")
|
||||
POST {{environment.base_url}}/queue/items/{{queue_item_id}}/process
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
@name("Retry Queue Item")
|
||||
POST {{environment.base_url}}/queue/items/{{queue_item_id}}/retry
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
# Delete Queue Item
|
||||
@name("Delete Queue Item")
|
||||
DELETE {{environment.base_url}}/queue/items/{{queue_item_id}}
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
# Clear All Queue
|
||||
@name("Clear All Queue Items")
|
||||
DELETE {{environment.base_url}}/queue/clear
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
@name("Clear Failed Items")
|
||||
DELETE {{environment.base_url}}/queue/clear-failed
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
# Get Queue Stats
|
||||
@name("Get Queue Statistics")
|
||||
GET {{environment.base_url}}/queue/stats
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
@name("Get Device Queue Stats")
|
||||
GET {{environment.base_url}}/queue/devices/{{device_id}}/stats
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
|
||||
@name("Get Device Queue Items")
|
||||
GET {{environment.base_url}}/queue/devices/{{device_id}}/items
|
||||
Authorization: Bearer {{jwt_token}}
|
||||
@@ -0,0 +1,230 @@
|
||||
meta {
|
||||
name: "Bookmann Kobo Sync API"
|
||||
type: "collection"
|
||||
environment: {
|
||||
development: {
|
||||
base_url: "http://localhost:8765/api"
|
||||
},
|
||||
production: {
|
||||
base_url: "https://your-domain.com/api"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Authentication Headers
|
||||
@name("Kobo Device Token")
|
||||
@AuthorizationHeader({
|
||||
name: "Authorization",
|
||||
value: "Bearer {{kobo_device_token}}"
|
||||
})
|
||||
{
|
||||
"token": "{{kobo_device_token}}"
|
||||
}
|
||||
|
||||
@name("Kobo Device Info Header")
|
||||
@Request({
|
||||
name: "x-kobo-device",
|
||||
value: '{"DeviceId":"{{kobo_device_id}}","Model":"Kobo Clara","SerialNumber":"{{kobo_serial}}"}'
|
||||
})
|
||||
{
|
||||
"test": "data"
|
||||
}
|
||||
|
||||
# Sync Markup (Reading Progress + Annotations)
|
||||
@name("Sync Reading Progress")
|
||||
POST {{environment.base_url}}/sync/kobo/markup
|
||||
Authorization: Bearer {{kobo_device_token}}
|
||||
x-kobo-device: {"DeviceId":"{{kobo_device_id}}","Model":"Kobo Clara"}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"ReadingSync": [
|
||||
{
|
||||
"ContentId": "book-uuid-here",
|
||||
"PercentRead": 45.6,
|
||||
"EntitlementId": "entitlement-id-here",
|
||||
"RemainingTimeMinutes": 120,
|
||||
"FirstReadTime": "2026-01-25T10:00:00Z",
|
||||
"LastModified": "2026-01-30T20:00:00Z"
|
||||
}
|
||||
],
|
||||
"BookmarkSync": []
|
||||
}
|
||||
|
||||
@name("Sync Progress with Bookmarks")
|
||||
POST {{environment.base_url}}/sync/kobo/markup
|
||||
Authorization: Bearer {{kobo_device_token}}
|
||||
x-kobo-device: {"DeviceId":"{{kobo_device_id}}","Model":"Kobo Clara"}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"ReadingSync": [
|
||||
{
|
||||
"ContentId": "book-uuid",
|
||||
"PercentRead": 42.3,
|
||||
"EntitlementId": "entitlement-id",
|
||||
"RemainingTimeMinutes": 138,
|
||||
"FirstReadTime": "2026-01-25T10:00:00Z",
|
||||
"LastModified": "2026-01-30T20:00:00Z"
|
||||
}
|
||||
],
|
||||
"BookmarkSync": [
|
||||
{
|
||||
"ContentId": "book-uuid",
|
||||
"BookmarkText": "highlighted text passage",
|
||||
"BookmarkType": "annotation",
|
||||
"BookmarkTitle": "Chapter 3"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@name("Sync Multiple Books Progress")
|
||||
POST {{environment.base_url}}/sync/kobo/markup
|
||||
Authorization: Bearer {{kobo_device_token}}
|
||||
x-kobo-device: {"DeviceId":"{{kobo_device_id}}","Model":"Kobo Aura"}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"ReadingSync": [
|
||||
{
|
||||
"ContentId": "book-1-uuid",
|
||||
"PercentRead": 25.0,
|
||||
"EntitlementId": "entitlement-1",
|
||||
"RemainingTimeMinutes": 240,
|
||||
"FirstReadTime": "2026-01-25T10:00:00Z",
|
||||
"LastModified": "2026-01-30T18:00:00Z"
|
||||
},
|
||||
{
|
||||
"ContentId": "book-2-uuid",
|
||||
"PercentRead": 78.5,
|
||||
"EntitlementId": "entitlement-2",
|
||||
"RemainingTimeMinutes": 45,
|
||||
"FirstReadTime": "2026-01-25T14:00:00Z",
|
||||
"LastModified": "2026-01-30T20:00:00Z"
|
||||
}
|
||||
],
|
||||
"BookmarkSync": []
|
||||
}
|
||||
|
||||
@name("Sync with Annotations")
|
||||
POST {{environment.base_url}}/sync/kobo/markup
|
||||
Authorization: Bearer {{kobo_device_token}}
|
||||
x-kobo-device: {"DeviceId":"{{kobo_device_id}}","Model":"Kobo Libra"}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"ReadingSync": [
|
||||
{
|
||||
"ContentId": "book-uuid",
|
||||
"PercentRead": 55.0,
|
||||
"EntitlementId": "entitlement-id",
|
||||
"RemainingTimeMinutes": 120,
|
||||
"FirstReadTime": "2026-01-25T10:00:00Z",
|
||||
"LastModified": "2026-01-30T20:00:00Z"
|
||||
}
|
||||
],
|
||||
"BookmarkSync": [
|
||||
{
|
||||
"ContentId": "book-uuid",
|
||||
"BookmarkText": "Important quote",
|
||||
"BookmarkType": "annotation",
|
||||
"BookmarkTitle": "Chapter 4 - The Truth"
|
||||
},
|
||||
{
|
||||
"ContentId": "book-uuid",
|
||||
"BookmarkText": "Another quote",
|
||||
"BookmarkType": "annotation",
|
||||
"BookmarkTitle": "Chapter 5"
|
||||
},
|
||||
{
|
||||
"ContentId": "book-uuid",
|
||||
"BookmarkText": "Note to myself",
|
||||
"BookmarkType": "note",
|
||||
"BookmarkTitle": "Personal note"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
# Sync Bookmark
|
||||
@name("Sync Single Bookmark")
|
||||
POST {{environment.base_url}}/sync/kobo/bookmark
|
||||
Authorization: Bearer {{kobo_device_token}}
|
||||
x-kobo-device: {"DeviceId":"{{kobo_device_id}}","Model":"Kobo Clara"}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"ContentId": "book-uuid",
|
||||
"BookmarkText": "Bookmarked passage",
|
||||
"BookmarkType": "annotation",
|
||||
"BookmarkTitle": "Chapter 3"
|
||||
}
|
||||
|
||||
# Get Library
|
||||
@name("Get Kobo Library")
|
||||
GET {{environment.base_url}}/sync/kobo/library
|
||||
Authorization: Bearer {{kobo_device_token}}
|
||||
|
||||
@name("Get Library for Book")
|
||||
GET {{environment.base_url}}/sync/kobo/library
|
||||
Authorization: Bearer {{kobo_device_token}}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"ContentId": "book-uuid"
|
||||
}
|
||||
|
||||
# Analytics Get Tests
|
||||
@name("Get Analytics Tests")
|
||||
POST {{environment.base_url}}/sync/kobo/v1/analytics/gettests
|
||||
Authorization: Bearer {{kobo_device_token}}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"platform": "android"
|
||||
"firmware_version": "4.30.19023"
|
||||
}
|
||||
|
||||
# Initialization
|
||||
@name("Kobo Initialization")
|
||||
GET {{environment.base_url}}/sync/kobo/v1/initialization
|
||||
Authorization: Bearer {{kobo_device_token}}
|
||||
|
||||
@name("Initialization with Device Info")
|
||||
GET {{environment.base_url}}/sync/kobo/v1/initialization?Platform=android&FirmwareVersion=4.30.19023
|
||||
Authorization: Bearer {{kobo_device_token}}
|
||||
|
||||
# Sync from Server
|
||||
@name("Sync Books from Server to Kobo")
|
||||
POST {{environment.base_url}}/sync/kobo/sync-from-server
|
||||
Authorization: Bearer {{kobo_device_token}}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"force_sync": true,
|
||||
"books": ["book-uuid-1", "book-uuid-2"]
|
||||
}
|
||||
|
||||
@name("Sync Specific Book from Server")
|
||||
POST {{environment.base_url}}/sync/kobo/sync-from-server
|
||||
Authorization: Bearer {{kobo_device_token}}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"ContentId": "book-uuid",
|
||||
"EntitlementId": "entitlement-id"
|
||||
}
|
||||
|
||||
@name("Partial Sync - Since Date")
|
||||
POST {{environment.base_url}}/sync/kobo/sync-from-server
|
||||
Authorization: Bearer {{kobo_device_token}}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"books": ["book-1", "book-2"],
|
||||
"sync_options": {
|
||||
"since_date": "2026-01-30T00:00:00Z",
|
||||
"include_annotations": true
|
||||
}
|
||||
}
|
||||
|
||||
@name("Sync with Conflict Resolution Preference")
|
||||
POST {{environment.base_url}}/sync/kobo/sync-from-server
|
||||
Authorization: Bearer {{kobo_device_token}}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"books": ["book-1", "book-2", "book-3"],
|
||||
"sync_options": {
|
||||
"conflict_resolution": "most_recent",
|
||||
"force_annotations": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,276 @@
|
||||
meta {
|
||||
name: "Bookmann KOReader Sync API"
|
||||
type: "collection"
|
||||
environment: {
|
||||
development: {
|
||||
base_url: "http://localhost:8765/api"
|
||||
},
|
||||
production: {
|
||||
base_url: "https://your-domain.com/api"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Authentication Headers
|
||||
@name("KOReader Device Token")
|
||||
@AuthorizationHeader({
|
||||
name: "Authorization",
|
||||
value: "Bearer {{koreader_device_token}}"
|
||||
})
|
||||
{
|
||||
"token": "{{koreader_device_token}}"
|
||||
}
|
||||
|
||||
# Sync Progress
|
||||
@name("Sync Progress - Single Book")
|
||||
POST {{environment.base_url}}/sync/koreader/progress
|
||||
Authorization: Bearer {{koreader_device_token}}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"library_id": "optional-library-uuid",
|
||||
"books": [
|
||||
{
|
||||
"uuid": "book-uuid-here",
|
||||
"title": "Book Title",
|
||||
"authors": ["Author Name"],
|
||||
"progress": 0.45,
|
||||
"percentage": 0.45,
|
||||
"last_read": "2026-01-30T20:00:00Z",
|
||||
"chapter": 3,
|
||||
"epubcfi": "epubcfi(/6/4/2:15)",
|
||||
"character": 15432
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@name("Sync Progress - Multiple Books")
|
||||
POST {{environment.base_url}}/sync/koreader/progress
|
||||
Authorization: Bearer {{koreader_device_token}}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"library_id": "optional-library-uuid",
|
||||
"books": [
|
||||
{
|
||||
"uuid": "book-1-uuid",
|
||||
"title": "Book One",
|
||||
"authors": ["Author One"],
|
||||
"progress": 0.25,
|
||||
"percentage": 0.25,
|
||||
"last_read": "2026-01-30T19:00:00Z",
|
||||
"chapter": 1,
|
||||
"epubcfi": "epubcfi(/6/4/2:10)"
|
||||
},
|
||||
{
|
||||
"uuid": "book-2-uuid",
|
||||
"title": "Book Two",
|
||||
"authors": ["Author Two"],
|
||||
"progress": 0.75,
|
||||
"percentage": 0.75,
|
||||
"last_read": "2026-01-30T20:00:00Z",
|
||||
"chapter": 8,
|
||||
"epubcfi": "epubcfi(/6/4/2:50)"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@name("Sync Progress - With Bookmarks")
|
||||
POST {{environment.base_url}}/sync/koreader/progress
|
||||
Authorization: Bearer {{koreader_device_token}}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"library_id": "optional-library-uuid",
|
||||
"books": [
|
||||
{
|
||||
"uuid": "book-uuid-here",
|
||||
"title": "Book Title",
|
||||
"authors": ["Author Name"],
|
||||
"progress": 0.45,
|
||||
"percentage": 0.45,
|
||||
"last_read": "2026-01-30T20:00:00Z",
|
||||
"bookmarks": [
|
||||
{
|
||||
"chapter": 3,
|
||||
"datetime": "2026-01-30T19:55:00Z",
|
||||
"notes": "highlighted text",
|
||||
"pos0": "epubcfi(/6/4/2:15)",
|
||||
"pos1": "epubcfi(/6/4/2:20)",
|
||||
"page": 45,
|
||||
"text": "highlighted text excerpt",
|
||||
"type": "highlight"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@name("Sync Progress - With Highlights and Notes")
|
||||
POST {{environment.base_url}}/sync/koreader/progress
|
||||
Authorization: Bearer {{koreader_device_token}}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"library_id": "optional-library-uuid",
|
||||
"books": [
|
||||
{
|
||||
"uuid": "book-uuid-here",
|
||||
"title": "Book Title",
|
||||
"authors": ["Author Name"],
|
||||
"progress": 0.60,
|
||||
"percentage": 0.60,
|
||||
"last_read": "2026-01-30T20:00:00Z",
|
||||
"highlights": [
|
||||
{
|
||||
"datetime": "2026-01-30T19:50:00Z",
|
||||
"text": "Important passage",
|
||||
"chapter": 4,
|
||||
"pos0": "epubcfi(/6/4/2:20)",
|
||||
"pos1": "epubcfi(/6/4/2:30)",
|
||||
"page_start": 78,
|
||||
"page_end": 79
|
||||
}
|
||||
],
|
||||
"notes": [
|
||||
{
|
||||
"datetime": "2026-01-30T19:52:00Z",
|
||||
"text": "My note about this chapter",
|
||||
"chapter": 4
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
# Get Metadata
|
||||
@name("Get Book Metadata")
|
||||
GET {{environment.base_url}}/sync/koreader/metadata/{{book_uuid}}
|
||||
Authorization: Bearer {{koreader_device_token}}
|
||||
|
||||
@name("Get Metadata for Multiple Books")
|
||||
GET {{environment.base_url}}/sync/koreader/metadata
|
||||
Authorization: Bearer {{koreader_device_token}}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"books": ["book-uuid-1", "book-uuid-2", "book-uuid-3"]
|
||||
}
|
||||
|
||||
# Sync Bookmarks
|
||||
@name("Sync Bookmarks")
|
||||
POST {{environment.base_url}}/sync/koreader/bookmarks
|
||||
Authorization: Bearer {{koreader_device_token}}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"library_id": "optional-library-uuid",
|
||||
"books": [
|
||||
{
|
||||
"uuid": "book-uuid",
|
||||
"bookmarks": [
|
||||
{
|
||||
"chapter": 3,
|
||||
"datetime": "2026-01-30T19:55:00Z",
|
||||
"notes": "Marked this chapter as important",
|
||||
"pos0": "epubcfi(/6/4/2:15)",
|
||||
"pos1": "epubcfi(/6/4/2:20)",
|
||||
"page": 45,
|
||||
"text": "Important passage",
|
||||
"type": "bookmark"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@name("Sync Highlights")
|
||||
POST {{environment.base_url}}/sync/koreader/highlights
|
||||
Authorization: Bearer {{koreader_device_token}}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"library_id": "optional-library-uuid",
|
||||
"books": [
|
||||
{
|
||||
"uuid": "book-uuid",
|
||||
"highlights": [
|
||||
{
|
||||
"datetime": "2026-01-30T19:50:00Z",
|
||||
"text": "Important quote from book",
|
||||
"chapter": 4,
|
||||
"pos0": "epubcfi(/6/4/2:20)",
|
||||
"pos1": "epubcfi(/6/4/2:30)",
|
||||
"page_start": 78,
|
||||
"page_end": 79
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@name("Sync Notes")
|
||||
POST {{environment.base_url}}/sync/koreader/notes
|
||||
Authorization: Bearer {{koreader_device_token}}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"library_id": "optional-library-uuid",
|
||||
"books": [
|
||||
{
|
||||
"uuid": "book-uuid",
|
||||
"notes": [
|
||||
{
|
||||
"datetime": "2026-01-30T19:52:00Z",
|
||||
"text": "My personal note about this chapter",
|
||||
"chapter": 4
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
# Get Library
|
||||
@name("Get User Library for KOReader")
|
||||
GET {{environment.base_url}}/sync/koreader/library
|
||||
Authorization: Bearer {{koreader_device_token}}
|
||||
|
||||
@name("Get Library for Specific Book")
|
||||
GET {{environment.base_url}}/sync/koreader/library
|
||||
Authorization: Bearer {{koreader_device_token}}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"books": ["book-uuid-1", "book-uuid-2"]
|
||||
}
|
||||
|
||||
# Immediate Sync Mode
|
||||
@name("Immediate Sync - Page Turn")
|
||||
POST {{environment.base_url}}/sync/koreader/progress
|
||||
Authorization: Bearer {{koreader_device_token}}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"sync_mode": "immediate",
|
||||
"books": [
|
||||
{
|
||||
"uuid": "book-uuid",
|
||||
"percentage": 0.45678,
|
||||
"chapter": 3,
|
||||
"timestamp": "2026-01-30T20:00:00Z"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
# Checkpoint Sync Mode
|
||||
@name("Checkpoint Sync")
|
||||
POST {{environment.base_url}}/sync/koreader/progress
|
||||
Authorization: Bearer {{koreader_device_token}}
|
||||
Content-Type: application/json
|
||||
{
|
||||
"sync_mode": "checkpoint",
|
||||
"checkpoint_id": "checkpoint-uuid",
|
||||
"since_timestamp": "2026-01-30T19:00:00Z",
|
||||
"books": [
|
||||
{
|
||||
"uuid": "book-uuid-1",
|
||||
"percentage": 0.45,
|
||||
"chapter": 3
|
||||
},
|
||||
{
|
||||
"uuid": "book-uuid-2",
|
||||
"percentage": 0.75,
|
||||
"chapter": 8
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user