Example #1
0
        public async Task <ICommandResult <TEntity> > CreateAsync(TEntity model)
        {
            var result = new CommandResult <TEntity>();

            // Validate
            if (model.Id > 0)
            {
                return(result.Failed(new CommandError($"{nameof(model.Id)} cannot be greater than zero when creating an entity")));
            }

            if (model.FeatureId == 0)
            {
                throw new ArgumentOutOfRangeException(nameof(model.FeatureId));
            }

            if (String.IsNullOrWhiteSpace(model.Title))
            {
                throw new ArgumentNullException(nameof(model.Title));
            }

            if (String.IsNullOrWhiteSpace(model.Message))
            {
                throw new ArgumentNullException(nameof(model.Message));
            }

            if (model.CreatedDate == null)
            {
                throw new ArgumentNullException(nameof(model.CreatedDate));
            }

            // Parse Html and message abstract
            model.Html = await ParseEntityHtml(model.Message);

            model.Abstract = await ParseEntityAbstract(model.Message);

            model.Urls = await ParseEntityUrls(model.Html);

            model.Alias = await ParseEntityAlias(model.Title);

            // Parse totals
            model.TotalWords = model.Message.TotalWords();

            // Raise creating event
            Creating?.Invoke(this, new EntityEventArgs <TEntity>(model));

            // Invoke EntityCreating subscriptions
            foreach (var handler in _broker.Pub <TEntity>(this, "EntityCreating"))
            {
                model = await handler.Invoke(new Message <TEntity>(model, this));
            }

            var entity = await _entityStore.CreateAsync(model);

            if (entity != null)
            {
                // Raise created event
                Created?.Invoke(this, new EntityEventArgs <TEntity>(entity));

                // Invoke EntityCreated subscriptions
                foreach (var handler in _broker.Pub <TEntity>(this, "EntityCreated"))
                {
                    entity = await handler.Invoke(new Message <TEntity>(entity, this));
                }

                // Return success
                return(result.Success(entity));
            }

            return(result.Failed(new CommandError("An unknown error occurred whilst attempting to create an eneity")));
        }