|
|
@@ -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 |