alchemy-json_api 0.12.2 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/controllers/alchemy/json_api/admin/layout_pages_controller.rb +14 -0
- data/app/controllers/alchemy/json_api/admin/pages_controller.rb +20 -0
- data/app/controllers/alchemy/json_api/base_controller.rb +10 -0
- data/app/controllers/alchemy/json_api/layout_pages_controller.rb +0 -4
- data/app/controllers/alchemy/json_api/pages_controller.rb +23 -8
- data/app/models/alchemy/json_api/page.rb +22 -26
- data/app/serializers/alchemy/json_api/element_serializer.rb +0 -4
- data/app/serializers/alchemy/json_api/page_serializer.rb +4 -0
- data/config/routes.rb +6 -0
- data/lib/alchemy/json_api/version.rb +1 -1
- metadata +6 -5
- data/app/models/alchemy/json_api/element.rb +0 -34
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: e8800ea751939b672e2361001cffe2d0da220a6ee61b25c6728c0e0a8db3ca9b
         | 
| 4 | 
            +
              data.tar.gz: b9a7baa74ef2e0336aa91ad20f03ef26cb8f85c258caa1faf0b8a0c03d665a6f
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 3bbefcf52e8b02cad76158b312945bc1a818df8427b658898073bd7cdb8ef09a8d594bb33db0b0d5bcd2a4a9a7b4bd532d2d14a5c5c59f65cd8bbb880394232b
         | 
| 7 | 
            +
              data.tar.gz: e4a795e0ac64b11930b10d1f582339326f79b9695863930aa69856e93c8ff41f76341710e13dad70074b85fc4a99453605d2725585525c1816fcda19f877c3af
         | 
| @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
            module Alchemy
         | 
| 3 | 
            +
              module JsonApi
         | 
| 4 | 
            +
                module Admin
         | 
| 5 | 
            +
                  class LayoutPagesController < PagesController
         | 
| 6 | 
            +
                    private
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                    def page_scope
         | 
| 9 | 
            +
                      page_scope_with_includes(page_version: :draft_version).layoutpages
         | 
| 10 | 
            +
                    end
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
            end
         | 
| @@ -0,0 +1,20 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
            module Alchemy
         | 
| 3 | 
            +
              module JsonApi
         | 
| 4 | 
            +
                module Admin
         | 
| 5 | 
            +
                  class PagesController < JsonApi::PagesController
         | 
| 6 | 
            +
                    prepend_before_action { authorize! :edit_content, Alchemy::Page }
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                    def show
         | 
| 9 | 
            +
                      render jsonapi: Alchemy::JsonApi::Page.new(@page, page_version: :draft_version)
         | 
| 10 | 
            +
                    end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                    private
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                    def page_scope
         | 
| 15 | 
            +
                      page_scope_with_includes(page_version: :draft_version).contentpages
         | 
| 16 | 
            +
                    end
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
            end
         | 
| @@ -9,6 +9,11 @@ module Alchemy | |
| 9 9 | 
             
                  include JSONAPI::Filtering
         | 
| 10 10 | 
             
                  include JSONAPI::Pagination
         | 
| 11 11 |  | 
| 12 | 
            +
                  rescue_from(
         | 
| 13 | 
            +
                    CanCan::AccessDenied,
         | 
| 14 | 
            +
                    with: :render_jsonapi_unauthorized,
         | 
| 15 | 
            +
                  )
         | 
| 16 | 
            +
             | 
| 12 17 | 
             
                  private
         | 
| 13 18 |  | 
| 14 19 | 
             
                  def render_jsonapi_internal_server_error(exception)
         | 
| @@ -25,6 +30,11 @@ module Alchemy | |
| 25 30 | 
             
                    message << "  " << exception.backtrace.join("\n  ")
         | 
| 26 31 | 
             
                    logger.fatal("#{message}\n\n")
         | 
| 27 32 | 
             
                  end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  def render_jsonapi_unauthorized(exception)
         | 
| 35 | 
            +
                    error = { status: "401", title: Rack::Utils::HTTP_STATUS_CODES[401] }
         | 
| 36 | 
            +
                    render jsonapi_errors: [error], status: :unauthorized
         | 
| 37 | 
            +
                  end
         | 
| 28 38 | 
             
                end
         | 
| 29 39 | 
             
              end
         | 
| 30 40 | 
             
            end
         | 
| @@ -9,14 +9,16 @@ module Alchemy | |
| 9 9 | 
             
                    allowed = [:page_layout]
         | 
| 10 10 |  | 
| 11 11 | 
             
                    jsonapi_filter(page_scope, allowed) do |filtered|
         | 
| 12 | 
            -
                       | 
| 12 | 
            +
                      # decorate with our page model that has a eager loaded elements collection
         | 
| 13 | 
            +
                      pages = filtered.result.map { |p| Alchemy::JsonApi::Page.new(p) }
         | 
| 14 | 
            +
                      jsonapi_paginate(pages) do |paginated|
         | 
| 13 15 | 
             
                        render jsonapi: paginated
         | 
| 14 16 | 
             
                      end
         | 
| 15 17 | 
             
                    end
         | 
| 16 18 | 
             
                  end
         | 
| 17 19 |  | 
| 18 20 | 
             
                  def show
         | 
| 19 | 
            -
                    render jsonapi: @page
         | 
| 21 | 
            +
                    render jsonapi: Alchemy::JsonApi::Page.new(@page)
         | 
| 20 22 | 
             
                  end
         | 
| 21 23 |  | 
| 22 24 | 
             
                  private
         | 
| @@ -26,7 +28,7 @@ module Alchemy | |
| 26 28 |  | 
| 27 29 | 
             
                    {
         | 
| 28 30 | 
             
                      pagination: pagination.presence,
         | 
| 29 | 
            -
                      total: page_scope.count
         | 
| 31 | 
            +
                      total: page_scope.count,
         | 
| 30 32 | 
             
                    }.compact
         | 
| 31 33 | 
             
                  end
         | 
| 32 34 |  | 
| @@ -47,18 +49,31 @@ module Alchemy | |
| 47 49 | 
             
                    page_scope_with_includes.contentpages
         | 
| 48 50 | 
             
                  end
         | 
| 49 51 |  | 
| 50 | 
            -
                  def page_scope_with_includes
         | 
| 52 | 
            +
                  def page_scope_with_includes(page_version: :public_version)
         | 
| 51 53 | 
             
                    base_page_scope.
         | 
| 52 | 
            -
                       | 
| 53 | 
            -
                       | 
| 54 | 
            +
                      where(language: Language.current).
         | 
| 55 | 
            +
                      includes(
         | 
| 56 | 
            +
                        [
         | 
| 57 | 
            +
                          :legacy_urls,
         | 
| 58 | 
            +
                          { language: { nodes: [:parent, :children, { page: { language: { site: :languages } } }] } },
         | 
| 59 | 
            +
                          {
         | 
| 60 | 
            +
                            page_version => {
         | 
| 61 | 
            +
                              elements: [
         | 
| 62 | 
            +
                                :nested_elements,
         | 
| 63 | 
            +
                                { contents: { essence: :ingredient_association } },
         | 
| 64 | 
            +
                              ],
         | 
| 65 | 
            +
                            },
         | 
| 66 | 
            +
                          },
         | 
| 67 | 
            +
                        ]
         | 
| 68 | 
            +
                      )
         | 
| 54 69 | 
             
                  end
         | 
| 55 70 |  | 
| 56 71 | 
             
                  def base_page_scope
         | 
| 57 72 | 
             
                    # cancancan is not able to merge our complex AR scopes for logged in users
         | 
| 58 73 | 
             
                    if can?(:edit_content, ::Alchemy::Page)
         | 
| 59 | 
            -
                       | 
| 74 | 
            +
                      Alchemy::Page.all
         | 
| 60 75 | 
             
                    else
         | 
| 61 | 
            -
                       | 
| 76 | 
            +
                      Alchemy::Page.published
         | 
| 62 77 | 
             
                    end
         | 
| 63 78 | 
             
                  end
         | 
| 64 79 |  | 
| @@ -1,35 +1,28 @@ | |
| 1 1 | 
             
            module Alchemy
         | 
| 2 2 | 
             
              module JsonApi
         | 
| 3 | 
            -
                class Page <  | 
| 4 | 
            -
                   | 
| 5 | 
            -
             | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
                  has_many :all_elements,
         | 
| 9 | 
            -
                    -> { available.order(:position) },
         | 
| 10 | 
            -
                    class_name: "Alchemy::JsonApi::Element",
         | 
| 11 | 
            -
                    inverse_of: :page
         | 
| 12 | 
            -
             | 
| 13 | 
            -
                  scope :published, -> {
         | 
| 14 | 
            -
                      where("#{table_name}.public_on <= :time AND " \
         | 
| 15 | 
            -
                            "(#{table_name}.public_until IS NULL " \
         | 
| 16 | 
            -
                            "OR #{table_name}.public_until >= :time)", time: Time.current)
         | 
| 17 | 
            -
                    }
         | 
| 3 | 
            +
                class Page < SimpleDelegator
         | 
| 4 | 
            +
                  def initialize(page, page_version: :public_version)
         | 
| 5 | 
            +
                    @page_version = page.public_send(page_version)
         | 
| 6 | 
            +
                    super(page)
         | 
| 7 | 
            +
                  end
         | 
| 18 8 |  | 
| 19 | 
            -
                   | 
| 20 | 
            -
                   | 
| 21 | 
            -
             | 
| 9 | 
            +
                  # All elements including nested and fixed elements
         | 
| 10 | 
            +
                  def all_elements
         | 
| 11 | 
            +
                    @_all_elements ||= element_repository
         | 
| 12 | 
            +
                  end
         | 
| 22 13 |  | 
| 23 | 
            -
                  #  | 
| 24 | 
            -
                  # contains their nested_elements.
         | 
| 14 | 
            +
                  # Not nested unfixed top level elements
         | 
| 25 15 | 
             
                  def elements
         | 
| 26 | 
            -
                    @_elements ||=  | 
| 16 | 
            +
                    @_elements ||= element_repository.not_nested.unfixed
         | 
| 27 17 | 
             
                  end
         | 
| 28 18 |  | 
| 29 | 
            -
                  #  | 
| 30 | 
            -
                  # contains their nested_elements.
         | 
| 19 | 
            +
                  # Not nested fixed top level elements
         | 
| 31 20 | 
             
                  def fixed_elements
         | 
| 32 | 
            -
                    @_fixed_elements ||=  | 
| 21 | 
            +
                    @_fixed_elements ||= element_repository.not_nested.fixed
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  def all_element_ids
         | 
| 25 | 
            +
                    @_all_element_ids ||= all_elements.map(&:id)
         | 
| 33 26 | 
             
                  end
         | 
| 34 27 |  | 
| 35 28 | 
             
                  def element_ids
         | 
| @@ -42,8 +35,11 @@ module Alchemy | |
| 42 35 |  | 
| 43 36 | 
             
                  private
         | 
| 44 37 |  | 
| 45 | 
            -
                  def  | 
| 46 | 
            -
                     | 
| 38 | 
            +
                  def element_repository
         | 
| 39 | 
            +
                    return Alchemy::ElementsRepository.none unless @page_version
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                    # Need to use select here, otherwise rails would not eager load the elements correctly
         | 
| 42 | 
            +
                    Alchemy::ElementsRepository.new(@page_version.elements.select(&:public))
         | 
| 47 43 | 
             
                  end
         | 
| 48 44 | 
             
                end
         | 
| 49 45 | 
             
              end
         | 
| @@ -16,10 +16,6 @@ module Alchemy | |
| 16 16 | 
             
                    !!element.definition[:deprecated]
         | 
| 17 17 | 
             
                  end
         | 
| 18 18 |  | 
| 19 | 
            -
                  belongs_to :parent_element, record_type: :element, serializer: self
         | 
| 20 | 
            -
             | 
| 21 | 
            -
                  belongs_to :page, record_type: :page, serializer: ::Alchemy::JsonApi::PageSerializer
         | 
| 22 | 
            -
             | 
| 23 19 | 
             
                  has_many :essences, polymorphic: true do |element|
         | 
| 24 20 | 
             
                    element.contents.map(&:essence)
         | 
| 25 21 | 
             
                  end
         | 
| @@ -18,6 +18,10 @@ module Alchemy | |
| 18 18 | 
             
                    :updated_at,
         | 
| 19 19 | 
             
                  )
         | 
| 20 20 |  | 
| 21 | 
            +
                  attribute :legacy_urls do |page|
         | 
| 22 | 
            +
                    page.legacy_urls.map(&:urlname)
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
             | 
| 21 25 | 
             
                  belongs_to :language, record_type: :language, serializer: ::Alchemy::JsonApi::LanguageSerializer
         | 
| 22 26 |  | 
| 23 27 | 
             
                  # All public elements of this page regardless of if they are fixed or nested.
         | 
    
        data/config/routes.rb
    CHANGED
    
    | @@ -4,4 +4,10 @@ Alchemy::JsonApi::Engine.routes.draw do | |
| 4 4 | 
             
              get "pages/*path" => "pages#show", as: :page
         | 
| 5 5 | 
             
              resources :layout_pages, only: [:index]
         | 
| 6 6 | 
             
              get "layout_pages/*path" => "layout_pages#show", as: :layout_page
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              namespace :admin do
         | 
| 9 | 
            +
                get "pages/*path" => "pages#show", as: :page
         | 
| 10 | 
            +
                resources :layout_pages, only: [:index]
         | 
| 11 | 
            +
                get "layout_pages/*path" => "layout_pages#show", as: :layout_page
         | 
| 12 | 
            +
              end
         | 
| 7 13 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: alchemy-json_api
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.13.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Martin Meyerhoff
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2021- | 
| 11 | 
            +
            date: 2021-03-05 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: alchemy_cms
         | 
| @@ -16,7 +16,7 @@ dependencies: | |
| 16 16 | 
             
                requirements:
         | 
| 17 17 | 
             
                - - ">="
         | 
| 18 18 | 
             
                  - !ruby/object:Gem::Version
         | 
| 19 | 
            -
                    version:  | 
| 19 | 
            +
                    version: 6.0.a
         | 
| 20 20 | 
             
                - - "<"
         | 
| 21 21 | 
             
                  - !ruby/object:Gem::Version
         | 
| 22 22 | 
             
                    version: '6.1'
         | 
| @@ -26,7 +26,7 @@ dependencies: | |
| 26 26 | 
             
                requirements:
         | 
| 27 27 | 
             
                - - ">="
         | 
| 28 28 | 
             
                  - !ruby/object:Gem::Version
         | 
| 29 | 
            -
                    version:  | 
| 29 | 
            +
                    version: 6.0.a
         | 
| 30 30 | 
             
                - - "<"
         | 
| 31 31 | 
             
                  - !ruby/object:Gem::Version
         | 
| 32 32 | 
             
                    version: '6.1'
         | 
| @@ -124,10 +124,11 @@ files: | |
| 124 124 | 
             
            - MIT-LICENSE
         | 
| 125 125 | 
             
            - README.md
         | 
| 126 126 | 
             
            - Rakefile
         | 
| 127 | 
            +
            - app/controllers/alchemy/json_api/admin/layout_pages_controller.rb
         | 
| 128 | 
            +
            - app/controllers/alchemy/json_api/admin/pages_controller.rb
         | 
| 127 129 | 
             
            - app/controllers/alchemy/json_api/base_controller.rb
         | 
| 128 130 | 
             
            - app/controllers/alchemy/json_api/layout_pages_controller.rb
         | 
| 129 131 | 
             
            - app/controllers/alchemy/json_api/pages_controller.rb
         | 
| 130 | 
            -
            - app/models/alchemy/json_api/element.rb
         | 
| 131 132 | 
             
            - app/models/alchemy/json_api/page.rb
         | 
| 132 133 | 
             
            - app/serializers/alchemy/json_api/element_serializer.rb
         | 
| 133 134 | 
             
            - app/serializers/alchemy/json_api/essence_boolean_serializer.rb
         | 
| @@ -1,34 +0,0 @@ | |
| 1 | 
            -
            module Alchemy
         | 
| 2 | 
            -
              module JsonApi
         | 
| 3 | 
            -
                class Element < BaseRecord
         | 
| 4 | 
            -
                  include Alchemy::Logger
         | 
| 5 | 
            -
                  include Alchemy::Element::Definitions
         | 
| 6 | 
            -
                  include Alchemy::Element::ElementContents
         | 
| 7 | 
            -
             | 
| 8 | 
            -
                  self.table_name = "alchemy_elements"
         | 
| 9 | 
            -
             | 
| 10 | 
            -
                  belongs_to :page, class_name: "Alchemy::JsonApi::Page", inverse_of: :all_elements
         | 
| 11 | 
            -
                  has_many :contents, class_name: "Alchemy::Content", inverse_of: :element
         | 
| 12 | 
            -
             | 
| 13 | 
            -
                  scope :available, -> { where(public: true).where.not(position: nil) }
         | 
| 14 | 
            -
             | 
| 15 | 
            -
                  def parent_element
         | 
| 16 | 
            -
                    page.all_elements.detect do |element|
         | 
| 17 | 
            -
                      element.id == parent_element_id
         | 
| 18 | 
            -
                    end
         | 
| 19 | 
            -
                  end
         | 
| 20 | 
            -
             | 
| 21 | 
            -
                  def nested_elements
         | 
| 22 | 
            -
                    @_nested_elements ||= begin
         | 
| 23 | 
            -
                      page.all_elements.select do |element|
         | 
| 24 | 
            -
                        element.parent_element_id == id
         | 
| 25 | 
            -
                      end
         | 
| 26 | 
            -
                    end
         | 
| 27 | 
            -
                  end
         | 
| 28 | 
            -
             | 
| 29 | 
            -
                  def nested_element_ids
         | 
| 30 | 
            -
                    nested_elements.map(&:id)
         | 
| 31 | 
            -
                  end
         | 
| 32 | 
            -
                end
         | 
| 33 | 
            -
              end
         | 
| 34 | 
            -
            end
         |