public IEnumerator ReplaceGameRecord(string @namespace, string accessToken, string key, ConcurrentReplaceRequest data, ResultCallback callback, Action callbackOnConflictedData = null) { Assert.IsNotNull(@namespace, nameof(@namespace) + " cannot be null"); Assert.IsNotNull(accessToken, nameof(accessToken) + " cannot be null"); Assert.IsNotNull(key, nameof(key) + " cannot be null"); Assert.IsNotNull(data, nameof(data) + " cannot be null"); var request = HttpRequestBuilder .CreatePut(this.baseUrl + "/v1/namespaces/{namespace}/concurrent/records/{key}") .WithPathParam("namespace", @namespace) .WithPathParam("key", key) .WithBearerAuth(accessToken) .WithBody(data.ToUtf8Json()) .WithContentType(MediaType.ApplicationJson) .Accepts(MediaType.ApplicationJson) .GetResult(); IHttpResponse response = null; yield return(this.httpClient.SendRequest(request, rsp => response = rsp)); var result = response.TryParse(); if (result.IsError && result.Error.Code == ErrorCode.GameRecordPreconditionFailed && callbackOnConflictedData != null) { callbackOnConflictedData?.Invoke(); } else { callback.Try(result); } }
private void ReplaceUserRecordRecursive(int remainingAttempt, string key, Dictionary <string, object> recordRequest, ResultCallback callback, Func <Dictionary <string, object>, Dictionary <string, object> > payloadModifier) { if (remainingAttempt <= 0) { callback.TryError(new Error(ErrorCode.PreconditionFailed, "Exhaust all retry attempt to modify game record. Please try again.")); return; } GetUserRecord(key, getUserRecordResult => { var updateRequest = new ConcurrentReplaceRequest(); if (getUserRecordResult.IsError) { if (getUserRecordResult.Error.Code == ErrorCode.PlayerRecordNotFound) { updateRequest.value = recordRequest; updateRequest.updatedAt = DateTime.Now; this.coroutineRunner.Run( this.api.ReplaceUserRecord( this.@namespace, this.session.UserId, this.session.AuthorizationToken, key, updateRequest, callback, () => { ReplaceUserRecordRecursive(remainingAttempt - 1, key, recordRequest, callback, payloadModifier); })); } else { callback.TryError(getUserRecordResult.Error); } } else { getUserRecordResult.Value.value = payloadModifier(getUserRecordResult.Value.value); updateRequest.value = getUserRecordResult.Value.value; updateRequest.updatedAt = getUserRecordResult.Value.updated_at; this.coroutineRunner.Run( this.api.ReplaceUserRecord( this.@namespace, this.session.UserId, this.session.AuthorizationToken, key, updateRequest, callback, () => { ReplaceUserRecordRecursive(remainingAttempt - 1, key, recordRequest, callback, payloadModifier); })); } }); }
/// <summary> /// Replace a record in namespace-level. If the record doesn't exist, it will create and save the record. If already exists, it will replace the existing one, but will failed if lastUpdated is not up-to-date. /// </summary> /// <param name="key">Key of record</param> /// <param name="lastUpdated">last time the record is updated. Retrieve it from GetGameRecord.</param> /// <param name="recordRequest">The request of the record with JSON formatted.</param> /// <param name="callback">Returns a Result via callback when completed</param> public void ReplaceGameRecordCheckLatest(string key, DateTime lastUpdated, Dictionary <string, object> recordRequest, ResultCallback callback) { Assert.IsFalse(string.IsNullOrEmpty(key), "Key should not be null."); Assert.IsNotNull(recordRequest, "RecordRequest should not be null."); Report.GetFunctionLog(this.GetType().Name); if (!this.session.IsValid()) { callback.TryError(ErrorCode.IsNotLoggedIn); return; } ConcurrentReplaceRequest request = new ConcurrentReplaceRequest { updatedAt = lastUpdated, value = recordRequest }; this.coroutineRunner.Run(this.api.ReplaceGameRecord(this.@namespace, this.session.AuthorizationToken, key, request, callback)); }