1
0
KF2-Dev-Scripts/IpDrv/Classes/McpIdMappingManager.uc
2020-12-13 18:01:13 +03:00

302 lines
9.9 KiB
Ucode

/**
* Copyright 1998-2013 Epic Games, Inc. All Rights Reserved.
*
* Concrete implementation for mapping McpIds to external account ids
*/
class McpIdMappingManager extends McpIdMappingBase;
/**
* Holds the set of mapped accounts that we've downloaded
*/
var array<McpIdMapping> AccountMappings;
/** The URL to use when making add mapping requests */
var config String AddMappingUrl;
/** The URL to use when making query mapping requests */
var config String QueryMappingUrl;
/** Holds the state information for an outstanding add mapping request */
struct AddMappingRequest
{
/** The McpId the add is happening to */
var string McpId;
/** The external account id that is being mapped to a MCP id */
var string ExternalId;
/** The account type that is being mapped */
var string ExternalType;
/** The request object for this request */
var HttpRequestInterface Request;
};
/** The set of add mapping requests that are pending */
var array<AddMappingRequest> AddMappingRequests;
/** Holds the state information for an outstanding query mapping request */
struct QueryMappingRequest
{
/** The account type that is being mapped */
var string ExternalType;
/** The request object for this request */
var HttpRequestInterface Request;
};
/** The set of query mapping requests that are pending */
var array<QueryMappingRequest> QueryMappingRequests;
/**
* Adds an external account mapping. Sends this request to MCP to be processed
*
* @param McpId the account to add the mapping to
* @param ExternalId the external account that is being mapped to this account
* @param ExternalType the type of account for disambiguation
*/
function AddMapping(String McpId, String ExternalId, String ExternalType)
{
local String Url;
local HttpRequestInterface Request;
local int AddAt;
Request = class'HttpFactory'.static.CreateRequest();
if (Request != none)
{
Url = GetBaseURL() $ AddMappingUrl $ GetAppAccessURL() $
"&uniqueUserId=" $ McpId $
"&externalAccountId=" $ ExternalId $
"&externalAccountType=" $ ExternalType;
// Build our web request with the above URL
Request.SetURL(Url);
Request.SetVerb("POST");
Request.OnProcessRequestComplete = OnAddMappingRequestComplete;
// Store off the data for reporting later
AddAt = AddMappingRequests.Length;
AddMappingRequests.Length = AddAt + 1;
AddMappingRequests[AddAt].McpId = McpId;
AddMappingRequests[AddAt].ExternalId = ExternalId;
AddMappingRequests[AddAt].ExternalType = ExternalType;
AddMappingRequests[AddAt].Request = Request;
// Now kick off the request
if (!Request.ProcessRequest())
{
`Log("Failed to start AddMapping web request for URL(" $ Url $ ")");
}
`Log("URL is " $ Url);
}
}
/**
* Called once the request/response has completed. Used to process the add mapping result and notify any
* registered delegate
*
* @param Request the request object that was used
* @param Response the response object that was generated
* @param bWasSuccessful whether or not the request completed successfully
*/
function OnAddMappingRequestComplete(HttpRequestInterface Request, HttpResponseInterface Response, bool bWasSuccessful)
{
local int Index;
local int AddAt;
local int ResponseCode;
// Search for the corresponding entry in the array
Index = AddMappingRequests.Find('Request', Request);
if (Index != INDEX_NONE)
{
ResponseCode = 500;
if (Response != none)
{
ResponseCode = Response.GetResponseCode();
}
// Both of these need to be true for the request to be a success
bWasSuccessful = bWasSuccessful && ResponseCode == 200;
`Log("Account mapping McpId(" $ AddMappingRequests[Index].McpId $ "), ExternalId(" $
AddMappingRequests[Index].ExternalId $ "), ExternalType(" $
AddMappingRequests[Index].ExternalType $ ") was successful " $ bWasSuccessful $
" with ResponseCode(" $ ResponseCode $ ")");
// Add this item to our list
if (bWasSuccessful)
{
AddAt = AccountMappings.Length;
AccountMappings.Length = AddAt + 1;
AccountMappings[AddAt].McpId = AddMappingRequests[Index].McpId;
AccountMappings[AddAt].ExternalId = AddMappingRequests[Index].ExternalId;
AccountMappings[AddAt].ExternalType = AddMappingRequests[Index].ExternalType;
}
// Notify anyone waiting on this
OnAddMappingComplete(AddMappingRequests[Index].McpId,
AddMappingRequests[Index].ExternalId,
AddMappingRequests[Index].ExternalType,
bWasSuccessful,
Response.GetContentAsString());
// Done with the pending request
AddMappingRequests.Remove(Index,1);
}
}
/**
* Queries the backend for the McpIds of the list of external ids of a specific type
*
* @param ExternalIds the set of ids to get McpIds for
* @param ExternalType the type of account that is being mapped to McpIds
*/
function QueryMappings(const out array<String> ExternalIds, String ExternalType)
{
local String Url;
local HttpRequestInterface Request;
local int AddAt;
local string JsonPayload;
local int Index;
local bool bFirst;
Request = class'HttpFactory'.static.CreateRequest();
if (Request != none)
{
Url = GetBaseURL() $ QueryMappingUrl $ GetAppAccessURL() $
"&externalAccountType=" $ ExternalType;
// Make a json string from our list of ids
JsonPayload = "[ ";
bFirst = true;
for (Index = 0; Index < ExternalIds.Length; Index++)
{
if (Len(ExternalIds[Index]) > 0)
{
if (!bFirst)
JsonPayload $= ",";
bFirst = false;
JsonPayload $= "\"" $ ExternalIds[Index] $ "\"";
}
}
JsonPayload $= " ]";
`log("QueryMappings.JsonPayload:\n" $ JsonPayload);
// Build our web request with the above URL
Request.SetURL(Url);
Request.SetContentAsString(JsonPayload);
Request.SetVerb("POST");
Request.SetHeader("Content-Type","multipart/form-data");
Request.OnProcessRequestComplete = OnQueryMappingsRequestComplete;
// Store off the data for reporting later
AddAt = QueryMappingRequests.Length;
QueryMappingRequests.Length = AddAt + 1;
QueryMappingRequests[AddAt].ExternalType = ExternalType;
QueryMappingRequests[AddAt].Request = Request;
// Now kick off the request
if (!Request.ProcessRequest())
{
`Log("Failed to start QueryMappings web request for URL(" $ Url $ ")");
}
}
}
/**
* Called once the request/response has completed. Used to process the returned data and notify any
* registered delegate
*
* @param Request the request object that was used
* @param Response the response object that was generated
* @param bWasSuccessful whether or not the request completed successfully
*/
function OnQueryMappingsRequestComplete(HttpRequestInterface Request, HttpResponseInterface Response, bool bWasSuccessful)
{
local int Index;
local int AddAt;
local int ResponseCode;
local string JsonString;
local JsonObject ParsedJson;
local int JsonIndex;
local int AccountIndex;
local bool bWasFound;
local string McpId;
local string ExternalId;
local string ExternalType;
// Search for the corresponding entry in the array
Index = QueryMappingRequests.Find('Request', Request);
if (Index != INDEX_NONE)
{
ResponseCode = 500;
if (Response != none)
{
ResponseCode = Response.GetResponseCode();
}
// Both of these need to be true for the request to be a success
bWasSuccessful = bWasSuccessful && ResponseCode == 200;
`Log("Account mapping query for ExternalType(" $
QueryMappingRequests[Index].ExternalType $ ") was successful " $ bWasSuccessful $
" with ResponseCode(" $ ResponseCode $ ")");
// Add this item to our list
if (bWasSuccessful)
{
JsonString = Response.GetContentAsString();
if (JsonString != "")
{
`Log("JSON for account query = \r\n" $ JsonString);
// @todo joeg - Replace with Wes' ImportJson() once it's implemented
// Parse the json
ParsedJson = class'JsonObject'.static.DecodeJson(JsonString);
// Add each mapping in the json packet if missing
for (JsonIndex = 0; JsonIndex < ParsedJson.ObjectArray.Length; JsonIndex++)
{
McpId = ParsedJson.ObjectArray[JsonIndex].GetStringValue("unique_user_id");
ExternalId = ParsedJson.ObjectArray[JsonIndex].GetStringValue("external_account_id");
ExternalType = ParsedJson.ObjectArray[JsonIndex].GetStringValue("external_account_type");
bWasFound = false;
// Search the array for any existing adding only when missing
for (AccountIndex = 0; AccountIndex < AccountMappings.Length && !bWasFound; AccountIndex++)
{
bWasFound = McpId == AccountMappings[AccountIndex].McpId &&
ExternalId == AccountMappings[AccountIndex].ExternalId &&
ExternalType == AccountMappings[AccountIndex].ExternalType;
}
// Add this one since it wasn't found
if (!bWasFound)
{
AddAt = AccountMappings.Length;
AccountMappings.Length = AddAt + 1;
AccountMappings[AddAt].McpId = McpId;
AccountMappings[AddAt].ExternalId = ExternalId;
AccountMappings[AddAt].ExternalType = ExternalType;
}
}
}
}
// Notify anyone waiting on this
OnQueryMappingsComplete(QueryMappingRequests[Index].ExternalType,
bWasSuccessful,
Response.GetContentAsString());
// Done with the pending request
QueryMappingRequests.Remove(Index,1);
}
}
/**
* Returns the set of id mappings that match the requested account type
*
* @param ExternalType the account type that we want the mappings for
* @param IdMappings the out array that gets the copied data
*/
function GetIdMappings(String ExternalType, out array<McpIdMapping> IdMappings)
{
local int Index;
local int AddAt;
IdMappings.Length = 0;
// Search through for all mappings that match the desired type
for (Index = 0; Index < AccountMappings.Length; Index++)
{
if (AccountMappings[Index].ExternalType == ExternalType)
{
AddAt = IdMappings.Length;
IdMappings.Length = AddAt + 1;
IdMappings[AddAt] = AccountMappings[Index];
}
}
}