64 lines
1.7 KiB
Markdown
64 lines
1.7 KiB
Markdown
|
|
# TODO: Editor.js Image Tool Integration
|
|||
|
|
|
|||
|
|
## Goal
|
|||
|
|
Integrate the Editor.js **Image Tool** with proper upload endpoints, storage, and access control.
|
|||
|
|
|
|||
|
|
## Why
|
|||
|
|
- Editor.js expects uploads to respond with `{ success: 1, file: { url: "..." } }`.
|
|||
|
|
- We want private storage with a controlled proxy (like avatars) and optional resizing.
|
|||
|
|
|
|||
|
|
## Open Decisions
|
|||
|
|
- Public access? (e.g. impressum pages should be public)
|
|||
|
|
- Allowed file types (recommended: PNG/JPG/WebP; avoid SVG for security)
|
|||
|
|
- Resize policy (max width + WebP variants?)
|
|||
|
|
|
|||
|
|
## Proposed Structure
|
|||
|
|
|
|||
|
|
### Storage
|
|||
|
|
- `storage/pages/{page_uuid}/assets/{asset_uuid}/original.<ext>`
|
|||
|
|
- Optional variants: `w1280.webp`, `w640.webp`, etc.
|
|||
|
|
|
|||
|
|
### DB
|
|||
|
|
Create `page_assets` table:
|
|||
|
|
- `id`, `uuid`, `page_id`, `locale`
|
|||
|
|
- `file_name`, `mime`, `size`, `width`, `height`
|
|||
|
|
- `created_by`, `created`
|
|||
|
|
|
|||
|
|
### Endpoints
|
|||
|
|
1) **Upload by file**
|
|||
|
|
`pages/page/upload-image(none).phtml`
|
|||
|
|
- Accepts multipart (field name `image`).
|
|||
|
|
- Validates MIME/size.
|
|||
|
|
- Stores file + creates DB record.
|
|||
|
|
- Returns `{ success: 1, file: { url } }`.
|
|||
|
|
|
|||
|
|
2) **Fetch by URL** (optional)
|
|||
|
|
`pages/page/fetch-image(none).phtml`
|
|||
|
|
- Accepts JSON `{ url: "..." }`.
|
|||
|
|
- Downloads, validates, stores like upload.
|
|||
|
|
- Returns same response.
|
|||
|
|
|
|||
|
|
3) **Media proxy**
|
|||
|
|
`pages/page/media(none).phtml?uuid=...`
|
|||
|
|
- Checks permissions (public vs. logged‑in).
|
|||
|
|
- Reads storage file, sets headers, returns file.
|
|||
|
|
|
|||
|
|
### Editor.js config
|
|||
|
|
Add `image` tool to `web/js/components/page-editor.js`:
|
|||
|
|
```js
|
|||
|
|
image: {
|
|||
|
|
class: ImageTool,
|
|||
|
|
config: {
|
|||
|
|
endpoints: {
|
|||
|
|
byFile: 'page/upload-image',
|
|||
|
|
byUrl: 'page/fetch-image'
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Next Steps
|
|||
|
|
- Decide public vs. private access rules.
|
|||
|
|
- Implement service + migration + endpoints.
|
|||
|
|
- Add tool config and i18n messages.
|