05d062f4e0
fmt
CI / Check / Test (push) Successful in 15m57s
2026-06-09 02:31:02 +02:00
70b3ca0f5c
refactor: split domain models, move presentation logic out of app layer
...
CI / Check / Test (push) Failing after 47s
Split domain/models/mod.rs (630 lines) into focused files:
movie.rs, review.rs, user.rs, stats.rs, enrichment.rs, feed.rs.
Move URL/date formatting from application use cases to
presentation mappers — use cases now return raw domain data.
Delete watchlist/get_page.rs (was pure presentation logic),
replace with presentation/mappers/watchlist.rs.
Document signature conventions in CONTRIBUTING.md.
2026-06-09 02:29:11 +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
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
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
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
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
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
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
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
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
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
241063c914
feat: wrapup date validation, delete endpoint, failed record cleanup
CI / Check / Test (push) Failing after 41s
2026-06-03 00:54:08 +02:00
d52120d6a9
feat: frutiger aero visual overhaul — backgrounds, glass panels, cast photos, full mosaic
CI / Check / Test (push) Failing after 42s
2026-06-03 00:34:13 +02:00
bb503f3ce8
feat: AdminApiUser extractor for Bearer-token admin endpoints
CI / Check / Test (push) Has been cancelled
2026-06-03 00:00:45 +02:00
bf0350c87a
fmt
CI / Check / Test (push) Failing after 6m39s
2026-06-02 23:50:20 +02:00
1e063b6580
feat: streaming video download via ImageStorage::get_stream
CI / Check / Test (push) Failing after 41s
2026-06-02 23:45:31 +02:00
21c33b169e
feat: gate wrapup generate behind admin role
2026-06-02 23:14:06 +02:00
490bd97a40
feat: wire video renderer pipeline + download endpoint
CI / Check / Test (push) Failing after 41s
2026-06-02 22:34:55 +02:00
f00a2cbbb8
feat: HTML wrap-up page with Askama template
2026-06-02 22:28:28 +02:00
ea43911984
feat: wire real wrapup adapters into presentation + worker
2026-06-02 22:19:29 +02:00
5a15bea3d4
feat: wrap-up REST API endpoints
2026-06-02 22:17:11 +02:00
5e740ba2a1
fix: add async_trait + exhaustive match for wrapup events in tests
2026-06-02 22:14:50 +02:00
b171d2d1e2
feat(application): wrapup generate/get/list use cases
2026-06-02 22:09:08 +02:00
4c75113c4f
chore: wire WrapUpStatsQuery panic stub into binaries
CI / Check / Test (push) Failing after 44s
2026-06-02 21:49:54 +02:00
c878c0358f
fix: add 403 response to confirm/dismiss OpenAPI annotations
CI / Check / Test (push) Failing after 6m22s
2026-06-02 21:06:22 +02:00
4067dedb28
refactor: add DomainError::Forbidden + centralize error-to-HTTP mapping
...
Ownership checks (delete_review, confirm/dismiss watch events) now
return Forbidden instead of Unauthorized. Presentation layer maps
DomainError→StatusCode via domain_error_response helper, replacing
verbose per-handler match arms.
2026-06-02 21:00:22 +02:00
28170c95d4
chore: fmt + remove dead federation module
CI / Check / Test (push) Failing after 5m58s
2026-06-02 20:44:08 +02:00
62fd6682c6
refactor: extract view-model mappers from presentation handlers
...
CI / Check / Test (push) Has been cancelled
Move mapping logic (domain→DTO/template structs) into mappers/ module.
Handlers now call mapper fns instead of inline conversions.
2026-06-02 20:43:33 +02:00