activity_log.rb 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. # Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
  2. class Karma::ActivityLog < ApplicationModel
  3. belongs_to :object_lookup, class_name: 'ObjectLookup'
  4. self.table_name = 'karma_activity_logs'
  5. def self.add(action, user, object, o_id, force = false)
  6. activity = Karma::Activity.lookup(name: action)
  7. if object
  8. object_id = ObjectLookup.by_name(object)
  9. end
  10. Karma::ActivityLog.transaction do
  11. last_activity = Karma::ActivityLog.where(user_id: user.id).order(created_at: :desc, id: :desc).lock(true).first
  12. latest_activity = Karma::ActivityLog.where(
  13. user_id: user.id,
  14. object_lookup_id: object_id,
  15. o_id: o_id,
  16. activity_id: activity.id,
  17. ).find_by('created_at >= ?', Time.zone.now - activity.once_ttl.seconds)
  18. return false if !force && latest_activity
  19. score_total = 0
  20. if last_activity
  21. score_total = last_activity.score_total
  22. end
  23. local_score_total = score_total + activity.score
  24. if local_score_total.negative?
  25. local_score_total = 0
  26. end
  27. Karma::ActivityLog.create(
  28. object_lookup_id: object_id,
  29. o_id: o_id,
  30. user_id: user.id,
  31. activity_id: activity.id,
  32. score: activity.score,
  33. score_total: local_score_total,
  34. )
  35. end
  36. # set new karma level
  37. Karma::User.sync(user)
  38. true
  39. end
  40. def self.latest(user, limit = 12)
  41. result = []
  42. logs = Karma::ActivityLog.where(user_id: user.id).order(id: :desc).limit(limit)
  43. logs.each { |log|
  44. last = result.last
  45. if last && last[:object_id] == log.object_id && last[:o_id] == log.o_id && last[:created_at] == log.created_at
  46. comment = {
  47. description: Karma::Activity.lookup(id: log.activity_id).description,
  48. score: log.score,
  49. }
  50. last[:comments].push comment
  51. last[:score_total] = score_total
  52. next
  53. end
  54. comment = {
  55. object_id: log.object_id,
  56. o_id: log.o_id,
  57. description: Karma::Activity.lookup(id: log.activity_id).description,
  58. score: log.score,
  59. }
  60. data = {
  61. comments: [comment],
  62. score_total: log.score_total,
  63. created_at: log.created_at,
  64. }
  65. result.push data
  66. }
  67. result
  68. end
  69. end