Replace OEmbed and initial state Rabl templates with serializers (#4110)
* Replace OEmbed Rabl template with serializer * Replace initial state rabl with serializer
This commit is contained in:
		
							parent
							
								
									89c8a81ef9
								
							
						
					
					
						commit
						0d54e620d9
					
				
					 9 changed files with 121 additions and 94 deletions
				
			
		|  | @ -5,8 +5,7 @@ class Api::OEmbedController < Api::BaseController | |||
| 
 | ||||
|   def show | ||||
|     @stream_entry = find_stream_entry.stream_entry | ||||
|     @width = maxwidth_or_default | ||||
|     @height = maxheight_or_default | ||||
|     render json: @stream_entry, serializer: OEmbedSerializer, width: maxwidth_or_default, height: maxheight_or_default | ||||
|   end | ||||
| 
 | ||||
|   private | ||||
|  |  | |||
|  | @ -2,13 +2,10 @@ | |||
| 
 | ||||
| class HomeController < ApplicationController | ||||
|   before_action :authenticate_user! | ||||
|   before_action :set_initial_state_json | ||||
| 
 | ||||
|   def index | ||||
|     @body_classes           = 'app-body' | ||||
|     @token                  = current_session.token | ||||
|     @web_settings           = Web::Setting.find_by(user: current_user)&.data || {} | ||||
|     @admin                  = Account.find_local(Setting.site_contact_username) | ||||
|     @streaming_api_base_url = Rails.configuration.x.streaming_api_base_url | ||||
|     @body_classes = 'app-body' | ||||
|   end | ||||
| 
 | ||||
|   private | ||||
|  | @ -16,4 +13,14 @@ class HomeController < ApplicationController | |||
|   def authenticate_user! | ||||
|     redirect_to(single_user_mode? ? account_path(Account.first) : about_path) unless user_signed_in? | ||||
|   end | ||||
| 
 | ||||
|   def set_initial_state_json | ||||
|     state = InitialStatePresenter.new(settings: Web::Setting.find_by(user: current_user)&.data || {}, | ||||
|                                       current_account: current_account, | ||||
|                                       token: current_session.token, | ||||
|                                       admin: Account.find_local(Setting.site_contact_username)) | ||||
| 
 | ||||
|     serializable_resource = ActiveModelSerializers::SerializableResource.new(state, serializer: InitialStateSerializer) | ||||
|     @initial_state_json   = serializable_resource.to_json | ||||
|   end | ||||
| end | ||||
|  |  | |||
							
								
								
									
										5
									
								
								app/presenters/initial_state_presenter.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								app/presenters/initial_state_presenter.rb
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,5 @@ | |||
| # frozen_string_literal: true | ||||
| 
 | ||||
| class InitialStatePresenter < ActiveModelSerializers::Model | ||||
|   attributes :settings, :token, :current_account, :admin | ||||
| end | ||||
							
								
								
									
										39
									
								
								app/serializers/initial_state_serializer.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								app/serializers/initial_state_serializer.rb
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,39 @@ | |||
| # frozen_string_literal: true | ||||
| 
 | ||||
| class InitialStateSerializer < ActiveModel::Serializer | ||||
|   attributes :meta, :compose, :accounts, | ||||
|              :media_attachments, :settings | ||||
| 
 | ||||
|   def meta | ||||
|     { | ||||
|       streaming_api_base_url: Rails.configuration.x.streaming_api_base_url, | ||||
|       access_token: object.token, | ||||
|       locale: I18n.locale, | ||||
|       domain: Rails.configuration.x.local_domain, | ||||
|       me: object.current_account.id, | ||||
|       admin: object.admin&.id, | ||||
|       boost_modal: object.current_account.user.setting_boost_modal, | ||||
|       delete_modal: object.current_account.user.setting_delete_modal, | ||||
|       auto_play_gif: object.current_account.user.setting_auto_play_gif, | ||||
|       system_font_ui: object.current_account.user.setting_system_font_ui, | ||||
|     } | ||||
|   end | ||||
| 
 | ||||
|   def compose | ||||
|     { | ||||
|       me: object.current_account.id, | ||||
|       default_privacy: object.current_account.user.setting_default_privacy, | ||||
|     } | ||||
|   end | ||||
| 
 | ||||
|   def accounts | ||||
|     store = {} | ||||
|     store[object.current_account.id] = ActiveModelSerializers::SerializableResource.new(object.current_account, serializer: REST::AccountSerializer) | ||||
|     store[object.admin.id]           = ActiveModelSerializers::SerializableResource.new(object.admin, serializer: REST::AccountSerializer) unless object.admin.nil? | ||||
|     store | ||||
|   end | ||||
| 
 | ||||
|   def media_attachments | ||||
|     { accept_content_types: MediaAttachment::IMAGE_MIME_TYPES + MediaAttachment::VIDEO_MIME_TYPES } | ||||
|   end | ||||
| end | ||||
							
								
								
									
										56
									
								
								app/serializers/oembed_serializer.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								app/serializers/oembed_serializer.rb
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,56 @@ | |||
| # frozen_string_literal: true | ||||
| 
 | ||||
| class OEmbedSerializer < ActiveModel::Serializer | ||||
|   include RoutingHelper | ||||
|   include ActionView::Helpers::TagHelper | ||||
| 
 | ||||
|   attributes :type, :version, :title, :author_name, | ||||
|              :author_url, :provider_name, :provider_url, | ||||
|              :cache_age, :html, :width, :height | ||||
| 
 | ||||
|   def type | ||||
|     'rich' | ||||
|   end | ||||
| 
 | ||||
|   def version | ||||
|     '1.0' | ||||
|   end | ||||
| 
 | ||||
|   def author_name | ||||
|     object.account.display_name.presence || object.account.username | ||||
|   end | ||||
| 
 | ||||
|   def author_url | ||||
|     account_url(object.account) | ||||
|   end | ||||
| 
 | ||||
|   def provider_name | ||||
|     Rails.configuration.x.local_domain | ||||
|   end | ||||
| 
 | ||||
|   def provider_url | ||||
|     root_url | ||||
|   end | ||||
| 
 | ||||
|   def cache_age | ||||
|     86_400 | ||||
|   end | ||||
| 
 | ||||
|   def html | ||||
|     tag :iframe, | ||||
|         src: embed_account_stream_entry_url(object.account, object), | ||||
|         style: 'width: 100%; overflow: hidden', | ||||
|         frameborder: '0', | ||||
|         scrolling: 'no', | ||||
|         width: width, | ||||
|         height: height | ||||
|   end | ||||
| 
 | ||||
|   def width | ||||
|     instance_options[:width] | ||||
|   end | ||||
| 
 | ||||
|   def height | ||||
|     instance_options[:height] | ||||
|   end | ||||
| end | ||||
|  | @ -1,14 +0,0 @@ | |||
| # frozen_string_literal: true | ||||
| object @stream_entry | ||||
| 
 | ||||
| node(:type) { 'rich' } | ||||
| node(:version) { '1.0' } | ||||
| node(:title, &:title) | ||||
| node(:author_name) { |entry| entry.account.display_name.blank? ? entry.account.username : entry.account.display_name } | ||||
| node(:author_url) { |entry| account_url(entry.account) } | ||||
| node(:provider_name) { site_hostname } | ||||
| node(:provider_url) { root_url } | ||||
| node(:cache_age) { 86_400 } | ||||
| node(:html) { |entry| "<iframe src=\"#{embed_account_stream_entry_url(entry.account, entry)}\" style=\"width: 100%; overflow: hidden\" frameborder=\"0\" width=\"#{@width}\" height=\"#{@height}\" scrolling=\"no\"></iframe>" } | ||||
| node(:width) { @width } | ||||
| node(:height) { @height } | ||||
|  | @ -1,5 +1,5 @@ | |||
| - content_for :header_tags do | ||||
|   %script#initial-state{ type: 'application/json' }!= json_escape(render(file: 'home/initial_state', formats: :json)) | ||||
|   %script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json) | ||||
| 
 | ||||
|   = javascript_pack_tag 'application', integrity: true, crossorigin: 'anonymous' | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,38 +0,0 @@ | |||
| object false | ||||
| 
 | ||||
| node(:meta) do | ||||
|   { | ||||
|     streaming_api_base_url: @streaming_api_base_url, | ||||
|     access_token: @token, | ||||
|     locale: I18n.locale, | ||||
|     domain: site_hostname, | ||||
|     me: current_account.id, | ||||
|     admin: @admin.try(:id), | ||||
|     boost_modal: current_account.user.setting_boost_modal, | ||||
|     delete_modal: current_account.user.setting_delete_modal, | ||||
|     auto_play_gif: current_account.user.setting_auto_play_gif, | ||||
|     system_font_ui: current_account.user.setting_system_font_ui, | ||||
|   } | ||||
| end | ||||
| 
 | ||||
| node(:compose) do | ||||
|   { | ||||
|     me: current_account.id, | ||||
|     default_privacy: current_account.user.setting_default_privacy, | ||||
|   } | ||||
| end | ||||
| 
 | ||||
| node(:accounts) do | ||||
|   store = {} | ||||
|   store[current_account.id] = ActiveModelSerializers::SerializableResource.new(current_account, serializer: REST::AccountSerializer) | ||||
|   store[@admin.id] = ActiveModelSerializers::SerializableResource.new(@admin, serializer: REST::AccountSerializer) unless @admin.nil? | ||||
|   store | ||||
| end | ||||
| 
 | ||||
| node(:media_attachments) do | ||||
|   { | ||||
|     accept_content_types: MediaAttachment::IMAGE_MIME_TYPES + MediaAttachment::VIDEO_MIME_TYPES | ||||
|   } | ||||
| end | ||||
| 
 | ||||
| node(:settings) { @web_settings } | ||||
|  | @ -23,41 +23,14 @@ RSpec.describe HomeController, type: :controller do | |||
|         expect(assigns(:body_classes)).to eq 'app-body' | ||||
|       end | ||||
| 
 | ||||
|       it 'assigns @token' do | ||||
|         app = Doorkeeper::Application.create!(name: 'Web', superapp: true, redirect_uri: Doorkeeper.configuration.native_redirect_uri) | ||||
|         allow(Doorkeeper.configuration).to receive(:access_token_expires_in).and_return(42) | ||||
| 
 | ||||
|       it 'assigns @initial_state_json' do | ||||
|         subject | ||||
|         token = Doorkeeper::AccessToken.find_by(token: assigns(:token)) | ||||
| 
 | ||||
|         expect(token.application).to eq app | ||||
|         expect(token.resource_owner_id).to eq user.id | ||||
|         expect(token.scopes).to eq Doorkeeper::OAuth::Scopes.from_string('read write follow') | ||||
|         expect(token.expires_in_seconds).to eq 42 | ||||
|         expect(token.use_refresh_token?).to eq false | ||||
|       end | ||||
| 
 | ||||
|       it 'assigns @web_settings for {} if not available' do | ||||
|         subject | ||||
|         expect(assigns(:web_settings)).to eq({}) | ||||
|       end | ||||
| 
 | ||||
|       it 'assigns @web_settings for Web::Setting if available' do | ||||
|         setting = Fabricate('Web::Setting', data: '{"home":{}}', user: user) | ||||
|         subject | ||||
|         expect(assigns(:web_settings)).to eq setting.data | ||||
|       end | ||||
| 
 | ||||
|       it 'assigns @admin' do | ||||
|         admin = Fabricate(:account) | ||||
|         Setting.site_contact_username = admin.username | ||||
|         subject | ||||
|         expect(assigns(:admin)).to eq admin | ||||
|       end | ||||
| 
 | ||||
|       it 'assigns streaming_api_base_url' do | ||||
|         subject | ||||
|         expect(assigns(:streaming_api_base_url)).to eq 'ws://localhost:4000' | ||||
|         initial_state_json = json_str_to_hash(assigns(:initial_state_json)) | ||||
|         expect(initial_state_json[:meta]).to_not be_nil | ||||
|         expect(initial_state_json[:compose]).to_not be_nil | ||||
|         expect(initial_state_json[:accounts]).to_not be_nil | ||||
|         expect(initial_state_json[:settings]).to_not be_nil | ||||
|         expect(initial_state_json[:media_attachments]).to_not be_nil | ||||
|       end | ||||
|     end | ||||
|   end | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue