//
// Copyright 2014-2015 Amazon.com,
// Inc. or its affiliates. All Rights Reserved.
//
// SPDX-License-Identifier: Apache-2.0
//
using System;
using System.Collections.Generic;
using Amazon.Runtime;
using Amazon.CognitoSync.Model;
using Amazon.Util.Internal;
namespace Amazon.CognitoSync.SyncManager.Internal
{
///
/// Remote data storage using Cognito Sync service on which we can invoke
/// actions like creating a dataset or record.
///
public partial class CognitoSyncStorage: IDisposable
{
#region ListDataset
///
/// Gets a list of
///
public List ListDatasetMetadata()
{
return PopulateListDatasetMetadata(null, new List());
}
private List PopulateListDatasetMetadata(string nextToken, List datasets)
{
ListDatasetsRequest request = new ListDatasetsRequest();
// a large enough number to reduce # of requests
request.MaxResults = 64;
request.NextToken = nextToken;
ListDatasetsResponse response = client.ListDatasets(request);
foreach (Amazon.CognitoSync.Model.Dataset dataset in response.Datasets)
{
datasets.Add(ModelToDatasetMetadata(dataset));
}
nextToken = response.NextToken;
if (nextToken != null)
{
PopulateListDatasetMetadata(nextToken, datasets);
}
return datasets;
}
#endregion
#region ListUpdates
///
/// Gets a list of records which have been updated since lastSyncCount
/// (inclusive). If the value of a record equals null, then the record is
/// deleted. If you pass 0 as lastSyncCount, the full list of records will be
/// returned.
///
/// Dataset name.
/// Last sync count.
public DatasetUpdates ListUpdates(string datasetName, long lastSyncCount)
{
return PopulateListUpdates(datasetName, lastSyncCount, new List(), null);
}
private DatasetUpdates PopulateListUpdates(string datasetName, long lastSyncCount, List records, string nextToken)
{
ListRecordsRequest request = new ListRecordsRequest();
request.IdentityPoolId = identityPoolId;
request.IdentityId = this.GetCurrentIdentityId();
request.DatasetName = datasetName;
request.LastSyncCount = lastSyncCount;
// mark it large enough to reduce # of requests
request.MaxResults = 1024;
request.NextToken = nextToken;
ListRecordsResponse listRecordsResponse = client.ListRecords(request);
foreach (Amazon.CognitoSync.Model.Record remoteRecord in listRecordsResponse.Records)
{
records.Add(ModelToRecord(remoteRecord));
}
if (listRecordsResponse.NextToken != null)
{
// update last evaluated key
nextToken = listRecordsResponse.NextToken;
PopulateListUpdates(datasetName, lastSyncCount, records, nextToken);
}
DatasetUpdates updates = new DatasetUpdates(
datasetName,
records,
listRecordsResponse.DatasetSyncCount,
listRecordsResponse.SyncSessionToken,
listRecordsResponse.DatasetExists,
listRecordsResponse.DatasetDeletedAfterRequestedSyncCount,
listRecordsResponse.MergedDatasetNames
);
return updates;
}
#endregion
#region PutRecords
///
/// Post updates to remote storage. Each record has a sync count. If the sync
/// count doesn't match what's on the remote storage, i.e. the record is
/// modified by a different device, this operation sets the exception in the
/// callback response to ConflictException. Otherwise it returns a list of
/// records that are updated successfully.
///
/// The records.
/// Dataset name.
/// Records.
/// Sync session token.
public List PutRecords(string datasetName, List records, string syncSessionToken)
{
UpdateRecordsRequest request = new UpdateRecordsRequest();
request.DatasetName = datasetName;
request.IdentityPoolId = identityPoolId;
request.IdentityId = this.GetCurrentIdentityId();
request.SyncSessionToken = syncSessionToken;
List updatedRecords = new List();
// create patches
List patches = new List();
foreach (Record record in records)
{
patches.Add(RecordToPatch(record));
}
request.RecordPatches = patches;
try
{
UpdateRecordsResponse updateRecordsResponse = client.UpdateRecords(request);
foreach (Amazon.CognitoSync.Model.Record remoteRecord in updateRecordsResponse.Records)
{
updatedRecords.Add(ModelToRecord(remoteRecord));
}
}
catch (Exception e)
{
throw HandleException(e, "Failed to update records in dataset: " + datasetName);
}
return updatedRecords;
}
#endregion
#region DeleteDataset
///
/// Deletes a dataset.
///
/// The records.
/// Dataset name.
public void DeleteDataset(string datasetName)
{
DeleteDatasetRequest request = new DeleteDatasetRequest();
request.IdentityPoolId = identityPoolId;
request.IdentityId = this.GetCurrentIdentityId();
request.DatasetName = datasetName;
try
{
client.DeleteDataset(request);
}
catch (Exception e)
{
throw HandleException(e, "Failed to delete dataset: " + datasetName);
}
}
#endregion
#region GetDatasetMetadata
///
/// Retrieves the metadata of a dataset.
///
/// The records.
/// Dataset name.
public DatasetMetadata GetDatasetMetadata(string datasetName)
{
DescribeDatasetRequest request = new DescribeDatasetRequest();
request.IdentityPoolId = identityPoolId;
request.IdentityId = this.GetCurrentIdentityId();
request.DatasetName = datasetName;
DatasetMetadata metadata = null;
try
{
var describeResponse = client.DescribeDataset(request);
metadata = ModelToDatasetMetadata(describeResponse.Dataset);
}
catch (Exception e)
{
throw new DataStorageException("Failed to get metadata of dataset: "
+ datasetName, e);
}
return metadata;
}
#endregion
}
}