Esempio n. 1
0
        public async Task PublishNewVersion(IConnectApiHandler api)
        {
            if (PublishedId == null)
            {
                throw new Exception("Not a published collection");
            }
            if (string.IsNullOrWhiteSpace(Name))
            {
                throw new CollectionNameMissingException();
            }
            //if (scope != CollectionScope.Private && string.IsNullOrWhiteSpace(Description))
            // throw new CollectionDescriptionMissingException();
            if (!Items.Any())
            {
                throw new CollectionEmptyException();
            }

            await api.ChangeCollectionName(PublishedId.Value, Name).ConfigureAwait(false);

            var version = PublishedVersion.AutoIncrement();

            var hasCustomRepo = HasCustomRepo();

            if (hasCustomRepo)
            {
                UpdateRepositoriesFromCustomRepo();
            }

            var servers = GetServersForPublishing();

            await api.PublishNewCollectionVersion(new AddCollectionVersionModel {
                Description  = Description,
                CollectionId = PublishedId.Value,
                Version      = version,
                Dependencies = Items.OfType <ToggleableModProxy>()
                               .Select(Convert)
                               .ToList(),
                Repositories = Repositories.ToList(),
                Servers      = servers
            }).ConfigureAwait(false);

            if (hasCustomRepo)
            {
                CleanupRepo();
            }

            UpdatePublishInfo(version);

            if (hasCustomRepo)
            {
                await UploadImageIfAvailable(api).ConfigureAwait(false);
            }
        }
        public async Task UpdatePublishedVersionAsync(string processorName, string aggregateRootTypeName, string aggregateRootId, int publishedVersion)
        {
            if (publishedVersion == 1)
            {
                var record = new PublishedVersion()
                {
                    ProcessorName         = processorName,
                    AggregateRootTypeName = aggregateRootTypeName,
                    AggregateRootId       = aggregateRootId,
                    Version   = 1,
                    CreatedOn = DateTime.UtcNow
                };
                try
                {
                    await _publishedVersionCollection.GetCollection(aggregateRootId).InsertOneAsync(record);
                }
                catch (MongoWriteException ex)
                {
                    if (ex.WriteError.Code == 11000 && ex.Message.Contains(nameof(PublishedVersion.ProcessorName)) && ex.Message.Contains(nameof(PublishedVersion.AggregateRootId)) && ex.Message.Contains(nameof(PublishedVersion.Version)))
                    {
                        return;
                    }
                    var errorMessage = string.Format("Insert aggregate published version has mongo exception, aggregateRootType: {0}, aggregateRootId: {1}", aggregateRootTypeName, aggregateRootId);
                    _logger.Error(errorMessage, ex);
                    throw;
                }
                catch (Exception ex)
                {
                    var errorMessage = string.Format("Insert aggregate published version has unknown exception, aggregateRootType: {0}, aggregateRootId: {1}", aggregateRootTypeName, aggregateRootId);
                    _logger.Error(errorMessage, ex);
                    throw;
                }
            }
            else
            {
                try
                {
                    var builder = Builders <PublishedVersion> .Filter;
                    var filter  = builder.Eq(e => e.ProcessorName, processorName)
                                  & builder.Eq(e => e.AggregateRootId, aggregateRootId)
                                  & builder.Eq(e => e.Version, publishedVersion - 1);
                    var update = Builders <PublishedVersion> .Update
                                 .Set(e => e.Version, publishedVersion)
                                 .Set(e => e.CreatedOn, DateTime.UtcNow);

                    await _publishedVersionCollection.GetCollection(aggregateRootId)
                    .UpdateOneAsync(filter, update);

                    await _aggregateSnapshotSaver.SaveAsync(aggregateRootId, _typeNameProvider.GetType(aggregateRootTypeName), publishedVersion);
                }
                catch (MongoException ex)
                {
                    var errorMessage = string.Format("Update aggregate published version has mongo exception, aggregateRootType: {0}, aggregateRootId: {1}", aggregateRootTypeName, aggregateRootId);
                    _logger.Error(errorMessage, ex);
                    throw;
                }
                catch (Exception ex)
                {
                    var errorMessage = string.Format("Update aggregate published version has unknown exception, aggregateRootType: {0}, aggregateRootId: {1}", aggregateRootTypeName, aggregateRootId);
                    _logger.Error(errorMessage, ex);
                    throw;
                }
            }
        }
        public async Task <AsyncTaskResult> UpdatePublishedVersionAsync(string processorName, string aggregateRootTypeName, string aggregateRootId, int publishedVersion)
        {
            if (publishedVersion == 1)
            {
                var record = new PublishedVersion()
                {
                    ProcessorName         = processorName,
                    AggregateRootTypeName = aggregateRootTypeName,
                    AggregateRootId       = aggregateRootId,
                    Version   = 1,
                    CreatedOn = DateTime.UtcNow
                };
                try
                {
                    await _publishedVersionCollection.GetCollection(aggregateRootId).InsertOneAsync(record);

                    return(AsyncTaskResult.Success);
                }
                catch (MongoWriteException ex)
                {
                    if (ex.WriteError.Code == 11000 && ex.Message.Contains(nameof(record.ProcessorName)) && ex.Message.Contains(nameof(record.AggregateRootId)) && ex.Message.Contains(nameof(record.Version)))
                    {
                        return(AsyncTaskResult.Success);
                    }
                    _logger.Error("Insert aggregate published version has write exception.", ex);
                    return(new AsyncTaskResult(AsyncTaskStatus.IOException, ex.Message));
                }
                catch (Exception ex)
                {
                    _logger.Error("Insert aggregate published version has unknown exception.", ex);
                    return(new AsyncTaskResult(AsyncTaskStatus.Failed, ex.Message));
                }
            }
            else
            {
                try
                {
                    var builder = Builders <PublishedVersion> .Filter;
                    var filter  = builder.Eq(e => e.ProcessorName, processorName)
                                  & builder.Eq(e => e.AggregateRootId, aggregateRootId)
                                  & builder.Eq(e => e.Version, publishedVersion - 1);
                    var update = Builders <PublishedVersion> .Update
                                 .Set(e => e.Version, publishedVersion)
                                 .Set(e => e.CreatedOn, DateTime.UtcNow);

                    await _publishedVersionCollection.GetCollection(aggregateRootId)
                    .UpdateOneAsync(filter, update);

                    await _savableAggregateSnapshotter.SaveSnapshotAsync(aggregateRootId, _typeNameProvider.GetType(aggregateRootTypeName), publishedVersion);

                    return(AsyncTaskResult.Success);
                }
                catch (MongoException ex)
                {
                    _logger.Error("Update aggregate published version has update exception.", ex);
                    return(new AsyncTaskResult(AsyncTaskStatus.IOException, ex.Message));
                }
                catch (Exception ex)
                {
                    _logger.Error("Update aggregate published version has unknown exception.", ex);
                    return(new AsyncTaskResult(AsyncTaskStatus.Failed, ex.Message));
                }
            }
        }