class Api::V2::DataController

Has to be authenticated with :user_email and :user_token

Information returns in <datum_info>;

{:id=>16799,
:datum_url=>
 "http://localhost:5000/projects/npq-npqt-comparison/explore_single_measurement?datum_id=16799",
:user_id=>78,
:status=>"submitted",
"time_offset"=>"300",
"time"=>"1418154459591",
"device_id"=>"49",
"firmware_version"=>"0.340",
"sample"=>
 "{\"time\"=>1418154459600, \"protocol_id\"=>\"83\", \"get_ir_baseline\"=>[[15, 148.43, 92.74], [14, 3183.41, 3771.16]], \"light_intensity\"=>34, \"r\"=>31, \"g\"=>30, \"b\"=>29, \"relative_humidity\"=>28.01, \"temperature\"=>28.25, \"data_raw\"=>[2112, 2092, 2099, 2091, 2095, 2085, 2106]}",
"user_answers"=>"",
"location"=>"42.7223664,-84.474758"}

Public Instance Methods

create() click to toggle source

Creates a datum

POST /api/v2/:project_id/data/(.:format)

Input params;

:project_id //the project which data belongs to, :data=>“???”

Ex;

post :create, {:user_email => foo@bar.com, :user_token => "xxxxxxx", :data=>"???", :project_id => "??"}

Output;

On success - {:status => "success", :notice => "...", :datum => <datum_info>}
On failed - {:status => "failed", :notice => "..."}
# File app/controllers/api/v2/data_controller.rb, line 72
def create
  @project = Project.find(params[:project_id])

  unless @project
    render json: {status: "failed", notice: "Error: Couldn't find a project with id #{params[:project_id]}"} and return
  end

  data = params[:data].is_a?(Hash) ? params[:data] : {}

  user_answers = data[:user_answers].nil? ? [] : data[:user_answers]
  question_ids = @project.project_question_ids

  if user_answers.size > question_ids.size
    missing_questions_count = user_answers.size - question_ids.size

    remaining_answers = user_answers - user_answers.first(question_ids.size)

    missing_question_ids = []

    (0..missing_questions_count-1).each do |i|
      answer_content = remaining_answers[i] rescue nil
      answer_content = "-" if (answer_content.eql?("null") || answer_content.blank?)
      answer = ProjectAnswer.create(content: answer_content)
      missing_question = @project.project_questions.new
      missing_question.value_type = 1
      missing_question.content = "Missing question"
      missing_question.project_answer_ids = [answer.id]
      missing_question.is_deleted=true
      missing_question.save
      missing_question_ids << missing_question.id
    end

    meta_hash = Hash[(question_ids + missing_question_ids).zip user_answers]

  elsif user_answers.size < question_ids.size
    present_question_ids = question_ids.first(user_answers.size)

    remaining_question_ids = question_ids - present_question_ids
    remaining_project_questions = ProjectQuestion.find(remaining_question_ids)

    remaining_project_questions.each do |q|
      q.project_answers.create(content: "-")
    end

    meta_hash = Hash[question_ids.zip (user_answers + Array.new(remaining_project_questions.size, "-"))]

  else
    meta_hash = Hash[question_ids.zip user_answers]
  end

  data[:user_answers] = meta_hash

  data[:api_version] = 2

  @datum = @project.data.create(data_map: data, user_id: current_user.id, checksum: Digest::MD5.hexdigest(params.to_s))

  if @datum.valid?
    render json: {status: "success", notice: "You have successfully contributed the data!", datum: @datum.info}
  elsif !@datum.errors[:checksum].empty?
     @duplicated_datum = @project.data.where(checksum: Digest::MD5.hexdigest(params.to_s)).first
     render json: {notice: "You have successfully contributed the data!",:status => :success, :id=> @duplicated_datum.id}
  else
    render json: {status: "failed", notice: "Error: #{@datum.errors.full_messages.join(',')}"}
  end
end
index() click to toggle source

Returns list of datum

GET /api/v2/:project_id/data(.:format)

Input params;

:project_id //the project which data belongs to Ex;

get :index, {:user_email => foo@bar.com, :user_token => "xxxxxxx", :project_id => "xx"}

Output;

On success - {:status => "success", :data => [<datum_info>, ...]}
On failed - {:status => "failed", :notice => "..."}
# File app/controllers/api/v2/data_controller.rb, line 41
def index
   
  @project = Project.find(params[:project_id])
  
  if @project
    render json: {status: "success", notice: "#{@project.data.size} records found", data: @project.data.map(&:info)}
  else
    render json: {status: "failed", notice: "Error: Couldn't find a project with id #{params[:project_id]}"}
  end
end