4 KiB
Modules AGENTS.md
Before reading this file, also read Appwrite's base AGENTS.md.
Modules are the building blocks of the Appwrite platform. They are responsible for handling specific tasks, defining background workers, and providing API endpoints. Each module should have its own directory within the src/Appwrite/Platform/Modules directory.
Generally-speaking, each service is its own module, but there are some exceptions. The goal is to always put related code that achieves a specific goal under one roof.
Structure and Naming Conventions
When adding a module, always add a new directory under src/Appwrite/Platform/Modules. The directory name should be PascalCase, and if possible, use only one word. For example, User, Database, Storage, etc. Avoid using shorthands, unless they are standardized, such as DB, JWT, or SMTP.
A module consists of:
Module.php- Simple register class registering all module's services (fromServicesdirectory)Workersdirectory - Contains behavior for module-specific workersTasksdirectory - Contains behavior for module-specific CLI tasksHttpdirectory - Contains HTTP endpoints for the moduleServicesdirectory - Contains register classes for all relevant types of services
Inside module, the Services directory can contain:
Http.php- Register HTTP endpoints and hooks fromHttpdirectoryWorkers.php- Register workers fromWorkersdirectoryTasks.php- Register CLI tasks fromTasksdirectory
After implementing a module, make sure to register it in
src/Appwrite/Platform/Appwrite.php.
HTTP directory structure
Inside module's Http directory, there are multiple rules to follow:
-
Directly in
Httpdirectory, there should only be directories for services (and hooks, check point number 2). If a module is a single service, it's okay to only have one directory, with the same name as the service, for examplesrc/Appwrite/Platform/Modules/Account/Http/Account. An example with multiple services issrc/Appwrite/Platform/Modules/Databases/Http/Databasesandsrc/Appwrite/Platform/Modules/Databases/Http/TablesDB. -
Hooks should live in
Hooksdirectory, underInit,Shutdown, orErrordirectories, insideHttpdirectory. For example, an init hook to prevent unauthorized access might live insrc/Appwrite/Platform/Modules/Functions/Http/Hooks/Init/Authentication.php. -
Inside
Httpdirectories for services, file names can only beGet.php,Update.php,Create.php,Delete.phporXList.php. We call itXList, becauseListis a reserved keyword and PHP would not like that. Never use any other words! Let's say you want a method to beblockUser, tempting to addUsers/Block.php, instead, think of the resource and property it affects. Better naming would beUsers/Status/Update.php(update user's status). Doing so also nicely reflects in the HTTP endpoint,PATCH /v1/users/:userId/status. -
It's allowed to nest directories in
Httpservice directories. For example, if you want to create a new deployment for a function based on a template, an endpoint might live insrc/Appwrite/Platform/Modules/Functions/Http/Functions/Deployments/Template/Create.php. In this example, notice functions and deployments are resources, and template is property - both resources and properties can be nested, and have separate directories.
Sample module directory structure
src/Appwrite/Platform/Modules/Functions
├── Module.php
├── Workers
│ └── Builds.php
├── Tasks
│ └── Block.php
├── Http
│ └── Functions
│ ├── Create.php
│ ├── XList.php
│ ├── Update.php
│ ├── Delete.php
│ ├── Get.php
│ └── Deployments
│ ├── XList.php
│ ├── Delete.php
│ ├── Get.php
│ └── Template
│ └── Create.php
└── Services
├── Http.php
├── Workers.php
└── Tasks.php