using System.Text.Json.Serialization;
namespace FinlyticCore.Dtos;
///
/// Generic request payload carrying only a limit parameter (e.g. news_GetPending).
///
public record LimitRequest(
[property: JsonPropertyName("limit")] int Limit
);
///
/// Generic request payload for paginated queries with optional ISIN filter.
///
public record PaginatedRequest(
[property: JsonPropertyName("limit")] int Limit,
[property: JsonPropertyName("offset")] int Offset,
[property: JsonPropertyName("isin")] string? Isin = null
);
///
/// Request payload for daily-news queries with optional filters.
///
public record DailyNewsRequest(
[property: JsonPropertyName("limit")] int Limit,
[property: JsonPropertyName("offset")] int Offset,
[property: JsonPropertyName("isin")] string? Isin = null,
[property: JsonPropertyName("date")] string? Date = null,
[property: JsonPropertyName("status")] string? Status = null,
[property: JsonPropertyName("query")] string? Query = null,
[property: JsonPropertyName("hasSentiment")] bool? HasSentiment = null
);
///
/// Request payload for fetching fundamentals or technical-analysis data by ISIN.
///
public record IsinRequest(
[property: JsonPropertyName("isin")] string Isin,
[property: JsonPropertyName("ticker")] string? Ticker = "",
[property: JsonPropertyName("forceRefresh")] bool ForceRefresh = false
);
///
/// Request payload for fetching trades filtered by ISIN and/or status.
///
public record GetTradesRequest(
[property: JsonPropertyName("isin")] string? Isin = null,
[property: JsonPropertyName("status")] string? Status = null,
[property: JsonPropertyName("userId")] string? UserId = null
);
///
/// Request payload for fetching sentiment by article ID.
///
public record ArticleRequest(
[property: JsonPropertyName("articleId")] string ArticleId,
[property: JsonPropertyName("id")] string? Id = null
);
///
/// Request payload for triggering a manual sentiment analysis for an article or ISIN.
///
public record AnalyzeSentimentRequest(
[property: JsonPropertyName("articleId")] string? ArticleId = null,
[property: JsonPropertyName("isin")] string? Isin = null,
[property: JsonPropertyName("forceReload")] bool ForceReload = false
);
///
/// Empty request payload for MQTT RPCs that require no parameters (e.g. events_GetAll).
///
public record EmptyRequest;
///
/// Request payload for triggering a manual AI analysis.
///
public record ManualAnalysisRpcRequest(
[property: JsonPropertyName("isin")] string Isin,
[property: JsonPropertyName("symbol")] string Symbol,
[property: JsonPropertyName("sector")] string Sector,
[property: JsonPropertyName("headline")] string Headline,
[property: JsonPropertyName("currentPrice")] decimal CurrentPrice,
[property: JsonPropertyName("riskScore")] int RiskScore,
[property: JsonPropertyName("minTimeframeValue")] int MinTimeframeValue,
[property: JsonPropertyName("maxTimeframeValue")] int MaxTimeframeValue,
[property: JsonPropertyName("timeframeUnit")] string TimeframeUnit,
[property: JsonPropertyName("instrumentType")] string InstrumentType,
[property: JsonPropertyName("userNotes")] string UserNotes,
[property: JsonPropertyName("taData")] FinlyticCore.Dtos.TechnicalAnalysis.TechnicalAnalysisDto? TaData,
[property: JsonPropertyName("fundamentalsData")] FinlyticCore.Dtos.Fundamentals.AssetFundamentalsDto? FundamentalsData,
[property: JsonPropertyName("sentimentData")] FinlyticCore.Dtos.Sentiment.IsinSentimentSummaryDto? SentimentData
);
///
/// Response payload returned by microservice health pings over MQTT.
///
public record ServiceHealthResponse(
[property: JsonPropertyName("serviceName")] string ServiceName,
[property: JsonPropertyName("status")] string Status,
[property: JsonPropertyName("timestamp")] DateTime Timestamp,
[property: JsonPropertyName("dbStatus")] string DbStatus
);
///
/// Response payload for assets_FetchLogo RPC request.
///
public record FetchLogoResponse(
[property: JsonPropertyName("isin")] string? Isin,
[property: JsonPropertyName("path")] string? Path,
[property: JsonPropertyName("success")] bool Success
);
///
/// Payload published to MQTT when the Admin Panel updates a microservice's configuration.
/// Replaces the anonymous type to be compatible with AOT/source-gen JSON serialization.
///
public record ServiceConfigUpdatePayload(
[property: JsonPropertyName("serviceName")] string ServiceName,
[property: JsonPropertyName("timestamp")] DateTime Timestamp,
[property: JsonPropertyName("settings")] Dictionary Settings
);
///
/// Payload published to MQTT when a live market tick is received.
///
public record TickMessageDto(
[property: JsonPropertyName("price")] decimal Price
);