require_relative "./auth.rb" require_relative "./api_response" require "csv" class LifePex::Systems::UserPexSystem < LifePex::Systems::AuthSystem include LifePex::Systems::ApiResponse set :protection, :except => [:frame_options, :json_csrf] extend DocMyRoutes::Annotatable # included by PexSystem register Sinatra::Namespace # included by PexSystem namespace "/api/user-pex/v1" do summary "Export every single user pex and pex" produces "application/json,application/csv" status_codes [200] # parameter :id, required: true, type: "integer", in: "path" # parameter :date, required: true, type: "string", in: "path" get "/export", auth: [], provides: %w(json application/csv) do if accept? "application/csv" export_csv else pexs = LifePex::Pex.where(user_id: current_user_id).map{ |pex| [pex, pex.user_pexs] }.to_h api_response({ pexs: pexs, entity_type: "pexs" }) end end summary "Export every single user pex and pex as CSV" produces "application/csv" status_codes [200] # parameter :id, required: true, type: "integer", in: "path" # parameter :date, required: true, type: "string", in: "path" get "/export.csv", auth: [], provides: %w(application/csv) do export_csv end private def export_csv pexs = LifePex::Pex.where(user_id: current_user_id).order(:id).all pexs_names = pexs.map { |pex| "[#{pex.category}] #{pex.name}" } pexs_ids = pexs.map(&:id) user_pexs_by_date = LifePex::UserPex .where(Sequel.qualify(:user_pexs, :user_id) => current_user_id) .order_by(:created_at).all.group_by(&:created_at) csv_output = CSV.generate do |csv| csv << ["date", *pexs_names] user_pexs_by_date.each do |date, user_pexs| amount_by_column = user_pexs.group_by(&:pex_id).transform_values { |v| v.size } user_pex_amount_by_date_all_column = pexs_ids.map { |id| amount_by_column[id] || 0 } csv << [date, *user_pex_amount_by_date_all_column] end end content_type "application/csv" csv_output end namespace "/pexs" do summary "Get the amount of user_pex for a given day" produces "application/json" status_codes [200] parameter :id, required: true, type: "integer", in: "path" parameter :date, required: true, type: "string", in: "path" get "/:pex_id/amount/by-date/:date", auth: [], provides: "json" do pex_id = params["pex_id"] date = params["date"] count = LifePex::UserPex.where( user_id: current_user_id, pex_id: pex_id, created_at: date, ).count api_response({ count: count, entity_type: "user_pex" }) end summary "Create a new user_pex for a given day" produces "application/json" status_codes [200] parameter :id, required: true, type: "integer", in: "path" parameter :date, required: false, type: "string", in: "body" parameter :force_count_total, required: false, type: "bool", in: "body", description: "if true, force the server to computes the total amount of validation compatible after the operation" post "/:pex_id/validation", auth: [], provides: "json" do pex_id = params["pex_id"] date = date_input_convertor(json_params["date"]) api_error(403, "You may not have created or access to this pex id") if LifePex::Pex.where(id: pex_id).select(:user_id).first&.user_id != current_user_id user_pex = LifePex::UserPex.new( user_id: current_user_id, pex_id: pex_id, created_at: date, ).save count_total = LifePex::UserPex.where( user_id: current_user_id, pex_id: pex_id, created_at: date, ).count if json_params["force_count_total"] == true api_response_entity( "Successfuly added one user_pex", "user_pex", user_pex, count_total: count_total, ) end summary "Remove an existing user_pex for a given day" produces "application/json" status_codes [200] parameter :id, required: true, type: "integer", in: "path" parameter :date, required: false, type: "string", in: "body" parameter :force_count_total, required: false, type: "bool", in: "body", description: "if true, force the server to computes the total amount of validation compatible after the operation" delete "/:pex_id/validation", auth: [], provides: "json" do pex_id = params["pex_id"] date = date_input_convertor(json_params["date"]) user_pex = LifePex::UserPex.where( user_id: current_user_id, pex_id: pex_id, created_at: date, ).select(:id).first if user_pex user_pex.destroy count_total = LifePex::UserPex.where( user_id: current_user_id, pex_id: pex_id, created_at: date, ).count if json_params["force_count_total"] == true api_response({ message: "Successfuly destroyed 1 user_pex", entity_type: "user_pex", count_destroyed: 1, count_total: count_total, }) else api_error(404, "Nothing to destroy") end end end end include LifePex::Systems::ApiList end