Class: RailsOnboarding::MilestonesController

Inherits:
ApplicationController show all
Includes:
RateLimitable
Defined in:
app/controllers/rails_onboarding/milestones_controller.rb

Instance Method Summary collapse

Instance Method Details

#achieveObject



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'app/controllers/rails_onboarding/milestones_controller.rb', line 40

def achieve
  milestone = MilestoneService.claim_if_eligible(current_user, params[:milestone_key])

  if milestone
    render json: {
      success: true,
      milestone: milestone,
      total_points: current_user.total_milestone_points,
      celebration: true
    }
  else
    render json: {
      success: false,
      error: "Milestone could not be achieved"
    }, status: :forbidden
  end
end

#availableObject



107
108
109
110
# File 'app/controllers/rails_onboarding/milestones_controller.rb', line 107

def available
  available_milestones = current_user.milestones_available || []
  render json: available_milestones
end

#checkObject



70
71
72
73
74
75
# File 'app/controllers/rails_onboarding/milestones_controller.rb', line 70

def check
  milestone_id = params[:id]
  achieved = current_user.milestone_achieved?(milestone_id)

  render json: { achieved: achieved }
end

#indexObject



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'app/controllers/rails_onboarding/milestones_controller.rb', line 8

def index
  achieved_milestones = current_user.achieved_milestones.map do |key|
    RailsOnboarding.configuration.milestone_by_key(key)
  end.compact

  available_milestones = current_user.milestones_available
  total_points = current_user.total_milestone_points

  respond_to do |format|
    format.html do
      @achieved_milestones = achieved_milestones
      @available_milestones = available_milestones
      @total_points = total_points
    end
    format.json do
      render json: (achieved_milestones + available_milestones)
    end
  end
end

#progressObject



63
64
65
66
67
68
# File 'app/controllers/rails_onboarding/milestones_controller.rb', line 63

def progress
  render json: {
    points: current_user.milestone_points || 0,
    achieved: current_user.milestones_achieved.map { |m| m["key"] || m[:key] }.compact
  }
end

#recentObject



58
59
60
61
# File 'app/controllers/rails_onboarding/milestones_controller.rb', line 58

def recent
  @recent_milestones = current_user.recent_milestones(limit: params[:limit]&.to_i || 5)
  render json: @recent_milestones
end

#showObject



28
29
30
31
32
33
34
35
36
37
38
# File 'app/controllers/rails_onboarding/milestones_controller.rb', line 28

def show
  milestone_key = params[:id]
  @milestone = RailsOnboarding.configuration.milestone_by_key(milestone_key)

  unless @milestone
    redirect_to milestones_path, alert: "Milestone not found"
    return
  end

  @achieved = current_user.milestone_achieved?(milestone_key)
end

#triggerObject



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'app/controllers/rails_onboarding/milestones_controller.rb', line 77

def trigger
  milestone_id = params[:milestone_id]

  # Check if milestone is already achieved
  if current_user.milestone_achieved?(milestone_id)
    render json: {
      success: false,
      message: "Milestone already achieved"
    }
    return
  end

  # Award the milestone only if the user actually qualifies for it
  milestone = MilestoneService.claim_if_eligible(current_user, milestone_id)

  if milestone
    render json: {
      success: true,
      celebration: true,
      points_awarded: milestone[:points] || 0,
      total_points: current_user.milestone_points || 0
    }
  else
    render json: {
      success: false,
      error: "You are not eligible for this milestone yet"
    }, status: :forbidden
  end
end