| 
				
				
					
				
				
				 | 
			
			 | 
			@@ -62,19 +62,12 @@ class PostsController < ApplicationController | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    url = params[:url] | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    thumbnail = params[:thumbnail] | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    tag_names = params[:tags].to_s.split(' ') | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if tag_names.size < 20 && tag_names.none?('タグ希望') | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      tag_names << 'タグ希望' | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    end | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    post = Post.new(title:, url:, thumbnail_base: '', uploaded_user: current_user) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    post.thumbnail.attach(thumbnail) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if post.save | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      post.resized_thumbnail! | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      # TODO: 接頭辞に応じて category 変へる | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      post.tags = tag_names.map { |name| Tag.find_or_initialize_by(name:) { |tag| | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        tag.category = 'general' | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      } } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      post.tags = normalise_tags(tags_names) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      render json: post.as_json(include: { tags: { only: [:id, :name, :category] } }), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			             status: :created | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    else | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -103,22 +96,12 @@ class PostsController < ApplicationController | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    title = params[:title] | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    tag_names = params[:tags].to_s.split(' ') | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if tag_names.size < 20 && tag_names.none?('タグ希望') | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      tag_names << 'タグ希望' | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    end | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    post = Post.find(params[:id].to_i) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    tags = post.tags.where(category: 'nico').to_a | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    tag_names.each do |name| | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      # TODO: 接頭辞に応じて category 変へる | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      tags << Tag.find_or_initialize_by(name:) { |tag| | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        tag.category = 'general' | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    end | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    tags = post.tags.where(category: 'nico').to_a + normalise_tags(tag_names) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if post.update(title:, tags:) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      render({ json:    (post | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                         .as_json(include: { tags: { only: [:id, :name, :category] } })), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			               status:  :created }) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      render json: post.as_json(include: { tags: { only: [:id, :name, :category] } }), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			             status: :created | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    else | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      render json: post.errors, status: :unprocessable_entity | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    end | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -130,8 +113,16 @@ class PostsController < ApplicationController | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  private | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  CATEGORY_PREFIXES = { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      'gen:'  => 'general', | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      'djk:'  => 'deerjikist', | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      'meme:' => 'meme', | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      'chr:'  => 'character', | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      'mtr:'  => 'material', | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      'meta:' => 'meta' }.freeze | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  def filtered_posts | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    tag_names = params[:tags]&.split(?\ ) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    tag_names = params[:tags]&.split(' ') | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    match_type = params[:match] | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    tag_names.present? ? filter_posts_by_tags(tag_names, match_type) : Post.all | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  end | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -147,4 +138,19 @@ class PostsController < ApplicationController | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    end | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    posts.distinct | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  end | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  def normalise_tags tag_names | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    tags = tag_names.map do |name| | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      pf, cat = CATEGORY_PREFIXES.find { |p, _| name.start_with?(p) } || ['', nil] | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      name.delete_prefix!(pf) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      Tag.find_or_initialize_by(name:).tap do |tag| | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if cat && tag.category != cat | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          tag.category = cat | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          tag.save! | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        end | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      end | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    end | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    tags << Tag.tagme if tags.size < 20 && tags.none?(Tag.tagme) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    tags.uniq | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  end | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			end |