cas-cms 1.0.0.alpha1 → 1.0.0.alpha2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8f12f0fb6a3b7c3c29caf99a139194aac107be867f347f5738d2b9cc215a5581
4
- data.tar.gz: 950fd904a33eb23cd9467cc2324a6bea612a1e920a4c90d227ace4d299276257
3
+ metadata.gz: 96db3f49e7ef1be93244ed68bf8a6b7a9ed8fd063c7a8eef270028d3c5a0fe49
4
+ data.tar.gz: 769019cb609a44cb5e10ddae58d9914f6276b373002e8bad542b3988175744b5
5
5
  SHA512:
6
- metadata.gz: b7f891b42b447860a676e36aa868221a0165d81819f95e3d3ea3f9b88111eeb21eaa3788468156e9818e0d7c119b285faba5538cb47a8b27f76fea776505c7be
7
- data.tar.gz: 8c720e1eb5382606cdf7679d242617734efcfb40501c5a813da22fcafe9a0d958c7c4be431805c9d8f262e0dd16725ce106cef2398b290d8c5040cd77ecb3445
6
+ metadata.gz: b116b21f10eb582ad68d7664d89b15e9619a459f4f83d0bba55701e77da658a7fecae9900ba56b9bf4f68e8621fb6231d619eb3d64fe7bfb295dce508b87fe2d
7
+ data.tar.gz: 56517fae5fb373605c9c323c1c72a8441564e88419c87af7dbdf73a16b723d81dc38d332680cf8f048a159b894a4ce151ca4fad0b30f22f02a6f74ae99e1147c
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Cas
2
2
 
3
+ For branches for specific versions: [rails-5](https://github.com/cas-cms/cas-core/tree/rails-5)
4
+
3
5
  ## Usage
4
6
 
5
7
  Add this line to your application's Gemfile:
@@ -16,7 +18,7 @@ bin/rails generate cas:install
16
18
 
17
19
  This adds an `/admin` entry to `config/routes.rb` and generates a new file,
18
20
  `config/cas.config.yml` which contains all sections your site is supposed to
19
- have.
21
+ have.
20
22
 
21
23
  Once the file is edited, run
22
24
 
@@ -77,14 +77,12 @@ var ImageGalleryUploadFunctions = {
77
77
  data.progressBar.remove();
78
78
 
79
79
  var file = {
80
- original: {
81
- id: data.formData.key.match(/cache\/(.+)/)[1], // we have to remove the prefix part
82
- storage: 'cache',
83
- metadata: {
84
- size: data.files[0].size,
85
- filename: data.files[0].name.match(/[^\/\\]*$/)[0], // IE returns full path
86
- mime_type: data.files[0].type
87
- }
80
+ id: data.formData.key.match(/cache\/(.+)/)[1], // we have to remove the prefix part
81
+ storage: 'cache',
82
+ metadata: {
83
+ size: data.files[0].size,
84
+ filename: data.files[0].name.match(/[^\/\\]*$/)[0], // IE returns full path
85
+ mime_type: data.files[0].type
88
86
  }
89
87
  }
90
88
 
@@ -148,14 +146,12 @@ var AttachmentUploadFunctions = {
148
146
  data.progressBar.remove();
149
147
 
150
148
  var file = {
151
- original: {
152
- id: data.formData.key.match(/cache\/(.+)/)[1], // we have to remove the prefix part
153
- storage: 'cache',
154
- metadata: {
155
- size: data.files[0].size,
156
- filename: data.files[0].name.match(/[^\/\\]*$/)[0], // IE returns full path
157
- mime_type: data.files[0].type
158
- }
149
+ id: data.formData.key.match(/cache\/(.+)/)[1], // we have to remove the prefix part
150
+ storage: 'cache',
151
+ metadata: {
152
+ size: data.files[0].size,
153
+ filename: data.files[0].name.match(/[^\/\\]*$/)[0], // IE returns full path
154
+ mime_type: data.files[0].type
159
155
  }
160
156
  }
161
157
 
@@ -5,17 +5,27 @@ class Cas::Api::FilesController < Cas::ApplicationController
5
5
  if ENV.fetch("S3_BUCKET")
6
6
  service = "s3"
7
7
  end
8
+
8
9
  metadata = resource_params[:attributes][:metadata]
9
10
  file = ::Cas::MediaFile.new(
10
11
  service: service,
11
- size: metadata[:original][:metadata][:size].to_i,
12
- original_name: metadata[:original][:metadata][:filename],
13
- mime_type: metadata[:original][:metadata][:mime_type],
12
+ size: metadata[:metadata][:size].to_i,
13
+ original_name: metadata[:metadata][:filename],
14
+ mime_type: metadata[:metadata][:mime_type],
14
15
  media_type: resource_params[:attributes][:media_type],
15
16
  file: metadata.to_json,
16
- attachable: attachable_record
17
+ attachable: attachable_record,
18
+ author: current_user,
17
19
  )
18
- file.save
20
+
21
+ Rails.logger.debug metadata.inspect
22
+
23
+ unless !file.valid?
24
+ Rails.logger.debug "File upload failed: #{file.errors.inspect}"
25
+ end
26
+
27
+ file.save!
28
+
19
29
  Cas::RemoteCallbacks.callbacks[:after_file_upload].call(file)
20
30
  render json: {
21
31
  data: {
@@ -53,11 +63,9 @@ class Cas::Api::FilesController < Cas::ApplicationController
53
63
  :cover,
54
64
  :media_type,
55
65
  metadata: [
56
- original: [
57
- :id,
58
- :storage,
59
- metadata: [:size, :filename, :mime_type, 'mime-type']
60
- ]
66
+ :id,
67
+ :storage,
68
+ metadata: [:size, :filename, :mime_type, 'mime-type']
61
69
  ]
62
70
  ],
63
71
  relationships: [
@@ -68,10 +76,10 @@ class Cas::Api::FilesController < Cas::ApplicationController
68
76
  )
69
77
 
70
78
  if r[:attributes][:metadata].present?
71
- if r[:attributes][:metadata][:original][:metadata][:mime_type].blank?
72
- r[:attributes][:metadata][:original][:metadata][:mime_type] = r[:attributes][:metadata][:original][:metadata][:"mime-type"]
79
+ if r[:attributes][:metadata][:metadata][:mime_type].blank?
80
+ r[:attributes][:metadata][:metadata][:mime_type] = r[:attributes][:metadata][:metadata][:"mime-type"]
73
81
  end
74
- r[:attributes][:metadata][:original][:metadata].delete(:"mime-type")
82
+ r[:attributes][:metadata][:metadata].delete(:"mime-type")
75
83
  end
76
84
  r
77
85
  end
@@ -25,6 +25,7 @@ module Cas
25
25
  @content.section_id = @section.id
26
26
  @content.tag_list = content_params[:tag_list] if content_params[:tag_list]
27
27
  success = @content.save!
28
+
28
29
  ::Cas::Activity.create!(user: current_user, site: @site, subject: @content, event_name: 'create')
29
30
  associate_files(@content, :images)
30
31
  associate_files(@content, :attachments)
@@ -96,7 +97,9 @@ module Cas
96
97
  # When no file is uploaded, when the content form is submitted the
97
98
  # `file` input ends up being sent empty (e.g file: [""]). This confuses
98
99
  # Rails.
99
- params[:content].delete(:file) if params[:content][:file].map(&:presence).compact.blank?
100
+ if params[:content][:file].present?
101
+ params[:content].delete(:file) if params[:content][:file].map(&:presence)&.compact.blank?
102
+ end
100
103
 
101
104
  result = params.require(:content).permit(
102
105
  :category_id,
@@ -3,8 +3,11 @@ module Cas
3
3
  class DeleteJob
4
4
  include ::Sidekiq::Worker
5
5
 
6
- def perform(data)
7
- ::Shrine::Attacher.delete(data)
6
+ def perform(attacher_class, data)
7
+ attacher_class = Object.const_get(attacher_class)
8
+
9
+ attacher = attacher_class.from_data(data)
10
+ attacher.destroy
8
11
  end
9
12
  end
10
13
  end
@@ -1,10 +1,19 @@
1
1
  module Cas
2
2
  module Images
3
3
  class PromoteJob
4
- include ::Sidekiq::Worker
5
4
 
6
- def perform(data)
7
- ::Shrine::Attacher.promote(data)
5
+ include Sidekiq::Worker
6
+
7
+ def perform(attacher_class, record_class, record_id, name, file_data)
8
+ attacher_class = Object.const_get(attacher_class)
9
+ record = Object.const_get(record_class).find(record_id) # if using Active Record
10
+
11
+ attacher = attacher_class.retrieve(model: record, name: name, file: file_data)
12
+ attacher.create_derivatives # call derivatives processor
13
+ attacher.atomic_promote
14
+ rescue Shrine::AttachmentChanged, ActiveRecord::RecordNotFound => e
15
+ Rails.logger.info e.inspect
16
+ # attachment has changed or record has been deleted, nothing to do
8
17
  end
9
18
  end
10
19
  end
@@ -1,12 +1,12 @@
1
1
  module Cas
2
2
  class MediaFile < ApplicationRecord
3
- include FileUploader::Attachment.new(:file)
3
+ include FileUploader::Attachment.new(:file) # This is for the Shrine gem
4
4
 
5
5
  class UnknownPath < StandardError; end
6
6
  class UnknownFileService < StandardError; end
7
7
 
8
- belongs_to :attachable, polymorphic: true
9
- belongs_to :author, class_name: "::Cas::User"
8
+ belongs_to :attachable, polymorphic: true, optional: true
9
+ belongs_to :author, class_name: "::Cas::User", optional: true
10
10
 
11
11
  before_validation :set_media_type
12
12
  before_save :set_image_as_unique_cover
@@ -39,13 +39,37 @@ module Cas
39
39
  raise UnknownFileService
40
40
  end
41
41
 
42
- # Shrine gem uses `file_data`
42
+ # Shrine gem uses `file_data` because `file` is the name we specified for
43
+ # the Attachment at the top of this model.
43
44
  elsif JSON.parse(file_data).present?
44
- if cdn.present?
45
- file_url(version.to_sym, host: cdn, public: true)
46
- else
47
- file_url(version.to_sym, public: true).gsub(/\?.*/, "")
48
- end
45
+ params = {
46
+ public: true
47
+ }
48
+ params[:host] = cdn if cdn.present?
49
+
50
+ # With Shrine, the default image version is :original. Other versions
51
+ # are called derivatives. The `file_url` method expects a derivative
52
+ # name as first argument.
53
+ #
54
+ # When we pass :original, it just returns `nil` because the main file is
55
+ # not considered a derivative. If we had something like :larger, then
56
+ # that would be the argument.
57
+ url = if version.to_sym == :original
58
+ file_url(params)
59
+ else
60
+ file_url(version, params)
61
+ end
62
+
63
+ # Shrine 3 returns `nil` when a derivative doesn't exist. It also
64
+ # returns `nil` when we pass parameters. This is a fallback way of
65
+ # avoiding any `nil` returns. However, notice that we can't pass
66
+ # `params` because Shrine just ignores it and returns `nil` if it's
67
+ # present (it wasn't like that in Shrine 2).
68
+ url = file_url if url.blank?
69
+
70
+ # Amazon S3 has URLs that include some query strings like signatures
71
+ # which we don't want to include in URLs.
72
+ url&.gsub(/\?.*/, "")
49
73
  else
50
74
  raise UnknownPath
51
75
  end
@@ -1,14 +1,13 @@
1
1
  class ::FileUploader < Shrine
2
- plugin :versions
3
- plugin :processing
4
2
 
5
- process(:store) do |io, context|
6
- result = {}
3
+ Attacher.derivatives do |original|
4
+ result = {
5
+ }
6
+
7
7
  if context[:record].media_type == 'image'
8
- result = Cas::RemoteCallbacks.callbacks[:uploaded_image_versions].call(io, context)
8
+ result = Cas::RemoteCallbacks.callbacks[:uploaded_image_versions].call(original)
9
9
  end
10
- original = (io.respond_to?(:[]) && io[:original]) ? io[:original] : io
11
- result = result.merge(original: original) unless result.keys.include?(:original)
10
+
12
11
  Rails.logger.info "FileUploader, versions: [#{result.keys.join(", ")}]"
13
12
  result
14
13
  end
@@ -4,16 +4,15 @@
4
4
  require 'shrine'
5
5
 
6
6
  Shrine.plugin :activerecord
7
- Shrine.plugin :presign_endpoint
8
7
  Shrine.plugin :backgrounding
9
8
 
9
+ Shrine.plugin(
10
+ :derivatives,
11
+ create_on_promote: true, # automatically create derivatives on promotion
12
+ versions_compatibility: true # handle versions column format
13
+ )
14
+
10
15
  if Rails.env.test?
11
- s3_options = {
12
- access_key_id: 'access_key_id',
13
- secret_access_key: 'secret_access_key',
14
- region: 'us-east-1',
15
- bucket: 'com.bucket'
16
- }
17
16
  require "shrine/storage/file_system"
18
17
 
19
18
  Shrine.storages = {
@@ -27,6 +26,7 @@ else
27
26
  puts msg
28
27
 
29
28
  else
29
+ Shrine.plugin :presign_endpoint
30
30
  s3_options = {
31
31
  access_key_id: ENV.fetch("S3_ACCESS_KEY_ID"),
32
32
  secret_access_key: ENV.fetch("S3_SECRET_ACCESS_KEY"),
@@ -43,12 +43,19 @@ else
43
43
  end
44
44
  end
45
45
 
46
- Shrine::Attacher.promote do |data|
47
- Rails.logger.info "Shrine promoting file scheduled"
48
- ::Cas::Images::PromoteJob.perform_async(data)
46
+ Shrine::Attacher.promote_block do
47
+ Rails.logger.info "Shrine promoting #{record.class.name} file scheduled"
48
+ ::Cas::Images::PromoteJob.perform_async(
49
+ self.class.name,
50
+ record.class.name,
51
+ record.id,
52
+ name.to_s,
53
+ file_data
54
+ )
49
55
  end
50
56
 
51
- Shrine::Attacher.delete do |data|
57
+
58
+ Shrine::Attacher.destroy_block do
52
59
  Rails.logger.info "Shrine deleting file scheduled"
53
- ::Cas::Images::DeleteJob.perform_async(data)
60
+ ::Cas::Images::DeleteJob.perform_async(self.class.name, data)
54
61
  end
data/config/routes.rb CHANGED
@@ -3,7 +3,12 @@ require 'sidekiq/web'
3
3
  #Sidekiq::Web.set :session_secret, Rails.application.secrets[:secret_key_base]
4
4
 
5
5
  Cas::Engine.routes.draw do
6
- mount Shrine.presign_endpoint(:cache) => "/files/cache/presign"
6
+ if Shrine.respond_to?(:presign_endpoint)
7
+ mount Shrine.presign_endpoint(:cache) => "/files/cache/presign"
8
+ else
9
+ Rails.logger.info "Shrine's presign endpoint is disabled"
10
+ end
11
+
7
12
  # TODO - fix
8
13
  # mount Shrine.upload_endpoint(:cache) => "/files/upload"
9
14
 
@@ -9,9 +9,9 @@ module Cas
9
9
  # big: big_image
10
10
  # }
11
11
  #
12
- # `original` should always be present. If it is not, we will merge it
13
- # afterwards automatically.
14
- uploaded_image_versions: ->(io, context) {
12
+ # `original` should not be present after Shrine 3.0. If it is not, we will
13
+ # merge it afterwards automatically.
14
+ uploaded_image_versions: ->(original) {
15
15
  {}
16
16
  },
17
17
 
data/lib/cas/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Cas
2
- VERSION = '1.0.0.alpha1'
2
+ VERSION = '1.0.0.alpha2'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cas-cms
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.alpha1
4
+ version: 1.0.0.alpha2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexandre de Oliveira
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-02-20 00:00:00.000000000 Z
11
+ date: 2023-03-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -182,16 +182,16 @@ dependencies:
182
182
  name: sidekiq
183
183
  requirement: !ruby/object:Gem::Requirement
184
184
  requirements:
185
- - - ">="
185
+ - - ">"
186
186
  - !ruby/object:Gem::Version
187
- version: '0'
187
+ version: '5.0'
188
188
  type: :runtime
189
189
  prerelease: false
190
190
  version_requirements: !ruby/object:Gem::Requirement
191
191
  requirements:
192
- - - ">="
192
+ - - ">"
193
193
  - !ruby/object:Gem::Version
194
- version: '0'
194
+ version: '5.0'
195
195
  - !ruby/object:Gem::Dependency
196
196
  name: sprockets-rails
197
197
  requirement: !ruby/object:Gem::Requirement
@@ -238,16 +238,16 @@ dependencies:
238
238
  name: shrine
239
239
  requirement: !ruby/object:Gem::Requirement
240
240
  requirements:
241
- - - '='
241
+ - - "~>"
242
242
  - !ruby/object:Gem::Version
243
- version: 2.19.1
243
+ version: '3.0'
244
244
  type: :runtime
245
245
  prerelease: false
246
246
  version_requirements: !ruby/object:Gem::Requirement
247
247
  requirements:
248
- - - '='
248
+ - - "~>"
249
249
  - !ruby/object:Gem::Version
250
- version: 2.19.1
250
+ version: '3.0'
251
251
  - !ruby/object:Gem::Dependency
252
252
  name: roda
253
253
  requirement: !ruby/object:Gem::Requirement
@@ -263,21 +263,21 @@ dependencies:
263
263
  - !ruby/object:Gem::Version
264
264
  version: '0'
265
265
  - !ruby/object:Gem::Dependency
266
- name: aws-sdk
266
+ name: aws-sdk-s3
267
267
  requirement: !ruby/object:Gem::Requirement
268
268
  requirements:
269
- - - "~>"
269
+ - - ">="
270
270
  - !ruby/object:Gem::Version
271
- version: '2.1'
271
+ version: '0'
272
272
  type: :runtime
273
273
  prerelease: false
274
274
  version_requirements: !ruby/object:Gem::Requirement
275
275
  requirements:
276
- - - "~>"
276
+ - - ">="
277
277
  - !ruby/object:Gem::Version
278
- version: '2.1'
278
+ version: '0'
279
279
  - !ruby/object:Gem::Dependency
280
- name: awesome_print
280
+ name: amazing_print
281
281
  requirement: !ruby/object:Gem::Requirement
282
282
  requirements:
283
283
  - - ">="
@@ -579,7 +579,7 @@ homepage: ''
579
579
  licenses:
580
580
  - MIT
581
581
  metadata: {}
582
- post_install_message:
582
+ post_install_message:
583
583
  rdoc_options: []
584
584
  require_paths:
585
585
  - lib
@@ -594,8 +594,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
594
594
  - !ruby/object:Gem::Version
595
595
  version: 1.3.1
596
596
  requirements: []
597
- rubygems_version: 3.1.6
598
- signing_key:
597
+ rubygems_version: 3.3.7
598
+ signing_key:
599
599
  specification_version: 4
600
600
  summary: Summary of Cas.
601
601
  test_files: []