public async Task <IActionResult> GetStatements([FromQuery] Queries.PagedStatementsQuery parameters, CancellationToken cancellationToken = default)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            ResultFormat format = parameters.Format ?? ResultFormat.Exact;

            if (!StringValues.IsNullOrEmpty(Request.Headers[HeaderNames.AcceptLanguage]))
            {
                format = ResultFormat.Canonical;
            }

            bool attachments = parameters.Attachments.GetValueOrDefault();

            if (parameters.StatementId.HasValue || parameters.VoidedStatementId.HasValue)
            {
                IRequest <StatementEntity> requestQuery = null;
                if (parameters.StatementId.HasValue)
                {
                    Guid statementId = parameters.StatementId.Value;
                    requestQuery = Queries.StatementQuery.Create(statementId, attachments, format);
                }
                else if (parameters.VoidedStatementId.HasValue)
                {
                    Guid voidedStatementId = parameters.VoidedStatementId.Value;
                    requestQuery = Queries.VoidedStatemetQuery.Create(voidedStatementId, attachments, format);
                }

                StatementEntity statementEntity = await _mediator.Send(requestQuery, cancellationToken);

                if (statementEntity == null)
                {
                    return(NotFound());
                }

                var statement = _mapper.Map <Statement>(statementEntity);

                return(new StatementActionResult(statement, format));
            }

            PagedStatementsResult pagedResult = await _mediator.Send(parameters, cancellationToken);

            var mappedStatements    = _mapper.Map <IEnumerable <Statement> >(pagedResult.Statements);
            StatementsResult result = new StatementsResult()
            {
                Statements = new StatementCollection(mappedStatements)
            };

            // Generate more url
            if (!string.IsNullOrEmpty(pagedResult.MoreToken))
            {
                result.More = new Uri($"/xapi/statements?more={pagedResult.MoreToken}", UriKind.Relative);
            }

            return(new StatementsActionResult(result, format, attachments));
        }
        public async Task <IActionResult> GetStatements([FromQuery] Queries.PagedStatementsQuery parameters)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            ResultFormat format = parameters.Format ?? ResultFormat.Exact;

            if (parameters.StatementId.HasValue || parameters.VoidedStatementId.HasValue)
            {
                bool attachments = parameters.Attachments.GetValueOrDefault();

                IRequest <Statement> requestQuery = null;
                if (parameters.StatementId.HasValue)
                {
                    Guid statementId = parameters.StatementId.Value;
                    requestQuery = Queries.StatementQuery.Create(statementId, attachments, format);
                }
                else if (parameters.VoidedStatementId.HasValue)
                {
                    Guid voidedStatementId = parameters.VoidedStatementId.Value;
                    requestQuery = Queries.VoidedStatemetQuery.Create(voidedStatementId, attachments, format);
                }

                Statement statement = await _mediator.Send(requestQuery);

                if (statement == null)
                {
                    return(NotFound());
                }

                return(new StatementActionResult(statement, format));
            }

            PagedStatementsResult pagedResult = await _mediator.Send(parameters);

            StatementsResult result = new StatementsResult
            {
                Statements = pagedResult.Statements
            };

            // Generate more url
            if (!string.IsNullOrEmpty(pagedResult.MoreToken))
            {
                result.More = new Uri($"/xapi/statements?more={pagedResult.MoreToken}", UriKind.Relative);
            }

            return(new StatementsActionResult(result, format));
        }