Example #1
0
        public ICommandResult <TOutput> Execute <TInput, TOutput>(ISerialization <TInput> input, ISerialization <TOutput> output, TInput data)
        {
            var either = CommandResult <TOutput> .Check <Argument <TInput>, TInput>(input, output, data, CreateExampleArgument);

            if (either.Error != null)
            {
                return(either.Error);
            }
            var argument = either.Argument;

            var rootType = DomainModel.Find(argument.Name);

            if (rootType == null)
            {
                return(CommandResult <TOutput> .Fail(
                           "Couldn't find aggregate root type {0}.".With(argument.Name),
                           @"Example argument: 
" + CommandResult <TOutput> .ConvertToString(CreateExampleArgument(output))));
            }

            if (!typeof(IAggregateRoot).IsAssignableFrom(rootType))
            {
                return(CommandResult <TOutput> .Fail(@"Specified type ({0}) is not an aggregate root. 
Please check your arguments.".With(argument.Name), null));
            }

            if (!Permissions.CanAccess(rootType))
            {
                return
                    (CommandResult <TOutput> .Return(
                         HttpStatusCode.Forbidden,
                         default(TOutput),
                         "You don't have permission to access: {0}.",
                         argument.Name));
            }

            if (argument.Uri == null)
            {
                return(CommandResult <TOutput> .Fail(
                           "Uri to update not specified.",
                           @"Example argument: 
" + CommandResult <TOutput> .ConvertToString(CreateExampleArgument(output, rootType))));
            }

            if (argument.Data == null)
            {
                return(CommandResult <TOutput> .Fail(
                           "Data to update not specified.",
                           @"Example argument: 
" + CommandResult <TOutput> .ConvertToString(CreateExampleArgument(output, rootType))));
            }

            try
            {
                var commandType = typeof(UpdateCommand <>).MakeGenericType(rootType);
                var command     = Activator.CreateInstance(commandType) as IUpdateCommand;
                var result      = command.Update(input, output, Locator, argument.Uri, argument.Data);

                return(CommandResult <TOutput> .Success(result, "Object updated"));
            }
            catch (ArgumentException ex)
            {
                return(CommandResult <TOutput> .Fail(
                           ex.Message,
                           ex.GetDetailedExplanation() + @"
Example argument: 
" + CommandResult <TOutput> .ConvertToString(CreateExampleArgument(output, rootType))));
            }
        }