87 lines
2.9 KiB
Python
87 lines
2.9 KiB
Python
"""
|
|
Chase Notification Service
|
|
Sends email notifications to users when songs they're chasing are played.
|
|
"""
|
|
from sqlmodel import Session, select
|
|
from models import ChaseSong, User, Song, Show, Performance, Venue
|
|
from helpers import create_notification
|
|
|
|
|
|
def notify_chase_users(session: Session, song_id: int, show_id: int, performance_id: int):
|
|
"""
|
|
Send notifications to all users chasing this song.
|
|
Called after a new performance is imported.
|
|
"""
|
|
from services.email_service import send_chase_notification_email
|
|
|
|
# Get song, show, and venue info for the notification
|
|
song = session.get(Song, song_id)
|
|
show = session.get(Show, show_id)
|
|
|
|
if not song or not show:
|
|
return 0
|
|
|
|
venue = session.get(Venue, show.venue_id) if show.venue_id else None
|
|
|
|
# Find all users chasing this song who haven't caught it yet
|
|
chase_songs = session.exec(
|
|
select(ChaseSong)
|
|
.where(ChaseSong.song_id == song_id)
|
|
.where(ChaseSong.caught_at.is_(None)) # Not yet caught
|
|
).all()
|
|
|
|
notified_count = 0
|
|
|
|
for chase in chase_songs:
|
|
user = session.get(User, chase.user_id)
|
|
if not user:
|
|
continue
|
|
|
|
# Create in-app notification
|
|
create_notification(
|
|
session,
|
|
user_id=user.id,
|
|
title="Chase Alert!",
|
|
message=f"{song.title} was played at {venue.name if venue else 'a show'}!",
|
|
type="chase",
|
|
link=f"/performances/{performance_id}" # Link to performance page
|
|
)
|
|
|
|
# Send email if user has chase alerts enabled
|
|
if user.preferences and user.preferences.email_on_chase:
|
|
show_date = show.date.strftime("%Y-%m-%d") if show.date else "Unknown date"
|
|
venue_name = venue.name if venue else "Unknown venue"
|
|
|
|
# Get performance slug for link
|
|
perf = session.get(Performance, performance_id)
|
|
perf_link = f"/performances/{perf.slug}" if perf and perf.slug else f"/shows/{show.slug}"
|
|
|
|
send_chase_notification_email(
|
|
to_email=user.email,
|
|
song_title=song.title,
|
|
show_date=show_date,
|
|
venue_name=venue_name,
|
|
link=perf_link
|
|
)
|
|
notified_count += 1
|
|
|
|
return notified_count
|
|
|
|
|
|
def check_new_performances_for_chases(session: Session, performance_ids: list):
|
|
"""
|
|
Check a list of newly imported performances and notify chase users.
|
|
Call this after batch importing shows.
|
|
"""
|
|
total_notified = 0
|
|
|
|
for perf_id in performance_ids:
|
|
perf = session.get(Performance, perf_id)
|
|
if perf:
|
|
count = notify_chase_users(session, perf.song_id, perf.show_id, perf.id)
|
|
total_notified += count
|
|
|
|
if total_notified > 0:
|
|
print(f"📧 Sent {total_notified} chase notification emails")
|
|
|
|
return total_notified
|