139 lines
5.3 KiB
Ruby
139 lines
5.3 KiB
Ruby
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
|