76 lines
2.1 KiB
Ruby
76 lines
2.1 KiB
Ruby
|
# Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/
|
||
|
|
||
|
class Karma::ActivityLog < ApplicationModel
|
||
|
belongs_to :object_lookup, class_name: 'ObjectLookup'
|
||
|
|
||
|
self.table_name = 'karma_activity_logs'
|
||
|
|
||
|
def self.add(action, user, object, o_id)
|
||
|
activity = Karma::Activity.lookup(name: action)
|
||
|
|
||
|
if object
|
||
|
object_id = ObjectLookup.by_name(object)
|
||
|
end
|
||
|
|
||
|
Karma::ActivityLog.transaction do
|
||
|
last_activity = Karma::ActivityLog.where(user_id: user.id).order(id: :desc).lock(true).first
|
||
|
latest_activity = Karma::ActivityLog.where(
|
||
|
user_id: user.id,
|
||
|
object_lookup_id: object_id,
|
||
|
o_id: o_id,
|
||
|
activity_id: activity.id,
|
||
|
).find_by('created_at >= ?', Time.zone.now - activity.once_ttl.seconds)
|
||
|
return false if latest_activity
|
||
|
score_total = 0
|
||
|
if last_activity
|
||
|
score_total = last_activity.score_total
|
||
|
end
|
||
|
|
||
|
Karma::ActivityLog.create(
|
||
|
object_lookup_id: object_id,
|
||
|
o_id: o_id,
|
||
|
user_id: user.id,
|
||
|
activity_id: activity.id,
|
||
|
score: activity.score,
|
||
|
score_total: score_total + activity.score,
|
||
|
)
|
||
|
end
|
||
|
|
||
|
# set new karma level
|
||
|
Karma::User.sync(user)
|
||
|
|
||
|
true
|
||
|
end
|
||
|
|
||
|
def self.latest(user, limit = 20)
|
||
|
result = []
|
||
|
logs = Karma::ActivityLog.where(user_id: user.id).order(id: :desc).limit(limit)
|
||
|
logs.each { |log|
|
||
|
last = result.last
|
||
|
if last && last[:object_id] == log.object_id && last[:o_id] == log.o_id && last[:created_at] == log.created_at
|
||
|
comment = {
|
||
|
description: Karma::Activity.lookup(id: log.activity_id).description,
|
||
|
score: log.score,
|
||
|
}
|
||
|
last[:comments].push comment
|
||
|
last[:score_total] = score_total
|
||
|
next
|
||
|
end
|
||
|
comment = {
|
||
|
object_id: log.object_id,
|
||
|
o_id: log.o_id,
|
||
|
description: Karma::Activity.lookup(id: log.activity_id).description,
|
||
|
score: log.score,
|
||
|
}
|
||
|
data = {
|
||
|
comments: [comment],
|
||
|
score_total: log.score_total,
|
||
|
created_at: log.created_at,
|
||
|
}
|
||
|
result.push data
|
||
|
}
|
||
|
result
|
||
|
end
|
||
|
|
||
|
end
|