# API Usage Examples

## Base URL
```
http://localhost:3000/api/v1
```

## Authentication
Currently no authentication required (internal tool). Bearer token support planned for Phase 2.

---

## Projects API

### 1. Create a Project

```bash
curl -X POST http://localhost:3000/api/v1/projects \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Persona Portal v2.0",
    "description": "Redesign and relaunch the persona publishing platform",
    "color_hex": "#3498db",
    "icon_name": "rocket"
  }'
```

**Response:**
```json
{
  "status": "success",
  "data": {
    "id": 1,
    "name": "Persona Portal v2.0",
    "description": "Redesign and relaunch the persona publishing platform",
    "status": "active",
    "color_hex": "#3498db",
    "icon_name": "rocket",
    "owner_id": 1,
    "created_at": "2026-04-13T15:42:00.000Z",
    "updated_at": "2026-04-13T15:42:00.000Z"
  },
  "meta": {
    "timestamp": "2026-04-13T15:42:00.000Z",
    "request_id": "550e8400-e29b-41d4-a716-446655440000"
  }
}
```

---

### 2. List Projects

```bash
# Get all active projects
curl http://localhost:3000/api/v1/projects

# Filter by status with pagination
curl "http://localhost:3000/api/v1/projects?status=active&limit=25&offset=0"

# Get archived projects
curl "http://localhost:3000/api/v1/projects?status=archived"
```

**Response:**
```json
{
  "status": "success",
  "data": [
    {
      "id": 1,
      "name": "Persona Portal v2.0",
      "description": "...",
      "status": "active",
      "color_hex": "#3498db",
      "icon_name": "rocket",
      "owner_id": 1,
      "task_count": 12,
      "completed_count": 3,
      "overdue_count": 1,
      "created_at": "2026-04-13T15:42:00.000Z",
      "updated_at": "2026-04-13T15:42:00.000Z"
    },
    {
      "id": 2,
      "name": "Command Center MVP",
      "description": "Build the core task management system",
      "status": "active",
      "color_hex": "#e74c3c",
      "icon_name": "deploy",
      "owner_id": 1,
      "task_count": 8,
      "completed_count": 5,
      "overdue_count": 0,
      "created_at": "2026-04-13T16:00:00.000Z",
      "updated_at": "2026-04-13T16:00:00.000Z"
    }
  ],
  "meta": {
    "total": 2,
    "limit": 50,
    "offset": 0,
    "timestamp": "2026-04-13T15:42:00.000Z",
    "request_id": "550e8400-e29b-41d4-a716-446655440000"
  }
}
```

---

### 3. Get Project Detail

```bash
curl http://localhost:3000/api/v1/projects/1
```

**Response:**
```json
{
  "status": "success",
  "data": {
    "id": 1,
    "name": "Persona Portal v2.0",
    "description": "Redesign and relaunch the persona publishing platform",
    "status": "active",
    "color_hex": "#3498db",
    "icon_name": "rocket",
    "owner_id": 1,
    "created_at": "2026-04-13T15:42:00.000Z",
    "updated_at": "2026-04-13T15:42:00.000Z"
  },
  "meta": {
    "timestamp": "2026-04-13T15:42:00.000Z",
    "request_id": "550e8400-e29b-41d4-a716-446655440000"
  }
}
```

---

### 4. Update Project

```bash
curl -X PUT http://localhost:3000/api/v1/projects/1 \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Persona Portal v2.1",
    "status": "paused",
    "color_hex": "#e74c3c"
  }'
```

**Response:**
```json
{
  "status": "success",
  "data": {
    "id": 1,
    "name": "Persona Portal v2.1",
    "description": "Redesign and relaunch the persona publishing platform",
    "status": "paused",
    "color_hex": "#e74c3c",
    "icon_name": "rocket",
    "owner_id": 1,
    "created_at": "2026-04-13T15:42:00.000Z",
    "updated_at": "2026-04-13T15:45:00.000Z"
  },
  "meta": {
    "timestamp": "2026-04-13T15:45:00.000Z",
    "request_id": "550e8400-e29b-41d4-a716-446655440000"
  }
}
```

---

### 5. Delete Project

```bash
curl -X DELETE http://localhost:3000/api/v1/projects/1
```

**Response:** `204 No Content` (empty body)

---

## Tasks API

### 6. Create a Task

```bash
curl -X POST http://localhost:3000/api/v1/projects/1/tasks \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Design new UI components",
    "description": "Create reusable button, card, and modal components",
    "status": "backlog",
    "due_date": "2026-04-20",
    "assignee_id": 2
  }'
```

**Response:**
```json
{
  "status": "success",
  "data": {
    "id": 42,
    "project_id": 1,
    "title": "Design new UI components",
    "description": "Create reusable button, card, and modal components",
    "status": "backlog",
    "position": 5,
    "due_date": "2026-04-20",
    "assignee_id": 2,
    "created_by": 1,
    "created_at": "2026-04-13T15:42:00.000Z",
    "updated_at": "2026-04-13T15:42:00.000Z"
  },
  "meta": {
    "timestamp": "2026-04-13T15:42:00.000Z",
    "request_id": "550e8400-e29b-41d4-a716-446655440000"
  }
}
```

Note: Task is added at the end of the project (position = max_position + 1)

---

### 7. List Tasks

```bash
# Get all tasks in a project
curl http://localhost:3000/api/v1/projects/1/tasks

# Filter by status
curl "http://localhost:3000/api/v1/projects/1/tasks?status=in_progress"

# Sort by due date
curl "http://localhost:3000/api/v1/projects/1/tasks?sort=due_date"

# Combine filters
curl "http://localhost:3000/api/v1/projects/1/tasks?status=backlog&sort=due_date&limit=100"
```

**Response:**
```json
{
  "status": "success",
  "data": [
    {
      "id": 42,
      "project_id": 1,
      "title": "Design new UI components",
      "description": "Create reusable button, card, and modal components",
      "status": "backlog",
      "position": 0,
      "due_date": "2026-04-20",
      "assignee_id": 2,
      "created_by": 1,
      "created_at": "2026-04-13T15:42:00.000Z",
      "updated_at": "2026-04-13T15:42:00.000Z"
    },
    {
      "id": 43,
      "project_id": 1,
      "title": "Implement API endpoints",
      "description": null,
      "status": "backlog",
      "position": 1,
      "due_date": null,
      "assignee_id": 1,
      "created_by": 1,
      "created_at": "2026-04-13T15:50:00.000Z",
      "updated_at": "2026-04-13T15:50:00.000Z"
    }
  ],
  "meta": {
    "total": 2,
    "limit": 200,
    "offset": 0,
    "timestamp": "2026-04-13T15:42:00.000Z",
    "request_id": "550e8400-e29b-41d4-a716-446655440000"
  }
}
```

---

### 8. Get Task Detail

```bash
curl http://localhost:3000/api/v1/projects/1/tasks/42
```

**Response:**
```json
{
  "status": "success",
  "data": {
    "id": 42,
    "project_id": 1,
    "title": "Design new UI components",
    "description": "Create reusable button, card, and modal components",
    "status": "backlog",
    "position": 0,
    "due_date": "2026-04-20",
    "assignee_id": 2,
    "created_by": 1,
    "created_at": "2026-04-13T15:42:00.000Z",
    "updated_at": "2026-04-13T15:42:00.000Z"
  },
  "meta": {
    "timestamp": "2026-04-13T15:42:00.000Z",
    "request_id": "550e8400-e29b-41d4-a716-446655440000"
  }
}
```

---

### 9. Update Task

```bash
# Update just the status
curl -X PUT http://localhost:3000/api/v1/projects/1/tasks/42 \
  -H "Content-Type: application/json" \
  -d '{
    "status": "in_progress"
  }'

# Update with reordering
curl -X PUT http://localhost:3000/api/v1/projects/1/tasks/42 \
  -H "Content-Type: application/json" \
  -d '{
    "status": "in_progress",
    "position": 2
  }'

# Full update
curl -X PUT http://localhost:3000/api/v1/projects/1/tasks/42 \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Updated title",
    "description": "Updated description",
    "status": "done",
    "due_date": "2026-04-25",
    "assignee_id": 1,
    "position": 0
  }'
```

**Response (with reordering at position 2):**
```json
{
  "status": "success",
  "data": {
    "id": 42,
    "project_id": 1,
    "title": "Design new UI components",
    "description": "Create reusable button, card, and modal components",
    "status": "in_progress",
    "position": 2,
    "due_date": "2026-04-20",
    "assignee_id": 2,
    "created_by": 1,
    "created_at": "2026-04-13T15:42:00.000Z",
    "updated_at": "2026-04-13T15:55:00.000Z"
  },
  "meta": {
    "timestamp": "2026-04-13T15:55:00.000Z",
    "request_id": "550e8400-e29b-41d4-a716-446655440000"
  }
}
```

---

### 10. Delete Task

```bash
curl -X DELETE http://localhost:3000/api/v1/projects/1/tasks/42
```

**Response:** `204 No Content` (empty body)

---

### 11. Bulk Reorder Tasks

```bash
curl -X POST http://localhost:3000/api/v1/projects/1/tasks/reorder \
  -H "Content-Type: application/json" \
  -d '{
    "order": [43, 44, 45, 42, 46]
  }'
```

**Response:**
```json
{
  "status": "success",
  "data": {
    "updated_count": 5
  },
  "meta": {
    "timestamp": "2026-04-13T15:42:00.000Z",
    "request_id": "550e8400-e29b-41d4-a716-446655440000"
  }
}
```

---

## Error Examples

### Validation Error (400)

```bash
curl -X POST http://localhost:3000/api/v1/projects \
  -H "Content-Type: application/json" \
  -d '{
    "name": ""
  }'
```

**Response:**
```json
{
  "status": "error",
  "error": {
    "code": "BAD_REQUEST",
    "message": "Validation failed",
    "details": [
      {
        "field": "name",
        "message": "Project name is required"
      }
    ]
  },
  "meta": {
    "timestamp": "2026-04-13T15:42:00.000Z",
    "request_id": "550e8400-e29b-41d4-a716-446655440000"
  }
}
```

### Not Found (404)

```bash
curl http://localhost:3000/api/v1/projects/999
```

**Response:**
```json
{
  "status": "error",
  "error": {
    "code": "RESOURCE_NOT_FOUND",
    "message": "Project not found"
  },
  "meta": {
    "timestamp": "2026-04-13T15:42:00.000Z",
    "request_id": "550e8400-e29b-41d4-a716-446655440000"
  }
}
```

### Conflict (409)

```bash
curl -X PUT http://localhost:3000/api/v1/projects/1/tasks/42 \
  -H "Content-Type: application/json" \
  -d '{
    "position": 100
  }'
```

**Response:**
```json
{
  "status": "error",
  "error": {
    "code": "CONFLICT",
    "message": "Position must be between 0 and 4"
  },
  "meta": {
    "timestamp": "2026-04-13T15:42:00.000Z",
    "request_id": "550e8400-e29b-41d4-a716-446655440000"
  }
}
```

---

## Testing with Different Tools

### Using HTTPie

```bash
# List projects
http http://localhost:3000/api/v1/projects

# Create project
http POST http://localhost:3000/api/v1/projects \
  name="Test Project" \
  description="A test" \
  color_hex="#3498db"
```

### Using Postman

1. Import this collection: (Postman collection JSON available on request)
2. Set environment variable: `base_url = http://localhost:3000`
3. Run requests from "Projects" and "Tasks" folders

### Using VS Code REST Client

Create a `.http` file:

```http
### List Projects
GET http://localhost:3000/api/v1/projects

### Create Project
POST http://localhost:3000/api/v1/projects
Content-Type: application/json

{
  "name": "Test Project",
  "description": "A test project",
  "color_hex": "#3498db"
}
```

---

## Status Filters

**Projects**:
- `active` — Currently in progress
- `archived` — Completed or no longer relevant
- `paused` — Temporarily on hold

**Tasks**:
- `backlog` — Not yet started
- `in_progress` — Currently being worked on
- `done` — Completed
- `blocked` — Waiting on something

---

## Sort Options

- `position` — By task position (default)
- `due_date` — By due date (earliest first)
- `created_at` — By creation date
- `-updated_at` — By last updated (most recent first)

---

**Built by Talos for TekDek Command Center**
