From b391e033cbf2124bb7b815bc289820b2b02e879f Mon Sep 17 00:00:00 2001
From: tmn21 <tmn21@inf.ufpr.br>
Date: Wed, 24 May 2023 11:51:38 -0300
Subject: [PATCH] ISSUE #38: CREATE streak route

---
 app/controllers/v1/users_controller.rb    | 11 +++++++++++
 app/models/user.rb                        | 23 +++++++++++++++++++++++
 app/models/view.rb                        |  1 +
 app/serializers/user_serializer.rb        |  4 +++-
 app/services/learning_object_publisher.rb |  3 +++
 config/routes.rb                          |  1 +
 6 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/app/controllers/v1/users_controller.rb b/app/controllers/v1/users_controller.rb
index de41f3513..55c574c05 100644
--- a/app/controllers/v1/users_controller.rb
+++ b/app/controllers/v1/users_controller.rb
@@ -179,6 +179,7 @@ class V1::UsersController < ApplicationController
   end
 
   # GET /v1/top_users
+  # GET /v1/top_users.json
   def show_top_users
     # select users who are not admin and order by level, limit to 5 users
     ids = User.joins(:roles_users).where(roles_users: {role_id: 3}).pluck(:user_id)
@@ -187,6 +188,16 @@ class V1::UsersController < ApplicationController
     render json: users
   end
 
+  # GET /v1/most_active_users
+  # GET /v1/most_active_users.json
+  def most_active_users
+    # select users who are not admin and order by streak, limit to 5 users
+    ids = User.joins(:roles_users).where(roles_users: {role_id: 3}).pluck(:user_id)
+    users = User.where.not(id: ids).order("streak DESC").limit(5)
+    render json: users
+  end
+
+
   # GET /v1/users/teacher_requests
   # GET /v1/users/teacher_requests.json
   def teacher_requests
diff --git a/app/models/user.rb b/app/models/user.rb
index ae740e609..4c360cd33 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -79,6 +79,8 @@
 #  level                  :integer          default("1")
 #  points                 :integer          default("0")
 #  last_sign_in_day       :datetime
+#  last_action_at         :date
+#  streak                 :integer          default("0")
 
 class User < ApplicationRecord
   include Followable
@@ -385,6 +387,27 @@ class User < ApplicationRecord
     end
   end
 
+  def update_streak()
+    if self.last_action_at==Date.today
+      return
+    end
+    
+    # increase streak count
+    if self.last_action_at==Date.yesterday    
+      self.update(last_action_at: Date.today)
+      self.update(streak: streak+1)
+      return
+    end
+    
+    # restart streak count 
+    if Date.today - self.last_action_at >= 2
+      self.update(last_action_at: Date.today)
+      self.update(streak: 1)
+    end
+
+  end
+
+
   def complete_action(action, quantity=1)
     return false, { "error": "action not found"} if action.blank?
 
diff --git a/app/models/view.rb b/app/models/view.rb
index c18f1b5cb..3aedbb486 100644
--- a/app/models/view.rb
+++ b/app/models/view.rb
@@ -60,6 +60,7 @@ class View < ApplicationRecord
 
   def create_action
     if !user.nil?
+      user.update_streak()
       if viewable_type == "LearningObject"
         user.complete_action(Action.find_by_name("Visualizar um Recurso"))
         viewable.subjects.each do |subject|
diff --git a/app/serializers/user_serializer.rb b/app/serializers/user_serializer.rb
index 7c3ecdca8..16591fd05 100644
--- a/app/serializers/user_serializer.rb
+++ b/app/serializers/user_serializer.rb
@@ -109,7 +109,9 @@ class UserSerializer < ActiveModel::Serializer
       :level,
       :level_xp,
       :experience,
-      :points
+      :points,
+      :last_action_at,
+      :streak
 
   attribute \
       :times_blocked, if: :is_current_user?
diff --git a/app/services/learning_object_publisher.rb b/app/services/learning_object_publisher.rb
index 5515fc954..45cfdda4d 100644
--- a/app/services/learning_object_publisher.rb
+++ b/app/services/learning_object_publisher.rb
@@ -31,6 +31,8 @@ class LearningObjectPublisher
     draft.id_dspace = item.id
     draft.publisher = publisher
     draft.save
+    
+    draf.publisher.update_streak()
 
     update_dspace(draft)
 
@@ -53,6 +55,7 @@ class LearningObjectPublisher
     learning_object.save
     learning_object.new_activity(:publish)
     learning_object.publisher.complete_action(Action.find_by_name("Publicar"))
+    learning_object.publisher.update_streak()
     if learning_object.link? && learning_object.thumbnail.blank?
       att = learning_object.attachments.create(retrieve_link: learning_object.link, bundle_name: "LINK")
       ThumbnailGenerateWorker.perform_async(att.id)
diff --git a/config/routes.rb b/config/routes.rb
index 229c06a65..5238f976d 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -249,6 +249,7 @@ Rails.application.routes.draw do
     get 'learning_objects_complaints/queue_user/:user_id', to: 'learning_objects_complaints#queue_user'
     get 'user_progresses/:user_id', to: 'user_progresses#index'
     get '/top_users', to: 'users#show_top_users'
+    get '/most_active_users', to: 'users#most_active_users'
     get '/email', to: 'email#index'
   end
 end
-- 
GitLab