protected override HttpResponseMessage DoPost(T item) { HttpResponseMessage response = null; try { long itemid = 0; var itemIns = tblData.Insert(item, out itemid); ApiDataResponse res = new ApiDataResponse(); res.data = itemIns; res.recordsaffected = 1; response = Request.CreateResponse <ApiDataResponse>(HttpStatusCode.OK, res); string uri = Url.Link("DefaultApi", new { id = itemid }); response.Headers.Location = new Uri(uri); } catch (Exception ex) { response = ExceptionHandler(ex); } return(response); }
private Task HandleExceptionAsync(HttpContext context, Exception exception) { //context.Response.ContentType = "application/json"; var apiErrorResponce = new ApiErrorResponse(); int code = (int)HttpStatusCode.InternalServerError; if (exception is DbUpdateException) { apiErrorResponce.Message = exception.Message; code = (int)HttpStatusCode.BadRequest; context.Response.StatusCode = code; } //else if else { apiErrorResponce.Message = exception.Message; code = (int)HttpStatusCode.InternalServerError; context.Response.StatusCode = code; } var apiResponce = new ApiDataResponse <ApiErrorResponse>(code, apiErrorResponce); var json = JsonConvert.SerializeObject(apiResponce); logger.LogError($"An exception occured {exception.Message}"); return(context.Response.WriteAsync(json)); }
private Task HandleNotSuccessValidationAsync(HttpContext context, int statusCode, ModelStateDictionary modelState) { var errorListModel = modelState .Where(x => x.Value.Errors.Count > 0) .ToDictionary(er => er.Key, er => er.Value.Errors.Select(x => x.ErrorMessage)) .ToList(); var apiErrorResponce = new ApiErrorResponse(); foreach (var error in errorListModel) { foreach (var erValue in error.Value) { var errorModel = new ValidationError() { Name = error.Key, Message = erValue }; apiErrorResponce.ValidationErrors.Add(errorModel); } } var apiResponce = new ApiDataResponse <ApiErrorResponse>(statusCode, apiErrorResponce); context.Response.StatusCode = statusCode; var json = JsonConvert.SerializeObject(apiResponce); return(context.Response.WriteAsync(json)); }
/// <summary> /// Constroi a resposta de acordo com os resultados e processamentos /// Executa a ordenação no caso de não ter paginação /// </summary> /// <typeparam name="TAnyClass">Classe com o modelo de dados da resposta</typeparam> /// <param name="foundItens">Lista de dados encontrados e a retornar</param> /// <param name="hasPages"></param> /// <returns></returns> public ApiDataResponse buildTypedResponse <TAnyClass>(PagedResults <TAnyClass> foundItens, bool hasPages = false) where TAnyClass : class { ApiDataResponse returnValue = new ApiDataResponse(); // se não tem paginação // A ordenação não é feita na BD // é faita aqui. if ((MatchedCommands != null) && (!HasPagingCommand)) { foundItens.Records = ExecuteOrderCommand <TAnyClass>(foundItens.Records); } returnValue.data = foundItens.Records; if (hasPages) { returnValue.pagination = foundItens.PageInfo; returnValue.recordsaffected = foundItens.PageInfo.CurrentPageSize; } else { returnValue.recordsaffected = foundItens.Records.Count(); } return(returnValue); }
/// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="item"></param> /// <returns></returns> public HttpResponseMessage GenericPost <T>(T item) where T : class { HttpResponseMessage response; DbTable <T> tblData = new DbTable <T>(DBContext, UserID); try { long itemid = 0; var itemIns = tblData.Insert(item, out itemid); ApiDataResponse res = new ApiDataResponse(); res.data = itemIns; res.recordsaffected = 1; response = Controller.Request.CreateResponse <ApiDataResponse>(HttpStatusCode.OK, res); // Erro no parametro request //UrlHelper url = new UrlHelper(); //string uri = url.Link("DefaultApi", new { id = itemid }); //response.Headers.Location = new Uri(uri); } catch (Exception ex) { tblData = null; response = DefaultControllerException(Controller.Request, ex); } return(response); }
protected IActionResult ApiOk <T>(T data, HttpStatusCode code = HttpStatusCode.OK) { ApiDataResponse <T> response = new ApiDataResponse <T> { Data = data, HttpStatusCode = code }; return(Ok(response)); }
private ActionResult ValidateApiResult <T>(ApiDataResponse <T> result) { if (result.IsError) { return(LocalRedirect($"~/Error/{result.ResponseException.MessageType}")); } return(null); }
protected override HttpResponseMessage DoGetAll() { var listAll = tblData.GetAll(null); ApiDataResponse res = new ApiDataResponse(); res.data = listAll; res.recordsaffected = listAll.Count(); return(Request.CreateResponse <ApiDataResponse>(HttpStatusCode.OK, res)); }
//protected HttpResponseMessage ErrorResponse(HttpStatusCode httpStatusCode = HttpStatusCode.InternalServerError) //{ // HttpResponseMessage response; // if (listErrors.Count > 0) // { // response = Request.CreateResponse<List<ApiStatusResponse>>(httpStatusCode, listErrors); // listErrors.Clear(); // } // else // { // response = Request.CreateResponse(httpStatusCode); // } // return response; //} protected virtual HttpResponseMessage DoGetByQueryString() { List<string> retval = new List<string>(); foreach (var q in QueryStringPairs) { retval.Add("Key: " + q.Key + " Value: " + q.Value); } ApiDataResponse res = new ApiDataResponse(); res.data = retval; return Request.CreateResponse<ApiDataResponse>(HttpStatusCode.OK, res); }
public void ThrowExceptionWithErrorMessageWhenApiDataResponseHasAnError() { var mockApiReturn = new ApiDataResponse("error"); mockDeserializer.Convert(Arg.Any <string>()).Returns(new List <ApiDataResponse> { mockApiReturn }); var service = new NewsService(mockCaller, mockDeserializer); Should.Throw <Exception>(() => service.GetArticle()).Message.ShouldBe("error"); }
protected override HttpResponseMessage DoPut(int Id, T item) { HttpResponseMessage response = new HttpResponseMessage(); // descobrir campo chave e saber valor // se o valor do parametro nao for igual ao do campo chave // é erro, logo nem avança if (GetKeyValueOf(item) != Id) { ApiStatusResponse errorResponse = new ApiStatusResponse() { Code = "101", Detail = "Está a tentar executar a actulização de um objecto, mas tem incomsistência entre a chave do objecto e o ID do Uri", Title = "Uri Inválido", Type = "error" }; response = Request.CreateResponse(HttpStatusCode.BadRequest, errorResponse); } else { var itemIns = tblData.Update(item); if (itemIns == null) { // não update, mas não deu erro... portanto elemento não existe ApiStatusResponse errorResponse = new ApiStatusResponse() { Code = "102", Detail = "Está a tentar executar a actulização de um objecto, mas o objecto não existe", Title = "Operação Inválida", Type = "error" }; response = Request.CreateResponse(HttpStatusCode.NotFound, errorResponse); } else { ApiDataResponse res = new ApiDataResponse(); res.data = item; res.recordsaffected = 1; response = Request.CreateResponse <ApiDataResponse>(HttpStatusCode.OK, res); string uri = Url.Link("DefaultApi", new { id = Id }); response.Headers.Location = new Uri(uri); } } return(response); }
public void ReturnDomainModelWithCorrectTitle() { var mockApiReturn = new ApiDataResponse { Title = "Bob" }; mockDeserializer.Convert(Arg.Any <string>()).Returns(new List <ApiDataResponse> { mockApiReturn }); var service = new NewsService(mockCaller, mockDeserializer); var result = service.GetArticle(); result.Title.ShouldBe("Bob"); }
public void ReturnFirstArticleIfReceivesMoreThanOneArticle() { var mockApiReturn1 = new ApiDataResponse { Title = "Bob" }; var mockApiReturn2 = new ApiDataResponse { Title = "Ross" }; mockDeserializer.Convert(Arg.Any <string>()).Returns(new List <ApiDataResponse> { mockApiReturn1, mockApiReturn2 }); var service = new NewsService(mockCaller, mockDeserializer); var result = service.GetArticle(); result.Title.ShouldBe("Bob"); }
protected override HttpResponseMessage DoGet(int id) { HttpResponseMessage response = null; try { var record = tblData.Get(id); ApiDataResponse res = new ApiDataResponse(); res.data = record; res.recordsaffected = 1; response = Request.CreateResponse <ApiDataResponse>(HttpStatusCode.OK, res); } catch (Exception ex) { response = ExceptionHandler(ex); } return(response); }
/// <summary> /// Executa um GET (SELECT) por ID do registo /// </summary> /// <typeparam name="T">Modelo da Tabela</typeparam> /// <param name="id">ID do registo</param> /// <returns>HTTP Response com o registo</returns> public virtual HttpResponseMessage GenericGet <T>(int id) where T : class { DbTable <T> tblData = new DbTable <T>(DBContext, UserID); try { var record = tblData.Get(id); ApiDataResponse res = new ApiDataResponse(); res.data = record; res.recordsaffected = 1; tblData = null; return(Controller.Request.CreateResponse <ApiDataResponse>(HttpStatusCode.OK, res)); } catch (Exception ex) { tblData = null; return(DefaultControllerException(Controller.Request, ex)); } }
/// <summary> /// Executa um GET ALL (SELECT da tabela inteira) /// </summary> /// <typeparam name="T">Modelo da Tabela</typeparam> /// <returns>HTTP Response com a tabela, paginada ou não</returns> public HttpResponseMessage GenericGetAll <T>() where T : class { HttpResponseMessage response = ResourceNotFound(); DbTable <T> tblData = new DbTable <T>(DBContext, UserID); var QueryStringValidationResponse = ValidateQryString(); if (QueryStringValidationResponse != null) { response = Controller.Request.CreateResponse <ApiStatusResponse>(HttpStatusCode.BadRequest, QueryStringValidationResponse); } else { try { PagedResults <T> foundItens = null; IEnumerable <T> listAll = null; if (HasPagingCommand) { foundItens = tblData.GetPagedResults(PageSize, PageNumber, GetOrderByFieldsList(), BuildWhereParams <T>()); } else { listAll = tblData.GetAll(BuildWhereParams <T>()); } if (!listAll.IsNullOrEmpty() || (foundItens != null)) { ApiDataResponse res = new ApiDataResponse(); // já temos os resultados, temos de ordenar? if (!HasPagingCommand && (!MatchedOrderFields.IsNullOrEmpty() && (MatchedOrderFields.Count > 0))) { string order = GetOrderForQuery(); var listOrdered = listAll.AsQueryable().OrderBy(order); listAll = listOrdered; } if (!HasPagingCommand) { res.data = listAll; res.recordsaffected = listAll.Count(); } else { res = buildTypedResponse <T>(foundItens, HasPagingCommand); } tblData = null; response = Controller.Request.CreateResponse <ApiDataResponse>(HttpStatusCode.OK, res); } } catch (Exception ex) { tblData = null; response = DefaultControllerException(Controller.Request, ex); } } return(response); }
/// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="Id"></param> /// <param name="item"></param> /// <param name="activeTransaction"></param> /// <returns></returns> public HttpResponseMessage GenericPut <T>(int Id, T item, IDbTransaction activeTransaction = null) where T : class { HttpResponseMessage response; // descobrir campo chave e saber valor // se o valor do parametro nao for igual ao do campo chave // é erro, logo nem avança if (DatabaseHelpers.GetKeyValueOf(item) != Id) { ApiStatusResponse errorResponse = new ApiStatusResponse() { Code = "101", Detail = "Está a tentar executar a actulização de um objecto, mas tem incomsistência entre a chave do objecto e o ID do Uri", Title = "Uri Inválido", Type = "error" }; response = Controller.Request.CreateResponse(HttpStatusCode.BadRequest, errorResponse); } else { DbTable <T> tblData = new DbTable <T>(DBContext, UserID); try { var itemIns = tblData.Update(item, activeTransaction); tblData = null; if (itemIns == null) { // não update, mas não deu erro... portanto elemento não existe ApiStatusResponse errorResponse = new ApiStatusResponse() { Code = "102", Detail = "Está a tentar executar a actulização de um objecto, mas o objecto não existe", Title = "Operação Inválida", Type = "error" }; response = Controller.Request.CreateResponse(HttpStatusCode.NotFound, errorResponse); } else { ApiDataResponse res = new ApiDataResponse(); res.data = item; res.recordsaffected = 1; response = Controller.Request.CreateResponse <ApiDataResponse>(HttpStatusCode.OK, res); // Erro no parametro request //UrlHelper url = new UrlHelper(); //string uri = url.Link("DefaultApi", new { id = Id }); //response.Headers.Location = new Uri(uri); } } catch (Exception ex) { tblData = null; response = DefaultControllerException(Controller.Request, ex); } tblData = null; } return(response); }