public virtual HttpResponseMessage Delete([FromUri] string serviceName, [FromBody] deleteRequestType deleteRequest, [MatrixParameter] string[] zone = null, [MatrixParameter] string[] context = null) { string sessionToken = CheckAuthorisation(serviceName, zone, context, new Right(RightType.DELETE, RightValue.APPROVED)); IFunctionalService service = getService(serviceName); ICollection <deleteStatus> statuses = new List <deleteStatus>(); foreach (deleteIdType deleteId in deleteRequest.deletes) { try { if (SettingsManager.ProviderSettings.JobBinding && !service.IsBound(Guid.Parse(deleteId.id), getOwnerId(sessionToken))) { throw new InvalidSessionException("Request failed as job does not belong to this consumer."); } service.Delete(Guid.Parse(deleteId.id), zone: (zone == null ? null : zone[0]), context: (context == null ? null : context[0])); if (SettingsManager.ProviderSettings.JobBinding) { service.Unbind(Guid.Parse(deleteId.id)); } statuses.Add(ProviderUtils.CreateDelete(HttpStatusCode.OK, deleteId.id)); } catch (ArgumentException e) { statuses.Add(ProviderUtils.CreateDelete(HttpStatusCode.BadRequest, deleteId.id, ProviderUtils.CreateError(HttpStatusCode.BadRequest, serviceName, "Invalid argument: id=" + deleteId.id + ".\n" + e.Message))); } catch (DeleteException e) { statuses.Add(ProviderUtils.CreateDelete(HttpStatusCode.BadRequest, deleteId.id, ProviderUtils.CreateError(HttpStatusCode.BadRequest, serviceName, "Request failed for object " + serviceName + " with ID of " + deleteId.id + ".\n " + e.Message))); } catch (NotFoundException e) { statuses.Add(ProviderUtils.CreateDelete(HttpStatusCode.NotFound, deleteId.id, ProviderUtils.CreateError(HttpStatusCode.BadRequest, serviceName, "Object " + serviceName + " with ID of " + deleteId.id + " not found.\n" + e.Message))); } catch (InvalidSessionException e) { statuses.Add(ProviderUtils.CreateDelete(HttpStatusCode.BadRequest, deleteId.id, ProviderUtils.CreateError(HttpStatusCode.BadRequest, serviceName, "Request failed for object " + serviceName + " with ID of " + deleteId.id + ", job doesn't belong to this consumer.\n " + e.Message))); } catch (Exception e) { statuses.Add(ProviderUtils.CreateDelete(HttpStatusCode.InternalServerError, deleteId.id, ProviderUtils.CreateError(HttpStatusCode.BadRequest, serviceName, "Request failed for object " + serviceName + " with ID of " + deleteId.id + ".\n " + e.Message))); } } return(Request.CreateResponse <deleteResponseType>(HttpStatusCode.OK, ProviderUtils.CreateDeleteResponse(statuses.ToArray()))); }
/// <summary> /// <see cref="IProvider{TTSingle,TMultiple,TPrimaryKey}.Delete(deleteRequestType, string[], string[])">Delete</see> /// </summary> public virtual IHttpActionResult Delete( deleteRequestType deleteRequest, [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.DELETE)) { 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 <deleteStatus> deleteStatuses = new List <deleteStatus>(); try { foreach (deleteIdType deleteId in deleteRequest.deletes) { var status = new deleteStatus { id = deleteId.id }; try { RequestParameter[] requestParameters = GetQueryParameters(Request); Service.Delete(deleteId.id, zoneId?[0], contextId?[0], requestParameters); status.statusCode = ((int)HttpStatusCode.NoContent).ToString(); } catch (ArgumentException e) { status.error = ProviderUtils.CreateError( HttpStatusCode.BadRequest, TypeName, $"Invalid argument: id={deleteId.id}.\n{e.Message}"); status.statusCode = ((int)HttpStatusCode.BadRequest).ToString(); } catch (DeleteException e) { status.error = ProviderUtils.CreateError( HttpStatusCode.BadRequest, TypeName, $"Request failed for object {TypeName} with ID of {deleteId.id}.\n{e.Message}"); status.statusCode = ((int)HttpStatusCode.BadRequest).ToString(); } catch (NotFoundException e) { status.error = ProviderUtils.CreateError( HttpStatusCode.NotFound, TypeName, $"Object {TypeName} with ID of {deleteId.id} not found.\n{e.Message}"); status.statusCode = ((int)HttpStatusCode.NotFound).ToString(); } catch (Exception e) { status.error = ProviderUtils.CreateError( HttpStatusCode.InternalServerError, TypeName, $"Request failed for object {TypeName} with ID of {deleteId.id}.\n{e.Message}"); status.statusCode = ((int)HttpStatusCode.InternalServerError).ToString(); } deleteStatuses.Add(status); } } catch (Exception) { // Need to ignore exceptions otherwise it would not be possible to return status records of processed objects. } var deleteResponse = new deleteResponseType { deletes = deleteStatuses.ToArray() }; return(Ok(deleteResponse)); }
/// <summary> /// <see cref="Provider{TSingle, TMultiple}.Post(TMultiple, string[], string[])">Post</see> /// </summary> public override IHttpActionResult Post( 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 <createType> createStatuses = new List <createType>(); try { bool?mustUseAdvisory = HttpUtils.GetMustUseAdvisory(Request.Headers); foreach (T obj in objs) { bool hasAdvisoryId = !string.IsNullOrWhiteSpace(obj.RefId); var status = new createType { advisoryId = (hasAdvisoryId ? obj.RefId : null) }; try { if (mustUseAdvisory.HasValue) { if (mustUseAdvisory.Value && !hasAdvisoryId) { status.error = ProviderUtils.CreateError( HttpStatusCode.BadRequest, TypeName, "Create request failed as object ID is not provided, but mustUseAdvisory is true."); status.statusCode = ((int)HttpStatusCode.BadRequest).ToString(); } else { status.id = Service.Create(obj, mustUseAdvisory, zoneId?[0], contextId?[0]).RefId; status.statusCode = ((int)HttpStatusCode.Created).ToString(); } } else { status.id = Service.Create(obj, null, zoneId?[0], contextId?[0]).RefId; status.statusCode = ((int)HttpStatusCode.Created).ToString(); } } catch (AlreadyExistsException e) { status.error = ProviderUtils.CreateError( HttpStatusCode.Conflict, TypeName, $"Object {TypeName} with ID of {obj.RefId} already exists.\n{e.Message}"); status.statusCode = ((int)HttpStatusCode.Conflict).ToString(); } catch (ArgumentException e) { status.error = ProviderUtils.CreateError( HttpStatusCode.BadRequest, TypeName, $"Object to create of type {TypeName}" + (hasAdvisoryId ? $" with ID of {obj.RefId}" : "") + $" is invalid.\n {e.Message}"); status.statusCode = ((int)HttpStatusCode.BadRequest).ToString(); } catch (CreateException e) { status.error = ProviderUtils.CreateError( HttpStatusCode.BadRequest, TypeName, $"Request failed for object {TypeName}" + (hasAdvisoryId ? $" with ID of {obj.RefId}" : "") + $".\n{e.Message}"); status.statusCode = ((int)HttpStatusCode.BadRequest).ToString(); } catch (RejectedException e) { status.error = ProviderUtils.CreateError( HttpStatusCode.NotFound, TypeName, $"Create request rejected for object {TypeName} with ID of {obj.RefId}.\n{e.Message}"); status.statusCode = ((int)HttpStatusCode.Conflict).ToString(); } catch (Exception e) { status.error = ProviderUtils.CreateError( HttpStatusCode.InternalServerError, TypeName, $"Request failed for object {TypeName}" + (hasAdvisoryId ? $" with ID of {obj.RefId}" : "") + $".\n{e.Message}"); status.statusCode = ((int)HttpStatusCode.InternalServerError).ToString(); } createStatuses.Add(status); } } catch (Exception) { // Need to ignore exceptions otherwise it would not be possible to return status records of processed objects. } var createResponse = new createResponseType { creates = createStatuses.ToArray() }; return(Ok(createResponse)); }
public virtual HttpResponseMessage Post([FromUri] string serviceName, [FromBody] jobCollectionType items, [MatrixParameter] string[] zone = null, [MatrixParameter] string[] context = null) { string sessionToken = CheckAuthorisation(serviceName, zone, context, new Right(RightType.CREATE, RightValue.APPROVED)); HttpResponseMessage result; try { IFunctionalService service = getService(serviceName); List <createType> creates = new List <createType>(); foreach (jobType job in items.job) { try { if (!service.AcceptJob(serviceName, job.name)) { throw new ArgumentException("Service " + serviceName + " does not handle jobs named " + job.name); } Guid id = service.Create(job, zone: (zone == null ? null : zone[0]), context: (context == null ? null : context[0])); if (SettingsManager.ProviderSettings.JobBinding) { service.Bind(id, getOwnerId(sessionToken)); } creates.Add(ProviderUtils.CreateCreate(HttpStatusCode.Created, id.ToString(), job.id)); } catch (CreateException e) { ProviderUtils.CreateCreate(HttpStatusCode.Conflict, job.id, error: ProviderUtils.CreateError(HttpStatusCode.Conflict, HttpStatusCode.Conflict.ToString(), e.Message)); } } createResponseType createResponse = ProviderUtils.CreateCreateResponse(creates.ToArray()); result = Request.CreateResponse <createResponseType>(HttpStatusCode.Created, createResponse); string uri = Url.Link("ServicesRoute", new { controller = serviceName }); result.Headers.Location = new Uri(uri); } catch (AlreadyExistsException e) { result = Request.CreateErrorResponse(HttpStatusCode.Conflict, e); } catch (ArgumentException e) { result = Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Object to create Jobs is invalid.\n ", e); } catch (CreateException e) { result = Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Request failed for creating Jobs.\n ", e); } catch (RejectedException e) { result = Request.CreateErrorResponse(HttpStatusCode.NotFound, "Create request rejected for creating Jobs.\n", e); } catch (QueryException e) { result = Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Request failed for Job.\n", e); } catch (Exception e) { result = Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e); } return(result); }
/// <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 override IHttpActionResult Post(List <StudentPersonal> objs, [MatrixParameter] string[] zoneId = null, [MatrixParameter] string[] contextId = null) { foreach (KeyValuePair <string, IEnumerable <string> > nameValues in Request.Headers) { if (log.IsDebugEnabled) { log.Debug($"*** Header field is [{nameValues.Key}:{string.Join(",", nameValues.Value)}]"); } } //return base.Post(objs, zoneId, contextId); string sessionToken; if (!authenticationService.VerifyAuthenticationHeader(Request.Headers, out sessionToken)) { return(Unauthorized()); } if ((zoneId != null && zoneId.Length != 1) || (contextId != null && contextId.Length != 1)) { return(BadRequest("Request failed for object " + typeof(StudentPersonal).Name + " as Zone and/or Context are invalid.")); } IHttpActionResult result; ICollection <createType> createStatuses = new List <createType>(); try { bool?mustUseAdvisory = HttpUtils.GetMustUseAdvisory(Request.Headers); foreach (StudentPersonal obj in objs) { bool hasAdvisoryId = !string.IsNullOrWhiteSpace(obj.RefId); createType status = new createType(); status.advisoryId = (hasAdvisoryId ? obj.RefId : null); try { if (mustUseAdvisory.HasValue && mustUseAdvisory.Value == true) { if (hasAdvisoryId) { status.id = service.Create(obj, mustUseAdvisory, zoneId: (zoneId == null ? null : zoneId[0]), contextId: (contextId == null ? null : contextId[0])).RefId; status.statusCode = ((int)HttpStatusCode.Created).ToString(); } else { status.error = ProviderUtils.CreateError(HttpStatusCode.BadRequest, typeof(StudentPersonal).Name, "Create request failed as object ID is not provided, but mustUseAdvisory is true."); status.statusCode = ((int)HttpStatusCode.BadRequest).ToString(); } } else { status.id = service.Create(obj, zoneId: (zoneId == null ? null : zoneId[0]), contextId: (contextId == null ? null : contextId[0])).RefId; status.statusCode = ((int)HttpStatusCode.Created).ToString(); } } catch (AlreadyExistsException e) { status.error = ProviderUtils.CreateError(HttpStatusCode.Conflict, typeof(StudentPersonal).Name, "Object " + typeof(StudentPersonal).Name + " with ID of " + obj.RefId + " already exists.\n" + e.Message); status.statusCode = ((int)HttpStatusCode.Conflict).ToString(); } catch (ArgumentException e) { status.error = ProviderUtils.CreateError(HttpStatusCode.BadRequest, typeof(StudentPersonal).Name, "Object to create of type " + typeof(StudentPersonal).Name + (hasAdvisoryId ? " with ID of " + obj.RefId : "") + " is invalid.\n " + e.Message); status.statusCode = ((int)HttpStatusCode.BadRequest).ToString(); } catch (CreateException e) { status.error = ProviderUtils.CreateError(HttpStatusCode.BadRequest, typeof(StudentPersonal).Name, "Request failed for object " + typeof(StudentPersonal).Name + (hasAdvisoryId ? " with ID of " + obj.RefId : "") + ".\n " + e.Message); status.statusCode = ((int)HttpStatusCode.BadRequest).ToString(); } catch (RejectedException e) { status.error = ProviderUtils.CreateError(HttpStatusCode.NotFound, typeof(StudentPersonal).Name, "Create request rejected for object " + typeof(StudentPersonal).Name + " with ID of " + obj.RefId + ".\n" + e.Message); status.statusCode = ((int)HttpStatusCode.Conflict).ToString(); } catch (Exception e) { status.error = ProviderUtils.CreateError(HttpStatusCode.InternalServerError, typeof(StudentPersonal).Name, "Request failed for object " + typeof(StudentPersonal).Name + (hasAdvisoryId ? " with ID of " + obj.RefId : "") + ".\n " + e.Message); status.statusCode = ((int)HttpStatusCode.InternalServerError).ToString(); } createStatuses.Add(status); } } catch (Exception) { // Need to ignore exceptions otherwise it would not be possible to return status records of processed objects. } createResponseType createResponse = new createResponseType { creates = createStatuses.ToArray() }; result = Ok(createResponse); return(result); }
/// <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); }
/// <summary> /// <see cref="IProvider{TTSingle,TMultiple,TPrimaryKey}.Delete(deleteRequestType, string[], string[])">Delete</see> /// </summary> public virtual IHttpActionResult Delete(deleteRequestType deleteRequest, [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(TSingle).Name + " as Zone and/or Context are invalid.")); } IHttpActionResult result; ICollection <deleteStatus> deleteStatuses = new List <deleteStatus>(); try { foreach (deleteIdType deleteId in deleteRequest.deletes) { deleteStatus status = new deleteStatus(); status.id = deleteId.id; try { service.Delete(deleteId.id, 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(TSingle).Name, "Invalid argument: id=" + deleteId.id + ".\n" + e.Message); status.statusCode = ((int)HttpStatusCode.BadRequest).ToString(); } catch (DeleteException e) { status.error = ProviderUtils.CreateError(HttpStatusCode.BadRequest, typeof(TSingle).Name, "Request failed for object " + typeof(TSingle).Name + " with ID of " + deleteId.id + ".\n " + e.Message); status.statusCode = ((int)HttpStatusCode.BadRequest).ToString(); } catch (NotFoundException e) { status.error = ProviderUtils.CreateError(HttpStatusCode.NotFound, typeof(TSingle).Name, "Object " + typeof(TSingle).Name + " with ID of " + deleteId.id + " not found.\n" + e.Message); status.statusCode = ((int)HttpStatusCode.NotFound).ToString(); } catch (Exception e) { status.error = ProviderUtils.CreateError(HttpStatusCode.InternalServerError, typeof(TSingle).Name, "Request failed for object " + typeof(TSingle).Name + " with ID of " + deleteId.id + ".\n " + e.Message); status.statusCode = ((int)HttpStatusCode.InternalServerError).ToString(); } deleteStatuses.Add(status); } } catch (Exception) { // Need to ignore exceptions otherwise it would not be possible to return status records of processed objects. } deleteResponseType deleteResponse = new deleteResponseType { deletes = deleteStatuses.ToArray() }; result = Ok(deleteResponse); return(result); }
/// <summary> /// <see cref="Provider{TSingle, TMultiple}.Post(TMultiple, string[], string[])">Post</see> /// </summary> public override IHttpActionResult Post(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 <createType> createStatuses = new List <createType>(); try { foreach (T obj in objs) { bool hasAdvisoryId = !string.IsNullOrWhiteSpace(obj.RefId); createType status = new createType(); status.advisoryId = (hasAdvisoryId ? obj.RefId : null); try { bool?mustUseAdvisory = HttpUtils.GetMustUseAdvisory(Request.Headers); if (hasAdvisoryId) { if (mustUseAdvisory.HasValue && mustUseAdvisory.Value == true) { status.id = service.Create(obj, mustUseAdvisory, zoneId: (zoneId == null ? null : zoneId[0]), contextId: (contextId == null ? null : contextId[0])).RefId; status.statusCode = ((int)HttpStatusCode.Created).ToString(); } else { status.error = ProviderUtils.CreateError(HttpStatusCode.BadRequest, typeof(T).Name, "Create request failed as object ID provided (" + obj.RefId + "), but mustUseAdvisory is not specified or is false."); status.statusCode = ((int)HttpStatusCode.BadRequest).ToString(); } } else { if (mustUseAdvisory.HasValue && mustUseAdvisory.Value == true) { status.error = ProviderUtils.CreateError(HttpStatusCode.BadRequest, typeof(T).Name, "Create request failed as object ID is not provided, but mustUseAdvisory is true."); status.statusCode = ((int)HttpStatusCode.BadRequest).ToString(); } else { status.id = service.Create(obj, zoneId: (zoneId == null ? null : zoneId[0]), contextId: (contextId == null ? null : contextId[0])).RefId; status.statusCode = ((int)HttpStatusCode.Created).ToString(); } } } catch (AlreadyExistsException e) { status.error = ProviderUtils.CreateError(HttpStatusCode.Conflict, typeof(T).Name, "Object " + typeof(T).Name + " with ID of " + obj.RefId + " already exists.\n" + e.Message); status.statusCode = ((int)HttpStatusCode.Conflict).ToString(); } catch (ArgumentException e) { status.error = ProviderUtils.CreateError(HttpStatusCode.BadRequest, typeof(T).Name, "Object to create of type " + typeof(T).Name + (hasAdvisoryId ? " with ID of " + obj.RefId : "") + " is invalid.\n " + e.Message); status.statusCode = ((int)HttpStatusCode.BadRequest).ToString(); } catch (CreateException e) { status.error = ProviderUtils.CreateError(HttpStatusCode.BadRequest, typeof(T).Name, "Request failed for object " + typeof(T).Name + (hasAdvisoryId ? " with ID of " + obj.RefId : "") + ".\n " + e.Message); status.statusCode = ((int)HttpStatusCode.BadRequest).ToString(); } catch (RejectedException e) { status.error = ProviderUtils.CreateError(HttpStatusCode.NotFound, typeof(T).Name, "Create request rejected for object " + typeof(T).Name + " with ID of " + obj.RefId + ".\n" + e.Message); status.statusCode = ((int)HttpStatusCode.Conflict).ToString(); } catch (Exception e) { status.error = ProviderUtils.CreateError(HttpStatusCode.InternalServerError, typeof(T).Name, "Request failed for object " + typeof(T).Name + (hasAdvisoryId ? " with ID of " + obj.RefId : "") + ".\n " + e.Message); status.statusCode = ((int)HttpStatusCode.InternalServerError).ToString(); } createStatuses.Add(status); } } catch (Exception) { // Need to ignore exceptions otherwise it would not be possible to return status records of processed objects. } createResponseType createResponse = new createResponseType { creates = createStatuses.ToArray() }; result = Ok(createResponse); return(result); }