forked from fedi/mastodon
Adding hashtag model
This commit is contained in:
parent
6471a548fe
commit
62292797ec
|
@ -14,12 +14,12 @@ class Api::V1::AccountsController < ApiController
|
||||||
end
|
end
|
||||||
|
|
||||||
def following
|
def following
|
||||||
@accounts = @account.following.limit(40)
|
@accounts = @account.following.with_counters.limit(40)
|
||||||
render action: :index
|
render action: :index
|
||||||
end
|
end
|
||||||
|
|
||||||
def followers
|
def followers
|
||||||
@accounts = @account.followers.limit(40)
|
@accounts = @account.followers.with_counters.limit(40)
|
||||||
render action: :index
|
render action: :index
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -15,12 +15,12 @@ class Api::V1::StatusesController < ApiController
|
||||||
end
|
end
|
||||||
|
|
||||||
def reblogged_by
|
def reblogged_by
|
||||||
@accounts = @status.reblogs.includes(:account).limit(40).map(&:account)
|
@accounts = @status.reblogged_by(40)
|
||||||
render action: :accounts
|
render action: :accounts
|
||||||
end
|
end
|
||||||
|
|
||||||
def favourited_by
|
def favourited_by
|
||||||
@accounts = @status.favourites.includes(:account).limit(40).map(&:account)
|
@accounts = @status.favourited_by(40)
|
||||||
render action: :accounts
|
render action: :accounts
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ class Formatter
|
||||||
html = simple_format(html, sanitize: false)
|
html = simple_format(html, sanitize: false)
|
||||||
html = link_urls(html)
|
html = link_urls(html)
|
||||||
html = link_mentions(html, status.mentions)
|
html = link_mentions(html, status.mentions)
|
||||||
|
html = link_hashtags(html)
|
||||||
|
|
||||||
html.html_safe
|
html.html_safe
|
||||||
end
|
end
|
||||||
|
@ -43,6 +44,17 @@ class Formatter
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def link_hashtags(html)
|
||||||
|
html.gsub(Tag::HASHTAG_RE) do |match|
|
||||||
|
hashtag_html(match)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def hashtag_html(match)
|
||||||
|
prefix, affix = match.split('#')
|
||||||
|
"#{prefix}<a href=\"#\" class=\"mention hashtag\">#<span>#{affix}</span></a>"
|
||||||
|
end
|
||||||
|
|
||||||
def mention_html(match, account)
|
def mention_html(match, account)
|
||||||
"#{match.split('@').first}<a href=\"#{TagManager.instance.url_for(account)}\" class=\"mention\">@<span>#{account.username}</span></a>"
|
"#{match.split('@').first}<a href=\"#{TagManager.instance.url_for(account)}\" class=\"mention\">@<span>#{account.username}</span></a>"
|
||||||
end
|
end
|
||||||
|
|
|
@ -33,12 +33,12 @@ class Account < ApplicationRecord
|
||||||
has_many :active_relationships, class_name: 'Follow', foreign_key: 'account_id', dependent: :destroy
|
has_many :active_relationships, class_name: 'Follow', foreign_key: 'account_id', dependent: :destroy
|
||||||
has_many :passive_relationships, class_name: 'Follow', foreign_key: 'target_account_id', dependent: :destroy
|
has_many :passive_relationships, class_name: 'Follow', foreign_key: 'target_account_id', dependent: :destroy
|
||||||
|
|
||||||
has_many :following, -> { order('follows.created_at desc') }, through: :active_relationships, source: :target_account
|
has_many :following, -> { order('follows.id desc') }, through: :active_relationships, source: :target_account
|
||||||
has_many :followers, -> { order('follows.created_at desc') }, through: :passive_relationships, source: :account
|
has_many :followers, -> { order('follows.id desc') }, through: :passive_relationships, source: :account
|
||||||
|
|
||||||
# Block relationships
|
# Block relationships
|
||||||
has_many :block_relationships, class_name: 'Block', foreign_key: 'account_id', dependent: :destroy
|
has_many :block_relationships, class_name: 'Block', foreign_key: 'account_id', dependent: :destroy
|
||||||
has_many :blocking, -> { order('blocks.created_at desc') }, through: :block_relationships, source: :target_account
|
has_many :blocking, -> { order('blocks.id desc') }, through: :block_relationships, source: :target_account
|
||||||
|
|
||||||
has_many :media_attachments, dependent: :destroy
|
has_many :media_attachments, dependent: :destroy
|
||||||
|
|
||||||
|
|
|
@ -77,6 +77,14 @@ class Status < ApplicationRecord
|
||||||
ids.map { |id| statuses[id].first }
|
ids.map { |id| statuses[id].first }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def reblogged_by(limit)
|
||||||
|
Account.where(id: reblogs.limit(limit).pluck(:account_id)).with_counters
|
||||||
|
end
|
||||||
|
|
||||||
|
def favourited_by(limit)
|
||||||
|
Account.where(id: favourites.limit(limit).pluck(:account_id)).with_counters
|
||||||
|
end
|
||||||
|
|
||||||
def self.as_home_timeline(account)
|
def self.as_home_timeline(account)
|
||||||
where(account: [account] + account.following).with_includes.with_counters
|
where(account: [account] + account.following).with_includes.with_counters
|
||||||
end
|
end
|
||||||
|
|
5
app/models/tag.rb
Normal file
5
app/models/tag.rb
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
class Tag < ApplicationRecord
|
||||||
|
HASHTAG_RE = /[?:^|\s|\.|>]#([[:word:]_]+)/i
|
||||||
|
|
||||||
|
validates :name, presence: true, uniqueness: true
|
||||||
|
end
|
|
@ -7,7 +7,7 @@ class User < ApplicationRecord
|
||||||
validates :account, presence: true
|
validates :account, presence: true
|
||||||
|
|
||||||
scope :prolific, -> { joins('inner join statuses on statuses.account_id = users.account_id').select('users.*, count(statuses.id) as statuses_count').group('users.id').order('statuses_count desc') }
|
scope :prolific, -> { joins('inner join statuses on statuses.account_id = users.account_id').select('users.*, count(statuses.id) as statuses_count').group('users.id').order('statuses_count desc') }
|
||||||
scope :recent, -> { order('created_at desc') }
|
scope :recent, -> { order('id desc') }
|
||||||
scope :admins, -> { where(admin: true) }
|
scope :admins, -> { where(admin: true) }
|
||||||
|
|
||||||
has_settings do |s|
|
has_settings do |s|
|
||||||
|
|
11
db/migrate/20161104173623_create_tags.rb
Normal file
11
db/migrate/20161104173623_create_tags.rb
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
class CreateTags < ActiveRecord::Migration[5.0]
|
||||||
|
def change
|
||||||
|
create_table :tags do |t|
|
||||||
|
t.string :name, null: false, default: ''
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
|
||||||
|
add_index :tags, :name, unique: true
|
||||||
|
end
|
||||||
|
end
|
|
@ -10,7 +10,7 @@
|
||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema.define(version: 20161027172456) do
|
ActiveRecord::Schema.define(version: 20161104173623) do
|
||||||
|
|
||||||
# These are extensions that must be enabled in order to support this database
|
# These are extensions that must be enabled in order to support this database
|
||||||
enable_extension "plpgsql"
|
enable_extension "plpgsql"
|
||||||
|
@ -170,6 +170,13 @@ ActiveRecord::Schema.define(version: 20161027172456) do
|
||||||
t.index ["activity_id", "activity_type"], name: "index_stream_entries_on_activity_id_and_activity_type", using: :btree
|
t.index ["activity_id", "activity_type"], name: "index_stream_entries_on_activity_id_and_activity_type", using: :btree
|
||||||
end
|
end
|
||||||
|
|
||||||
|
create_table "tags", force: :cascade do |t|
|
||||||
|
t.string "name", default: "", null: false
|
||||||
|
t.datetime "created_at", null: false
|
||||||
|
t.datetime "updated_at", null: false
|
||||||
|
t.index ["name"], name: "index_tags_on_name", unique: true, using: :btree
|
||||||
|
end
|
||||||
|
|
||||||
create_table "users", force: :cascade do |t|
|
create_table "users", force: :cascade do |t|
|
||||||
t.string "email", default: "", null: false
|
t.string "email", default: "", null: false
|
||||||
t.integer "account_id", null: false
|
t.integer "account_id", null: false
|
||||||
|
|
3
spec/fabricators/tag_fabricator.rb
Normal file
3
spec/fabricators/tag_fabricator.rb
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
Fabricator(:tag) do
|
||||||
|
name "MyString"
|
||||||
|
end
|
5
spec/models/tag_spec.rb
Normal file
5
spec/models/tag_spec.rb
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
RSpec.describe Tag, type: :model do
|
||||||
|
pending "add some examples to (or delete) #{__FILE__}"
|
||||||
|
end
|
Loading…
Reference in a new issue