Commit Graph

347 Commits

Author SHA1 Message Date
307113381f docs: add CONTRIBUTING.md with setup, architecture, PR guidelines
Some checks failed
CI / Check / Test (push) Has been cancelled
2026-06-09 00:04:30 +02:00
6d238b6c3d docs: mark TUI as deprecated experiment
Some checks failed
CI / Check / Test (push) Has been cancelled
2026-06-09 00:02:20 +02:00
a7a11dde08 refactor: split monolithic handlers + testing into domain-grouped modules
Some checks failed
CI / Check / Test (push) Has been cancelled
handlers/api.rs (1706 LOC) + html.rs (1735 LOC) → 12 domain files:
auth, diary, movies, users, search, watchlist, goals, social,
integrations, helpers + existing import/webhook/wrapup/images/rss.

domain/testing.rs (1309 LOC) → testing/ module:
in_memory, fakes, noops, panics, wrapup.

Update README + architecture.mmd with goals feature.
2026-06-08 23:59:23 +02:00
988e15eac6 fix: add missing common.edit i18n key
All checks were successful
CI / Check / Test (push) Successful in 18m44s
2026-06-08 22:38:54 +02:00
fff5f4af2f feat: goals — "watch N movies in YEAR" with progress bar
Domain: Goal entity, UserSettings (federation toggle), RemoteGoalEntry.
Ports: GoalRepository, UserSettingsRepository, RemoteGoalRepository.
Adapters: sqlite + postgres repos, migrations, AP content query extensions.
Application: CRUD use cases (create/update/delete/get/list), settings use cases.
API: 7 endpoints (/goals CRUD, /users/{id}/goals, /settings) with utoipa docs.
Federation: GoalObject (Note + goal discriminator), outbound broadcast with
per-user toggle, inbound GoalObjectHandler in CompositeObjectHandler.
SPA: API client + hooks, GoalCard (shadcn Card+Progress+DropdownMenu),
GoalSheet (Drawer), profile integration (editable own, read-only others),
federation toggle in settings (Switch).
Classic HTML: glassmorphic goal card on profile, Frutiger Aero styling.
Progress computed from existing reviews — backwards compatible.
2026-06-08 22:37:52 +02:00
213f9a2433 Remove backdrop filter from input slot in aero-theme.css for improved performance
All checks were successful
CI / Check / Test (push) Successful in 17m46s
2026-06-08 21:05:16 +02:00
4dacbbfded fix: update poster_url on remote review Update activity
All checks were successful
CI / Check / Test (push) Successful in 21m35s
on_update was ignoring posterUrl from the AP note, so remote instances
never got the poster even after receiving the Update.
2026-06-04 23:21:19 +02:00
886f26c7dc fix: broadcast AP Update after poster sync to fix missing posters on remote instances
Some checks failed
CI / Check / Test (push) Has been cancelled
New movies had no poster at AP broadcast time (race between poster sync
and ReviewLogged handler). PosterSynced event now fires after sync
completes, triggering Update notes so remote apps get the poster URL.
2026-06-04 23:12:27 +02:00
6a10ba15c1 feat(spa): comment field in queue review, date picker in log sheet
All checks were successful
CI / Check / Test (push) Successful in 17m20s
2026-06-04 22:35:30 +02:00
237f1e7d32 style: fmt persons test
All checks were successful
CI / Check / Test (push) Successful in 16m49s
2026-06-04 17:59:05 +02:00
c647f4c13b fix: clippy 1.96 lints — map_or, duplicate_mod, needless_borrows, slice_refs
Some checks failed
CI / Check / Test (push) Failing after 44s
2026-06-04 17:58:01 +02:00
3bb2dbee19 ci: split workflows — Gitea tests only, GitHub tests + Docker push
Some checks failed
CI / Check / Test (push) Failing after 6m24s
2026-06-04 17:48:37 +02:00
b0bfc149e1 ci: build + push Docker image to ghcr.io on master/tags
Some checks failed
CI / Build & Push Docker Image (push) Has been cancelled
CI / Check / Test (push) Has been cancelled
2026-06-04 17:47:04 +02:00
7e8a1b8379 feat: batteries-included deployment — compose, .env.example, sane defaults
Some checks failed
CI / Check / Test (push) Failing after 6m21s
2026-06-04 17:32:34 +02:00
4bd8dcbf05 feat: wrapup wow — animated counters, scroll-reveal, fun facts, component split, budget formatting
Some checks failed
CI / Check / Test (push) Failing after 6m25s
2026-06-04 17:15:35 +02:00
ebf9a9f4a8 feat: replace CSS bar charts with recharts, fix label readability
Some checks failed
CI / Check / Test (push) Failing after 6m20s
2026-06-04 17:04:29 +02:00
a76386345f feat: SPA polish — wrapup sections, shareable card, webhook instructions, blocked merge
Some checks failed
CI / Check / Test (push) Failing after 6m35s
2026-06-04 16:56:09 +02:00
49728f8cd7 fix: fall back to converted extensions in object storage get
Some checks failed
CI / Check / Test (push) Failing after 6m36s
2026-06-04 16:22:57 +02:00
5334312d64 refactor: extract reindex + enrichment logic from handlers into use cases
Some checks failed
CI / Check / Test (push) Failing after 6m45s
2026-06-04 16:09:35 +02:00
81a377cbb2 docs: proper SPA readme
Some checks failed
CI / Check / Test (push) Failing after 6m21s
2026-06-04 15:58:03 +02:00
689c8a9ac3 docs: add hexagonal architecture mermaid diagram
Some checks failed
CI / Check / Test (push) Has been cancelled
2026-06-04 15:52:38 +02:00
5e6bc93a6a feat: SPA quick wins — refresh, back nav, watchlist add, dates, haptics, export
Some checks failed
CI / Check / Test (push) Failing after 7m1s
- feed refresh button with spinning icon
- BackButton component using history.back()
- watchlist bookmark icon on search results
- timeAgo/shortDate date formatting (date-fns)
- haptic feedback on star rating, swipe-to-delete, review log
- global error toasts via QueryClient mutation defaults
- diary CSV export button
2026-06-04 15:45:31 +02:00
4a3a99c6d2 fix: disable vaul repositionInputs to fix iOS keyboard in drawers
Some checks failed
CI / Check / Test (push) Failing after 6m35s
2026-06-04 15:35:00 +02:00
dacc057af6 fix: lazy-load wrapup backgrounds, cap sqlite pool to 4 connections
Some checks failed
CI / Check / Test (push) Failing after 6m32s
backgrounds were decoded to RGBA at startup (~173MB for 9 images).
now only store paths, decode on demand during video generation.
2026-06-04 14:57:47 +02:00
01c1082290 feat: SPA bug fixes, interactivity, federation badges, admin reindex
Some checks failed
CI / Check / Test (push) Failing after 10m55s
- fix wrapup status "completed" → "Ready"
- fix unfollow sending {handle} instead of {actor_url}
- fix missing post import in users.ts
- fix feed/activity cache not invalidated on review delete/log
- add person_id to cast/crew types, link to /people pages
- add movie_id to wrapup MovieRef, link highlights to /movies pages
- add wrapup actor profile images + clickable person links
- add federated review globe badge in feed and movie detail
- add fediverse handle (@user@instance) in follower/following cards
- add admin reindex search button in settings
- add wrapup user picker for admins
- add username/display_name to user summary type
- use tmdbProfileUrl for person search results
2026-06-04 14:43:41 +02:00
bd7dc648c4 feat: search reindex, worker improvements, person IDs, user display names
- add admin POST /api/v1/admin/reindex-search endpoint + event-driven handler
- backfill persons from movie_cast/movie_crew into persons table
- paginate person list_page/backfill_from_credits_batch to cap memory
- concurrent worker event dispatch with semaphore (max 8)
- graceful worker shutdown (drain in-flight tasks on SIGINT)
- always ack events, log handler errors as warnings (no infinite retry)
- NATS ack_wait 600s, AtomicBool guard against concurrent reindex
- add username/display_name to UserSummaryDto and users list
- add person_id to CastMemberDto/CrewMemberDto via get_movie_profile use case
- add movie_id to wrapup MovieRef, person_id to wrapup PersonStat
- thread tmdb_person_id through wrapup cast pipeline
- add is_federated to FeedEntryDto
- cap orphaned persons query with LIMIT 500
- add SPA link to classic site footer
2026-06-04 14:43:28 +02:00
af8e58aeb8 fix: use avatar/banner URLs directly, not through posterUrl()
Some checks failed
CI / Check / Test (push) Failing after 11m13s
2026-06-04 04:30:38 +02:00
fd9a053702 fix: exclude spa/.env from docker build to prevent baked localhost URLs
Some checks failed
CI / Check / Test (push) Has been cancelled
2026-06-04 04:27:02 +02:00
092e769641 fix: 401 redirect uses /app/login instead of /login
Some checks failed
CI / Check / Test (push) Has been cancelled
2026-06-04 04:22:20 +02:00
b20d23fbb3 fix: exclude spa/node_modules and spa/dist from docker context 2026-06-04 04:21:25 +02:00
b9c0b10740 feat: add SPA, serve at /app/, update Dockerfile and README
- React + TanStack Router + shadcn/ui SPA under spa/
- serve spa/dist at /app/ with index.html fallback for client routing
- Dockerfile: node build stage for SPA, copy dist into runtime image
- README: document SPA, CORS_ORIGINS env var, architecture entry
- vite base set to /app/, manifest.json paths fixed
2026-06-04 04:20:15 +02:00
15dc0e526b feat: expose display_name, also_known_as, profile fields in GET /profile 2026-06-04 02:58:12 +02:00
cf2f4a1b4f feat: watchlist add accepts title/year/imdb for movies not in DB 2026-06-04 02:47:55 +02:00
e7cdbf9ca7 fix: user profile URLs, typed returns for following/followers
- avatar_url/banner_url now use full base_url + /images/ prefix
- get_user_following/followers return Result<Json<_>, ApiError>
- add ap_to_domain helper for anyhow→DomainError conversion
2026-06-04 02:40:04 +02:00
837b7866af feat: include avatar_url and banner_url in UserProfileResponse 2026-06-04 02:37:16 +02:00
c4908b7765 feat: API endpoints for any user's following/followers 2026-06-04 02:34:01 +02:00
dbc78a1ff4 feat: add user_id to FeedEntryDto 2026-06-04 02:22:08 +02:00
a97e263ed3 fix: always return following/followers counts, only hide pending for non-own profiles 2026-06-04 02:19:27 +02:00
b1d667d3cb fix: user profile returns social counts when viewing own profile 2026-06-04 02:18:28 +02:00
bf73d4a695 feat: CORS, role in auth, banner_url, diary sort, cleanup
- CORS layer on API routes via CORS_ORIGINS env var
- role field in login + profile responses
- banner_url in profile response
- diary sort_by: rating_desc/rating_asc/date_asc/date_desc
- UserRole::as_str() to deduplicate role mapping
- typed DTOs for import preview (replace ad-hoc JSON)
- warn on invalid CORS origins
2026-06-04 02:06:51 +02:00
7b9b0f9ffe feat: API preview endpoint for import sessions 2026-06-04 01:59:09 +02:00
7d6f874ae7 feat: activity feed accepts sort_by param 2026-06-04 01:35:45 +02:00
4206bb4b06 fix: diary sort_by rating_desc/rating_asc in all/movie queries 2026-06-04 01:28:35 +02:00
004243dcbb fix: use embed=true for serde bool compat
Some checks failed
CI / Check / Test (push) Failing after 6m35s
2026-06-03 10:17:43 +02:00
c798b851dc fmt
Some checks failed
CI / Check / Test (push) Has been cancelled
2026-06-03 10:14:53 +02:00
c18d4eebc1 fix: use array instead of vec for clippy 2026-06-03 10:14:20 +02:00
3f6e01ed65 feat: add embed snippet to profile settings 2026-06-03 10:09:38 +02:00
19642175eb feat: wire embed param to EmbedProfileTemplate 2026-06-03 10:08:51 +02:00
8ca378b25f feat: add embed.css standalone stylesheet 2026-06-03 10:07:46 +02:00
fad73a9fab feat: add embed_profile.html template 2026-06-03 10:07:45 +02:00