alchemy-json_api 0.20.0 → 0.24.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3935cd3e895377d3abf8138b854c6aa54148da1a77d7fd7c9942b59a467117d9
4
- data.tar.gz: 9c2c96ba95625c68e186558a5316eedf087d375784026d50ef93a7e4f2e4edec
3
+ metadata.gz: 6c6090af6d711e4a909628207f0b5f7d916944c60a8482b5b7ff958a38633d73
4
+ data.tar.gz: 4e70e1de9b2ab1a68ce359c32973deac67a0965ade5021a7cf398ea29bf83a82
5
5
  SHA512:
6
- metadata.gz: fceba1d386c35489b4145a0becdffccdd4f00614546b15781038df613b5dea27d5dad7104ff00ad2920f52728ddb729f184d40b97542b36d96c2b05b0fb77216
7
- data.tar.gz: f01bfc78e0d1911abf74666a4b8f19a6e0288d287125f0072364263c8450038b4bf6b8a808bdab65ed49c8265fdcdb9db2df883f60674707298e173144e11992
6
+ metadata.gz: 56d2a3623ad9e3a8585d5487f94f08c3d4a31f17a177f300252056eec68f5f4223eb86f32eca26238c5d52ecc6481a39d845b8082ea3d5cb4daec2fc25004a92
7
+ data.tar.gz: 30ca7d8ca1e07d9e924e395ee42c0d4cbf693180052a70f003ccd592267564c2e701aea50462f24f659aad8f39c687d42fa90f05da2633ce2c90a82228a9a3c0
data/Rakefile CHANGED
@@ -20,6 +20,8 @@ task :test_setup do
20
20
  system <<-SETUP.strip_heredoc
21
21
  export RAILS_ENV=test && \
22
22
  bin/rake db:environment:set db:drop && \
23
+ bin/rake gutentag:install:migrations && \
24
+ bin/rails g gutentag:migration_versions && \
23
25
  bin/rake railties:install:migrations && \
24
26
  bin/rails g alchemy:devise:install --force && \
25
27
  bin/rake db:migrate
@@ -6,7 +6,7 @@ module Alchemy
6
6
  private
7
7
 
8
8
  def page_scope
9
- page_scope_with_includes.layoutpages
9
+ base_page_scope.layoutpages
10
10
  end
11
11
  end
12
12
  end
@@ -4,9 +4,26 @@ module Alchemy
4
4
  module Admin
5
5
  class PagesController < JsonApi::PagesController
6
6
  prepend_before_action { authorize! :edit_content, Alchemy::Page }
7
+ before_action :set_current_preview, only: :show
7
8
 
8
9
  private
9
10
 
11
+ def cache_duration
12
+ 0
13
+ end
14
+
15
+ def caching_options
16
+ { public: false, must_revalidate: true }
17
+ end
18
+
19
+ def set_current_preview
20
+ Alchemy::Page.current_preview = @page
21
+ end
22
+
23
+ def last_modified_for(page)
24
+ page.updated_at
25
+ end
26
+
10
27
  def page_version_type
11
28
  :draft_version
12
29
  end
@@ -5,7 +5,7 @@ module Alchemy
5
5
  private
6
6
 
7
7
  def page_scope
8
- page_scope_with_includes.layoutpages
8
+ base_page_scope.layoutpages
9
9
  end
10
10
  end
11
11
  end
@@ -3,26 +3,57 @@
3
3
  module Alchemy
4
4
  module JsonApi
5
5
  class PagesController < JsonApi::BaseController
6
- before_action :load_page, only: :show
6
+ before_action :load_page_for_cache_key, only: :show
7
7
 
8
8
  def index
9
- allowed = [:page_layout]
10
-
11
- jsonapi_filter(page_scope, allowed) do |filtered|
12
- # decorate with our page model that has a eager loaded elements collection
13
- pages = filtered.result.map { |page| api_page(page) }
14
- jsonapi_paginate(pages) do |paginated|
15
- render jsonapi: paginated
9
+ allowed = [:page_layout, :urlname]
10
+
11
+ jsonapi_filter(page_scope, allowed) do |filtered_pages|
12
+ @pages = filtered_pages.result
13
+ if stale?(last_modified: @pages.maximum(:published_at), etag: @pages.max_by(&:cache_key)&.cache_key)
14
+ # Only load pages with all includes when browser cache is stale
15
+ jsonapi_filter(page_scope_with_includes, allowed) do |filtered|
16
+ # decorate with our page model that has a eager loaded elements collection
17
+ filtered_pages = filtered.result.map { |page| api_page(page) }
18
+ jsonapi_paginate(filtered_pages) do |paginated|
19
+ render jsonapi: paginated
20
+ end
21
+ end
16
22
  end
17
23
  end
24
+
25
+ expires_in cache_duration, { public: @pages.none?(&:restricted?) }.merge(caching_options)
18
26
  end
19
27
 
20
28
  def show
21
- render jsonapi: api_page(@page)
29
+ if stale?(last_modified: last_modified_for(@page), etag: @page.cache_key)
30
+ # Only load page with all includes when browser cache is stale
31
+ render jsonapi: api_page(load_page)
32
+ end
33
+
34
+ expires_in cache_duration, { public: !@page.restricted? }.merge(caching_options)
22
35
  end
23
36
 
24
37
  private
25
38
 
39
+ def cache_duration
40
+ ENV.fetch("ALCHEMY_JSON_API_CACHE_DURATION", 3).to_i.hours
41
+ end
42
+
43
+ def caching_options
44
+ { must_revalidate: true }
45
+ end
46
+
47
+ # Get page w/o includes to get cache key
48
+ def load_page_for_cache_key
49
+ @page = page_scope.where(id: params[:path]).
50
+ or(page_scope.where(urlname: params[:path])).first!
51
+ end
52
+
53
+ def last_modified_for(page)
54
+ page.published_at
55
+ end
56
+
26
57
  def jsonapi_meta(pages)
27
58
  pagination = jsonapi_pagination_meta(pages)
28
59
 
@@ -38,20 +69,19 @@ module Alchemy
38
69
 
39
70
  def load_page_by_id
40
71
  return unless params[:path] =~ /\A\d+\z/
41
- page_scope.find_by(id: params[:path])
72
+ page_scope_with_includes.find_by(id: params[:path])
42
73
  end
43
74
 
44
75
  def load_page_by_urlname
45
- page_scope.find_by(urlname: params[:path])
76
+ page_scope_with_includes.find_by(urlname: params[:path])
46
77
  end
47
78
 
48
79
  def page_scope
49
- page_scope_with_includes.contentpages
80
+ base_page_scope.contentpages
50
81
  end
51
82
 
52
83
  def page_scope_with_includes
53
- base_page_scope.
54
- where(language: Language.current).
84
+ page_scope.
55
85
  includes(
56
86
  [
57
87
  :legacy_urls,
@@ -80,9 +110,9 @@ module Alchemy
80
110
  def base_page_scope
81
111
  # cancancan is not able to merge our complex AR scopes for logged in users
82
112
  if can?(:edit_content, ::Alchemy::Page)
83
- Alchemy::Page.all.joins(page_version_type)
113
+ Alchemy::Language.current.pages.joins(page_version_type)
84
114
  else
85
- Alchemy::Page.published.joins(page_version_type)
115
+ Alchemy::Language.current.pages.published.joins(page_version_type)
86
116
  end
87
117
  end
88
118
 
@@ -12,6 +12,8 @@ module Alchemy
12
12
  :updated_at,
13
13
  )
14
14
 
15
+ cache_options store: Rails.cache, namespace: "alchemy-jsonapi"
16
+
15
17
  attribute :deprecated do |element|
16
18
  !!element.definition[:deprecated]
17
19
  end
@@ -33,6 +33,27 @@ module Alchemy
33
33
  }
34
34
  end
35
35
 
36
+ attribute :srcset do |essence|
37
+ essence.content.settings.fetch(:srcset, []).map do |src|
38
+ case src
39
+ when Hash
40
+ url = essence.picture_url(src)
41
+ size = src[:size]
42
+ else
43
+ url = essence.picture_url(size: src)
44
+ size = src
45
+ end
46
+ width, height = size.split("x", 2)
47
+
48
+ {
49
+ url: url,
50
+ desc: "#{width}w",
51
+ width: width,
52
+ height: height,
53
+ }
54
+ end
55
+ end
56
+
36
57
  attribute :image_name do |essence|
37
58
  essence.picture.name
38
59
  end
@@ -39,6 +39,27 @@ module Alchemy
39
39
  }
40
40
  end
41
41
 
42
+ attribute :srcset do |ingredient|
43
+ ingredient.settings.fetch(:srcset, []).map do |src|
44
+ case src
45
+ when Hash
46
+ url = ingredient.picture_url(src)
47
+ size = src[:size]
48
+ else
49
+ url = ingredient.picture_url(size: src)
50
+ size = src
51
+ end
52
+ width, height = size.split("x", 2)
53
+
54
+ {
55
+ url: url,
56
+ desc: "#{width}w",
57
+ width: width,
58
+ height: height,
59
+ }
60
+ end
61
+ end
62
+
42
63
  attribute :image_name do |ingredient|
43
64
  ingredient.picture.name
44
65
  end
@@ -9,6 +9,7 @@ module Alchemy
9
9
  attributes(
10
10
  :name,
11
11
  :urlname,
12
+ :url_path,
12
13
  :page_layout,
13
14
  :title,
14
15
  :language_code,
@@ -18,6 +19,8 @@ module Alchemy
18
19
  :updated_at,
19
20
  )
20
21
 
22
+ cache_options store: Rails.cache, namespace: "alchemy-jsonapi"
23
+
21
24
  attribute :legacy_urls do |page|
22
25
  page.legacy_urls.map(&:urlname)
23
26
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  module Alchemy
3
3
  module JsonApi
4
- VERSION = "0.20.0"
4
+ VERSION = "0.24.0"
5
5
  end
6
6
  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.20.0
4
+ version: 0.24.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martin Meyerhoff
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-07 00:00:00.000000000 Z
11
+ date: 2021-11-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: alchemy_cms
@@ -175,7 +175,7 @@ homepage: https://github.com/AlchemyCMS/alchemy-json_api
175
175
  licenses:
176
176
  - MIT
177
177
  metadata: {}
178
- post_install_message:
178
+ post_install_message:
179
179
  rdoc_options: []
180
180
  require_paths:
181
181
  - lib
@@ -190,8 +190,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
190
190
  - !ruby/object:Gem::Version
191
191
  version: '0'
192
192
  requirements: []
193
- rubygems_version: 3.1.4
194
- signing_key:
193
+ rubygems_version: 3.2.26
194
+ signing_key:
195
195
  specification_version: 4
196
196
  summary: A JSONAPI compliant API for AlchemyCMS
197
197
  test_files: []