/// <summary>
        /// Finds the endpoint and executes the request onto it.
        /// Handles errors and disposes of the endpoint when completed.
        /// </summary>
        public async Task InvokeAsync(IHttpRequestReader requestReader, IHttpRequestResponder responder, IRequestContext context)
        {
            var response = new Response(requestReader.ResourcePath);
            var builder  = new ResponseBuilder(response, _services.Modifiers);

            var reader = new RequestReader(requestReader, _services.NameSwitcher, _services.QueryCreator);
            var writer = new ResponseWriter(responder, response, _services.NameSwitcher);

            try
            {
                var           navigator = new EndpointNavigator(context, _startResourceFactory, _services);
                IRestEndpoint endpoint  = navigator.GetEndpointFromPath(requestReader.ResourcePath);
                IExecutor     executor  = _services.ExecutorFactory.GetExecutor(endpoint);

                await executor.ExecuteAsync(reader, builder);

                await writer.WriteAsync();
            }
            catch (Exception ex)
            {
                var errorInfo = new ExceptionErrorInfo(ex);
                builder.AddError(errorInfo);

                await writer.WriteAsync();
            }
            finally
            {
                context.Dispose();
            }
        }
 private void AddRecordNotBelongToParentError(RecordError error)
 {
     ResponseBuilder.AddError(
         $"{GetLocalizedEntityName(error.ParentEntityType.Name)} - {GetLocalizedEntityName(error.EntityType.Name)} : {ApiResources.RecordNotBelongToParent}",
         $"{GetLocalizedEntityName(error.ParentEntityType.Name)} : {ApiResources.Id} = {error.ParentEntityId}",
         $"{GetLocalizedEntityName(error.EntityType.Name)} : {ApiResources.Id} = {error.EntityId}");
 }
 private async Task <IActionResult> SaveAsync()
 {
     return(await Repository.SaveAsync() ?
            null :
            new InternalServerErrorResult(ResponseBuilder
                                          .AddError($"{GetLocalizedEntityName(typeof(TEntity).Name)} : {ApiResources.InternalServerError}")
                                          .Build()));
 }
        public ActionResult Remove(int id)
        {
            var UserId = _UserModel.LoggedIn() != null?_UserModel.LoggedIn().Id : 0;

            var Result = _ApiContext.Posts.AsEnumerable().SingleOrDefault(p => p.Id == id && p.UserId == UserId);

            if (Result == null)
            {
                _ResponseContext.AddError("הפוסט אינו קיים, או שאינך בעל הפוסט.");
            }

            if (_ResponseContext.status)
            {
                _ApiContext.Remove(Result);
                _ApiContext.SaveChanges();
            }

            return(Ok(_ResponseContext.Build()));
        }
        public ActionResult Signup([FromForm] User user)
        {
            if (!user.IsValidated())
            {
                _ResponseContext.AddError("אחד או יותר מהשדות ריקים.");
            }

            if (_UserModel.Exists(user.Email))
            {
                _ResponseContext.AddError("האימייל כבר תפוס, אנא נסה להרשם עם אימייל אחר.");
            }

            if (_ResponseContext.status)
            {
                _ApiContext.Users.Add(user);
                _ApiContext.SaveChanges();
            }

            return(Ok(_ResponseContext.Build()));
        }
        public virtual async Task <IActionResult> PatchAsync(TKey id, [FromBody] JsonPatchDocument <TInDto> patchDto, QueryString queryString)
        {
            LogData(patchDto);

            if (patchDto == null)
            {
                return(new ApiUnprocessableEntityResult(ResponseBuilder.AddError(ApiResources.PatchDataMissing).Build()));
            }

            var query = Repository.Query.Where(p => p.Id.Equals(id));

            query = ApplyRouteParams(query);

            var entity = await query.FirstOrDefaultAsync();

            if (entity == null)
            {
                return(await BuildResponseForNotFoundEntityAsync(id, queryString));
            }

            var dto = ApiMapper.Map <TInDto>(entity);

            patchDto.ApplyTo(dto, ModelState);
            TryValidateModel(dto);

            if (!ModelState.IsValid)
            {
                ModelStateResolver.GetModelErrors(ModelState).ForEach(error => ResponseBuilder.AddError(error.Message, error.Field));
                return(new ApiUnprocessableEntityResult(ResponseBuilder.Build()));
            }

            ApiMapper.Map(dto, entity);

            var result = await UpdateFlowAsync(dto, entity, SaveAsync);

            if (result != null)
            {
                return(result);
            }

            return(NoContent());
        }
        public virtual async Task <IActionResult> PutBatchAsync(KeyList <TKey> ids, [FromBody] IEnumerable <TInDto> dtoList, QueryString queryString)
        {
            LogData(dtoList);

            if (ids.Count() != dtoList.Count())
            {
                return(BadRequest(ResponseBuilder.AddError(ApiResources.IdAndDtoNumNotEqual).Build()));
            }

            var query = Repository.Query.Where(p => ids.Contains(p.Id));

            query = ApplyRouteParams(query);

            var entityList = await query.ToListAsync();

            if (ids.Count() != entityList.Count())
            {
                var missingIds = ids.Except(entityList.Select(p => p.Id));
                return(await BuildResponseForNotFoundEntityAsync(missingIds, queryString));
            }

            var sortedEntityList = new List <TEntity>();
            int cnt = 0;

            foreach (var dto in dtoList)
            {
                var entity = entityList.Find(p => p.Id.Equals(ids[cnt]));
                ApiMapper.Map(dto, entity);
                sortedEntityList.Add(entity);
                cnt++;
            }

            var result = await UpdateFlowAsync(dtoList, sortedEntityList, SaveAsync);

            if (result != null)
            {
                return(result);
            }

            return(NoContent());
        }
 private void AddRecordNotFoundError(RecordError error)
 {
     ResponseBuilder.AddError(
         $"{GetLocalizedEntityName(error.EntityType.Name)} : {ApiResources.RecordNotFound}",
         $"{ApiResources.Id} = {error.EntityId}");
 }