This commit is contained in:
2025-10-13 01:57:10 +09:00
parent 19a17e7ba7
commit 14f67b02e2
9 changed files with 171 additions and 54 deletions
+34 -8
View File
@@ -1,7 +1,3 @@
require 'open-uri'
require 'nokogiri'
class PostsController < ApplicationController
# GET /posts
def index
@@ -77,7 +73,7 @@ class PostsController < ApplicationController
post.thumbnail.attach(thumbnail)
if post.save
post.resized_thumbnail!
post.tags = Tag.normalise_tags(tag_names)
sync_post_tags!(post, Tag.normalise_tags(tag_names))
render json: post.as_json(include: { tags: { only: [:id, :name, :category, :post_count] } }),
status: :created
else
@@ -110,8 +106,10 @@ class PostsController < ApplicationController
original_created_before = params[:original_created_before]
post = Post.find(params[:id].to_i)
tags = post.tags.where(category: 'nico').to_a + Tag.normalise_tags(tag_names)
if post.update(title:, tags:, original_created_from:, original_created_before:)
if post.update(title:, original_created_from:, original_created_before:)
sync_post_tags!(post,
(post.tags.where(category: 'nico').to_a +
Tag.normalise_tags(tag_names)))
render json: post.as_json(include: { tags: { only: [:id, :name, :category, :post_count] } }),
status: :ok
else
@@ -128,7 +126,11 @@ class PostsController < ApplicationController
def filtered_posts
tag_names = params[:tags]&.split(' ')
match_type = params[:match]
tag_names.present? ? filter_posts_by_tags(tag_names, match_type) : Post.all
if tag_names.present?
filter_posts_by_tags(tag_names, match_type)
else
Post.all
end
end
def filter_posts_by_tags tag_names, match_type
@@ -142,4 +144,28 @@ class PostsController < ApplicationController
end
posts.distinct
end
def sync_post_tags! post, desired_tags
desired_tags.each do |t|
t.save! if t.new_record?
end
desired_ids = desired_tags.map(&:id).to_set
current_ids = post.tags.pluck(:id).to_set
to_add = desired_ids - current_ids
to_remove = current_ids - desired_ids
Tag.where(id: to_add).find_each do |tag|
begin
PostTag.create!(post:, tag:, created_user: current_user)
rescue ActiveRecord::RecordNotUnique
;
end
end
PostTag.where(post_id: post.id, tag_id: to_remove.to_a).kept.find_each do |pt|
pt.discard_by!(current_user)
end
end
end