Files
libr-2/app/controllers/api/v1/posts_controller.rb
T
2015-12-02 23:51:58 +08:00

105 lines
3.0 KiB
Ruby

class Api::V1::PostsController < Api::V1::ApplicationController
before_action :permit_params, :check_url, :map_post_type, :get_post, only: [:create]
before_action :load_post, only: [:add_viewed_times, :show]
skip_before_action :authenticate_user_from_token, only: [:posts, :show, :liked_posts, :bookmarked_posts]
before_action :fetch_current_user
before_action :load_target_user, only: [:posts, :liked_posts, :bookmarked_posts]
after_action :process_post, only: :create
POST_TYPE = {
:ARTICLE => 'article',
:WEB_PAGE => 'web_page'
}
def create
if @current_user.share_instances.where(sharable: @post).empty?
share_instance = @current_user.share_instances.create! sharable: @post, description: params[:description]
@current_user.timeline_sources.create! post_id: @post.id, action_type: 'share'
render json: share_instance.to_json(include: :sharable)
else
render json: {message: '请勿重复分享同一资源'}, status: 409
end
end
def show
render json: @target_post, serializer: PostSerializer
end
def index
post_ids = @current_user.share_instances.order('created_at DESC').page(params[:page]).pluck(:sharable_id)
render json: Post.where(id: post_ids), each_serializer: EachPostSerializer
end
def add_viewed_times
@target_post.increment!(:viewed_times)
render nothing: true
end
def posts
post_ids = @target_user.share_instances.order('created_at DESC').page(params[:page]).pluck(:sharable_id)
render json: Post.where(id: post_ids), each_serializer: EachPostSerializer
end
def liked_posts
ids = Like.where(user_id: @target_user.id).order('created_at DESC').pluck(:likable_id)
render json: Post.where(id: ids).page(params[:page]), each_serializer: EachPostSerializer
end
def bookmarked_posts
ids = Favorite.where(user_id: @target_user.id).order('created_at DESC').pluck(:favoritable_id)
render json: Post.where(id: ids).page(params[:page]), each_serializer: EachPostSerializer
end
def search
params.permit(:keywords)
render json: Post.where('title LIKE ?', "%#{params[:keywords]}%").page(params[:page]), each_serializer: EachPostSerializer
end
private
def permit_params
params.permit(:url, :type, :description)
end
def get_post
begin
@post = Post.find_or_create_by!(url: params[:url], type: @type)
rescue ActiveRecord::RecordInvalid
return render json: {msg: '缺少参数,校验失败'}, status: 400
end
end
def map_post_type
case params[:type]
when 'article'
@type = 'Article'
when 'page'
@type = 'WebPage'
else
return render json: {msg: 'Post 类型不合法'}, status: 400
end
end
def check_url
begin
uri = URI.parse params[:url]
res = uri.kind_of?(URI::HTTP)
rescue URI::InvalidURIError
res = false
end
return render json: {msg: 'URL不合法, 请重新输入'}, status: 400 unless res
end
def process_post
if !@post.processed
ProcessPostWorker.perform_async @post.url
end
end
end