FEATURE: Permalinks for users (#25552)
This commit is contained in:
parent
4b2be8c6b3
commit
dd5ca6cc4c
|
@ -28,6 +28,7 @@ export default class PermalinkForm extends Component {
|
||||||
{ id: "category_id", name: I18n.t("admin.permalink.category_id") },
|
{ id: "category_id", name: I18n.t("admin.permalink.category_id") },
|
||||||
{ id: "tag_name", name: I18n.t("admin.permalink.tag_name") },
|
{ id: "tag_name", name: I18n.t("admin.permalink.tag_name") },
|
||||||
{ id: "external_url", name: I18n.t("admin.permalink.external_url") },
|
{ id: "external_url", name: I18n.t("admin.permalink.external_url") },
|
||||||
|
{ id: "user_id", name: I18n.t("admin.permalink.user_id") },
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -60,6 +60,9 @@
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<a href={{pl.external_url}}>{{pl.external_url}}</a>
|
<a href={{pl.external_url}}>{{pl.external_url}}</a>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
{{#if pl.user_id}}
|
||||||
|
<a href={{pl.user_url}}>{{pl.username}}</a>
|
||||||
|
{{/if}}
|
||||||
</td>
|
</td>
|
||||||
<td class="col action" style="text-align: right;">
|
<td class="col action" style="text-align: right;">
|
||||||
<DButton
|
<DButton
|
||||||
|
|
|
@ -5,6 +5,7 @@ class Permalink < ActiveRecord::Base
|
||||||
belongs_to :post
|
belongs_to :post
|
||||||
belongs_to :category
|
belongs_to :category
|
||||||
belongs_to :tag
|
belongs_to :tag
|
||||||
|
belongs_to :user
|
||||||
|
|
||||||
before_validation :normalize_url
|
before_validation :normalize_url
|
||||||
|
|
||||||
|
@ -75,12 +76,13 @@ class Permalink < ActiveRecord::Base
|
||||||
return topic.relative_url if topic
|
return topic.relative_url if topic
|
||||||
return category.url if category
|
return category.url if category
|
||||||
return tag.full_url if tag
|
return tag.full_url if tag
|
||||||
|
return user.full_url if user
|
||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.filter_by(url = nil)
|
def self.filter_by(url = nil)
|
||||||
permalinks =
|
permalinks =
|
||||||
Permalink.includes(:topic, :post, :category, :tag).order("permalinks.created_at desc")
|
Permalink.includes(:topic, :post, :category, :tag, :user).order("permalinks.created_at desc")
|
||||||
|
|
||||||
permalinks.where!("url ILIKE :url OR external_url ILIKE :url", url: "%#{url}%") if url.present?
|
permalinks.where!("url ILIKE :url OR external_url ILIKE :url", url: "%#{url}%") if url.present?
|
||||||
permalinks.limit!(100)
|
permalinks.limit!(100)
|
||||||
|
@ -101,6 +103,7 @@ end
|
||||||
# updated_at :datetime not null
|
# updated_at :datetime not null
|
||||||
# external_url :string(1000)
|
# external_url :string(1000)
|
||||||
# tag_id :integer
|
# tag_id :integer
|
||||||
|
# user_id :integer
|
||||||
#
|
#
|
||||||
# Indexes
|
# Indexes
|
||||||
#
|
#
|
||||||
|
|
|
@ -16,7 +16,10 @@ class PermalinkSerializer < ApplicationSerializer
|
||||||
:external_url,
|
:external_url,
|
||||||
:tag_id,
|
:tag_id,
|
||||||
:tag_name,
|
:tag_name,
|
||||||
:tag_url
|
:tag_url,
|
||||||
|
:user_id,
|
||||||
|
:user_url,
|
||||||
|
:username
|
||||||
|
|
||||||
def topic_title
|
def topic_title
|
||||||
object&.topic&.title
|
object&.topic&.title
|
||||||
|
@ -54,4 +57,12 @@ class PermalinkSerializer < ApplicationSerializer
|
||||||
def tag_url
|
def tag_url
|
||||||
object&.tag&.full_url
|
object&.tag&.full_url
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def user_url
|
||||||
|
object&.user&.full_url
|
||||||
|
end
|
||||||
|
|
||||||
|
def username
|
||||||
|
object&.user&.username
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -6575,6 +6575,8 @@ en:
|
||||||
category_title: "Category"
|
category_title: "Category"
|
||||||
tag_name: "Tag name"
|
tag_name: "Tag name"
|
||||||
external_url: "External or Relative URL"
|
external_url: "External or Relative URL"
|
||||||
|
user_id: "User ID"
|
||||||
|
username: "Username"
|
||||||
destination: "Destination"
|
destination: "Destination"
|
||||||
copy_to_clipboard: "Copy Permalink to Clipboard"
|
copy_to_clipboard: "Copy Permalink to Clipboard"
|
||||||
delete_confirm: Are you sure you want to delete this permalink?
|
delete_confirm: Are you sure you want to delete this permalink?
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class AddUserToPermalink < ActiveRecord::Migration[7.0]
|
||||||
|
def change
|
||||||
|
add_column :permalinks, :user_id, :integer
|
||||||
|
end
|
||||||
|
end
|
|
@ -31,6 +31,7 @@ RSpec.describe Permalink do
|
||||||
let(:post) { Fabricate(:post, topic: topic) }
|
let(:post) { Fabricate(:post, topic: topic) }
|
||||||
let(:category) { Fabricate(:category) }
|
let(:category) { Fabricate(:category) }
|
||||||
let(:tag) { Fabricate(:tag) }
|
let(:tag) { Fabricate(:tag) }
|
||||||
|
let(:user) { Fabricate(:user) }
|
||||||
|
|
||||||
it "returns a topic url when topic_id is set" do
|
it "returns a topic url when topic_id is set" do
|
||||||
permalink.topic_id = topic.id
|
permalink.topic_id = topic.id
|
||||||
|
@ -96,5 +97,15 @@ RSpec.describe Permalink do
|
||||||
it "returns nil when nothing is set" do
|
it "returns nil when nothing is set" do
|
||||||
expect(target_url).to eq(nil)
|
expect(target_url).to eq(nil)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "returns a user url when user_id is set" do
|
||||||
|
permalink.user_id = user.id
|
||||||
|
expect(target_url).to eq(user.full_url)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns nil when user_id is set but user is not found" do
|
||||||
|
permalink.user_id = 99_999
|
||||||
|
expect(target_url).to eq(nil)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -92,6 +92,8 @@ RSpec.describe Admin::PermalinksController do
|
||||||
post_id: nil,
|
post_id: nil,
|
||||||
category_id: nil,
|
category_id: nil,
|
||||||
tag_id: nil,
|
tag_id: nil,
|
||||||
|
external_url: nil,
|
||||||
|
user_id: nil,
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -112,6 +114,8 @@ RSpec.describe Admin::PermalinksController do
|
||||||
post_id: some_post.id,
|
post_id: some_post.id,
|
||||||
category_id: nil,
|
category_id: nil,
|
||||||
tag_id: nil,
|
tag_id: nil,
|
||||||
|
external_url: nil,
|
||||||
|
user_id: nil,
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -132,6 +136,8 @@ RSpec.describe Admin::PermalinksController do
|
||||||
post_id: nil,
|
post_id: nil,
|
||||||
category_id: category.id,
|
category_id: category.id,
|
||||||
tag_id: nil,
|
tag_id: nil,
|
||||||
|
external_url: nil,
|
||||||
|
user_id: nil,
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -152,6 +158,30 @@ RSpec.describe Admin::PermalinksController do
|
||||||
post_id: nil,
|
post_id: nil,
|
||||||
category_id: nil,
|
category_id: nil,
|
||||||
tag_id: tag.id,
|
tag_id: tag.id,
|
||||||
|
external_url: nil,
|
||||||
|
user_id: nil,
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "works for users" do
|
||||||
|
user = Fabricate(:user)
|
||||||
|
|
||||||
|
post "/admin/permalinks.json",
|
||||||
|
params: {
|
||||||
|
url: "/people/42",
|
||||||
|
permalink_type: "user_id",
|
||||||
|
permalink_type_value: user.id,
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(response.status).to eq(200)
|
||||||
|
expect(Permalink.last).to have_attributes(
|
||||||
|
url: "people/42",
|
||||||
|
topic_id: nil,
|
||||||
|
post_id: nil,
|
||||||
|
category_id: nil,
|
||||||
|
tag_id: nil,
|
||||||
|
external_url: nil,
|
||||||
|
user_id: user.id,
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue