public virtual async Task <IActionResult> PostBatchAsync([FromBody] IEnumerable <TInDto> dtoList)
        {
            LogData(dtoList);

            await ValidateRouteAsync(forceValidation : true);

            if (ResponseBuilder.HasErrors())
            {
                return(NotFound(ResponseBuilder.Build()));
            }

            var entityList = ApiMapper.Map <IEnumerable <TEntity> >(dtoList);

            Repository.AddRange(entityList);

            var result = await PostFlowAsync(dtoList, entityList, SaveAsync);

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

            var outDtoList = ApiMapper.Map <IEnumerable <TOutDto> >(entityList);
            var ids        = string.Join(',', outDtoList.Select(p => p.Id));

            LogData(outDtoList);

            return(CreatedAtAction(nameof(GetBatchAsync), new { ids }, ResponseBuilder
                                   .AddData(outDtoList)
                                   .Build()));
        }
        public virtual async Task <IActionResult> PostAsync([FromBody] TInDto dto)
        {
            LogData(dto);

            await ValidateRouteAsync(forceValidation : true);

            if (ResponseBuilder.HasErrors())
            {
                return(NotFound(ResponseBuilder.Build()));
            }

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

            Repository.Add(entity);

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

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

            var data = ApiMapper.Map <TOutDto>(entity);

            LogData(data);

            return(CreatedAtAction(nameof(GetAsync), new { id = entity.Id }, ResponseBuilder
                                   .AddData(data)
                                   .Build()));
        }
        public virtual async Task <IActionResult> GetAsync(QueryString queryString)
        {
            var query = Repository.Query.AsNoTracking();

            query = ApplyRouteParams(query);
            query = QueryBuilder.Build(query, queryString);

            var entityList = await PagedList <TEntity> .CreateAsync(query, queryString);

            if (!entityList.Any())
            {
                await ValidateRouteAsync(queryString);

                if (ResponseBuilder.HasErrors())
                {
                    return(NotFound(ResponseBuilder.Build()));
                }
            }

            Response.Headers.Add("X-Paging", PagingHeaderBuilder.Build(this, queryString, entityList));

            var data = ApiMapper.Map <IEnumerable <TOutDto> >(entityList).Select(p => Shaper.Shape(p, queryString));

            LogData(data);

            return(Ok(ResponseBuilder
                      .AddData(data)
                      .Build()));
        }
        public virtual async Task <IActionResult> GetByIdAsync(TKey id, QueryString queryString)
        {
            var query = Repository.Query.AsNoTracking().Where(p => p.Id.Equals(id));

            query = ApplyRouteParams(query);
            query = QueryBuilder.Build(query, queryString);

            var entity = await query.FirstOrDefaultAsync();

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

            var data = Shaper.Shape(ApiMapper.Map <TOutDto>(entity), queryString);

            LogData(data);

            return(Ok(ResponseBuilder
                      .AddData(data)
                      .Build()));
        }
        public virtual async Task <IActionResult> GetBatchAsync(KeyList <TKey> ids, QueryString queryString)
        {
            var query = Repository.Query.AsNoTracking().Where(p => ids.Contains(p.Id));

            query = ApplyRouteParams(query);
            query = QueryBuilder.Build(query, queryString);

            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 data = ApiMapper.Map <IEnumerable <TOutDto> >(entityList).Select(p => Shaper.Shape(p, queryString));

            LogData(data);

            return(Ok(ResponseBuilder
                      .AddData(data)
                      .Build()));
        }
        public async Task <IActionResult> GetStudentNumberAsync(int id)
        {
            int number = await _schoolsRepository.GetStudentNumberAsync(id);

            return(Ok(ResponseBuilder.AddData(new { number }).Build()));
        }