PageRenderTime 1057ms CodeModel.GetById 44ms RepoModel.GetById 1ms app.codeStats 0ms

/app/controllers/alchemy/api/pages_controller.rb

https://github.com/magiclabs/alchemy_cms
Ruby | 129 lines | 96 code | 18 blank | 15 comment | 9 complexity | b9861cad8a55cd33f2e5f27d9bb0e1e6 MD5 | raw file
  1. # frozen_string_literal: true
  2. module Alchemy
  3. class Api::PagesController < Api::BaseController
  4. serialization_scope :current_ability
  5. before_action :load_page, only: [:show]
  6. # Returns all pages as json object
  7. #
  8. def index
  9. # Fix for cancancan not able to merge multiple AR scopes for logged in users
  10. if can? :edit_content, Alchemy::Page
  11. @pages = Alchemy::Page.all
  12. else
  13. language = Alchemy::Language.find_by(id: params[:language_id]) || Alchemy::Language.current
  14. @pages = Alchemy::Page.accessible_by(current_ability, :index)
  15. @pages = @pages.where(language: language)
  16. end
  17. @pages = @pages.includes(*page_includes)
  18. @pages = @pages.ransack(params[:q]).result
  19. if params[:page]
  20. @pages = @pages.page(params[:page]).per(params[:per_page])
  21. end
  22. render json: @pages, adapter: :json, root: "pages", meta: meta_data
  23. end
  24. # Returns all pages as nested json object for tree views
  25. #
  26. # Pass a page_id param to only load tree for this page
  27. #
  28. # Pass elements=true param to include elements for pages
  29. #
  30. def nested
  31. @page = Page.find_by(id: params[:page_id]) || Language.current_root_page
  32. render json: PageTreeSerializer.new(@page,
  33. ability: current_ability,
  34. user: current_alchemy_user,
  35. elements: params[:elements],
  36. full: true)
  37. end
  38. # Returns a json object for page
  39. #
  40. # You can either load the page via id or its urlname
  41. #
  42. def show
  43. authorize! :show, @page
  44. respond_with @page
  45. end
  46. def move
  47. @page = Page.find(params[:id])
  48. authorize! :update, @page
  49. target_parent_page = Page.find(params[:target_parent_id])
  50. @page.move_to_child_with_index(target_parent_page, params[:new_position])
  51. render json: @page, serializer: PageSerializer
  52. end
  53. private
  54. def load_page
  55. @page = load_page_by_id || load_page_by_urlname || raise(ActiveRecord::RecordNotFound)
  56. end
  57. def load_page_by_id
  58. # The route param is called :urlname although it might be an integer
  59. Page.where(id: params[:urlname]).includes(page_includes).first
  60. end
  61. def load_page_by_urlname
  62. return unless Language.current
  63. Language.current.pages.where(
  64. urlname: params[:urlname],
  65. language_code: params[:locale] || Language.current.code,
  66. ).includes(page_includes).first
  67. end
  68. def meta_data
  69. {
  70. total_count: total_count_value,
  71. per_page: per_page_value,
  72. page: page_value,
  73. }
  74. end
  75. def total_count_value
  76. params[:page] ? @pages.total_count : @pages.size
  77. end
  78. def per_page_value
  79. if params[:page]
  80. (params[:per_page] || Kaminari.config.default_per_page).to_i
  81. else
  82. @pages.size
  83. end
  84. end
  85. def page_value
  86. params[:page] ? params[:page].to_i : nil
  87. end
  88. def page_includes
  89. [
  90. :tags,
  91. {
  92. language: :site,
  93. elements: [
  94. {
  95. nested_elements: [
  96. {
  97. contents: :essence,
  98. },
  99. :tags,
  100. ],
  101. },
  102. {
  103. contents: :essence,
  104. },
  105. :tags,
  106. ],
  107. },
  108. ]
  109. end
  110. end
  111. end