app/controllers/posts_controller.rb
# frozen_string_literal: true

#   Copyright (c) 2010-2011, Diaspora Inc.  This file is
#   licensed under the Affero General Public License version 3 or later.  See
#   the COPYRIGHT file.

class PostsController < ApplicationController
  before_action :authenticate_user!, only: %i(destroy mentionable)
  before_action :set_format_if_malformed_from_status_net, only: :show

  respond_to :html, :mobile, :json

  rescue_from Diaspora::NonPublic do
    authenticate_user!
  end

  rescue_from Diaspora::NotMine do
    render plain: I18n.t("posts.show.forbidden"), status: 403
  end

  def show
    post = post_service.find!(params[:id])
    post_service.mark_user_notifications(post.id)
    presenter = PostPresenter.new(post, current_user)
    respond_to do |format|
      format.html do
        gon.post = presenter.with_initial_interactions
        render locals: {post: presenter}
      end
      format.mobile { render locals: {post: post} }
      format.json { render json: presenter.with_interactions }
    end
  end

  def oembed
    post_id = OEmbedPresenter.id_from_url(params.delete(:url))
    post = post_service.find!(post_id)
    oembed = params.slice(:format, :maxheight, :minheight)
    render json: OEmbedPresenter.new(post, oembed)
  rescue
    head :not_found
  end

  def mentionable
    respond_to do |format|
      format.json {
        if params[:id].present? && params[:q].present?
          render json: post_service.mentionable_in_comment(params[:id], params[:q])
        else
          head :no_content
        end
      }
      format.any { head :not_acceptable }
    end
  rescue ActiveRecord::RecordNotFound
    head :not_found
  end

  def destroy
    post_service.destroy(params[:id])
    respond_to do |format|
      format.json { head :no_content }
      format.any { redirect_to stream_path }
    end
  end

  private

  def post_service
    @post_service ||= PostService.new(current_user)
  end

  def set_format_if_malformed_from_status_net
    request.format = :html if request.format == "application/html+xml"
  end
end
