Commit Graph
147 Commits
Author SHA1 Message Date
ik 8e419c1832 feat: filter external moderation queue
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 21:37:10 +07:00
ik 6e18e8e565 feat: add admin operations dashboard 2026-09-12 21:35:18 +07:00
ik 7c28a0c36a security: rate limit admin authentication 2026-09-12 21:33:26 +07:00
ik ff8ea40d40 security: expire admin browser sessions 2026-09-12 21:29:18 +07:00
ik ca22042d18 security: harden admin external links 2026-09-12 21:26:51 +07:00
ik 1776283a95 refactor: assign submissions to dedicated router 2026-09-12 21:21:34 +07:00
ik 31bbc15535 refactor: isolate submission rate limiting 2026-09-12 21:19:10 +07:00
ik e48b9ef876 refactor: extract public data router 2026-09-12 21:15:51 +07:00
ik 6974ae690d refactor: extract activity and spot router
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 21:12:35 +07:00
ik b84f1fe815 refactor: extract public catalog router
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 21:05:13 +07:00
ik 8d7fab97b9 ci: lock generated OpenAPI contract 2026-09-12 21:03:37 +07:00
ik 049f1ef30a refactor: separate migrations from API runtime
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 16:02:19 +07:00
ik 868278fdba security: restrict MinIO app to one bucket 2026-09-12 16:01:00 +07:00
ik 52ff29668e feat: add visual links between atlas entities 2026-09-12 15:46:36 +07:00
ik 45c7e65bc4 feat: connect atlas pages with breadcrumb line 2026-09-12 15:44:38 +07:00
ik cadd5607b8 feat: compose atlas identity for fishing pairs
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 15:37:54 +07:00
ik 2ce1e20af2 feat: add unique waterbody fingerprints 2026-09-12 15:35:57 +07:00
ik 80d534d549 feat: add semantic tackle glyphs 2026-09-12 15:30:40 +07:00
ik c3e847c249 feat: distinguish fish by visual family
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 15:28:24 +07:00
ik 966000b0b0 feat: transform catalogs into field atlas 2026-09-12 15:20:26 +07:00
ik a8b1775169 refactor: establish brand motion system
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 10:07:47 +07:00
ik 0c25cf020f refactor: unify action hierarchy 2026-09-12 10:05:49 +07:00
ik 2477543029 refactor: unify public state panels 2026-09-12 10:02:19 +07:00
ik c944db54af refactor: unify catalog page heroes
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 09:59:14 +07:00
ik 9647667ae2 refactor: unify editorial section headings 2026-09-12 09:57:56 +07:00
ik fc22795b63 refactor: clarify visual motif grammar
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 09:56:16 +07:00
ik 1fabf21935 refactor: introduce semantic brand tokens 2026-09-12 09:54:26 +07:00
ik b0dd703f72 feat: establish brand identity hierarchy 2026-09-12 09:49:19 +07:00
ik 987d9ea109 perf: establish frontend performance baseline 2026-09-12 09:46:52 +07:00
ik e7f3de1ddc fix: tighten narrow viewport behavior
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 09:42:17 +07:00
ik 4fef0e8b74 feat: add accessible queue loading states
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-11 08:08:52 +07:00
ik 8f76f70409 feat: add activity level legend to spot view 2026-09-11 07:54:16 +07:00
ik 8c94d40766 feat: add one-click coordinate copying 2026-09-11 07:52:07 +07:00
ik 1ffaf7478d fix: synchronize normalized records on import revisions 2026-09-11 07:50:31 +07:00
ik 2ad2bdcdff fix: mark catalog outage pages as SEO errors
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-11 07:49:58 +07:00
ik 0b7bbc78a6 fix: make report and idempotency insert transactional 2026-09-11 07:47:36 +07:00
ik fc963101b3 fix: handle concurrent idempotency key conflicts 2026-09-11 07:46:50 +07:00
ik 67d81f81ff fix: keep advanced filters accessible on mobile 2026-09-11 07:45:45 +07:00
ik 5b2db1cf48 fix: reject idempotency key payload conflicts 2026-09-11 07:44:07 +07:00
ik 531f1aa82f fix: replay idempotent upload token safely 2026-09-11 07:42:41 +07:00
ik 486e4c4673 fix: wire report idempotency and bootstrap scheduler check 2026-09-11 07:41:55 +07:00
ik bea3b9ccbb fix: align recovery schema idempotency and record counts 2026-09-11 07:40:58 +07:00
ik 13e04e6c66 A12: Add meaningful changes/provenance to ImportRecordEvent, skip events for unchanged data
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-11 07:36:21 +07:00
ik 5107a7c467 A11: Use requirements-lock.txt in Dockerfile for reproducible builds 2026-09-11 07:35:35 +07:00
ik 641374ddbc A05: Add server-side idempotency for catch report creation via Idempotency-Key header 2026-09-11 07:35:01 +07:00
ik f29ec706fd R09: Add PaginatedOfficialRecordOut schema and paginated /api/v1/records endpoint 2026-09-10 20:27:45 +07:00
ik ec3a1ca516 A09: Use static registry for CLI choices, check enabled at runtime
Bug: 'choices=configured_sources()' in argparse opened DB session at
import time, causing --help to fail when DB was unavailable.

Fix:
- Added STATIC_SOURCE_CHOICES list with known source keys
- argparse uses static choices — no DB required for --help
- fetch-community command now checks enabled status at runtime
- Disabled sources return error: 'source X is disabled or not configured'
- run_source still handles locked/cooling down state

Verification:
- CLI --help works without DB
- fetch-community --help shows all known sources
- Disabled sources are rejected at runtime with clear error
- 124/124 Python tests pass (1 skipped)
2026-09-10 19:53:15 +07:00
ik e2223c6f24 A07: Fix _auto_publish to allow fish name fallback without external_id
Bug: 'observation.fish_external_id is None' in early return prevented
auto-publishing observations that only have fish_name (no external_id),
even when name-based fallback matching was available.

Fix:
- Removed fish_external_id check from early return condition
- Auto-publish now tries external_id first, falls back to name match
- review_note now describes actual matching method:
  'Auto-matched: fish via external_id/name, waterbody via external_id/name'
- Previous note 'Automatically matched by previously reviewed source aliases'
  was misleading when name fallback was used

Verification:
- 14/14 community_importer tests pass
- 124/124 Python tests pass (1 skipped)
- Observations without fish_external_id can now auto-publish via name match
- review_note accurately describes matching method
2026-09-10 19:42:56 +07:00
ik 883e63aa8b A01: Fix scheduler aggregation to not mask stale/failed sources
Bug: has_any_success allowed one healthy source to give overall 'ready'
when another source was stale/not_started/running — masking failures.

Fix:
- Added has_any_stale and has_any_running tracking
- Overall status is 'degraded' if ANY source is failed/stale/running
- Overall status is 'ready' ONLY when ALL enabled sources are healthy
- 'not_started' when no sources are enabled
- readiness (ready flag) still NOT blocked by import health (A01 requirement)

Verification:
- 7/7 readiness tests pass
- 124/124 Python tests pass (1 skipped)
- Stale source now shows 'degraded' instead of 'ready'
- Failed source still shows 'degraded'
- All healthy sources show 'ready'
2026-09-10 19:32:33 +07:00
ik e996c6da41 A08: Pass errorPage on all pages with potential errors
Bug: Only index.astro passed errorPage={filterError}, missing:
- index.astro unavailable (503) — Dataset оставался на error page
- spots/[id].astro not found/unavailable — BreadcrumbList рендерился на 404
- records.astro unavailable (503) — no structuredData but should be explicit

Fix:
- index.astro: errorPage={filterError || unavailable}
- spots/[id].astro: errorPage={!spot || unavailable}
- records.astro: errorPage={unavailable}
- report.astro: не нужен (structuredData не передаётся)

Verification:
- Astro build: 0 errors
- Error pages (422, 503, 404) skip structuredData
- Normal pages include structuredData
- noindex still works for robots meta tag
2026-09-10 19:12:15 +07:00