class Api::V1::PostsController < Api::V1::ApplicationController before_action :permit_params, :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, :random] 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 share_instance = @current_user.share_instances.create! sharable: @post, description: params[:description] @current_user.timeline_sources.create! post_id: @post.id, action_type: 'share' @post.images.create permit_params[:images] #render json: share_instance.to_json(include: :sharable) render json: @post.to_json(include: :images) 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 def random render json: Post.order('RANDOM()').limit(1).first, serializer: PostSerializer end private def permit_params params.permit(:url, :type, :description, :title, :images => [:url, :title, :key]) end def get_post begin @post = Post.find_or_create_by!(title: params[:title], url: 'NONE', type: 'Article') rescue ActiveRecord::RecordInvalid => e Rails.logger.warn e return render json: (msg: e), 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