示例#1
0
        /// <summary>
        /// <see cref="IConsumer{TSingle,TMultiple,TPrimaryKeyPK}.Update(TMultiple, string, string)">Update</see>
        /// </summary>
        public virtual MultipleUpdateResponse Update(TMultiple obj, string zoneId = null, string contextId = null)
        {
            if (!RegistrationService.Registered)
            {
                throw new InvalidOperationException("Consumer has not registered.");
            }

            string url  = EnvironmentUtils.ParseServiceUrl(EnvironmentTemplate) + "/" + TypeName + "s" + HttpUtils.MatrixParameters(zoneId, contextId);
            string body = SerialiseMultiple(obj);
            string xml  = HttpUtils.PutRequest(url, RegistrationService.AuthorisationToken, body);

            if (log.IsDebugEnabled)
            {
                log.Debug("XML from PUT request ...");
            }
            if (log.IsDebugEnabled)
            {
                log.Debug(xml);
            }
            updateResponseType     updateResponseType = SerialiserFactory.GetXmlSerialiser <updateResponseType>().Deserialise(xml);
            MultipleUpdateResponse updateResponse     = MapperFactory.CreateInstance <updateResponseType, MultipleUpdateResponse>(updateResponseType);

            return(updateResponse);
        }
        /// <summary>
        /// <see cref="Provider{TSingle, TMultiple}.Put(TMultiple, string[], string[])">Put</see>
        /// </summary>
        public override IHttpActionResult Put(
            List <T> objs,
            [MatrixParameter] string[] zoneId    = null,
            [MatrixParameter] string[] contextId = null)
        {
            if (!AuthenticationService.VerifyAuthenticationHeader(Request.Headers, out string sessionToken))
            {
                return(Unauthorized());
            }

            // Check ACLs and return StatusCode(HttpStatusCode.Forbidden) if appropriate.
            if (!AuthorisationService.IsAuthorised(Request.Headers, sessionToken, $"{TypeName}s", RightType.CREATE))
            {
                return(StatusCode(HttpStatusCode.Forbidden));
            }

            if ((zoneId != null && zoneId.Length != 1) || (contextId != null && contextId.Length != 1))
            {
                return(BadRequest($"Request failed for object {TypeName} as Zone and/or Context are invalid."));
            }

            ICollection <updateType> updateStatuses = new List <updateType>();

            try
            {
                foreach (T obj in objs)
                {
                    var status = new updateType
                    {
                        id = obj.RefId
                    };

                    try
                    {
                        Service.Update(obj, (zoneId?[0]), (contextId?[0]));
                        status.statusCode = ((int)HttpStatusCode.NoContent).ToString();
                    }
                    catch (ArgumentException e)
                    {
                        status.error = ProviderUtils.CreateError(
                            HttpStatusCode.BadRequest,
                            TypeName,
                            $"Object to update of type {TypeName} is invalid.\n{e.Message}");
                        status.statusCode = ((int)HttpStatusCode.BadRequest).ToString();
                    }
                    catch (NotFoundException e)
                    {
                        status.error = ProviderUtils.CreateError(
                            HttpStatusCode.NotFound,
                            TypeName,
                            $"Object {TypeName} with ID of {obj.RefId} not found.\n{e.Message}");
                        status.statusCode = ((int)HttpStatusCode.NotFound).ToString();
                    }
                    catch (UpdateException e)
                    {
                        status.error = ProviderUtils.CreateError(
                            HttpStatusCode.BadRequest,
                            TypeName,
                            $"Request failed for object {TypeName} with ID of {obj.RefId}.\n{e.Message}");
                        status.statusCode = ((int)HttpStatusCode.BadRequest).ToString();
                    }
                    catch (Exception e)
                    {
                        status.error = ProviderUtils.CreateError(
                            HttpStatusCode.InternalServerError,
                            TypeName,
                            $"Request failed for object {TypeName} with ID of {obj.RefId}.\n{e.Message}");
                        status.statusCode = ((int)HttpStatusCode.InternalServerError).ToString();
                    }

                    updateStatuses.Add(status);
                }
            }
            catch (Exception)
            {
                // Need to ignore exceptions otherwise it would not be possible to return status records of processed objects.
            }

            var updateResponse = new updateResponseType {
                updates = updateStatuses.ToArray()
            };

            return(Ok(updateResponse));
        }
        public void ExplicitResponseMapperTest()
        {
            // Error.
            ResponseError srcError = new ResponseError {
                Code = 123, Description = "Err desc", Id = "42", Message = "Error occurred", Scope = "request"
            };
            errorType destError = MapperFactory.CreateInstance <ResponseError, errorType>(srcError);

            // Create.
            CreateStatus srcCreateStatus = new CreateStatus {
                AdvisoryId = "src456", Error = srcError, Id = "cr8", StatusCode = "200"
            };
            createType             destCreateStatus  = MapperFactory.CreateInstance <CreateStatus, createType>(srcCreateStatus);
            MultipleCreateResponse srcCreateResponse = new MultipleCreateResponse {
                StatusRecords = new List <CreateStatus> {
                    srcCreateStatus
                }
            };
            createResponseType destCreateResponse = MapperFactory.CreateInstance <MultipleCreateResponse, createResponseType>(srcCreateResponse);
            int index = 0;

            // Assert that the mapping was successful.
            foreach (CreateStatus record in srcCreateResponse.StatusRecords)
            {
                Assert.AreEqual(record.AdvisoryId, destCreateResponse.creates[index].advisoryId);
                Assert.AreEqual(record.Error.Code, destCreateResponse.creates[index].error.code);
                Assert.AreEqual(record.Error.Description, destCreateResponse.creates[index].error.description);
                Assert.AreEqual(record.Error.Id, destCreateResponse.creates[index].error.id);
                Assert.AreEqual(record.Error.Message, destCreateResponse.creates[index].error.message);
                Assert.AreEqual(record.Error.Scope, destCreateResponse.creates[index].error.scope);
                Assert.AreEqual(record.Id, destCreateResponse.creates[index].id);
                Assert.AreEqual(record.StatusCode, destCreateResponse.creates[index].statusCode);
                index++;
            }

            // Delete.
            DeleteStatus srcDeleteStatus = new DeleteStatus {
                Error = srcError, Id = "del8", StatusCode = "300"
            };
            deleteStatus           destDeleteStatus  = MapperFactory.CreateInstance <DeleteStatus, deleteStatus>(srcDeleteStatus);
            MultipleDeleteResponse srcDeleteResponse = new MultipleDeleteResponse {
                StatusRecords = new List <DeleteStatus> {
                    srcDeleteStatus
                }
            };
            deleteResponseType destDeleteResponse = MapperFactory.CreateInstance <MultipleDeleteResponse, deleteResponseType>(srcDeleteResponse);

            index = 0;

            // Assert that the mapping was successful.
            foreach (DeleteStatus record in srcDeleteResponse.StatusRecords)
            {
                Assert.AreEqual(record.Error.Code, destDeleteResponse.deletes[index].error.code);
                Assert.AreEqual(record.Error.Description, destDeleteResponse.deletes[index].error.description);
                Assert.AreEqual(record.Error.Id, destDeleteResponse.deletes[index].error.id);
                Assert.AreEqual(record.Error.Message, destDeleteResponse.deletes[index].error.message);
                Assert.AreEqual(record.Error.Scope, destDeleteResponse.deletes[index].error.scope);
                Assert.AreEqual(record.Id, destDeleteResponse.deletes[index].id);
                Assert.AreEqual(record.StatusCode, destDeleteResponse.deletes[index].statusCode);
                index++;
            }

            // Update.
            UpdateStatus srcUpdateStatus = new UpdateStatus {
                Error = srcError, Id = "up8", StatusCode = "400"
            };
            updateType             destUpdateStatus  = MapperFactory.CreateInstance <UpdateStatus, updateType>(srcUpdateStatus);
            MultipleUpdateResponse srcUpdateResponse = new MultipleUpdateResponse {
                StatusRecords = new List <UpdateStatus> {
                    srcUpdateStatus
                }
            };
            updateResponseType destUpdateResponse = MapperFactory.CreateInstance <MultipleUpdateResponse, updateResponseType>(srcUpdateResponse);

            index = 0;

            // Assert that the mapping was successful.
            foreach (UpdateStatus record in srcUpdateResponse.StatusRecords)
            {
                Assert.AreEqual(record.Error.Code, destUpdateResponse.updates[index].error.code);
                Assert.AreEqual(record.Error.Description, destUpdateResponse.updates[index].error.description);
                Assert.AreEqual(record.Error.Id, destUpdateResponse.updates[index].error.id);
                Assert.AreEqual(record.Error.Message, destUpdateResponse.updates[index].error.message);
                Assert.AreEqual(record.Error.Scope, destUpdateResponse.updates[index].error.scope);
                Assert.AreEqual(record.Id, destUpdateResponse.updates[index].id);
                Assert.AreEqual(record.StatusCode, destUpdateResponse.updates[index].statusCode);
                index++;
            }
        }
        /// <summary>
        /// <see cref="Provider{TSingle, TMultiple}.Put(TMultiple, string[], string[])">Put</see>
        /// </summary>
        public override IHttpActionResult Put(List <T> objs, [MatrixParameter] string[] zoneId = null, [MatrixParameter] string[] contextId = null)
        {
            if (!authService.VerifyAuthenticationHeader(Request.Headers))
            {
                return(Unauthorized());
            }

            // Check ACLs and return StatusCode(HttpStatusCode.Forbidden) if appropriate.

            if ((zoneId != null && zoneId.Length != 1) || (contextId != null && contextId.Length != 1))
            {
                return(BadRequest("Request failed for object " + typeof(T).Name + " as Zone and/or Context are invalid."));
            }

            IHttpActionResult        result;
            ICollection <updateType> updateStatuses = new List <updateType>();

            try
            {
                foreach (T obj in objs)
                {
                    updateType status = new updateType();
                    status.id = obj.RefId;

                    try
                    {
                        service.Update(obj, zoneId: (zoneId == null ? null : zoneId[0]), contextId: (contextId == null ? null : contextId[0]));
                        status.statusCode = ((int)HttpStatusCode.NoContent).ToString();
                    }
                    catch (ArgumentException e)
                    {
                        status.error      = ProviderUtils.CreateError(HttpStatusCode.BadRequest, typeof(T).Name, "Object to update of type " + typeof(T).Name + " is invalid.\n " + e.Message);
                        status.statusCode = ((int)HttpStatusCode.BadRequest).ToString();
                    }
                    catch (NotFoundException e)
                    {
                        status.error      = ProviderUtils.CreateError(HttpStatusCode.NotFound, typeof(T).Name, "Object " + typeof(T).Name + " with ID of " + obj.RefId + " not found.\n" + e.Message);
                        status.statusCode = ((int)HttpStatusCode.NotFound).ToString();
                    }
                    catch (UpdateException e)
                    {
                        status.error      = ProviderUtils.CreateError(HttpStatusCode.BadRequest, typeof(T).Name, "Request failed for object " + typeof(T).Name + " with ID of " + obj.RefId + ".\n " + e.Message);
                        status.statusCode = ((int)HttpStatusCode.BadRequest).ToString();
                    }
                    catch (Exception e)
                    {
                        status.error      = ProviderUtils.CreateError(HttpStatusCode.InternalServerError, typeof(T).Name, "Request failed for object " + typeof(T).Name + " with ID of " + obj.RefId + ".\n " + e.Message);
                        status.statusCode = ((int)HttpStatusCode.InternalServerError).ToString();
                    }

                    updateStatuses.Add(status);
                }
            }
            catch (Exception)
            {
                // Need to ignore exceptions otherwise it would not be possible to return status records of processed objects.
            }

            updateResponseType updateResponse = new updateResponseType {
                updates = updateStatuses.ToArray()
            };

            result = Ok(updateResponse);

            return(result);
        }