spiral / writeaway
PHP API server for Writeaway editor
Installs: 14 772
Dependents: 1
Suggesters: 0
Security: 0
Stars: 1
Watchers: 5
Forks: 2
Open Issues: 2
pkg:composer/spiral/writeaway
Requires
- php: >=8.0
- ext-imagick: *
- doctrine/collections: ^1.6
- spiral/cycle-bridge: ^1.0
- spiral/framework: ^2.9
- spiral/helpers: ^1.0
Requires (Dev)
- laminas/laminas-diactoros: ^2.4
- phpunit/phpunit: ^9.5
- spiral/code-style: ^1.0
- spiral/roadrunner: ^1.9
This package is auto-updated.
Last update: 2025-10-16 21:27:45 UTC
README
License:
MIT License (MIT). Please see LICENSE for more information. Maintained by Spiral Scout.
TODO
- add tests for public services
Usage
- Register WriteawayBootloaderin the App
Note that it must be registered and after
RouterBootloader.
- Implement MetaProviderInterface
- WriteawayCommandBootloadercan be added if you want to have a reset command.
Note that it uses
TokenizerBootloaderso it must be registered beforeCommandsBootloader.
- WriteawayViewsBootloadercan be added if you want use ready views bundle.
API Endpoints:
List Images
GET or POST writeaway:images:list to fetch a full list of available images.
Example response:
{
  "status": 200,
  "data": [
    {
      "id": "unique-id",
      "src": "image1.png"
    },
    {
      "id": "unique-id",
      "thumbnailSrc": "image2-th.png",
      "src": "image2.png"
    }
  ]
}
Possible image fields:
| Field | Type | Required | Description | 
|---|---|---|---|
| id | string | Required | Image id | 
| src | string | Required | Image source URL | 
| thumbnailSrc | string | Optional | Image thumbnail URL | 
| height | number | Optional | Image height to display | 
| width | number | Optional | Image width to display | 
Upload Image
POST writeaway:images:upload to upload an image file.
Example request:
image - FormData file
Example response:
{
  "status": 200,
  "data": [
    {
      "id": "unique-id",
      "src": "image1.png"
    }
  ]
}
For possible image fields see the previous endpoint.
Delete Image
POST or DELETE writeaway:images:delete to delete a particular image
Example request:
{
  "id": "unique-id"
}
Example response:
{
  "status": 200
}
Get Piece
GET or POST writeaway:pieces:get to fetch a particular piece by its id and type.
Example request:
{
  "id": "unique-id",
  "type": "piece-type"
}
If no pieces found, a new one wil be created.
idis a unique value across all pieces.
Example response:
{
  "status": 200,
  "data": {
    "id": "unique-id",
    "type": "piece-type",
    "data": {
      "key": "value",
      "key...": "value..."
    }
  }
}
In case if validation errors the example response will be:
{
  "status": 400,
  "errors": {
    "field-name": "error-message",
    "field-name...": "error-message..."
  }
}
Get Pieces in bulk
GET or POST writeaway:pieces:bulk to fetch a particular pieces by theirs id and type.
Example request:
{
  "pieces": [
    {
      "id": "unique-id",
      "type": "piece-type"
    },
    {
      "id": "unique-id",
      "type": "piece-type"
    }
  ]
}
Example response:
{
  "status": 200,
  "data": [
    {
      "id": "unique-id",
      "type": "piece-type",
      "data": {
        "key": "value",
        "key...": "value..."
      }
    },
    {
      "id": "unique-id",
      "type": "piece-type",
      "data": {
        "key": "value",
        "key...": "value..."
      }
    }
  ]
}
Not found pieces will be ignored.
In case if validation errors the example response will be:
{
  "status": 400,
  "errors": {
    "field-name": "error-message",
    "field-name...": "error-message..."
  }
}
Save Piece
POST writeaway:pieces:save to save a particular piece by its id and type.
Example request:
{
  "id": "unique-id",
  "type": "piece-type",
  "data": {
    "key": "value",
    "key...": "value..."
  }
}
If no pieces found, a new one wil be created.
idis a unique value across all pieces.
Example response:
{
  "status": 200,
  "data": {
    "id": "unique-id",
    "type": "piece-type",
    "data": {
      "key": "value",
      "key...": "value..."
    }
  }
}
In case if validation errors the example response will be:
{
  "status": 400,
  "errors": {
    "field-name": "error-message",
    "field-name...": "error-message..."
  }
}
Components
Meta
Meta is a structure designed to represent current piece editor. While this package knows nothing about real app actors,
\Spiral\Writeaway\Service\Meta\ProviderInterface is given - a developer can bind it to a more rich implementation,
so the meta will contain the real user's id, label and time. Example:
{
  "id": "some user id",
  "label": "some user label, such as name",
  "time": "current date time string"
}