Commit Graph

73 Commits

Author SHA1 Message Date
Claudio Ortolina ff3f809c2c ML-170: add enrichment fields to collection API
Add MusicLibrary.Collection.Enrichment module with batch scrobble, artist
country, and selected release enrichment from existing tables.

Wire enrichment into all four collection API endpoints (index, latest,
random, on_this_day). New JSON fields: scrobble_count, last_listened_at,
artist_country, selected_release.

Uses 3 fixed-count batch queries regardless of page size — no N+1 risk.
No schema changes or migrations required.
2026-05-22 13:21:14 +01:00
Claudio Ortolina e204e555bd ML-188: guard PubSub record updates during edit mode
Add live_action guard to handle_info({:update, record}) in both
CollectionLive.Show and WishlistLive.Show. When the user is editing,
background worker updates are skipped and a warning toast is shown
instead of overwriting the socket. Normal show-mode updates and
mismatched-ID no-ops are unchanged.

6 tests added covering all three code paths.
2026-05-19 11:38:42 +01:00
Claudio Ortolina 8391cf275a ML-180: remove backup download feature
Delete ArchiveController, its routes, the maintenance UI backup
button, and the test file. Management scripts and Litestream
supersede this functionality.
2026-05-15 07:13:33 +01:00
Claudio Ortolina a59dd22a18 ML-168: broadcast index_changed event after background import
Import workers now broadcast :records_index_changed on
"records:index_changed" after successful import via
Records.broadcast_index_changed/0.

CollectionLive.Index and WishlistLive.Index subscribe to the
topic in mount/3 and reload their record streams on receipt,
with a live_action guard to skip reloads when the grid is
hidden behind a modal (:import, :barcode_scan).

IndexActions.handle_index_changed/1 refreshes total_entries
before reloading to keep the pagination bar accurate.
2026-05-14 17:15:06 +01:00
Claudio Ortolina 2a9c54cb42 Sync docs: Elixir 1.20.0-rc.5, Oban pruner 7d, Docker builder 2026-05-13 21:13:51 +01:00
Claudio Ortolina 731c82cf30 Update architecture docs for collection API changes 2026-05-11 07:48:52 +01:00
Claudio Ortolina 777eec46f8 Update architecture docs: PubSub starts before Oban 2026-05-08 18:02:34 +01:00
Claudio Ortolina 829d0a2caa Update docs for Presto, PubSub, and Node.js 26
Add Presto companion display to architecture overview. Document collection API cover sizes (cover, thumb/480px, mini/150px, micro/40px). Update PubSub topic table and LiveView conventions for handle_params subscription management. Bump Node.js version from 25 to 26 in production infrastructure.
2026-05-07 10:57:23 +01:00
Claudio Ortolina cccd28a9f9 ML-165: implementation 2026-05-05 13:43:18 +01:00
Claudio Ortolina 5888324cc7 Run prettier on all relevant files 2026-05-05 10:45:25 +01:00
Claudio Ortolina 7c6760d7db ML-158: force single-line log output in production
Three-layer architecture:
- Logster v2 handles HTTP request and LiveView socket telemetry in logfmt format
- Custom formatter as safety net escaping any remaining embedded newlines
- Config flag (single_line_logging) gating Logster attachment to prod only

Dev environment retains multi-line format for readability.
2026-05-04 15:01:10 +01:00
Claudio Ortolina 51bd24d5b4 ML-162: enable /api/v1/errors endpoint 2026-05-04 13:14:40 +01:00
Claudio Ortolina b8b3b24ffa ML-151: document Assets.Cache TTL and invalidation strategy
Expand @moduledoc with cache key structure, 7-day TTL via
@one_week_seconds, periodic pruning by PruneAssetCache (every 12h),
and rationale for TTL-only invalidation (content-addressable immutable
assets). Update architecture.md entry accordingly.
2026-04-30 13:07:06 +01:00
Claudio Ortolina c489fde1cc ML-152: add /api/v1/ version prefix to all API routes 2026-04-30 11:57:43 +01:00
Claudio Ortolina 9113df5879 ML-146: honour API retry headers 2026-04-25 07:39:49 +01:00
Claudio Ortolina ed2e91400c Update documentation for ML-21, ML-9, and Erlang 28.5
- architecture.md: document new ErrorResponse behaviour, HttpError, and
  Worker.ErrorHandler modules plus per-API ErrorResponse pattern
- project-conventions.md: capture API-failure → Oban tuple convention and
  mix_audit CI/pre-commit run
- production-infrastructure.md: bump builder image Erlang to 28.5 and
  note mix_audit in the lint step
2026-04-24 14:29:35 +01:00
Claudio Ortolina 252caf31ce ML-11: Improve performance of Telemetry.Storage with in-memory buffer 2026-04-24 10:30:28 +01:00
Claudio Ortolina ed7dd8de03 Update architecture docs for scrobble route restructure 2026-04-23 15:26:08 +01:00
Claudio Ortolina 8d004d39cc Extract shared cart sidebar component 2026-04-20 15:57:44 +01:00
Claudio Ortolina fd93aaed30 Update architecture docs 2026-04-20 15:15:29 +01:00
Claudio Ortolina 9fa94714c8 Update architecture docs 2026-04-15 15:03:21 +01:00
Claudio Ortolina e43bccb9bc Extract shared index logic into LiveHelpers.IndexActions
Closes #150
2026-04-13 23:09:22 +01:00
Claudio Ortolina a1b775f0ae Fix architecture docs to reflect gpt-5.1 for CollectionChat 2026-04-13 13:15:10 +01:00
Claudio Ortolina 50407f154e Update architecture docs for Collection Chat 2026-04-13 12:17:27 +01:00
Claudio Ortolina a983698c72 Document SQLite query optimization conventions 2026-04-11 23:46:23 +01:00
Claudio Ortolina d3da4e4559 Update architecture docs for embedding ownership 2026-04-11 21:48:59 +01:00
Claudio Ortolina 90a0491924 Update architecture docs with QueryReporter 2026-04-10 10:31:21 +01:00
Claudio Ortolina eeb0763466 Deduplicate and consolidate project docs
Remove redundant sections from production-infrastructure.md that
duplicated architecture.md (Oban queues/plugins/cron, external API
integrations, SQLite extensions, scheduled maintenance). Absorb API
rate limits into architecture.md's integration table. Replace tool
versions table with pointer to mise.toml. Add two conventions from
project history: scoped test setup and single-path shared components.
2026-04-09 15:19:32 +01:00
Claudio Ortolina 67c01ab1fa Update architecture and infrastructure docs 2026-04-09 15:09:32 +01:00
Claudio Ortolina 4be9db6417 Refactor DefaultPrompt into Chats.Prompt with build/2 2026-04-05 08:32:03 +01:00
Claudio Ortolina ec12be613b Extract a default prompt 2026-04-04 23:35:30 +01:00
Claudio Ortolina 690846021e Update architecture documentation 2026-04-04 15:07:55 +01:00
Claudio Ortolina 74f514afc1 Update architecture documentation 2026-04-04 08:34:10 +01:00
Claudio Ortolina 3f7da55e50 Add a release tracked badge to records in lists 2026-04-02 11:52:07 +01:00
Claudio Ortolina 24f061646e Fix migration strategy docs to match production
Coolify runs migrations post-deploy via rel/overlays/bin/migrate,
not on boot. Update both architecture and infrastructure docs.

Closes #141
2026-03-30 14:15:23 +01:00
Claudio Ortolina c39202c5eb Update documentation 2026-03-30 10:59:14 +01:00
Claudio Ortolina 76b2ce6eea Update documentation 2026-03-29 23:11:36 +01:00
Claudio Ortolina 4db7442ad5 Update architecture docs 2026-03-28 10:26:46 +00:00
Claudio Ortolina 5c5a523fe6 Move scrobble refresh infra to Oban 2026-03-28 09:00:18 +00:00
Claudio Ortolina 47f8eddff1 Move BackfillScrobbledTracks worker under MusicLibrary namespace 2026-03-28 08:05:02 +00:00
Claudio Ortolina 4e2e0605ed Update architecture docs for ListeningStats refactor 2026-03-27 23:18:23 +00:00
Claudio Ortolina fa20428989 Update documentation 2026-03-26 23:04:53 +00:00
Claudio Ortolina 7342256afe Update documentation 2026-03-24 15:14:18 +00:00
Claudio Ortolina 58d1fc62c2 Update architecture and infrastructure docs 2026-03-22 17:19:50 +00:00
Claudio Ortolina 3639043882 Update architecture docs 2026-03-22 08:18:32 +00:00
Claudio Ortolina b12e70f471 Refactor charts to use plain HTML
More responsive, less edge cases, and simpler to maintain.
2026-03-21 18:00:06 +00:00
Claudio Ortolina 47b6f44273 Update architecture and infrastructure docs 2026-03-21 09:31:03 +00:00
Claudio Ortolina 56d9d6bfd7 Use MDEx streaming to render chat content 2026-03-20 23:42:10 +00:00
Claudio Ortolina 1ee4d3465a Move /dev/maintenance to /maintenance 2026-03-18 07:44:22 +00:00
Claudio Ortolina 49aef5a4cb Update architecture docs 2026-03-17 14:31:52 +00:00