Initial commit: YouTube Studio Flow (backend, frontend, infrastructure, docs)
This commit is contained in:
@@ -0,0 +1,125 @@
|
||||
# Templates API
|
||||
|
||||
Base path: `/api/v1/templates`
|
||||
|
||||
All endpoints require `Authorization: Bearer <jwt>`.
|
||||
|
||||
Related: [[02 - Description Engine]], [[03 - Blocks API]], [[02 - Videos API]]
|
||||
|
||||
---
|
||||
|
||||
## GET /templates
|
||||
|
||||
List all active templates for the current team.
|
||||
|
||||
**Response:** `Template[]`
|
||||
|
||||
---
|
||||
|
||||
## GET /templates/:id
|
||||
|
||||
Get a single template by ID.
|
||||
|
||||
**Response:** `Template`
|
||||
|
||||
---
|
||||
|
||||
## POST /templates
|
||||
|
||||
Create a new template. Requires `EDITOR` role.
|
||||
|
||||
**Request body:**
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "string",
|
||||
"description": "string",
|
||||
"defaultBlocks": ["blockId", "freetext:uuid"],
|
||||
"defaultOverrides": {},
|
||||
"rules": {
|
||||
"requiredLinks": ["https://..."]
|
||||
},
|
||||
"variables": {},
|
||||
"videoFields": {
|
||||
"privacyStatus": "PUBLIC",
|
||||
"tags": ["tag1"]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Field notes:**
|
||||
|
||||
| Field | Notes |
|
||||
|---|---|
|
||||
| `description` | Optional human-readable description of the template's purpose. |
|
||||
| `defaultBlocks` | Ordered list of block IDs. May include `freetext:uuid` entries for inline free-text entries. |
|
||||
| `defaultOverrides` | Per-block overrides in the same shape as `VideoConfig.blockOverrides`. Stores free-text content keyed by `freetext:*` ID. |
|
||||
| `rules` | Optional lint/validation rules applied when the template is in use, e.g. required links. |
|
||||
| `variables` | Default variable values to seed into `VideoConfig.variableValues` when the template is applied. |
|
||||
| `videoFields` | Video metadata fields to apply when the template is applied to a video (e.g. `privacyStatus`, `tags`). |
|
||||
|
||||
---
|
||||
|
||||
## PATCH /templates/:id
|
||||
|
||||
Update a template. Requires `EDITOR` role.
|
||||
|
||||
**Request body:** Same fields as `POST /templates`, all optional.
|
||||
|
||||
---
|
||||
|
||||
## DELETE /templates/:id
|
||||
|
||||
Delete a template. Requires `ADMIN` role.
|
||||
|
||||
---
|
||||
|
||||
## POST /templates/:id/preview
|
||||
|
||||
Render a preview of the template's description for a given variable context. Does not require a video — useful for inspecting template output before applying.
|
||||
|
||||
**Request body:**
|
||||
|
||||
```json
|
||||
{
|
||||
"variableValues": {
|
||||
"custom_var": "value"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Response:**
|
||||
|
||||
```json
|
||||
{ "rendered": "string" }
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Version history
|
||||
|
||||
`TemplateVersion` rows are written to the database on every `PATCH /templates/:id` call, storing a snapshot of the template content before the update. When a template is deleted, its version rows are also deleted.
|
||||
|
||||
There is **no `GET /templates/:id/versions` endpoint**. The version history is stored but unreachable via the API. Template version history is not exposed to the frontend. See the backlog.
|
||||
|
||||
---
|
||||
|
||||
## POST /templates/:templateId/apply/:videoId
|
||||
|
||||
Apply a template to a specific video. Requires `EDITOR` role.
|
||||
|
||||
When applied:
|
||||
- `template.defaultBlocks` is written to `VideoConfig.blockOrder`
|
||||
- `template.defaultOverrides` is written to `VideoConfig.blockOverrides`
|
||||
- If `applyVideoFields` is `true`, video metadata fields from `template.videoFields` are applied to the video row
|
||||
|
||||
**Request body:**
|
||||
|
||||
```json
|
||||
{
|
||||
"applyVideoFields": true,
|
||||
"applyDescriptionConfig": true
|
||||
}
|
||||
```
|
||||
|
||||
**Response:** Updated `VideoDetail`
|
||||
Reference in New Issue
Block a user