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