Community edition generated from private repo via sync pipeline. Includes 9 plugins (WordPress, WooCommerce, WP Advanced, Gitea, n8n, Supabase, OpenPanel, Appwrite, Directus) with ~587 tools. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1132 lines
37 KiB
Markdown
1132 lines
37 KiB
Markdown
# Appwrite Plugin Design - Phase I
|
|
|
|
> **MCP Plugin برای مدیریت Appwrite Self-Hosted روی Coolify**
|
|
|
|
**Version**: v1.0.0 (طراحی)
|
|
**Priority**: High (جایگزین Phase J)
|
|
**Estimated Tools**: 85-95
|
|
|
|
---
|
|
|
|
## Overview
|
|
|
|
پلاگین Appwrite برای مدیریت **Appwrite Self-Hosted** روی Coolify طراحی شده است. Appwrite یک پلتفرم Backend-as-a-Service متنباز است که امکانات جامعی برای Database، Authentication، Storage، Functions و Messaging ارائه میدهد.
|
|
|
|
### مقایسه با Supabase
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Appwrite vs Supabase Self-Hosted │
|
|
├─────────────────────────────────────────────────────────────────┤
|
|
│ │
|
|
│ Appwrite: │
|
|
│ ├── Document-based Database (NoSQL-like) │
|
|
│ ├── Built-in Users & Teams management │
|
|
│ ├── Messaging (Email, SMS, Push) built-in │
|
|
│ ├── 30+ OAuth providers │
|
|
│ ├── Multi-runtime Functions (Node, Python, PHP, etc.) │
|
|
│ ├── Database Transactions (v1.8+) │
|
|
│ └── GraphQL + REST APIs │
|
|
│ │
|
|
│ Supabase: │
|
|
│ ├── PostgreSQL (relational) │
|
|
│ ├── GoTrue for Auth │
|
|
│ ├── No built-in messaging │
|
|
│ ├── Deno-only Edge Functions │
|
|
│ └── PostgREST for REST API │
|
|
│ │
|
|
│ هر دو: Self-Hosted، Open Source، Coolify-compatible │
|
|
│ │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### ویژگیهای Self-Hosted Appwrite
|
|
|
|
```
|
|
✅ موجود در Self-Hosted:
|
|
├── Database API (Collections, Documents, Queries)
|
|
├── Users API (Users, Sessions, Teams, Memberships)
|
|
├── Storage API (Buckets, Files, Image Transformation)
|
|
├── Functions API (Deployments, Executions, Variables)
|
|
├── Messaging API (Email, SMS, Push Notifications)
|
|
├── Health API (Service status, Queue monitoring)
|
|
├── Avatars API (Image utilities)
|
|
├── Realtime API (WebSocket subscriptions)
|
|
├── GraphQL API (Alternative to REST)
|
|
└── Webhooks & Events
|
|
|
|
❌ محدودیتها:
|
|
├── Console API (Project management) - نیاز به Console access
|
|
├── Rate limiting بالا (پیشفرض 60/دقیقه) - قابل تنظیم
|
|
└── بعضی features نیاز به تنظیمات اضافی دارند
|
|
```
|
|
|
|
---
|
|
|
|
## Authentication
|
|
|
|
### روشهای احراز هویت
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Appwrite Self-Hosted Authentication │
|
|
├─────────────────────────────────────────────────────────────────┤
|
|
│ │
|
|
│ API Key: │
|
|
│ ├── X-Appwrite-Key header │
|
|
│ ├── Server-side only │
|
|
│ ├── Scoped permissions │
|
|
│ ├── Bypasses rate limits │
|
|
│ └── Admin mode (bypasses permissions) │
|
|
│ │
|
|
│ JWT Token: │
|
|
│ ├── Authorization: Bearer {token} │
|
|
│ ├── 15-minute expiration │
|
|
│ ├── Respects user permissions │
|
|
│ └── Rate limited (10 tokens/60min/user) │
|
|
│ │
|
|
│ Session (Client): │
|
|
│ ├── Cookie-based │
|
|
│ ├── For client SDKs │
|
|
│ └── Subject to rate limiting │
|
|
│ │
|
|
│ Project ID: │
|
|
│ ├── X-Appwrite-Project header (required) │
|
|
│ └── Identifies which project to access │
|
|
│ │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### Environment Variables
|
|
|
|
```bash
|
|
# Appwrite Self-Hosted Instance (Required)
|
|
APPWRITE_SITE1_URL=https://appwrite.example.com/v1
|
|
APPWRITE_SITE1_PROJECT_ID=your-project-id
|
|
APPWRITE_SITE1_API_KEY=your-api-key-with-scopes
|
|
APPWRITE_SITE1_ALIAS=myappwrite
|
|
|
|
# Multiple Instances
|
|
APPWRITE_SITE2_URL=https://appwrite-staging.example.com/v1
|
|
APPWRITE_SITE2_PROJECT_ID=staging-project-id
|
|
APPWRITE_SITE2_API_KEY=staging-api-key
|
|
APPWRITE_SITE2_ALIAS=staging
|
|
```
|
|
|
|
### API Key Scopes
|
|
|
|
```
|
|
Authentication & Users:
|
|
├── sessions.read / sessions.write
|
|
├── users.read / users.write
|
|
└── teams.read / teams.write
|
|
|
|
Database:
|
|
├── databases.read / databases.write
|
|
├── collections.read / collections.write (tables)
|
|
├── attributes.read / attributes.write (columns)
|
|
├── indexes.read / indexes.write
|
|
└── documents.read / documents.write (rows)
|
|
|
|
Storage:
|
|
├── buckets.read / buckets.write
|
|
└── files.read / files.write
|
|
|
|
Functions:
|
|
├── functions.read / functions.write
|
|
└── execution.read / execution.write
|
|
|
|
Messaging:
|
|
├── messages.read / messages.write
|
|
├── providers.read / providers.write
|
|
├── topics.read / topics.write
|
|
└── subscribers.read / subscribers.write
|
|
|
|
Other:
|
|
├── health.read
|
|
├── locale.read
|
|
└── avatars.read
|
|
```
|
|
|
|
---
|
|
|
|
## API Endpoints
|
|
|
|
### Base URL Structure
|
|
|
|
```
|
|
Self-Hosted: https://[SERVER_HOSTNAME]/v1
|
|
|
|
Database:
|
|
GET/POST /databases
|
|
GET/PUT/DELETE /databases/{databaseId}
|
|
GET/POST /databases/{databaseId}/collections
|
|
GET/POST /databases/{databaseId}/collections/{collectionId}/documents
|
|
...
|
|
|
|
Users:
|
|
GET/POST /users
|
|
GET/PUT/DELETE /users/{userId}
|
|
GET/DELETE /users/{userId}/sessions
|
|
...
|
|
|
|
Storage:
|
|
GET/POST /storage/buckets
|
|
GET/POST /storage/buckets/{bucketId}/files
|
|
GET /storage/buckets/{bucketId}/files/{fileId}/preview
|
|
...
|
|
|
|
Functions:
|
|
GET/POST /functions
|
|
POST /functions/{functionId}/executions
|
|
...
|
|
|
|
Messaging:
|
|
GET/POST /messaging/providers
|
|
GET/POST /messaging/topics
|
|
POST /messaging/messages
|
|
...
|
|
|
|
Health:
|
|
GET /health
|
|
GET /health/db
|
|
GET /health/queue
|
|
...
|
|
```
|
|
|
|
---
|
|
|
|
## Architecture
|
|
|
|
### Project Structure
|
|
|
|
```
|
|
plugins/appwrite/
|
|
├── __init__.py # Export: AppwritePlugin, AppwriteClient
|
|
├── plugin.py # کلاس اصلی AppwritePlugin
|
|
├── client.py # AppwriteClient (REST client)
|
|
└── handlers/
|
|
├── __init__.py
|
|
├── databases.py # Database & Collections (18 tools)
|
|
├── documents.py # Document CRUD & Queries (12 tools)
|
|
├── users.py # User management (12 tools)
|
|
├── teams.py # Teams & Memberships (10 tools)
|
|
├── storage.py # Buckets & Files (14 tools)
|
|
├── functions.py # Functions & Executions (14 tools)
|
|
├── messaging.py # Email, SMS, Push (12 tools)
|
|
└── system.py # Health & Avatars (8 tools)
|
|
```
|
|
|
|
### Client Architecture
|
|
|
|
```python
|
|
class AppwriteClient:
|
|
"""
|
|
REST API Client for Appwrite Self-Hosted
|
|
|
|
All requests include Project ID and API Key headers.
|
|
"""
|
|
def __init__(
|
|
self,
|
|
base_url: str, # e.g., https://appwrite.example.com/v1
|
|
project_id: str, # Appwrite project ID
|
|
api_key: str, # API key with required scopes
|
|
):
|
|
self.base_url = base_url.rstrip('/')
|
|
self.project_id = project_id
|
|
self.api_key = api_key
|
|
|
|
def _get_headers(self, additional_headers: Optional[Dict] = None) -> Dict[str, str]:
|
|
"""Get request headers with authentication."""
|
|
headers = {
|
|
"Content-Type": "application/json",
|
|
"X-Appwrite-Project": self.project_id,
|
|
"X-Appwrite-Key": self.api_key,
|
|
}
|
|
if additional_headers:
|
|
headers.update(additional_headers)
|
|
return headers
|
|
|
|
async def request(
|
|
self,
|
|
method: str,
|
|
endpoint: str,
|
|
params: Optional[Dict] = None,
|
|
json_data: Optional[Dict] = None,
|
|
headers_override: Optional[Dict] = None
|
|
) -> Any:
|
|
"""Make authenticated request to Appwrite API"""
|
|
url = f"{self.base_url}{endpoint}"
|
|
headers = self._get_headers(headers_override)
|
|
# ... request logic
|
|
```
|
|
|
|
---
|
|
|
|
## Tool Categories
|
|
|
|
### 1. Databases Handler (18 tools)
|
|
|
|
مدیریت Databases و Collections
|
|
|
|
| Tool | Method | Scope | Description |
|
|
|------|--------|-------|-------------|
|
|
| `list_databases` | GET | read | لیست databases |
|
|
| `get_database` | GET | read | جزئیات database |
|
|
| `create_database` | POST | write | ایجاد database |
|
|
| `update_database` | PUT | write | بهروزرسانی database |
|
|
| `delete_database` | DELETE | admin | حذف database |
|
|
| `list_collections` | GET | read | لیست collections |
|
|
| `get_collection` | GET | read | جزئیات collection |
|
|
| `create_collection` | POST | write | ایجاد collection |
|
|
| `update_collection` | PUT | write | بهروزرسانی collection |
|
|
| `delete_collection` | DELETE | admin | حذف collection |
|
|
| `list_attributes` | GET | read | لیست attributes |
|
|
| `create_string_attribute` | POST | write | attribute متنی |
|
|
| `create_integer_attribute` | POST | write | attribute عددی |
|
|
| `create_boolean_attribute` | POST | write | attribute boolean |
|
|
| `create_enum_attribute` | POST | write | attribute enum |
|
|
| `create_datetime_attribute` | POST | write | attribute تاریخ |
|
|
| `delete_attribute` | DELETE | admin | حذف attribute |
|
|
| `list_indexes` | GET | read | لیست indexes |
|
|
| `create_index` | POST | write | ایجاد index |
|
|
| `delete_index` | DELETE | admin | حذف index |
|
|
|
|
```python
|
|
# Create Collection Example
|
|
{
|
|
"name": "create_collection",
|
|
"method_name": "create_collection",
|
|
"description": "Create a new collection in database",
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"database_id": {
|
|
"type": "string",
|
|
"description": "Database ID"
|
|
},
|
|
"collection_id": {
|
|
"type": "string",
|
|
"description": "Unique collection ID (use 'unique()' for auto)"
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"description": "Collection name"
|
|
},
|
|
"permissions": {
|
|
"type": "array",
|
|
"items": {"type": "string"},
|
|
"description": "Array of permission strings",
|
|
"default": []
|
|
},
|
|
"document_security": {
|
|
"type": "boolean",
|
|
"description": "Enable document-level permissions",
|
|
"default": true
|
|
},
|
|
"enabled": {
|
|
"type": "boolean",
|
|
"default": true
|
|
}
|
|
},
|
|
"required": ["database_id", "collection_id", "name"]
|
|
},
|
|
"scope": "write"
|
|
}
|
|
```
|
|
|
|
### 2. Documents Handler (12 tools)
|
|
|
|
عملیات CRUD روی Documents
|
|
|
|
| Tool | Method | Scope | Description |
|
|
|------|--------|-------|-------------|
|
|
| `list_documents` | GET | read | لیست documents با فیلتر |
|
|
| `get_document` | GET | read | دریافت یک document |
|
|
| `create_document` | POST | write | ایجاد document |
|
|
| `update_document` | PATCH | write | بهروزرسانی document |
|
|
| `delete_document` | DELETE | write | حذف document |
|
|
| `bulk_create_documents` | POST | write | ایجاد دستهای |
|
|
| `bulk_update_documents` | PATCH | write | بهروزرسانی دستهای |
|
|
| `bulk_delete_documents` | DELETE | write | حذف دستهای |
|
|
| `count_documents` | GET | read | شمارش documents |
|
|
| `search_documents` | GET | read | جستجوی full-text |
|
|
| `create_transaction` | POST | admin | شروع transaction (v1.8+) |
|
|
| `commit_transaction` | PUT | admin | commit/rollback transaction |
|
|
|
|
```python
|
|
# List Documents with Queries
|
|
{
|
|
"name": "list_documents",
|
|
"method_name": "list_documents",
|
|
"description": "List documents with queries, filters, and pagination",
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"database_id": {
|
|
"type": "string",
|
|
"description": "Database ID"
|
|
},
|
|
"collection_id": {
|
|
"type": "string",
|
|
"description": "Collection ID"
|
|
},
|
|
"queries": {
|
|
"type": "array",
|
|
"items": {"type": "string"},
|
|
"description": "Query strings (e.g., 'equal(\"status\", \"active\")')",
|
|
"examples": [
|
|
"equal(\"status\", [\"active\"])",
|
|
"greaterThan(\"price\", 100)",
|
|
"search(\"title\", \"keyword\")",
|
|
"orderDesc(\"createdAt\")",
|
|
"limit(25)",
|
|
"offset(0)"
|
|
]
|
|
}
|
|
},
|
|
"required": ["database_id", "collection_id"]
|
|
},
|
|
"scope": "read"
|
|
}
|
|
```
|
|
|
|
### 3. Users Handler (12 tools)
|
|
|
|
مدیریت کاربران
|
|
|
|
| Tool | Method | Scope | Description |
|
|
|------|--------|-------|-------------|
|
|
| `list_users` | GET | read | لیست کاربران |
|
|
| `get_user` | GET | read | جزئیات کاربر |
|
|
| `create_user` | POST | write | ایجاد کاربر |
|
|
| `update_user` | PATCH | write | بهروزرسانی کاربر |
|
|
| `delete_user` | DELETE | admin | حذف کاربر |
|
|
| `update_user_email` | PATCH | write | تغییر ایمیل |
|
|
| `update_user_phone` | PATCH | write | تغییر تلفن |
|
|
| `update_user_status` | PATCH | admin | فعال/غیرفعال کردن |
|
|
| `update_user_labels` | PUT | admin | تنظیم labels |
|
|
| `list_user_sessions` | GET | read | لیست sessions |
|
|
| `delete_user_sessions` | DELETE | admin | حذف همه sessions |
|
|
| `delete_user_session` | DELETE | admin | حذف یک session |
|
|
|
|
```python
|
|
# Create User Example
|
|
{
|
|
"name": "create_user",
|
|
"method_name": "create_user",
|
|
"description": "Create a new user",
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"user_id": {
|
|
"type": "string",
|
|
"description": "Unique user ID (use 'unique()' for auto)"
|
|
},
|
|
"email": {
|
|
"type": "string",
|
|
"format": "email",
|
|
"description": "User email"
|
|
},
|
|
"phone": {
|
|
"type": "string",
|
|
"description": "Phone number (E.164 format)"
|
|
},
|
|
"password": {
|
|
"type": "string",
|
|
"minLength": 8,
|
|
"description": "Password (min 8 chars)"
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"description": "User display name"
|
|
}
|
|
},
|
|
"required": ["user_id"]
|
|
},
|
|
"scope": "write"
|
|
}
|
|
```
|
|
|
|
### 4. Teams Handler (10 tools)
|
|
|
|
مدیریت Teams و Memberships
|
|
|
|
| Tool | Method | Scope | Description |
|
|
|------|--------|-------|-------------|
|
|
| `list_teams` | GET | read | لیست teams |
|
|
| `get_team` | GET | read | جزئیات team |
|
|
| `create_team` | POST | write | ایجاد team |
|
|
| `update_team` | PUT | write | بهروزرسانی team |
|
|
| `delete_team` | DELETE | admin | حذف team |
|
|
| `list_team_memberships` | GET | read | لیست اعضا |
|
|
| `create_team_membership` | POST | write | دعوت عضو |
|
|
| `update_membership` | PATCH | write | بهروزرسانی عضویت |
|
|
| `delete_membership` | DELETE | write | حذف عضو |
|
|
| `update_membership_status` | PATCH | write | تایید/رد عضویت |
|
|
|
|
### 5. Storage Handler (14 tools)
|
|
|
|
مدیریت Buckets و Files
|
|
|
|
| Tool | Method | Scope | Description |
|
|
|------|--------|-------|-------------|
|
|
| `list_buckets` | GET | read | لیست buckets |
|
|
| `get_bucket` | GET | read | جزئیات bucket |
|
|
| `create_bucket` | POST | write | ایجاد bucket |
|
|
| `update_bucket` | PUT | write | بهروزرسانی bucket |
|
|
| `delete_bucket` | DELETE | admin | حذف bucket |
|
|
| `list_files` | GET | read | لیست فایلها |
|
|
| `get_file` | GET | read | جزئیات فایل |
|
|
| `create_file` | POST | write | آپلود فایل |
|
|
| `update_file` | PUT | write | بهروزرسانی فایل |
|
|
| `delete_file` | DELETE | write | حذف فایل |
|
|
| `get_file_download` | GET | read | دانلود فایل |
|
|
| `get_file_preview` | GET | read | پیشنمایش تصویر |
|
|
| `get_file_view` | GET | read | مشاهده در browser |
|
|
| `move_file` | PUT | write | انتقال فایل |
|
|
|
|
```python
|
|
# Get File Preview with Transformations
|
|
{
|
|
"name": "get_file_preview",
|
|
"method_name": "get_file_preview",
|
|
"description": "Get image preview with transformations",
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"bucket_id": {"type": "string"},
|
|
"file_id": {"type": "string"},
|
|
"width": {
|
|
"type": "integer",
|
|
"minimum": 0,
|
|
"maximum": 4000,
|
|
"description": "Preview width (0-4000)"
|
|
},
|
|
"height": {
|
|
"type": "integer",
|
|
"minimum": 0,
|
|
"maximum": 4000,
|
|
"description": "Preview height (0-4000)"
|
|
},
|
|
"gravity": {
|
|
"type": "string",
|
|
"enum": ["center", "top", "top-left", "top-right",
|
|
"left", "right", "bottom", "bottom-left", "bottom-right"],
|
|
"default": "center"
|
|
},
|
|
"quality": {
|
|
"type": "integer",
|
|
"minimum": 0,
|
|
"maximum": 100,
|
|
"default": 90
|
|
},
|
|
"output": {
|
|
"type": "string",
|
|
"enum": ["jpeg", "jpg", "png", "gif", "webp", "avif"],
|
|
"default": "webp"
|
|
},
|
|
"rotation": {
|
|
"type": "integer",
|
|
"minimum": 0,
|
|
"maximum": 360
|
|
},
|
|
"background": {
|
|
"type": "string",
|
|
"description": "Background color (hex without #)"
|
|
},
|
|
"border_width": {"type": "integer"},
|
|
"border_color": {"type": "string"},
|
|
"border_radius": {"type": "integer"}
|
|
},
|
|
"required": ["bucket_id", "file_id"]
|
|
},
|
|
"scope": "read"
|
|
}
|
|
```
|
|
|
|
### 6. Functions Handler (14 tools)
|
|
|
|
مدیریت Serverless Functions
|
|
|
|
| Tool | Method | Scope | Description |
|
|
|------|--------|-------|-------------|
|
|
| `list_functions` | GET | read | لیست functions |
|
|
| `get_function` | GET | read | جزئیات function |
|
|
| `create_function` | POST | write | ایجاد function |
|
|
| `update_function` | PUT | write | بهروزرسانی function |
|
|
| `delete_function` | DELETE | admin | حذف function |
|
|
| `list_deployments` | GET | read | لیست deployments |
|
|
| `get_deployment` | GET | read | جزئیات deployment |
|
|
| `create_deployment` | POST | write | deploy کد جدید |
|
|
| `delete_deployment` | DELETE | write | حذف deployment |
|
|
| `update_deployment` | PATCH | write | فعال کردن deployment |
|
|
| `list_executions` | GET | read | لیست executions |
|
|
| `get_execution` | GET | read | جزئیات execution |
|
|
| `create_execution` | POST | write | اجرای function |
|
|
| `delete_execution` | DELETE | write | حذف execution log |
|
|
|
|
```python
|
|
# Create Execution (Run Function)
|
|
{
|
|
"name": "create_execution",
|
|
"method_name": "create_execution",
|
|
"description": "Execute a function",
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"function_id": {
|
|
"type": "string",
|
|
"description": "Function ID"
|
|
},
|
|
"body": {
|
|
"type": "string",
|
|
"description": "Request body (string or JSON string)"
|
|
},
|
|
"async": {
|
|
"type": "boolean",
|
|
"default": false,
|
|
"description": "Run asynchronously"
|
|
},
|
|
"path": {
|
|
"type": "string",
|
|
"description": "Custom execution path"
|
|
},
|
|
"method": {
|
|
"type": "string",
|
|
"enum": ["GET", "POST", "PUT", "PATCH", "DELETE"],
|
|
"default": "POST"
|
|
},
|
|
"headers": {
|
|
"type": "object",
|
|
"description": "Custom headers"
|
|
}
|
|
},
|
|
"required": ["function_id"]
|
|
},
|
|
"scope": "write"
|
|
}
|
|
```
|
|
|
|
### 7. Messaging Handler (12 tools)
|
|
|
|
ارسال پیام از طریق Email, SMS, Push
|
|
|
|
| Tool | Method | Scope | Description |
|
|
|------|--------|-------|-------------|
|
|
| `list_providers` | GET | read | لیست providers |
|
|
| `get_provider` | GET | read | جزئیات provider |
|
|
| `create_email_provider` | POST | admin | ایجاد email provider |
|
|
| `create_sms_provider` | POST | admin | ایجاد SMS provider |
|
|
| `create_push_provider` | POST | admin | ایجاد push provider |
|
|
| `delete_provider` | DELETE | admin | حذف provider |
|
|
| `list_topics` | GET | read | لیست topics |
|
|
| `create_topic` | POST | write | ایجاد topic |
|
|
| `delete_topic` | DELETE | write | حذف topic |
|
|
| `create_subscriber` | POST | write | اضافه کردن subscriber |
|
|
| `delete_subscriber` | DELETE | write | حذف subscriber |
|
|
| `send_message` | POST | write | ارسال پیام |
|
|
|
|
```python
|
|
# Send Email Message
|
|
{
|
|
"name": "send_message",
|
|
"method_name": "send_message",
|
|
"description": "Send email, SMS, or push notification",
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"message_id": {
|
|
"type": "string",
|
|
"description": "Unique message ID"
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"enum": ["email", "sms", "push"],
|
|
"description": "Message type"
|
|
},
|
|
"topics": {
|
|
"type": "array",
|
|
"items": {"type": "string"},
|
|
"description": "Target topic IDs"
|
|
},
|
|
"targets": {
|
|
"type": "array",
|
|
"items": {"type": "string"},
|
|
"description": "Target user IDs"
|
|
},
|
|
"subject": {
|
|
"type": "string",
|
|
"description": "Email subject"
|
|
},
|
|
"content": {
|
|
"type": "string",
|
|
"description": "Message content (HTML for email)"
|
|
},
|
|
"scheduled_at": {
|
|
"type": "string",
|
|
"format": "date-time",
|
|
"description": "Schedule delivery time"
|
|
}
|
|
},
|
|
"required": ["message_id", "type", "content"]
|
|
},
|
|
"scope": "write"
|
|
}
|
|
```
|
|
|
|
### 8. System Handler (8 tools)
|
|
|
|
سلامت سیستم و Utilities
|
|
|
|
| Tool | Method | Scope | Description |
|
|
|------|--------|-------|-------------|
|
|
| `health_check` | GET | read | وضعیت کلی سرور |
|
|
| `health_db` | GET | read | وضعیت database |
|
|
| `health_cache` | GET | read | وضعیت cache |
|
|
| `health_queue` | GET | read | وضعیت queue |
|
|
| `health_storage` | GET | read | وضعیت storage |
|
|
| `health_time` | GET | read | همزمانی ساعت |
|
|
| `get_avatar_initials` | GET | read | آواتار از initials |
|
|
| `get_avatar_image` | GET | read | آواتار از URL |
|
|
|
|
---
|
|
|
|
## Query System
|
|
|
|
### Query Operators
|
|
|
|
Appwrite از سیستم Query مخصوص خود استفاده میکند:
|
|
|
|
```javascript
|
|
// Comparison
|
|
Query.equal("status", ["active"])
|
|
Query.notEqual("status", ["deleted"])
|
|
Query.lessThan("price", 100)
|
|
Query.lessThanOrEqual("price", 100)
|
|
Query.greaterThan("price", 50)
|
|
Query.greaterThanOrEqual("price", 50)
|
|
Query.between("price", 50, 100)
|
|
|
|
// String
|
|
Query.startsWith("name", "John")
|
|
Query.endsWith("email", "@example.com")
|
|
Query.search("title", "keyword") // Requires fulltext index
|
|
|
|
// Array
|
|
Query.contains("tags", ["featured"])
|
|
Query.isNull("deleted_at")
|
|
Query.isNotNull("published_at")
|
|
|
|
// Sorting & Pagination
|
|
Query.orderAsc("created_at")
|
|
Query.orderDesc("created_at")
|
|
Query.limit(25)
|
|
Query.offset(0)
|
|
Query.cursorAfter("document_id")
|
|
Query.cursorBefore("document_id")
|
|
|
|
// Selection
|
|
Query.select(["id", "name", "email"])
|
|
```
|
|
|
|
### Query در REST API
|
|
|
|
```bash
|
|
# Example: List active users, sorted by creation date
|
|
GET /databases/{dbId}/collections/{colId}/documents?queries[]=equal("status",["active"])&queries[]=orderDesc("$createdAt")&queries[]=limit(25)
|
|
```
|
|
|
|
---
|
|
|
|
## Tool Summary
|
|
|
|
| Handler | Tools | Description |
|
|
|---------|-------|-------------|
|
|
| Databases | 18 | Database, Collections, Attributes, Indexes |
|
|
| Documents | 12 | Document CRUD, Bulk ops, Transactions |
|
|
| Users | 12 | User management |
|
|
| Teams | 10 | Teams & Memberships |
|
|
| Storage | 14 | Buckets, Files, Image transformation |
|
|
| Functions | 14 | Functions, Deployments, Executions |
|
|
| Messaging | 12 | Email, SMS, Push notifications |
|
|
| System | 8 | Health checks, Avatars |
|
|
| **Total** | **100** | |
|
|
|
|
---
|
|
|
|
## Implementation Phases
|
|
|
|
### Phase I.1: Core (Database + System) - 38 tools
|
|
|
|
**هدف**: دسترسی اولیه به Appwrite Self-Hosted
|
|
|
|
1. **AppwritePlugin** class
|
|
2. **AppwriteClient** (REST client)
|
|
3. **Databases Handler** (18 tools)
|
|
4. **Documents Handler** (12 tools)
|
|
5. **System Handler** (8 tools)
|
|
|
|
### Phase I.2: Auth & Teams - 22 tools
|
|
|
|
**هدف**: مدیریت کاربران و تیمها
|
|
|
|
1. **Users Handler** (12 tools)
|
|
2. **Teams Handler** (10 tools)
|
|
|
|
**جمع**: 60 tools
|
|
|
|
### Phase I.3: Storage - 14 tools
|
|
|
|
**هدف**: مدیریت فایلها
|
|
|
|
1. **Storage Handler** (14 tools)
|
|
|
|
**جمع**: 74 tools
|
|
|
|
### Phase I.4: Functions & Messaging - 26 tools
|
|
|
|
**هدف**: قابلیتهای پیشرفته
|
|
|
|
1. **Functions Handler** (14 tools)
|
|
2. **Messaging Handler** (12 tools)
|
|
|
|
**جمع**: 100 tools
|
|
|
|
---
|
|
|
|
## Error Handling
|
|
|
|
### HTTP Status Codes
|
|
|
|
```python
|
|
async def handle_appwrite_error(response):
|
|
"""Handle Appwrite API errors"""
|
|
data = await response.json()
|
|
|
|
message = data.get("message", "Unknown error")
|
|
code = data.get("code", response.status)
|
|
error_type = data.get("type", "general_error")
|
|
|
|
if response.status == 400:
|
|
raise ValidationError(f"Bad Request: {message}")
|
|
elif response.status == 401:
|
|
raise AuthError("Invalid API key or missing authentication")
|
|
elif response.status == 403:
|
|
raise PermissionError(f"Permission denied: {message}")
|
|
elif response.status == 404:
|
|
raise NotFoundError(f"Resource not found: {message}")
|
|
elif response.status == 409:
|
|
raise ConflictError(f"Conflict: {message}")
|
|
elif response.status == 429:
|
|
raise RateLimitError("Rate limit exceeded. Try again later.")
|
|
elif response.status >= 500:
|
|
raise ServerError(f"Server error ({code}): {message}")
|
|
else:
|
|
raise AppwriteError(f"Error ({code}): {message}")
|
|
```
|
|
|
|
### Common Error Types
|
|
|
|
```
|
|
user_not_found - کاربر پیدا نشد
|
|
document_not_found - document پیدا نشد
|
|
collection_not_found - collection پیدا نشد
|
|
database_not_found - database پیدا نشد
|
|
storage_bucket_not_found - bucket پیدا نشد
|
|
storage_file_not_found - فایل پیدا نشد
|
|
document_already_exists - document تکراری
|
|
user_already_exists - کاربر تکراری
|
|
attribute_already_exists - attribute تکراری
|
|
```
|
|
|
|
---
|
|
|
|
## Security Considerations
|
|
|
|
### API Key Security
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ API Key Best Practices │
|
|
├─────────────────────────────────────────────────────────────────┤
|
|
│ │
|
|
│ ✅ Best Practices: │
|
|
│ ├── Create separate keys for different purposes │
|
|
│ ├── Use minimal required scopes │
|
|
│ ├── Rotate keys periodically │
|
|
│ ├── Never expose keys in client-side code │
|
|
│ └── Use environment variables for storage │
|
|
│ │
|
|
│ ⚠️ Scope Recommendations: │
|
|
│ ├── Read operations: *.read scopes only │
|
|
│ ├── Write operations: specific *.write scopes │
|
|
│ └── Admin operations: all scopes + careful monitoring │
|
|
│ │
|
|
│ ❌ Never Do: │
|
|
│ ├── Log API keys (even partially) │
|
|
│ ├── Commit keys to version control │
|
|
│ ├── Share keys across different services │
|
|
│ └── Use single key for all operations │
|
|
│ │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### Permission System
|
|
|
|
```python
|
|
# Document-level permissions
|
|
permissions = [
|
|
"read(\"user:123\")", # Specific user can read
|
|
"write(\"user:123\")", # Specific user can write
|
|
"read(\"team:456\")", # Team members can read
|
|
"read(\"any\")", # Anyone can read (public)
|
|
"create(\"users\")", # Any authenticated user
|
|
"update(\"label:admin\")", # Users with admin label
|
|
]
|
|
```
|
|
|
|
---
|
|
|
|
## Example Usage
|
|
|
|
### Query Documents
|
|
|
|
```json
|
|
{
|
|
"tool": "list_documents",
|
|
"args": {
|
|
"site": "myappwrite",
|
|
"database_id": "main",
|
|
"collection_id": "posts",
|
|
"queries": [
|
|
"equal(\"status\", [\"published\"])",
|
|
"greaterThan(\"views\", 100)",
|
|
"orderDesc(\"$createdAt\")",
|
|
"limit(20)"
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
### Create User
|
|
|
|
```json
|
|
{
|
|
"tool": "create_user",
|
|
"args": {
|
|
"site": "myappwrite",
|
|
"user_id": "unique()",
|
|
"email": "user@example.com",
|
|
"password": "securePassword123",
|
|
"name": "John Doe"
|
|
}
|
|
}
|
|
```
|
|
|
|
### Upload File
|
|
|
|
```json
|
|
{
|
|
"tool": "create_file",
|
|
"args": {
|
|
"site": "myappwrite",
|
|
"bucket_id": "avatars",
|
|
"file_id": "unique()",
|
|
"file_content_base64": "iVBORw0KGgoAAAANSUhEUgAA...",
|
|
"file_name": "avatar.png",
|
|
"permissions": ["read(\"any\")"]
|
|
}
|
|
}
|
|
```
|
|
|
|
### Execute Function
|
|
|
|
```json
|
|
{
|
|
"tool": "create_execution",
|
|
"args": {
|
|
"site": "myappwrite",
|
|
"function_id": "send-welcome-email",
|
|
"body": "{\"userId\": \"123\", \"template\": \"welcome\"}",
|
|
"async": false
|
|
}
|
|
}
|
|
```
|
|
|
|
### Send Email
|
|
|
|
```json
|
|
{
|
|
"tool": "send_message",
|
|
"args": {
|
|
"site": "myappwrite",
|
|
"message_id": "unique()",
|
|
"type": "email",
|
|
"targets": ["user-123"],
|
|
"subject": "Welcome to our platform!",
|
|
"content": "<h1>Welcome!</h1><p>Thanks for signing up.</p>"
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Coolify Deployment Notes
|
|
|
|
### Finding Appwrite Credentials
|
|
|
|
در Coolify، بعد از deploy کردن Appwrite:
|
|
|
|
1. **URL**: از Coolify dashboard → Project → Appwrite → Domain
|
|
- معمولاً: `https://appwrite.yourdomain.com/v1`
|
|
|
|
2. **Project ID**:
|
|
- در Appwrite Console → Settings → Project ID
|
|
- یا از URL بعد از login
|
|
|
|
3. **API Key**:
|
|
- Appwrite Console → Project → Settings → API Keys → Create
|
|
- Scopes مورد نیاز را انتخاب کنید
|
|
|
|
### Docker Compose Services
|
|
|
|
```yaml
|
|
# Appwrite services on Coolify
|
|
services:
|
|
appwrite: # Main API - port 80
|
|
appwrite-realtime: # Realtime WebSocket
|
|
appwrite-executor: # Function execution
|
|
appwrite-worker-*: # Background workers
|
|
mariadb: # Database
|
|
redis: # Cache
|
|
influxdb: # Metrics (optional)
|
|
```
|
|
|
|
### Environment Variables (Appwrite Server)
|
|
|
|
```bash
|
|
# Key settings in Appwrite .env
|
|
_APP_ENV=production
|
|
_APP_DOMAIN=appwrite.yourdomain.com
|
|
_APP_DOMAIN_TARGET=appwrite.yourdomain.com
|
|
_APP_OPTIONS_ABUSE=enabled # Rate limiting
|
|
_APP_FUNCTIONS_RUNTIMES=node-18.0,python-3.9,php-8.0
|
|
```
|
|
|
|
---
|
|
|
|
## Endpoint Registration
|
|
|
|
### Endpoint Config
|
|
|
|
```python
|
|
# core/endpoints/config.py
|
|
|
|
EndpointType.APPWRITE: EndpointConfig(
|
|
path="/appwrite",
|
|
name="Appwrite Manager",
|
|
description="Appwrite Self-Hosted management (database, auth, storage, functions, messaging)",
|
|
endpoint_type=EndpointType.APPWRITE,
|
|
plugin_types=["appwrite"],
|
|
require_master_key=False,
|
|
allowed_scopes={"read", "write", "admin"},
|
|
tool_blacklist={
|
|
"manage_api_keys_create",
|
|
"manage_api_keys_delete",
|
|
"manage_api_keys_rotate",
|
|
"oauth_register_client",
|
|
"oauth_revoke_client",
|
|
},
|
|
max_tools=110,
|
|
),
|
|
```
|
|
|
|
---
|
|
|
|
## Comparison: Appwrite vs Supabase Tools
|
|
|
|
| Feature | Appwrite | Supabase |
|
|
|---------|----------|----------|
|
|
| Database Tools | 30 (Documents + Databases) | 18 (PostgREST) |
|
|
| Auth Tools | 22 (Users + Teams) | 14 (GoTrue) |
|
|
| Storage Tools | 14 | 12 |
|
|
| Functions Tools | 14 | 8 |
|
|
| Messaging Tools | 12 | 0 (not built-in) |
|
|
| System Tools | 8 | 6 |
|
|
| Admin Tools | - | 12 (postgres-meta) |
|
|
| **Total** | **100** | **70** |
|
|
|
|
**نکته**: Appwrite ابزارهای بیشتری دارد چون:
|
|
- Messaging built-in دارد
|
|
- Teams management جداگانه دارد
|
|
- Document/Collection model متفاوت است
|
|
- Image transformation پیشرفتهتر است
|
|
|
|
---
|
|
|
|
## Testing Checklist
|
|
|
|
### Unit Tests
|
|
|
|
- [ ] AppwriteClient authentication
|
|
- [ ] Database CRUD operations
|
|
- [ ] Document queries with all operators
|
|
- [ ] User management operations
|
|
- [ ] Team operations
|
|
- [ ] File upload/download
|
|
- [ ] Function execution
|
|
- [ ] Message sending
|
|
- [ ] Error handling
|
|
|
|
### Integration Tests
|
|
|
|
- [ ] Create database and collection
|
|
- [ ] CRUD documents with queries
|
|
- [ ] Create user and authenticate
|
|
- [ ] Upload and preview image
|
|
- [ ] Execute serverless function
|
|
- [ ] Send email through messaging
|
|
- [ ] Health check all services
|
|
- [ ] Rate limit handling
|
|
|
|
---
|
|
|
|
## Function Runtimes
|
|
|
|
### Supported Runtimes (v1.8+)
|
|
|
|
| Runtime | Versions |
|
|
|---------|----------|
|
|
| Node.js | 18.x, 20.x |
|
|
| Python | 3.9, 3.10, 3.11, 3.12 |
|
|
| PHP | 8.0, 8.1, 8.2, 8.3 |
|
|
| Ruby | 3.0, 3.1, 3.2, 3.3 |
|
|
| Java | 11, 17, 21 |
|
|
| Go | 1.18, 1.19, 1.20, 1.21 |
|
|
| Dart | 3.0, 3.1, 3.2, 3.3 |
|
|
| Rust | 1.60, 1.65, 1.70, 1.75 |
|
|
| C# | 8, 11, 12 |
|
|
| Swift | 5.5, 5.8, 5.9 |
|
|
| Kotlin | 1.8 |
|
|
|
|
---
|
|
|
|
## References
|
|
|
|
- [Appwrite Documentation](https://appwrite.io/docs)
|
|
- [Appwrite REST API Reference](https://appwrite.io/docs/apis/rest)
|
|
- [Appwrite Self-Hosting Guide](https://appwrite.io/docs/advanced/self-hosting)
|
|
- [Appwrite Server SDKs](https://appwrite.io/docs/sdks)
|
|
- [Appwrite GitHub Repository](https://github.com/appwrite/appwrite)
|
|
- [Appwrite Database Queries](https://appwrite.io/docs/products/databases/queries)
|
|
- [Appwrite Permissions](https://appwrite.io/docs/advanced/platform/permissions)
|
|
- [Appwrite Functions](https://appwrite.io/docs/products/functions)
|
|
- [Appwrite Messaging](https://appwrite.io/docs/products/messaging)
|
|
|
|
---
|
|
|
|
**Created**: 2025-12-02
|
|
**Author**: Claude AI Assistant
|
|
**Status**: Design Phase (Ready for Implementation)
|