Skip to content

Commit

Permalink
Merge pull request #852 from portagenetwork/aaron/stats-api
Browse files Browse the repository at this point in the history
Create `GET "/api/ca_dashboard/stats"` endpoint
  • Loading branch information
aaronskiba authored Aug 29, 2024
2 parents 929c126 + 1e018b1 commit 04f2e21
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 0 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

## [Unreleased]

### Added

- Create GET "/api/ca_dashboard/stats" endpoint to fetch Plan, User, and Org-related statistics [#852](https://github.com/portagenetwork/roadmap/pull/852)

### Changed

- Drop Sessions Table and Delete `lib/tasks/sessions.rake` [#859](https://github.com/portagenetwork/roadmap/pull/859)
Expand Down
59 changes: 59 additions & 0 deletions app/controllers/api/ca_dashboard/stats_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# frozen_string_literal: true

module Api
module CaDashboard
# Handles CRUD operations for "/api/ca_dashboard/stats"
class StatsController < Api::V1::BaseApiController
# Allow public access / bypass JWT authentication via "POST /api/v1/authenticate"
skip_before_action :authorize_request, only: [:index]

# GET /api/ca_dashboard/stats
def index
base_hash = {
'plans' => Plan.all,
'orgs' => Org.where(managed: true).all,
'users' => User.all
}
@totals = {
'all_time' => all_time_counts(base_hash),
'last_30_days' => last_30_days_counts(base_hash)
}
begin
@totals['custom_range'] = custom_range_counts(base_hash) if date_params_present?
render 'api/ca_dashboard/stats/index', status: :ok
rescue ArgumentError
error_msg = _('Invalid date format. please use YYYY-MM-DD when supplying `start` or `end` params.')
render_error(errors: [error_msg], status: :bad_request)
end
end

private

def all_time_counts(base_hash)
base_hash.transform_values(&:count)
end

def last_30_days_counts(base_hash)
base_hash.transform_values do |scope|
scope.where('created_at >= ?', 30.days.ago).count
end
end

def custom_range_counts(base_hash)
start_date = parse_date(params[:start])
end_date = parse_date(params[:end])
base_hash.transform_values do |scope|
scope.where(created_at: start_date..end_date).count
end
end

def date_params_present?
params[:start].present? || params[:end].present?
end

def parse_date(date_string)
Date.strptime(date_string, '%Y-%m-%d') if date_string.present?
end
end
end
end
6 changes: 6 additions & 0 deletions app/views/api/ca_dashboard/stats/index.json.jbuilder
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# frozen_string_literal: true

json.partial! 'api/v1/standard_response'
json.stats do
json.totals @totals
end
4 changes: 4 additions & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,10 @@
resources :plans, only: %i[create show index]
resources :templates, only: [:index]
end

namespace :ca_dashboard do
resources :stats, only: [:index]
end
end

namespace :paginable do
Expand Down

0 comments on commit 04f2e21

Please sign in to comment.