/**
   * Saves user response.
   *
   * <p>This action builds a Response object from request by creating and parsing DynamicForm data.
   * Built Response object is then validated and returned back to client as a JSON object.
   *
   * <p>If response object is not valid - returns BAD_REQUEST status code to client as well as JSON
   * object with validation errors.
   *
   * <p>If response data is outdated - returns BAD_REQUEST status code to client as well as JSON
   * object with global errors.
   *
   * <p>This action requires CSRF token.
   *
   * @return 200-OK with saved response object as JSON 400-BAD_REQUEST with errors as JSON
   */
  @RequireCSRFCheck
  @Transactional
  public Result createResponse() {
    DynamicForm form = form().bindFromRequest();
    List<Field> activeFields = fieldService.getAllActiveFields();

    Response response = new Response(form.data(), activeFields);
    Logger.info("User send response: {}.", response);
    List<ValidationError> errors = response.validate();
    if (errors != null) {
      errors.forEach(form::reject);
      Logger.warn("User response contains validation errors: {}.", errors);
      return badRequest(form.errorsAsJson());
    }

    Response result = responseService.saveResponse(response);

    if (result == null) {
      form.reject("global", "Some options are outdated!");
      Logger.warn("Users response contains outdated data.");
      return badRequest(form.errorsAsJson());
    } else {
      Logger.info("Response saved: {}.", response);
      return ok(toJson(response));
    }
  }