2025-06-29 19:04:36 +02:00
|
|
|
|
// Fill out your copyright notice in the Description page of Project Settings.
|
|
|
|
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
|
|
#include "CoreMinimal.h"
|
2025-07-09 03:27:23 +02:00
|
|
|
|
#include "Types/Enum/DTFluxCoreEnum.h"
|
2025-06-29 19:04:36 +02:00
|
|
|
|
#include "UObject/Object.h"
|
|
|
|
|
|
#include "DTFluxRequestStructs.generated.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Struct representing a base json object request to the server
|
|
|
|
|
|
* Used to request data to the server
|
|
|
|
|
|
*/
|
|
|
|
|
|
USTRUCT()
|
|
|
|
|
|
struct FDTFluxRequestBase
|
|
|
|
|
|
{
|
|
|
|
|
|
GENERATED_BODY()
|
2025-07-08 16:50:31 +02:00
|
|
|
|
|
2025-06-29 19:04:36 +02:00
|
|
|
|
public:
|
|
|
|
|
|
UPROPERTY()
|
|
|
|
|
|
FString Path = "";
|
2025-07-08 16:50:31 +02:00
|
|
|
|
|
|
|
|
|
|
FDateTime CreatedAt = FDateTime::Now();
|
|
|
|
|
|
FGuid RequestId = FGuid::NewGuid();
|
2025-06-29 19:04:36 +02:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Struct representing a RaceData json object request to the server
|
|
|
|
|
|
* RaceData represents all data concerning the Race and its different Contests, Stages and Splits.
|
|
|
|
|
|
*/
|
|
|
|
|
|
USTRUCT()
|
2025-07-08 16:50:31 +02:00
|
|
|
|
struct FDTFluxRaceDataRequest : public FDTFluxRequestBase
|
2025-06-29 19:04:36 +02:00
|
|
|
|
{
|
|
|
|
|
|
GENERATED_BODY()
|
2025-07-08 16:50:31 +02:00
|
|
|
|
|
2025-06-29 19:04:36 +02:00
|
|
|
|
public:
|
2025-07-08 16:50:31 +02:00
|
|
|
|
FDTFluxRaceDataRequest()
|
|
|
|
|
|
{
|
2025-06-29 19:04:36 +02:00
|
|
|
|
Path = "race-datas";
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Struct representing a TeamList json object request to the server
|
|
|
|
|
|
* TeamList is the list of participants of the events
|
|
|
|
|
|
*/
|
|
|
|
|
|
USTRUCT()
|
2025-07-08 16:50:31 +02:00
|
|
|
|
struct FDTFluxTeamListRequest : public FDTFluxRequestBase
|
2025-06-29 19:04:36 +02:00
|
|
|
|
{
|
|
|
|
|
|
GENERATED_BODY()
|
2025-07-08 16:50:31 +02:00
|
|
|
|
|
2025-06-29 19:04:36 +02:00
|
|
|
|
public:
|
2025-07-08 16:50:31 +02:00
|
|
|
|
FDTFluxTeamListRequest()
|
|
|
|
|
|
{
|
2025-06-29 19:04:36 +02:00
|
|
|
|
Path = "team-list";
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Struct representing a Ranking json request object for a specific to the server
|
|
|
|
|
|
*/
|
|
|
|
|
|
USTRUCT()
|
2025-07-08 16:50:31 +02:00
|
|
|
|
struct FDTFluxContestRankingRequest : public FDTFluxRequestBase
|
2025-06-29 19:04:36 +02:00
|
|
|
|
{
|
|
|
|
|
|
GENERATED_BODY()
|
2025-07-08 16:50:31 +02:00
|
|
|
|
|
2025-06-29 19:04:36 +02:00
|
|
|
|
public:
|
|
|
|
|
|
FDTFluxContestRankingRequest()
|
|
|
|
|
|
{
|
|
|
|
|
|
Path = "contest-ranking";
|
|
|
|
|
|
ContestID = -1;
|
|
|
|
|
|
}
|
2025-07-08 16:50:31 +02:00
|
|
|
|
|
2025-06-29 19:04:36 +02:00
|
|
|
|
FDTFluxContestRankingRequest(int InContestID)
|
|
|
|
|
|
{
|
|
|
|
|
|
Path = "contest-ranking";
|
|
|
|
|
|
ContestID = InContestID;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
UPROPERTY()
|
|
|
|
|
|
int ContestID;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Struct representing a Ranking json request object for a specific Stage to the server
|
|
|
|
|
|
*/
|
|
|
|
|
|
USTRUCT()
|
2025-07-08 16:50:31 +02:00
|
|
|
|
struct FDTFluxStageRankingRequest : public FDTFluxRequestBase
|
2025-06-29 19:04:36 +02:00
|
|
|
|
{
|
|
|
|
|
|
GENERATED_BODY()
|
2025-07-08 16:50:31 +02:00
|
|
|
|
|
2025-06-29 19:04:36 +02:00
|
|
|
|
public:
|
|
|
|
|
|
FDTFluxStageRankingRequest()
|
|
|
|
|
|
{
|
|
|
|
|
|
Path = "stage-ranking";
|
|
|
|
|
|
ContestID = -1;
|
|
|
|
|
|
StageID = -1;
|
|
|
|
|
|
SplitID = -1;
|
|
|
|
|
|
}
|
2025-07-08 16:50:31 +02:00
|
|
|
|
|
2025-06-29 19:04:36 +02:00
|
|
|
|
FDTFluxStageRankingRequest(int InContestID, int InStageId)
|
|
|
|
|
|
{
|
|
|
|
|
|
Path = "stage-ranking";
|
|
|
|
|
|
ContestID = InContestID;
|
|
|
|
|
|
StageID = InStageId;
|
|
|
|
|
|
SplitID = -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
UPROPERTY()
|
|
|
|
|
|
int ContestID;
|
|
|
|
|
|
UPROPERTY()
|
|
|
|
|
|
int StageID;
|
|
|
|
|
|
UPROPERTY()
|
|
|
|
|
|
int SplitID;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Struct representing a Ranking json request object for a specific Split to the server
|
|
|
|
|
|
*/
|
|
|
|
|
|
USTRUCT()
|
2025-07-08 16:50:31 +02:00
|
|
|
|
struct FDTFluxSplitRankingRequest : public FDTFluxStageRankingRequest
|
2025-06-29 19:04:36 +02:00
|
|
|
|
{
|
|
|
|
|
|
GENERATED_BODY()
|
2025-07-08 16:50:31 +02:00
|
|
|
|
|
2025-06-29 19:04:36 +02:00
|
|
|
|
public:
|
|
|
|
|
|
FDTFluxSplitRankingRequest()
|
|
|
|
|
|
{
|
|
|
|
|
|
Path = "stage-ranking";
|
|
|
|
|
|
ContestID = -1;
|
|
|
|
|
|
StageID = -1;
|
|
|
|
|
|
SplitID = -1;
|
|
|
|
|
|
}
|
2025-07-08 16:50:31 +02:00
|
|
|
|
|
2025-06-29 19:04:36 +02:00
|
|
|
|
FDTFluxSplitRankingRequest(int InContestID, int InStageId, int InSplitId)
|
|
|
|
|
|
{
|
|
|
|
|
|
Path = "stage-ranking";
|
|
|
|
|
|
ContestID = InContestID;
|
|
|
|
|
|
StageID = InStageId;
|
|
|
|
|
|
SplitID = InSplitId;
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
2025-07-09 03:27:23 +02:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief Structure représentant une requête en file d'attente avec ses métadonnées
|
|
|
|
|
|
*/
|
|
|
|
|
|
USTRUCT(BlueprintType)
|
|
|
|
|
|
struct FDTFluxQueuedRequest : public FDTFluxRequestBase
|
|
|
|
|
|
{
|
|
|
|
|
|
GENERATED_BODY()
|
|
|
|
|
|
|
|
|
|
|
|
/** L'identifiant unique de la requête */
|
|
|
|
|
|
UPROPERTY(BlueprintReadOnly, Category = "DTFlux|Request")
|
|
|
|
|
|
FGuid RequestId;
|
|
|
|
|
|
|
|
|
|
|
|
/** L'heure à laquelle la requête a été envoyée */
|
|
|
|
|
|
UPROPERTY(BlueprintReadOnly, Category = "DTFlux|Request")
|
|
|
|
|
|
FDateTime CreatedAt;
|
|
|
|
|
|
|
|
|
|
|
|
/** Le type de requête */
|
|
|
|
|
|
UPROPERTY(BlueprintReadOnly, Category = "DTFlux|Request")
|
|
|
|
|
|
EDTFluxApiDataType RequestType = EDTFluxRequestType::None;
|
|
|
|
|
|
|
|
|
|
|
|
/** Identifiant de la compétition (ContestId) */
|
|
|
|
|
|
UPROPERTY(BlueprintReadOnly, Category = "DTFlux|Request")
|
|
|
|
|
|
int32 ContestId = -1;
|
|
|
|
|
|
|
|
|
|
|
|
/** Identifiant de l'étape (StageId) */
|
|
|
|
|
|
UPROPERTY(BlueprintReadOnly, Category = "DTFlux|Request")
|
|
|
|
|
|
int32 StageId = -1;
|
|
|
|
|
|
|
|
|
|
|
|
/** Identifiant du split (SplitId) */
|
|
|
|
|
|
UPROPERTY(BlueprintReadOnly, Category = "DTFlux|Request")
|
|
|
|
|
|
int32 SplitId = -1;
|
|
|
|
|
|
|
|
|
|
|
|
UPROPERTY(BlueprintReadOnly, Category = "DTFlux|Request")
|
|
|
|
|
|
FString RawResponse = "";
|
|
|
|
|
|
|
|
|
|
|
|
/** Délai maximum avant que la requête soit considérée comme expirée (en secondes) */
|
|
|
|
|
|
UPROPERTY(BlueprintReadWrite, Category = "DTFlux|Request")
|
|
|
|
|
|
float TimeoutSeconds = 2.0f;
|
|
|
|
|
|
|
|
|
|
|
|
/** Determine si la requête peut être mise en cache */
|
|
|
|
|
|
UPROPERTY(BlueprintReadWrite, Category = "DTFlux|Request")
|
|
|
|
|
|
bool bIsCacheable = false;
|
|
|
|
|
|
|
|
|
|
|
|
/** Validité du cache si bIsCacheable est mis à true après reception de la réponse (en secondes) */
|
|
|
|
|
|
UPROPERTY(BlueprintReadWrite, Category = "DTFlux|Request")
|
|
|
|
|
|
float CachedValidity = 50.0f;
|
|
|
|
|
|
|
|
|
|
|
|
/** Indicateur si la requête a reçu une réponse */
|
|
|
|
|
|
UPROPERTY(BlueprintReadWrite, Category = "DTFlux|Request")
|
|
|
|
|
|
bool bHasReceivedResponse = false;
|
|
|
|
|
|
|
|
|
|
|
|
/** Constructeur par défaut */
|
|
|
|
|
|
FDTFluxQueuedRequest()
|
|
|
|
|
|
{
|
|
|
|
|
|
RequestId = FGuid::NewGuid();
|
|
|
|
|
|
CreatedAt = FDateTime::Now();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/** Constructeur avec paramètres */
|
|
|
|
|
|
FDTFluxQueuedRequest(EDTFluxRequestType InRequestType, int32 InContestId = -1, int32 InStageId = -1,
|
|
|
|
|
|
int32 InSplitId = -1)
|
|
|
|
|
|
: RequestType(InRequestType)
|
|
|
|
|
|
, ContestId(InContestId)
|
|
|
|
|
|
, StageId(InStageId)
|
|
|
|
|
|
, SplitId(InSplitId)
|
|
|
|
|
|
{
|
|
|
|
|
|
RequestId = FGuid::NewGuid();
|
|
|
|
|
|
CreatedAt = FDateTime::Now();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool operator==(const FDTFluxQueuedRequest& Left) const
|
|
|
|
|
|
{
|
|
|
|
|
|
return RequestId == Left.RequestId;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool operator!=(const FDTFluxQueuedRequest& Left) const
|
|
|
|
|
|
{
|
|
|
|
|
|
return RequestId != Left.RequestId;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const FString Serialize() const;
|
|
|
|
|
|
|
|
|
|
|
|
/** Vérifie si la requête a expiré */
|
|
|
|
|
|
bool HasTimedOut() const
|
|
|
|
|
|
{
|
|
|
|
|
|
return (FDateTime::Now() - CreatedAt).GetTotalSeconds() > TimeoutSeconds;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** Vérifie si cette requête correspond aux paramètres spécifiés */
|
|
|
|
|
|
bool Matches(EDTFluxRequestType InRequestType, int32 InContestId = -1, int32 InStageId = -1,
|
|
|
|
|
|
int32 InSplitId = -1) const
|
|
|
|
|
|
{
|
|
|
|
|
|
return RequestType == InRequestType &&
|
|
|
|
|
|
(InContestId == -1 || ContestId == InContestId) &&
|
|
|
|
|
|
(InStageId == -1 || StageId == InStageId) &&
|
|
|
|
|
|
(InSplitId == -1 || SplitId == InSplitId);
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|