Commit Graph

1094 Commits

Author SHA1 Message Date
837e40ae6a docs(16.1-03): record phase 16.1 validation results 2026-10-09 22:51:10 +02:00
837922cf43 test(cabana): relation subquery and locale order coverage
- TestListRelationSQL: DryRun matrix for belongsToMany (incl. custom pivot keys and self-reference), hasMany, hasOne and belongsTo search and sort, soft delete, 422 refusals, bound and LIKE-escaped search values, no outer JOIN next to ListExtendQuery and scope predicates
- TestListRelationSearchPostgres: exact total through two matching tags, string_agg sort order and hasMany search on Postgres
- TestEnabledLocalesDefaultFirst: default-locale ordering cases
2026-10-09 22:47:57 +02:00
a8bce9c01f test(admin): list state round trip and storage coverage
- Form back, cancel, save-and-close and delete land on the list with the stored query; every list request after the return carries it
- listState helpers: key prefix, malformed stored values removed, empty query stores nothing, throwing storage
- ListView entry: URL wins, cleared controls forget the query, same-list navigation, 422 forgets, page clamp
- Logout removes every list key and keeps the sidebar preference
2026-10-09 22:42:36 +02:00
3b8527b397 docs(16.1-02): update state and roadmap after plan 02 2026-10-09 22:37:49 +02:00
80f4497f95 docs(16.1-02): complete release and UAT redeploy plan 2026-10-09 22:37:19 +02:00
d77393b4d1 docs(16.1-01): update state and roadmap after plan 01 v0.1.16 2026-10-09 21:05:55 +02:00
0ec2e31ffa docs(16.1-01): complete journal admin fixes plan 2026-10-09 21:05:31 +02:00
9cac45c389 fix(admin): keep list state in the URL and browser storage
- listState.ts stores each list's query (search, sort, dir, page, per_page,
  filter[name]) under summer-admin.list:<controller>; an empty query is
  never stored, malformed stored values are dropped like a hand-edited URL
- ListView restores the stored query into the URL before its first list
  request when entered without list params; a URL with list params wins
- a 422 forgets the stored query; an out-of-range page clamps to last_page
- logout clears every stored list query
- check-phase10.sh allows browser storage in useSidebar.ts and listState.ts
- list smoke tests start from a clean list state
- rebuilt modules/boardwalk/dist
2026-10-09 21:04:00 +02:00
bd8626e5fc fix(cabana): send the default content locale first in enabledLocales
- enabledContentLocales moves TranslationWriter.DefaultLocale to index 0
  and keeps the other enabled codes in the writer's order
- every ML control opens on enabledLocales[0], so the form now shows the
  host-column values (content, excerpt, title, slug) instead of an empty
  non-default locale
- a DefaultLocale error is logged and keeps the writer's order
- README and forms docs: default locale first
2026-10-09 20:58:12 +02:00
06d75cb654 fix(cabana): search and sort to-many relation columns through subqueries
- relationSubquery reads the pivot, key and table names from GORM's parsed
  relationship (Schema.Relationships.Relations), never from a convention
- list search matches every relation column through a correlated EXISTS,
  so the count query gains no JOIN and belongsToMany search stops failing
- sorting a hasMany or belongsToMany column orders by a correlated
  string_agg subquery before the primary-key tiebreak
- polymorphic relations and unknown related columns answer 422
- DryRun smoke test TestListRelationSearchSmoke needs no Docker
2026-10-09 20:56:53 +02:00
3ca6a0d4b2 docs(16.2): capture phase context 2026-10-09 20:52:50 +02:00
24f258f149 docs(16.1): create phase plan 2026-10-09 20:51:02 +02:00
ef6feb3441 docs(16.1): list state via URL + localStorage, three plans 2026-10-09 20:25:34 +02:00
17ee383a4f docs(phase-16.1): add research and validation strategy 2026-10-09 20:19:59 +02:00
1ef21b0e43 docs(16.1): insert phases 16.1 and 16.2 with 16.1 context 2026-10-09 20:19:29 +02:00
1c2dc28588 docs(16-05): complete unit tests and phase gate plan 2026-10-09 20:18:50 +02:00
a8c65bc71a docs(16-05): Phase 16 validation sign-off
Per-task rows bound to their plan tasks with threat refs, all green after
scripts/check-phase16.sh --all; Wave 0 ticked; nyquist_compliant: true.
2026-10-09 20:16:02 +02:00
c5e03f4a3a test(16-05): Phase 16 gate
scripts/check-phase16.sh runs the layer unit tests, the layer playground
SSR smoke, the site app install/build/tests/smokes, the host boot tests,
the grzyby command tests with -race and check-deploy. Each stage fails on
not ok, fail/skip/todo/cancelled counts, missing named tests, go test
failures, skips, no tests to run, data races or a smoke without ok; it
ends with "Phase 16 gate passed".
2026-10-09 20:15:14 +02:00
679d5544f1 docs(state): record phase 19.1 context session 2026-10-09 20:10:22 +02:00
cbb8f4c6f5 docs(19.1): capture phase context 2026-10-09 20:10:21 +02:00
b7649581da docs(16-04): complete staging deploy plan 2026-10-09 19:56:16 +02:00
4ef6776382 docs(state): record phase 19 context session 2026-10-09 19:53:17 +02:00
bf297d5244 docs(19): capture phase context 2026-10-09 19:53:16 +02:00
90cdc7145c docs(state): record phase 18.1 context session 2026-10-09 19:19:43 +02:00
9248b26f87 docs(18.1): capture phase context 2026-10-09 19:19:36 +02:00
01a34f87f8 docs(roadmap): insert phase 18.1 payment gateway subscriptions 2026-10-09 19:19:36 +02:00
296b9cda87 docs(16-03): complete host, migration runbook and staging deploy plan 2026-10-09 18:56:51 +02:00
6ff7d5da3e docs(16-03): todo for Journal HTML content re-save 2026-10-09 18:45:59 +02:00
719830410e docs(state): record phase 18 context session 2026-10-09 18:45:15 +02:00
65d577b828 docs(todos): capture plugin-registered cabana field types 2026-10-09 18:45:14 +02:00
6ea3652303 docs(18): capture phase context 2026-10-09 18:45:14 +02:00
e381f2cc0f docs(16-02): record plan 16-02 progress and decisions in STATE and ROADMAP v0.1.15 2026-10-09 18:30:15 +02:00
070da81907 docs(16-02): complete vue-grzybyfunkcjonalne-app plan 2026-10-09 18:29:54 +02:00
ee5ab31492 docs(16-01): record plan 16-01 progress and decisions in STATE and ROADMAP 2026-10-09 18:10:01 +02:00
b53892c316 docs(16-01): complete vue-journal-layer plan
- SUMMARY with the D-20/D-21 prerequisite contract
- USER-SETUP: both Gitea repos exist; the site repo is private (SSH)
2026-10-09 18:09:36 +02:00
7c5b8a8cb7 docs(quick-261009-mys): subtitle, avatar and My account page for backend users 2026-10-09 18:01:43 +02:00
89611eaaf9 test(cabana): cover My account profile, password and avatar
- account_internal_test: metadata subtitle reader and writer (NULL, blank,
  null, [], invalid JSON, non-objects, key preservation, NULL on the last
  key), the attachOne contract, avatar cap, unique-violation mapping,
  English fallbacks, and 401 for non-backend principals on all three routes
- account_test (Postgres): profile payload incl. copied WinterCMS metadata
  and avatar rows, trimmed profile saves and metadata keys, the forbidden-key
  allow-list with unchanged rows, email rules, password rules, the failed
  attempt log, Bearer and cookie session effects, CSRF, avatar upload,
  refusals (SVG, HTML as PNG, size, part shape, 413, no bucket) with no row
  or blob left, replace and remove with blob cleanup
- lagoon: TestBackendAdminMetadataColumn covers type, Winter row round trip,
  rollback of only the column and re-migrate
- SPA: AccountView, the user menu account item and avatar image,
  setCurrentUser and profileInitials; lang fixture gains myaccount keys
2026-10-09 17:59:27 +02:00
4f1cda33d7 fix(cabana): answer an empty or malformed avatar upload body with 422
- POST /account/avatar with no multipart part (NextPart io.EOF) or a broken
  boundary fell through to the generic 500; it is now the invalid-body 422
- a body over the cap still answers 413 payload_too_large
2026-10-09 17:53:21 +02:00
a03302e8fe docs(state): record phase 17 context session 2026-10-09 17:53:07 +02:00
02936b15bc docs(17): capture phase context 2026-10-09 17:53:00 +02:00
64d21c8caf feat(cabana): add backend user avatars to My account and the top bar
- cabana.BackendUser is an attach.Owner (MorphName Backend\Models\User,
  cabana.BackendUserMorphType) with one public attachOne avatar
  (cabana.BackendUserAvatarField), as WinterCMS stores it
- POST /account/avatar stores one file_data image (jpg, jpeg, png, gif or
  webp, image guard, at most cabana.AvatarMaxBytes = 2 MiB, under a
  server-generated name) and replaces the previous avatar: old rows are
  deleted in the transaction, their blobs after the commit
- DELETE /account/avatar removes the avatar and is idempotent
- GET /auth/me and the account routes return avatar {url, thumb_url}
  (250x250 crop); cabana.BackendUserAvatar lets plugins read it
- swag annotations, regenerated admin.json and schema.d.ts; route
  inventories, CSRF walk (29) and OpenAPI conformance learn both routes
- SPA: avatar upload and remove on My account, avatar image in the user
  menu trigger and header; backend::lang.myaccount avatar strings
- rebuilt boardwalk dist; cabana README, users-and-permissions and
  admin-spa docs
2026-10-09 17:45:43 +02:00
143eca5a1f feat(cabana): add the My account page with subtitle and password change
- lagoon: 202610090001_backend_users_metadata adds WinterCMS's nullable
  jsonable backend_users.metadata column (TEXT); rollback drops only it
- cabana.BackendUser.Metadata and Subtitle read metadata.subtitle leniently
  (NULL, blank, null, [], invalid JSON and non-strings read as empty)
- GET /auth/me returns subtitle; PUT /account edits the signed-in admin's
  own names, email and subtitle, and the password with current_password;
  any other key is a 422 and nothing is written
- email: required, valid, 6-255 chars, unique against other admins' email
  and login ignoring case (soft-deleted included); a unique-index race is 422
- a password change sets tokens_valid_after, revokes the presented token and
  gives a cookie session a fresh cookie
- swag annotation, regenerated admin.json and schema.d.ts; route inventories,
  CSRF walk (27) and OpenAPI conformance learn the route
- SPA: My account item in the user menu opens /account (AccountView), which
  saves through PUT /account and updates the top bar via setCurrentUser
- backend::lang.myaccount strings (en, pl), rebuilt boardwalk dist
- cabana and lagoon READMEs, users-and-permissions and admin-spa docs
2026-10-09 17:38:04 +02:00
5ba1a4ae1d docs(quick-261009-mgk): add the category content field to sm-journal-plugin (D-21) 2026-10-09 16:29:19 +02:00
56f3d9c59f docs(quick-261009-i6e): add the anonymous author endpoint to sm-journal-plugin (D-20) 2026-10-09 13:23:28 +02:00
f9324470bf docs(16): create phase plan 2026-10-09 12:25:09 +02:00
edf11f967c docs(16): resolve research open questions 2026-10-09 12:25:09 +02:00
6d36ffaef0 docs(16): add pattern map 2026-10-09 11:44:39 +02:00
960de8f1df docs(16): record post-research decisions D-19..D-25 2026-10-09 11:42:22 +02:00
460da612f1 docs(phase-16): add validation strategy 2026-10-09 11:16:49 +02:00
4117a6fce3 docs(16): research phase 2026-10-09 11:16:49 +02:00