mirror of
https://gitlink.org.cn/Gitlink/forgeplus.git
synced 2026-05-03 03:40:49 +08:00
init project
This commit is contained in:
0
app/models/concerns/.keep
Normal file
0
app/models/concerns/.keep
Normal file
34
app/models/concerns/base_model.rb
Executable file
34
app/models/concerns/base_model.rb
Executable file
@@ -0,0 +1,34 @@
|
||||
module BaseModel
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
scope :recent, -> { order(id: :desc) }
|
||||
scope :exclude_ids, -> (ids) { where.not(id: ids.map(&:to_i)) }
|
||||
scope :by_ids, -> (ids) { where(id: ids) unless ids.blank? }
|
||||
scope :by_week, -> { where("created_at > ?", 7.days.ago.utc) }
|
||||
|
||||
delegate :url_helpers, to: 'Rails.application.routes'
|
||||
end
|
||||
|
||||
# FIXME: 需要原子化操作
|
||||
def push(hash)
|
||||
hash.each_key do |key|
|
||||
self.send("#{key}_will_change!")
|
||||
old_val = self[key] || []
|
||||
old_val << hash[key].to_i
|
||||
old_val.uniq!
|
||||
update_attributes(key => old_val)
|
||||
end
|
||||
end
|
||||
|
||||
# FIXME: 需要原子化操作
|
||||
def pull(hash)
|
||||
hash.each_key do |key|
|
||||
self.send("#{key}_will_change!")
|
||||
old_val = self[key]
|
||||
return true if old_val.blank?
|
||||
old_val.delete(hash[key].to_i)
|
||||
update_attributes(key => old_val)
|
||||
end
|
||||
end
|
||||
end
|
||||
21
app/models/concerns/likeable.rb
Normal file
21
app/models/concerns/likeable.rb
Normal file
@@ -0,0 +1,21 @@
|
||||
module Likeable
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
has_many :praise_treads, as: :praise_tread_object, dependent: :destroy
|
||||
end
|
||||
|
||||
def liked?(praiseable)
|
||||
praiseable.praise_treads.exists?(user_id: self.id)
|
||||
end
|
||||
|
||||
def like!(praiseable)
|
||||
praiseable.praise_treads.create!(user_id: self.id)
|
||||
end
|
||||
|
||||
def unlike!(praiseable)
|
||||
obj = praiseable.praise_treads.find_by(user_id: self.id)
|
||||
obj.destroy! if obj.present?
|
||||
end
|
||||
|
||||
end
|
||||
10
app/models/concerns/lockable.rb
Normal file
10
app/models/concerns/lockable.rb
Normal file
@@ -0,0 +1,10 @@
|
||||
module Lockable
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
end
|
||||
|
||||
def locked?(is_member)
|
||||
is_member == true ? false : !publiced?
|
||||
end
|
||||
end
|
||||
13
app/models/concerns/matchable.rb
Normal file
13
app/models/concerns/matchable.rb
Normal file
@@ -0,0 +1,13 @@
|
||||
module Matchable
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
scope :like, lambda { |keywords|
|
||||
where("name LIKE ?", "%#{keywords.split(" ").join('|')}%") unless keywords.blank?
|
||||
}
|
||||
scope :with_project_category, ->(category_id) { where(project_category_id: category_id) unless category_id.blank? }
|
||||
scope :with_project_language, ->(language_id) { where(project_language_id: language_id) unless language_id.blank? }
|
||||
scope :with_project_type, ->(project_type) { where(project_type: project_type) if Project.project_types.include?(project_type) }
|
||||
end
|
||||
|
||||
end
|
||||
13
app/models/concerns/number_display_helper.rb
Normal file
13
app/models/concerns/number_display_helper.rb
Normal file
@@ -0,0 +1,13 @@
|
||||
module NumberDisplayHelper
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
module ClassMethods
|
||||
def number_display_methods(*columns, **opts)
|
||||
columns.each do |column|
|
||||
define_method "display_#{column}" do
|
||||
number_to_currency(column.to_f, opts)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
43
app/models/concerns/project_operable.rb
Normal file
43
app/models/concerns/project_operable.rb
Normal file
@@ -0,0 +1,43 @@
|
||||
module ProjectOperable
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
has_many :members
|
||||
# has_many :except_owner_members, -> { members.where("members.use_id != ? ", self.owner.id ) }
|
||||
has_many :manager_members, -> { joins(:roles).where(roles: { name: 'Manager' }) }, class_name: 'Member'
|
||||
end
|
||||
|
||||
def add_member!(user_id, role_name='Developer')
|
||||
member = members.create!(user_id: user_id)
|
||||
set_developer_role(member)
|
||||
end
|
||||
|
||||
def remove_member!(user_id)
|
||||
member = members.find_by(user_id: user_id)
|
||||
member.destroy! if member && self.user_id != user_id
|
||||
end
|
||||
|
||||
def member?(user_id)
|
||||
members.exists?(user_id: user_id)
|
||||
end
|
||||
|
||||
# 除了项目创建者本身
|
||||
def member(user_id)
|
||||
members.where.not("members.user_id = ? ", owner.id).find_by(user_id: user_id)
|
||||
end
|
||||
|
||||
def change_member_role!(user_id, role)
|
||||
member = self.member(user_id)
|
||||
member.member_roles.last.update_attributes!(role: role)
|
||||
end
|
||||
|
||||
def owner?(user)
|
||||
self.owner == user
|
||||
end
|
||||
|
||||
def set_developer_role(member)
|
||||
role = Role.find_by_name 'Developer'
|
||||
member.member_roles.create!(role: role)
|
||||
end
|
||||
|
||||
end
|
||||
15
app/models/concerns/projectable.rb
Normal file
15
app/models/concerns/projectable.rb
Normal file
@@ -0,0 +1,15 @@
|
||||
module Projectable
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
has_many :projects, -> { order(position: :asc) }
|
||||
|
||||
scope :without_content, -> { select(column_names - ['content'])}
|
||||
scope :search, lambda { |keywords|
|
||||
where("name LIKE ?", "%#{keywords.split(" ").join('|')}%") unless keywords.blank?
|
||||
}
|
||||
end
|
||||
|
||||
module ClassMethods
|
||||
end
|
||||
end
|
||||
7
app/models/concerns/publicable.rb
Normal file
7
app/models/concerns/publicable.rb
Normal file
@@ -0,0 +1,7 @@
|
||||
module Publicable
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
scope :visible, -> { where(is_public: true) }
|
||||
end
|
||||
end
|
||||
9
app/models/concerns/publishable.rb
Normal file
9
app/models/concerns/publishable.rb
Normal file
@@ -0,0 +1,9 @@
|
||||
module Publishable
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
alias_attribute :publish, :is_publish
|
||||
enum publish: { published: 1, unpublish: 0 }
|
||||
end
|
||||
|
||||
end
|
||||
26
app/models/concerns/watchable.rb
Normal file
26
app/models/concerns/watchable.rb
Normal file
@@ -0,0 +1,26 @@
|
||||
module Watchable
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
has_many :watchers, as: :watchable, dependent: :destroy
|
||||
has_many :watcher_users, through: :watchers, source: :user, validate: false
|
||||
|
||||
scope :watched_by, -> (user_id) { includes(:watchers).where(watchers: { user_id: user_id }) }
|
||||
end
|
||||
|
||||
def watched?(watchable)
|
||||
watchable.watchers.exists?(user: self)
|
||||
end
|
||||
|
||||
def watch!(watchable)
|
||||
watchable.watchers.create!(user: self)
|
||||
end
|
||||
|
||||
def unwatch!(watchable)
|
||||
obj = watchable.watchers.find_by(user: self)
|
||||
obj.destroy! if obj.present?
|
||||
end
|
||||
|
||||
module ClassMethods
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user