public async Task <Guid?> CreateDatasetNominationAsync(ClaimsPrincipal user, DatasetNomination nomination,
                                                               CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var userId = GetUserId(user);

            if (!userId.HasValue)
            {
                return(null);
            }
            var name   = GetUserName(user);
            var email  = GetUserEmail(user);
            var record = nomination.ToDatasetNominationStorageItem(d =>
            {
                d.CreatedByUserId    = userId.Value.ToString();
                d.CreatedByUserName  = name;
                d.CreatedByUserEmail = email;
                d.Created            = DateTime.UtcNow;
                d.DatasetId          = WellKnownIds.DatasetNominationDatasetId;
            });

            await this.Client.CreateDocumentAsync(UserDataDocumentCollectionUri, record).ConfigureAwait(false);

            return(record.Id);
        }
        public async Task <Guid?> UpdateDatasetNominationAsync(ClaimsPrincipal user, DatasetNomination nomination, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var userId = GetUserId(user);

            if (!userId.HasValue)
            {
                return(null);
            }
            var name  = GetUserName(user);
            var email = GetUserEmail(user);

            var options = new FeedOptions
            {
                PartitionKey = new PartitionKey(WellKnownIds.DatasetNominationDatasetId.ToString())
            };

            var uri = this.UserDataDocumentCollectionUri;
            var existingDocument = this.Client.CreateDocumentQuery <DatasetNominationStorageItem>(uri, options)
                                   .Where(r => r.Id == nomination.Id)
                                   .AsEnumerable()
                                   .SingleOrDefault();

            if (existingDocument == null)
            {
                throw new InvalidOperationException("Dataset Nomination not found.");
            }

            var storageItem = nomination.ToDatasetNominationStorageItem((d) =>
            {
                d.Created             = existingDocument.Created;
                d.CreatedByUserId     = existingDocument.CreatedByUserId;
                d.CreatedByUserName   = existingDocument.CreatedByUserName;
                d.CreatedByUserEmail  = existingDocument.CreatedByUserEmail;
                d.ModifiedByUserName  = name;
                d.ModifiedByUserEmail = email;
                d.Modified            = DateTime.UtcNow;
            });

            uri = UserDataDocumentUriById(storageItem.Id.ToString());
            await this.Client.ReplaceDocumentAsync(uri, storageItem);

            return(nomination.Id);
        }