module Api
module V0
class StatisticsController < Api::V0::BaseController
before_action :authenticate
##
# GET
# @return a count of users who joined DMPonline between the optional specified dates
# users are scoped to the organisation of the user initiating the call
def users_joined
if has_auth("statistics")
users = restrict_date_range(@user.organisations.first.users)
confirmed_users = []
users.each do |user|
unless user.confirmed_at.blank?
confirmed_users += [user]
end
end
@users_count = confirmed_users.count
respond_with @users_count
else
render json: I18n.t("api.no_auth_for_endpoint"), status: 401
end
end
##
# GET
# @return the number of DMPs using the specified template between the optional specified dates
# ensures that the template is owned/created by the caller's organisation
def using_template
if has_auth("statistics")
template = Dmptemplate.find(params[:id])
if template.organisation == @user.organisations.first
@template_count = restrict_date_range(template.projects).count
respond_with @template_count
else
#no auth to view statistics for this template
end
else
render json: I18n.t("api.no_auth_for_endpoint"), status: 401
end
end
##
# GET
# @return a list of templates with their titles, ids, and uses between the optional specified dates
# the uses are restricted to DMPs created by users of the same organisation
# as the user who ititiated the call
def plans_by_template
if has_auth("statistics")
@org_projects = []
@user.organisations.first.users.each do |user|
user.projects.each do |project|
unless @org_projects.include? project
@org_projects += [project]
end
end
end
@org_projects = restrict_date_range(@org_projects)
respond_with @org_projects
else
render json: I18n.t("api.no_auth_for_endpoint"), status: 401
end
end
##
# GET
# @return a list of DMPs metadata, provided the DMPs were created between the optional specified dates
# DMPs must be owned by a user who's organisation is the same as the user
# who generates the call
def plans
if has_auth("statistics")
@org_projects = []
@user.organisations.first.users.each do |user|
user.projects.each do |project|
unless @org_projects.include? project
@org_projects += [project]
end
end
end
@org_projects = restrict_date_range(@org_projects)
respond_with @org_projects
else
render json: I18n.t("api.no_auth_for_endpoint"), status: 401
end
end
private
##
# takes in an array of active_reccords and restricts the range of dates
# to those specified in the params
#
# @params objects [Array<ActiveReccord>] any active_reccord reccords which
# have the "created_at" field specified
# @return [Array<ActiveReccord>] filtered list of objects
def restrict_date_range( objects )
# set start_date to either passed param, or beginning of time
start_date = params[:start_date].blank? ? Date.new(0) : Date.strptime(params[:start_date], "%Y-%m-%d")
# set end_date to either passed param or now
end_date = params[:end_date].blank? ? Date.today : Date.strptime(params[:end_date], "%Y-%m-%d")
filtered = []
objects.each do |obj|
# apperantly things can have nil created_at
if obj.created_at.blank?
if params[:start_date].blank? && params[:end_date].blank?
filtered += [obj]
end
elsif start_date <= obj.created_at.to_date && end_date >= obj.created_at.to_date
filtered += [obj]
end
end
return filtered
end
end
end
end