feat: add comprehensive Bruno API tests for annotations
- Add complete Bruno collection for notes API (5 endpoints) - Add complete Bruno collection for highlights API (5 endpoints) - Include detailed request/response documentation - Add proper validation examples and error cases - Support both media-items and ebook endpoint testing - Add environment variable support for dynamic IDs
This commit is contained in:
@@ -0,0 +1,21 @@
|
|||||||
|
meta {
|
||||||
|
name: Get Dashboard Page
|
||||||
|
type: http,
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url: "/dashboard"
|
||||||
|
headers: {
|
||||||
|
Authorization: "Bearer {{ _.token }}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tests: {
|
||||||
|
test_dashboard_success: {
|
||||||
|
status: 200,
|
||||||
|
headers: {
|
||||||
|
"content-type": "text/html; charset=UTF-8"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
meta {
|
||||||
|
name: Create Media Highlight
|
||||||
|
type: http
|
||||||
|
seq: 2
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{base_url}}/api/media-items/{{media_item_id}}/highlights
|
||||||
|
body: json
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
body:json {
|
||||||
|
{
|
||||||
|
"selection_text": "This is the highlighted text from the media item.",
|
||||||
|
"start_position": "page:45:offset:120",
|
||||||
|
"end_position": "page:45:offset:145",
|
||||||
|
"color": "#ffff00",
|
||||||
|
"note_id": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
script:post-response {
|
||||||
|
onResponse(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
docs {
|
||||||
|
## Create Media Highlight
|
||||||
|
|
||||||
|
Creates a new highlight for a specific media item.
|
||||||
|
|
||||||
|
**Method:** POST
|
||||||
|
|
||||||
|
**Endpoint:** /api/media-items/:id/highlights
|
||||||
|
|
||||||
|
**Path Parameters:**
|
||||||
|
- `id` (string): Media item ID
|
||||||
|
|
||||||
|
**Request Body:**
|
||||||
|
- `selection_text` (string): Highlighted text (required, 1-5000 chars)
|
||||||
|
- `start_position` (string): Start position (required, max 100 chars)
|
||||||
|
- `end_position` (string): End position (required, max 100 chars)
|
||||||
|
- `color` (string): Highlight color in hex format (optional, default #ffff00)
|
||||||
|
- `note_id` (string): Optional associated note ID
|
||||||
|
|
||||||
|
**Response:**
|
||||||
|
- Highlight object with all fields including generated ID and timestamps
|
||||||
|
|
||||||
|
**Status Codes:**
|
||||||
|
- 201: Created
|
||||||
|
- 400: Invalid request
|
||||||
|
- 401: Unauthorized
|
||||||
|
- 404: Media item not found
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
meta {
|
||||||
|
name: Delete Media Highlight
|
||||||
|
type: http
|
||||||
|
seq: 5
|
||||||
|
}
|
||||||
|
|
||||||
|
delete {
|
||||||
|
url: {{base_url}}/api/media-items/{{media_item_id}}/highlights/{{highlight_id}}
|
||||||
|
body: none
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
script:post-response {
|
||||||
|
onResponse(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
docs {
|
||||||
|
## Delete Media Highlight
|
||||||
|
|
||||||
|
Deletes a specific highlight.
|
||||||
|
|
||||||
|
**Method:** DELETE
|
||||||
|
|
||||||
|
**Endpoint:** /api/media-items/:id/highlights/:highlightId
|
||||||
|
|
||||||
|
**Path Parameters:**
|
||||||
|
- `id` (string): Media item ID
|
||||||
|
- `highlightId` (string): Highlight ID
|
||||||
|
|
||||||
|
**Response:**
|
||||||
|
- 204 No Content on success
|
||||||
|
|
||||||
|
**Status Codes:**
|
||||||
|
- 204: Success
|
||||||
|
- 401: Unauthorized
|
||||||
|
- 404: Highlight not found
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
meta {
|
||||||
|
name: Get Media Highlights
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url: {{base_url}}/api/media-items/{{media_item_id}}/highlights
|
||||||
|
body: none
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
script:post-response {
|
||||||
|
onResponse(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
docs {
|
||||||
|
## Get Media Highlights
|
||||||
|
|
||||||
|
Retrieves all highlights for a specific media item for the authenticated user.
|
||||||
|
|
||||||
|
**Method:** GET
|
||||||
|
|
||||||
|
**Endpoint:** /api/media-items/:id/highlights
|
||||||
|
|
||||||
|
**Path Parameters:**
|
||||||
|
- `id` (string): Media item ID
|
||||||
|
|
||||||
|
**Response:**
|
||||||
|
- Array of highlight objects with fields:
|
||||||
|
- `id` (string): Highlight ID
|
||||||
|
- `media_item_id` (string): Media item ID
|
||||||
|
- `user_id` (string): User ID
|
||||||
|
- `selection_text` (string): Highlighted text
|
||||||
|
- `start_position` (string): Start position
|
||||||
|
- `end_position` (string): End position
|
||||||
|
- `color` (string): Highlight color (hex)
|
||||||
|
- `note_id` (string): Optional associated note ID
|
||||||
|
- `created_at` (string): Creation timestamp
|
||||||
|
- `updated_at` (string): Last update timestamp
|
||||||
|
|
||||||
|
**Status Codes:**
|
||||||
|
- 200: Success
|
||||||
|
- 401: Unauthorized
|
||||||
|
- 404: Media item not found
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
meta {
|
||||||
|
name: Get Single Media Highlight
|
||||||
|
type: http
|
||||||
|
seq: 3
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url: {{base_url}}/api/media-items/{{media_item_id}}/highlights/{{highlight_id}}
|
||||||
|
body: none
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
script:post-response {
|
||||||
|
onResponse(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
docs {
|
||||||
|
## Get Single Media Highlight
|
||||||
|
|
||||||
|
Retrieves a specific highlight by ID.
|
||||||
|
|
||||||
|
**Method:** GET
|
||||||
|
|
||||||
|
**Endpoint:** /api/media-items/:id/highlights/:highlightId
|
||||||
|
|
||||||
|
**Path Parameters:**
|
||||||
|
- `id` (string): Media item ID
|
||||||
|
- `highlightId` (string): Highlight ID
|
||||||
|
|
||||||
|
**Response:**
|
||||||
|
- Highlight object with all fields
|
||||||
|
|
||||||
|
**Status Codes:**
|
||||||
|
- 200: Success
|
||||||
|
- 401: Unauthorized
|
||||||
|
- 404: Highlight not found
|
||||||
|
}
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
meta {
|
||||||
|
name: Update Media Highlight
|
||||||
|
type: http
|
||||||
|
seq: 4
|
||||||
|
}
|
||||||
|
|
||||||
|
put {
|
||||||
|
url: {{base_url}}/api/media-items/{{media_item_id}}/highlights/{{highlight_id}}
|
||||||
|
body: json
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
body:json {
|
||||||
|
{
|
||||||
|
"selection_text": "This is the updated highlighted text.",
|
||||||
|
"start_position": "page:45:offset:125",
|
||||||
|
"end_position": "page:45:offset:150",
|
||||||
|
"color": "#ffeb3b",
|
||||||
|
"note_id": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
script:post-response {
|
||||||
|
onResponse(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
docs {
|
||||||
|
## Update Media Highlight
|
||||||
|
|
||||||
|
Updates an existing highlight.
|
||||||
|
|
||||||
|
**Method:** PUT
|
||||||
|
|
||||||
|
**Endpoint:** /api/media-items/:id/highlights/:highlightId
|
||||||
|
|
||||||
|
**Path Parameters:**
|
||||||
|
- `id` (string): Media item ID
|
||||||
|
- `highlightId` (string): Highlight ID
|
||||||
|
|
||||||
|
**Request Body:**
|
||||||
|
- `selection_text` (string): Updated highlighted text (required, 1-5000 chars)
|
||||||
|
- `start_position` (string): Updated start position (required, max 100 chars)
|
||||||
|
- `end_position` (string): Updated end position (required, max 100 chars)
|
||||||
|
- `color` (string): Updated highlight color in hex format (optional)
|
||||||
|
- `note_id` (string): Updated associated note ID (optional)
|
||||||
|
|
||||||
|
**Response:**
|
||||||
|
- Updated highlight object with all fields
|
||||||
|
|
||||||
|
**Status Codes:**
|
||||||
|
- 200: Success
|
||||||
|
- 400: Invalid request
|
||||||
|
- 401: Unauthorized
|
||||||
|
- 404: Highlight not found
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
meta {
|
||||||
|
name: Create Media Note
|
||||||
|
type: http
|
||||||
|
seq: 2
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{base_url}}/api/media-items/{{media_item_id}}/notes
|
||||||
|
body: json
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
body:json {
|
||||||
|
{
|
||||||
|
"content": "This is a test note about this media item.",
|
||||||
|
"position": "page:45"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
script:post-response {
|
||||||
|
onResponse(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
docs {
|
||||||
|
## Create Media Note
|
||||||
|
|
||||||
|
Creates a new note for a specific media item.
|
||||||
|
|
||||||
|
**Method:** POST
|
||||||
|
|
||||||
|
**Endpoint:** /api/media-items/:id/notes
|
||||||
|
|
||||||
|
**Path Parameters:**
|
||||||
|
- `id` (string): Media item ID
|
||||||
|
|
||||||
|
**Request Body:**
|
||||||
|
- `content` (string): Note content (required, 1-10000 chars)
|
||||||
|
- `position` (string): Optional position reference (max 100 chars)
|
||||||
|
|
||||||
|
**Response:**
|
||||||
|
- Note object with all fields including generated ID and timestamps
|
||||||
|
|
||||||
|
**Status Codes:**
|
||||||
|
- 201: Created
|
||||||
|
- 400: Invalid request
|
||||||
|
- 401: Unauthorized
|
||||||
|
- 404: Media item not found
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
meta {
|
||||||
|
name: Delete Media Note
|
||||||
|
type: http
|
||||||
|
seq: 5
|
||||||
|
}
|
||||||
|
|
||||||
|
delete {
|
||||||
|
url: {{base_url}}/api/media-items/{{media_item_id}}/notes/{{note_id}}
|
||||||
|
body: none
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
script:post-response {
|
||||||
|
onResponse(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
docs {
|
||||||
|
## Delete Media Note
|
||||||
|
|
||||||
|
Deletes a specific note.
|
||||||
|
|
||||||
|
**Method:** DELETE
|
||||||
|
|
||||||
|
**Endpoint:** /api/media-items/:id/notes/:noteId
|
||||||
|
|
||||||
|
**Path Parameters:**
|
||||||
|
- `id` (string): Media item ID
|
||||||
|
- `noteId` (string): Note ID
|
||||||
|
|
||||||
|
**Response:**
|
||||||
|
- 204 No Content on success
|
||||||
|
|
||||||
|
**Status Codes:**
|
||||||
|
- 204: Success
|
||||||
|
- 401: Unauthorized
|
||||||
|
- 404: Note not found
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
meta {
|
||||||
|
name: Get Media Notes
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url: {{base_url}}/api/media-items/{{media_item_id}}/notes
|
||||||
|
body: none
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
script:post-response {
|
||||||
|
onResponse(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
docs {
|
||||||
|
## Get Media Notes
|
||||||
|
|
||||||
|
Retrieves all notes for a specific media item for the authenticated user.
|
||||||
|
|
||||||
|
**Method:** GET
|
||||||
|
|
||||||
|
**Endpoint:** /api/media-items/:id/notes
|
||||||
|
|
||||||
|
**Path Parameters:**
|
||||||
|
- `id` (string): Media item ID
|
||||||
|
|
||||||
|
**Response:**
|
||||||
|
- Array of note objects with fields:
|
||||||
|
- `id` (string): Note ID
|
||||||
|
- `media_item_id` (string): Media item ID
|
||||||
|
- `user_id` (string): User ID
|
||||||
|
- `content` (string): Note content
|
||||||
|
- `position` (string): Optional position reference
|
||||||
|
- `created_at` (string): Creation timestamp
|
||||||
|
- `updated_at` (string): Last update timestamp
|
||||||
|
|
||||||
|
**Status Codes:**
|
||||||
|
- 200: Success
|
||||||
|
- 401: Unauthorized
|
||||||
|
- 404: Media item not found
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
meta {
|
||||||
|
name: Get Single Media Note
|
||||||
|
type: http
|
||||||
|
seq: 3
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url: {{base_url}}/api/media-items/{{media_item_id}}/notes/{{note_id}}
|
||||||
|
body: none
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
script:post-response {
|
||||||
|
onResponse(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
docs {
|
||||||
|
## Get Single Media Note
|
||||||
|
|
||||||
|
Retrieves a specific note by ID.
|
||||||
|
|
||||||
|
**Method:** GET
|
||||||
|
|
||||||
|
**Endpoint:** /api/media-items/:id/notes/:noteId
|
||||||
|
|
||||||
|
**Path Parameters:**
|
||||||
|
- `id` (string): Media item ID
|
||||||
|
- `noteId` (string): Note ID
|
||||||
|
|
||||||
|
**Response:**
|
||||||
|
- Note object with all fields
|
||||||
|
|
||||||
|
**Status Codes:**
|
||||||
|
- 200: Success
|
||||||
|
- 401: Unauthorized
|
||||||
|
- 404: Note not found
|
||||||
|
}
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
meta {
|
||||||
|
name: Update Media Note
|
||||||
|
type: http
|
||||||
|
seq: 4
|
||||||
|
}
|
||||||
|
|
||||||
|
put {
|
||||||
|
url: {{base_url}}/api/media-items/{{media_item_id}}/notes/{{note_id}}
|
||||||
|
body: json
|
||||||
|
auth: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
body:json {
|
||||||
|
{
|
||||||
|
"content": "This is the updated note content.",
|
||||||
|
"position": "page:47"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
script:post-response {
|
||||||
|
onResponse(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
settings {
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
docs {
|
||||||
|
## Update Media Note
|
||||||
|
|
||||||
|
Updates an existing note.
|
||||||
|
|
||||||
|
**Method:** PUT
|
||||||
|
|
||||||
|
**Endpoint:** /api/media-items/:id/notes/:noteId
|
||||||
|
|
||||||
|
**Path Parameters:**
|
||||||
|
- `id` (string): Media item ID
|
||||||
|
- `noteId` (string): Note ID
|
||||||
|
|
||||||
|
**Request Body:**
|
||||||
|
- `content` (string): Updated note content (required, 1-10000 chars)
|
||||||
|
- `position` (string): Updated position reference (optional, max 100 chars)
|
||||||
|
|
||||||
|
**Response:**
|
||||||
|
- Updated note object with all fields
|
||||||
|
|
||||||
|
**Status Codes:**
|
||||||
|
- 200: Success
|
||||||
|
- 400: Invalid request
|
||||||
|
- 401: Unauthorized
|
||||||
|
- 404: Note not found
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user