| 15-journal-plugin |
03 |
plugins |
| journal |
| api |
| jwt |
| surf |
| beachcomber |
| rss |
| typesense |
| rate-limit |
|
| phase |
provides |
| 15-02 |
Posts/Categories/Tags admin, FormatHTML, HasPermissions, newPostsEnv postgres harness, host TestBootUserTranslateJournal |
|
|
| Anonymous GET /_journal/api/v1/posts, posts/{slug}, categories, tags, rss with PHP shapes |
| Backend-audience JWT writes under the same prefix; PHP {error} strings; JOURNAL-005 draft 404 |
| journal-public-api / journal-api buckets Max 120; media upload under journal/; Typesense gate off |
|
|
| tokens |
tasks |
commits |
| 32000 |
3 |
5 |
|
db6243c8c2 |
bdd1c1be618658374f42e6a643e8d34b6c350c28 |
716aa44cf58e278251a3cff71f8ae99ed5e316a7 |
| added |
patterns |
|
|
| Public group throttle:journal-public-api only; never cabana middleware name backend on anonymous GET |
| Writes authenticate in-handler with bouncer.NewBackendJWTGuard (aud=backend) and PHP {error} JSON, not cabana writeUnauthenticated |
| Where() applies to the last declared route; register /media/upload before posts/{id} constraints |
| Host gitlink is a nested clone; bump via file:// fetch with protocol.file.allow=always |
|
|
| created |
modified |
| ../sm-journal-plugin/routes.go |
| ../sm-journal-plugin/search.go |
| ../sm-journal-plugin/controllers/api/auth.go |
| ../sm-journal-plugin/controllers/api/posts.go |
| ../sm-journal-plugin/controllers/api/posts_helpers.go |
| ../sm-journal-plugin/controllers/api/posts_search.go |
| ../sm-journal-plugin/controllers/api/media.go |
| ../sm-journal-plugin/controllers/api/rss.go |
| ../sm-journal-plugin/models/post_search.go |
| ../sm-journal-plugin/models/search_gate.go |
| ../sm-journal-plugin/journal_public_list_smoke_test.go |
| ../sm-journal-plugin/journal_api_writes_test.go |
| ../sm-journal-plugin/journal_api_task3_test.go |
|
| ../sm-journal-plugin/plugin.go |
| ../sm-journal-plugin/plugin_test.go |
| ../sm-journal-plugin/README.md |
| ../sm-journal-plugin/posts_admin_smoke_test.go |
| ../sm-grzybyfunkcjonalne-app/boot_test.go |
| ../sm-grzybyfunkcjonalne-app/plugins/golem15/journal |
|
|
| D-14 public prefix is /_journal/api/v1; show is GET posts/{slug} with ctype_digit fallback to id; list per_page default 9 max 30 |
| D-15 writes require cabana backend JWT audience backend; missing Bearer is JSON {error:Authentication required}; frontend-audience tokens fail the same 401 |
| JOURNAL-005 unpublished or future published_at show is 404 with no data key unless owner or access_other_posts; anonymous never 403 |
| D-17 buckets journal-public-api and journal-api Max 120 Decay 1m; 429 body stays surf Too Many Attempts |
| D-12 search_use_typesense defaults false; ShouldBeSearchable is false when unpublished or the Gate is off; a fresh save makes zero Typesense HTTP |
| D-16 Journal routes are not added to fonoteka.go tide/parity files |
|
| optionalBackendPrincipal on GET (Bearer present only; failure is anonymous); requireBackendPrincipal on writes with PHP-shaped writer |
| Store/update assign field-by-field; never lagoon.Fill the whole body onto Post; FormatHTML regenerates content_html |
| beachcomber.From in Plugin.Boot; Gate reads golem15_journal_settings.search_use_typesense for ID=1; read errors count as off |
|
|
| id |
description |
requirement |
verification |
human_judgment |
| D1 |
Anonymous GET /_journal/api/v1/posts returns published posts only; buckets Max 120; public group has no cabana backend middleware |
D-14 |
| kind |
ref |
status |
| integration |
../sm-journal-plugin#TestJournalPublicList |
pass |
|
| kind |
ref |
status |
| unit |
../sm-journal-plugin#TestJournalBuckets |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D2 |
POST without Bearer is 401 Authentication required (not cabana envelope); JOURNAL-005 draft 404; frontend JWT cannot write; publish without access_publish is 403 |
D-15 |
| kind |
ref |
status |
| integration |
../sm-journal-plugin#TestJournalWriteUnauthenticated |
pass |
|
| kind |
ref |
status |
| integration |
../sm-journal-plugin#TestJournal005DraftShow |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D3 |
Anonymous GET categories and tags return PHP {data} keys; featured-image writes without Bearer are 401; non-editor backend Bearer is 403 |
D-14 |
| kind |
ref |
status |
| integration |
../sm-journal-plugin#TestJournalPublicCategories |
pass |
|
| kind |
ref |
status |
| integration |
../sm-journal-plugin#TestJournalPublicTags |
pass |
|
| kind |
ref |
status |
| integration |
../sm-journal-plugin#TestJournalFeaturedImageUnauthenticated |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D4 |
Media upload without access_posts is 403; with permission path is under journal/; folder .. is 422 |
D-15 |
| kind |
ref |
status |
| integration |
../sm-journal-plugin#TestJournal006MediaUpload |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D5 |
Default search_use_typesense is off; a published save with Typesense configured records zero outbound HTTP; unpublished ShouldBeSearchable is false |
D-12 |
| kind |
ref |
status |
| integration |
../sm-journal-plugin#TestSearchGateOff |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D6 |
Anonymous GET rss is 200 application/rss+xml, RSS 2.0, rss_title and rss_posts_per_feed honored, unpublished omitted |
D-14 |
| kind |
ref |
status |
| integration |
../sm-journal-plugin#TestJournalRSS |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D7 |
Host assembled routes include GET and POST /_journal/api/v1/posts |
D-14 |
| kind |
ref |
status |
| integration |
../sm-grzybyfunkcjonalne-app#TestBootUserTranslateJournal |
pass |
|
|
false |
|
|
80min |
2026-10-06 |
complete |