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
This commit is contained in:
2026-06-04 14:43:41 +02:00
parent bd7dc648c4
commit 01c1082290
18 changed files with 159 additions and 30 deletions

View File

@@ -31,6 +31,7 @@ export const feedEntryDtoSchema = z.object({
user_id: z.string().uuid(),
user_email: z.string(),
user_display_name: z.string(),
is_federated: z.boolean(),
})
export type FeedEntryDto = z.infer<typeof feedEntryDtoSchema>

View File

@@ -60,6 +60,7 @@ export const keywordDtoSchema = z.object({
})
export const castMemberDtoSchema = z.object({
person_id: z.string(),
tmdb_person_id: z.number(),
name: z.string(),
character: z.string(),
@@ -69,6 +70,7 @@ export const castMemberDtoSchema = z.object({
export type CastMemberDto = z.infer<typeof castMemberDtoSchema>
export const crewMemberDtoSchema = z.object({
person_id: z.string(),
tmdb_person_id: z.number(),
name: z.string(),
job: z.string(),

View File

@@ -68,7 +68,7 @@ export function follow(data: FollowRequest) {
return post("/social/follow", data)
}
export function unfollow(data: FollowRequest) {
export function unfollow(data: ActorUrlRequest) {
return post("/social/unfollow", data)
}

View File

@@ -1,10 +1,12 @@
import { z } from "zod"
import { diaryEntryDtoSchema, paginatedSchema } from "./common"
import { get, put, putForm } from "./client"
import { get, post, put, putForm } from "./client"
export const userSummaryDtoSchema = z.object({
id: z.string().uuid(),
email: z.string(),
username: z.string(),
display_name: z.string().optional(),
total_movies: z.number(),
avg_rating: z.number().optional(),
})
@@ -130,3 +132,7 @@ export function updateProfile(data: UpdateProfileData) {
export function updateProfileFields(data: UpdateProfileFieldsRequest) {
return put("/profile/fields", data)
}
export function reindexSearch() {
return post("/admin/reindex-search")
}

View File

@@ -47,6 +47,7 @@ export function deleteWrapUp(id: string) {
}
export type MovieRef = {
movie_id?: string
title: string
year: number
runtime_minutes?: number
@@ -54,6 +55,7 @@ export type MovieRef = {
}
export type PersonStat = {
person_id?: string
name: string
count: number
avg_rating: number
@@ -91,6 +93,7 @@ export type WrapUpReport = {
first_movie_of_period?: MovieRef
last_movie_of_period?: MovieRef
poster_paths: string[]
top_cast_profile_paths: string[]
}
export function getWrapUpReport(id: string) {