use actix_web::{web, HttpRequest, HttpResponse, Responder};
use serde::Deserialize;
use super::response::account_feed_response;
use crate::app_state::AppState;
#[derive(Debug, Default, Deserialize)]
pub struct StreamQuery {
#[serde(default)]
pub since: Option<u64>,
}
pub async fn handler(
state: web::Data<AppState>,
query: web::Query<StreamQuery>,
req: HttpRequest,
) -> impl Responder {
let header_cursor = req
.headers()
.get("Last-Event-ID")
.and_then(|v| v.to_str().ok())
.and_then(|s| s.trim().parse::<u64>().ok());
let since = header_cursor.or(query.since).unwrap_or(0);
let receiver = state.account_sink.subscribe();
let latest_at_start = state.account_sink.latest_seq();
let events_dir = state.account_sink.events_dir().to_path_buf();
tracing::debug!(
"account feed subscription opened (since={since}, latest={latest_at_start})"
);
let response: HttpResponse =
account_feed_response(since, latest_at_start, events_dir, receiver);
response
}