{
  "openapi": "3.0.3",
  "info": {
    "title": "Tevello Public API",
    "version": "1.0.0"
  },
  "servers": [
    {
      "url": "https://api.tevello.com"
    }
  ],
  "paths": {
    "/{shop}/member/{member}": {
      "get": {
        "summary": "Get member",
        "description": "Retrieves detailed information about a specific member, including profile, courses, and communities.",
        "parameters": [
          { "$ref": "#/components/parameters/ShopParam" },
          {
            "name": "member",
            "in": "path",
            "required": true,
            "schema": { "type": "string" }
          }
        ],
        "responses": {
          "200": { "description": "Member found" },
          "404": { "description": "Member not found" }
        }
      }
    },
    "/{shop}/member/{member}/progress": {
      "post": {
        "summary": "Update member course progress",
        "parameters": [
          { "$ref": "#/components/parameters/ShopParam" },
          {
            "name": "member",
            "in": "path",
            "required": true,
            "schema": { "type": "string" }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "course_id": { "type": "string" },
                  "progress": {
                    "type": "array",
                    "items": { "type": "string" }
                  }
                },
                "required": ["course_id", "progress"]
              }
            }
          }
        },
        "responses": {
          "200": { "description": "Progress updated" }
        }
      }
    },
    "/{shop}/member/{member}/enrollments": {
      "post": {
        "summary": "Create or update enrollment",
        "description": "Creates or updates a course or community enrollment. Send exactly one of course_id or community_id.",
        "parameters": [
          { "$ref": "#/components/parameters/ShopParam" },
          {
            "name": "member",
            "in": "path",
            "required": true,
            "schema": { "type": "string" }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "course_id": { "type": "string" },
                  "community_id": { "type": "string" },
                  "expire_at": { "type": "string", "description": "ISO 8601 datetime or 'never'" },
                  "created_at": { "type": "string", "description": "ISO 8601 datetime" }
                }
              }
            }
          }
        },
        "responses": {
          "200": { "description": "Enrollment updated" }
        }
      }
    },
    "/{shop}/courses": {
      "get": {
        "summary": "List courses",
        "parameters": [
          { "$ref": "#/components/parameters/ShopParam" }
        ],
        "responses": {
          "200": { "description": "List of courses" }
        }
      },
      "put": {
        "summary": "Replace all courses",
        "parameters": [
          { "$ref": "#/components/parameters/ShopParam" }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": { "type": "object" }
              }
            }
          }
        },
        "responses": {
          "200": { "description": "Courses replaced" }
        }
      }
    },
    "/{shop}/courses/{course}": {
      "get": {
        "summary": "Get course",
        "parameters": [
          { "$ref": "#/components/parameters/ShopParam" },
          {
            "name": "course",
            "in": "path",
            "required": true,
            "schema": { "type": "string" }
          }
        ],
        "responses": {
          "200": { "description": "Course found" },
          "404": { "description": "Course not found" }
        }
      },
      "put": {
        "summary": "Create or update course",
        "parameters": [
          { "$ref": "#/components/parameters/ShopParam" },
          {
            "name": "course",
            "in": "path",
            "required": true,
            "schema": { "type": "string" }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": { "type": "object" }
            }
          }
        },
        "responses": {
          "200": { "description": "Course saved" }
        }
      }
    },
    "/{shop}/settings": {
      "get": {
        "summary": "Get settings",
        "parameters": [
          { "$ref": "#/components/parameters/ShopParam" }
        ],
        "responses": {
          "200": { "description": "Settings returned" }
        }
      },
      "put": {
        "summary": "Update settings",
        "parameters": [
          { "$ref": "#/components/parameters/ShopParam" }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": { "type": "object" }
            }
          }
        },
        "responses": {
          "200": { "description": "Settings updated" }
        }
      }
    },
    "/{shop}/communities": {
      "get": {
        "summary": "List communities",
        "parameters": [
          { "$ref": "#/components/parameters/ShopParam" }
        ],
        "responses": {
          "200": { "description": "List of communities" }
        }
      },
      "put": {
        "summary": "Replace all communities",
        "parameters": [
          { "$ref": "#/components/parameters/ShopParam" }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": { "type": "object" }
              }
            }
          }
        },
        "responses": {
          "200": { "description": "Communities replaced" }
        }
      }
    },
    "/{shop}/communities/{community}": {
      "get": {
        "summary": "Get community",
        "parameters": [
          { "$ref": "#/components/parameters/ShopParam" },
          {
            "name": "community",
            "in": "path",
            "required": true,
            "schema": { "type": "string" }
          }
        ],
        "responses": {
          "200": { "description": "Community found" },
          "404": { "description": "Community not found" }
        }
      },
      "put": {
        "summary": "Create or update community",
        "parameters": [
          { "$ref": "#/components/parameters/ShopParam" },
          {
            "name": "community",
            "in": "path",
            "required": true,
            "schema": { "type": "string" }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": { "type": "object" }
            }
          }
        },
        "responses": {
          "200": { "description": "Community saved" }
        }
      }
    },
    "/{shop}/communities/{community}/posts": {
      "get": {
        "summary": "List posts in community",
        "parameters": [
          { "$ref": "#/components/parameters/ShopParam" },
          {
            "name": "community",
            "in": "path",
            "required": true,
            "schema": { "type": "string" }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": { "type": "integer", "minimum": 1 },
            "description": "Page number (default 1)"
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": { "type": "string", "enum": ["newest-posts", "newest-activity"] },
            "description": "Sort order (default newest-posts)"
          }
        ],
        "responses": {
          "200": { "description": "Posts returned" }
        }
      },
      "post": {
        "summary": "Create post",
        "parameters": [
          { "$ref": "#/components/parameters/ShopParam" },
          {
            "name": "community",
            "in": "path",
            "required": true,
            "schema": { "type": "string" }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "content": { "type": "string" },
                  "topic": { "type": "string" },
                  "author": { "type": "string" }
                },
                "required": ["content", "author"]
              }
            }
          }
        },
        "responses": {
          "201": { "description": "Post created" }
        }
      }
    },
    "/{shop}/communities/{community}/posts/{post}": {
      "post": {
        "summary": "Update post",
        "parameters": [
          { "$ref": "#/components/parameters/ShopParam" },
          {
            "name": "community",
            "in": "path",
            "required": true,
            "schema": { "type": "string" }
          },
          {
            "name": "post",
            "in": "path",
            "required": true,
            "schema": { "type": "string" }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "content": { "type": "string" },
                  "topic": { "type": "string" }
                }
              }
            }
          }
        },
        "responses": {
          "200": { "description": "Post updated" }
        }
      },
      "delete": {
        "summary": "Delete post",
        "parameters": [
          { "$ref": "#/components/parameters/ShopParam" },
          {
            "name": "community",
            "in": "path",
            "required": true,
            "schema": { "type": "string" }
          },
          {
            "name": "post",
            "in": "path",
            "required": true,
            "schema": { "type": "string" }
          }
        ],
        "responses": {
          "204": { "description": "Post deleted" }
        }
      }
    },
    "/{shop}/communities/{community}/posts/{post}/comments": {
      "get": {
        "summary": "List comments",
        "parameters": [
          { "$ref": "#/components/parameters/ShopParam" },
          {
            "name": "community",
            "in": "path",
            "required": true,
            "schema": { "type": "string" }
          },
          {
            "name": "post",
            "in": "path",
            "required": true,
            "schema": { "type": "string" }
          }
        ],
        "responses": {
          "200": { "description": "Comments returned" }
        }
      },
      "post": {
        "summary": "Create comment",
        "parameters": [
          { "$ref": "#/components/parameters/ShopParam" },
          {
            "name": "community",
            "in": "path",
            "required": true,
            "schema": { "type": "string" }
          },
          {
            "name": "post",
            "in": "path",
            "required": true,
            "schema": { "type": "string" }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "content": { "type": "string" },
                  "author": { "type": "string" }
                },
                "required": ["content", "author"]
              }
            }
          }
        },
        "responses": {
          "201": { "description": "Comment created" }
        }
      }
    },
    "/{shop}/communities/{community}/posts/{post}/comments/{comment}": {
      "post": {
        "summary": "Update comment",
        "parameters": [
          { "$ref": "#/components/parameters/ShopParam" },
          {
            "name": "community",
            "in": "path",
            "required": true,
            "schema": { "type": "string" }
          },
          {
            "name": "post",
            "in": "path",
            "required": true,
            "schema": { "type": "string" }
          },
          {
            "name": "comment",
            "in": "path",
            "required": true,
            "schema": { "type": "string" }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "content": { "type": "string" }
                },
                "required": ["content"]
              }
            }
          }
        },
        "responses": {
          "200": { "description": "Comment updated" }
        }
      },
      "delete": {
        "summary": "Delete comment",
        "parameters": [
          { "$ref": "#/components/parameters/ShopParam" },
          {
            "name": "community",
            "in": "path",
            "required": true,
            "schema": { "type": "string" }
          },
          {
            "name": "post",
            "in": "path",
            "required": true,
            "schema": { "type": "string" }
          },
          {
            "name": "comment",
            "in": "path",
            "required": true,
            "schema": { "type": "string" }
          }
        ],
        "responses": {
          "204": { "description": "Comment deleted" }
        }
      }
    },
    "/{shop}/member/{member}/posts": {
      "get": {
        "summary": "List member posts",
        "parameters": [
          { "$ref": "#/components/parameters/ShopParam" },
          {
            "name": "member",
            "in": "path",
            "required": true,
            "schema": { "type": "string" }
          }
        ],
        "responses": {
          "200": { "description": "Posts returned" }
        }
      }
    },
    "/{shop}/communities/reactions": {
      "get": {
        "summary": "List reactions",
        "parameters": [
          { "$ref": "#/components/parameters/ShopParam" },
          {
            "name": "parent_id",
            "in": "query",
            "required": true,
            "schema": { "type": "string" },
            "description": "ID of the post or comment"
          }
        ],
        "responses": {
          "200": { "description": "Reactions returned" }
        }
      },
      "post": {
        "summary": "Toggle reaction",
        "parameters": [
          { "$ref": "#/components/parameters/ShopParam" }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "parent_id": { "type": "string" },
                  "reaction": { "type": "string" },
                  "author": { "type": "string" }
                },
                "required": ["parent_id", "reaction", "author"]
              }
            }
          }
        },
        "responses": {
          "200": { "description": "Reaction toggled" }
        }
      }
    },
    "/{shop}/upload/url": {
      "post": {
        "summary": "Create presigned upload URL",
        "parameters": [
          { "$ref": "#/components/parameters/ShopParam" }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "filename": { "type": "string" }
                },
                "required": ["filename"]
              }
            }
          }
        },
        "responses": {
          "200": { "description": "Presigned URL created" }
        }
      }
    },
    "/{shop}/upload/video/url": {
      "post": {
        "summary": "Create video upload (TUS) parameters",
        "parameters": [
          { "$ref": "#/components/parameters/ShopParam" }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "filename": { "type": "string" }
                },
                "required": ["filename"]
              }
            }
          }
        },
        "responses": {
          "200": { "description": "Video upload parameters created" }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "shopBearer": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      }
    },
    "parameters": {
      "ShopParam": {
        "name": "shop",
        "in": "path",
        "required": true,
        "schema": { "type": "string" },
        "description": "Shop myshopify domain, e.g. dev-tevello.myshopify.com"
      }
    }
  },
  "security": [
    {
      "shopBearer": []
    }
  ]
}

