6d3182525f
fmt
CI / Check / Test (push) Has been cancelled
2026-06-09 02:16:18 +02:00
7bcbc59587
fix: implement get_all_reviews_for_user, add crate metadata
...
CI / Check / Test (push) Failing after 43s
Replace todo!() stubs in sqlite/postgres adapters with
actual queries. Add description+license to presentation crate.
2026-06-09 02:12:35 +02:00
d867a14b28
add 400+ unit tests for domain and application layers
...
CI / Check / Test (push) Has been cancelled
Extract ReviewLogger trait to decouple import/integrations
from diary::log_review (cross-module coupling smell).
Add in-memory fakes for all repository ports, enabling
isolated testing of every use case module without a database.
Coverage: domain+application 22% → 80%, 427 tests.
2026-06-09 02:07:26 +02:00
30a6200b5b
remove wrapup video rendering (ffmpeg)
...
CI / Check / Test (push) Successful in 15m34s
SPA handles wrapup visuals client-side; server-side
renderer was dead code pulling in ffmpeg + image crates.
2026-06-09 00:36:44 +02:00
f4fd915e35
refactor: replace sqlx compile-time macros with runtime queries
...
CI / Check / Test (push) Failing after 44s
No longer requires DATABASE_URL at build time.
2026-06-09 00:19:02 +02:00
9e4370b068
fix: register goal + settings endpoints in OpenAPI spec
CI / Check / Test (push) Has been cancelled
2026-06-09 00:07:29 +02:00
a7a11dde08
refactor: split monolithic handlers + testing into domain-grouped modules
...
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
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
4dacbbfded
fix: update poster_url on remote review Update activity
...
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
...
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
237f1e7d32
style: fmt persons test
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
CI / Check / Test (push) Failing after 44s
2026-06-04 17:58:01 +02:00
7e8a1b8379
feat: batteries-included deployment — compose, .env.example, sane defaults
CI / Check / Test (push) Failing after 6m21s
2026-06-04 17:32:34 +02:00
49728f8cd7
fix: fall back to converted extensions in object storage get
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
CI / Check / Test (push) Failing after 6m45s
2026-06-04 16:09:35 +02:00
dacc057af6
fix: lazy-load wrapup backgrounds, cap sqlite pool to 4 connections
...
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
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
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
CI / Check / Test (push) Failing after 6m35s
2026-06-03 10:17:43 +02:00
c798b851dc
fmt
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
fad73a9fab
feat: add embed_profile.html template
2026-06-03 10:07:45 +02:00
627db45a56
feat: add embed_base.html template shell
2026-06-03 10:07:43 +02:00
976d872eed
feat: add EmbedProfileTemplate struct
2026-06-03 10:07:41 +02:00
6c7ce24e1f
feat: add embed param to ProfileQueryParams
2026-06-03 10:07:39 +02:00
6668ba511c
fmt
CI / Check / Test (push) Failing after 6m32s
2026-06-03 01:38:25 +02:00
430fbb21ea
refactor: rename image-storage crate to object-storage
CI / Check / Test (push) Failing after 44s
2026-06-03 01:37:14 +02:00
f262417971
refactor: rename ImageStorage → ObjectStorage
CI / Check / Test (push) Failing after 46s
2026-06-03 01:33:08 +02:00
d94ccbe057
refactor: store typed WrapUpReport in domain, serialize in adapters
CI / Check / Test (push) Failing after 45s
2026-06-03 01:25:16 +02:00
e4b8ba550e
refactor: extract storage key conventions into WrapUpStorage
CI / Check / Test (push) Failing after 43s
2026-06-03 01:20:51 +02:00
3cec726e3d
refactor: move VideoRenderConfig from domain to adapter, inject at construction
CI / Check / Test (push) Failing after 44s
2026-06-03 01:18:52 +02:00
e8e83d3f16
assets + fmt
CI / Check / Test (push) Has been cancelled
2026-06-03 01:13:06 +02:00
8cabc6af70
fix: clippy — redundant closure in AdminApiUser
CI / Check / Test (push) Has been cancelled
2026-06-03 01:12:36 +02:00
e378191045
fix: clippy — collapse nested if in cast photo store
CI / Check / Test (push) Has been cancelled
2026-06-03 01:12:07 +02:00
bca07b7824
fix: clippy — collapse nested ifs, use div_ceil
CI / Check / Test (push) Failing after 41s
2026-06-03 01:11:17 +02:00
857896f057
feat: add video download link to wrapup HTML page
CI / Check / Test (push) Failing after 41s
2026-06-03 01:06:11 +02:00