Fix Unknown Song in search: properly serialize nested relationships
This commit is contained in:
parent
8a46000b9d
commit
45608bfdfb
1 changed files with 33 additions and 4 deletions
|
|
@ -4,7 +4,6 @@ from sqlmodel import Session, select, col
|
||||||
from sqlalchemy.orm import selectinload
|
from sqlalchemy.orm import selectinload
|
||||||
from database import get_session
|
from database import get_session
|
||||||
from models import Show, Song, Venue, Tour, Group, Performance, PerformanceNickname, Comment, Review
|
from models import Show, Song, Venue, Tour, Group, Performance, PerformanceNickname, Comment, Review
|
||||||
from schemas import ShowRead, SongRead, VenueRead, TourRead, GroupRead
|
|
||||||
|
|
||||||
router = APIRouter(prefix="/search", tags=["search"])
|
router = APIRouter(prefix="/search", tags=["search"])
|
||||||
|
|
||||||
|
|
@ -48,22 +47,52 @@ def global_search(
|
||||||
).all()
|
).all()
|
||||||
|
|
||||||
# Search Nicknames
|
# Search Nicknames
|
||||||
nicknames = session.exec(
|
nicknames_raw = session.exec(
|
||||||
select(PerformanceNickname)
|
select(PerformanceNickname)
|
||||||
.options(selectinload(PerformanceNickname.performance).selectinload(Performance.song))
|
.options(
|
||||||
|
selectinload(PerformanceNickname.performance)
|
||||||
|
.selectinload(Performance.song),
|
||||||
|
selectinload(PerformanceNickname.performance)
|
||||||
|
.selectinload(Performance.show)
|
||||||
|
)
|
||||||
.where(col(PerformanceNickname.nickname).ilike(q_str))
|
.where(col(PerformanceNickname.nickname).ilike(q_str))
|
||||||
.where(PerformanceNickname.status == "approved")
|
.where(PerformanceNickname.status == "approved")
|
||||||
.limit(limit)
|
.limit(limit)
|
||||||
).all()
|
).all()
|
||||||
|
|
||||||
|
# Serialize nicknames with nested data
|
||||||
|
nicknames = []
|
||||||
|
for n in nicknames_raw:
|
||||||
|
nicknames.append({
|
||||||
|
"id": n.id,
|
||||||
|
"nickname": n.nickname,
|
||||||
|
"description": n.description,
|
||||||
|
"performance": {
|
||||||
|
"id": n.performance.id if n.performance else None,
|
||||||
|
"song": {"id": n.performance.song.id, "title": n.performance.song.title} if n.performance and n.performance.song else None,
|
||||||
|
"show": {"slug": n.performance.show.slug, "date": str(n.performance.show.date.date()) if n.performance.show else None} if n.performance and n.performance.show else None
|
||||||
|
} if n.performance else None
|
||||||
|
})
|
||||||
|
|
||||||
# Search Performances by notes
|
# Search Performances by notes
|
||||||
performances = session.exec(
|
performances_raw = session.exec(
|
||||||
select(Performance)
|
select(Performance)
|
||||||
.options(selectinload(Performance.song), selectinload(Performance.show))
|
.options(selectinload(Performance.song), selectinload(Performance.show))
|
||||||
.where(col(Performance.notes).ilike(q_str))
|
.where(col(Performance.notes).ilike(q_str))
|
||||||
.limit(limit)
|
.limit(limit)
|
||||||
).all()
|
).all()
|
||||||
|
|
||||||
|
# Serialize performances with nested song/show data
|
||||||
|
performances = []
|
||||||
|
for p in performances_raw:
|
||||||
|
performances.append({
|
||||||
|
"id": p.id,
|
||||||
|
"slug": p.slug,
|
||||||
|
"notes": p.notes,
|
||||||
|
"song": {"id": p.song.id, "title": p.song.title, "slug": p.song.slug} if p.song else None,
|
||||||
|
"show": {"slug": p.show.slug, "date": str(p.show.date.date()) if p.show else None} if p.show else None
|
||||||
|
})
|
||||||
|
|
||||||
# Search Reviews
|
# Search Reviews
|
||||||
reviews = session.exec(
|
reviews = session.exec(
|
||||||
select(Review)
|
select(Review)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue