openapi: 3.1.0
info:
  title: Cairnquire Foundation API
  version: 0.1.0
servers:
  - url: http://localhost:8080
paths:
  /health:
    get:
      summary: Health check
      operationId: getHealth
      responses:
        "200":
          description: Healthy
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                  database:
                    type: string
                  contentStore:
                    type: string
  /api/uploads:
    post:
      summary: Upload a single file
      description: Markdown, plain-text, and HTML files become rendered documents. Other supported file types remain attachments.
      operationId: uploadFile
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                file:
                  type: string
                  format: binary
                folder:
                  type: string
                  description: Optional relative destination folder for readable documents.
                duplicateAction:
                  type: string
                  enum: [overwrite, rename, reuse]
                  description: Explicit resolution after a 409 duplicate response. Use rename to keep both readable documents, overwrite to replace a readable document, or reuse to return an existing upload URL.
      responses:
        "200":
          description: Existing upload URL reused
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/UploadResponse"
        "201":
          description: File stored
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/UploadResponse"
        "409":
          description: A readable document name or attachment hash already exists. Ask the user how to continue and retry with duplicateAction.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/UploadConflict"
  /attachments/{hash}:
    get:
      summary: Download an attachment by content hash
      operationId: getAttachment
      parameters:
        - in: path
          name: hash
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Attachment content
components:
  schemas:
    UploadResponse:
      type: object
      required: [hash, contentType, kind, url, attachmentUrl]
      properties:
        hash:
          type: string
        contentType:
          type: string
        kind:
          type: string
          enum: [document, attachment]
        url:
          type: string
          description: Canonical rendered-document or attachment URL.
        attachmentUrl:
          type: string
          deprecated: true
          description: Compatibility alias for url.
    UploadConflict:
      type: object
      required: [error, conflictType, existingHash, existingUrl]
      properties:
        error:
          type: string
        conflictType:
          type: string
          enum: [document, attachment]
        existingHash:
          type: string
        existingPath:
          type: string
        existingUrl:
          type: string
