Skip to content

Commit

Permalink
[WIP] Restructuring the Google Drive support to reduce HTTP requests
Browse files Browse the repository at this point in the history
  • Loading branch information
jrgriffiniii committed Dec 16, 2019
1 parent dd288ae commit 410e229
Show file tree
Hide file tree
Showing 8 changed files with 114 additions and 83 deletions.
33 changes: 17 additions & 16 deletions app/assets/javascripts/browse_everything/behavior.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,29 +10,30 @@ function BrowseEverythingForm(form) {
};

/**
* Append a hidden <input> element to the form for a file entry (legacy)
* @param value {string}
* Append a hidden <input> element for the form for a file entry
* @param resource {BrowseEverythingResource}
*/
BrowseEverythingForm.prototype.appendLegacyFileInputElement = function(value) {
var hidden_input = $("<input type='hidden' class='ev-url' name='selected_files[]'/>").val(value);
BrowseEverythingForm.prototype.appendFileInputElement = function(resource) {
// Add the location
var hidden_input = $("<input type='hidden' class='ev-url' name='browse_everything[selected_files][][location]'/>").val(resource.getLocation());
this.$form.append(hidden_input);
};

/**
* Append a hidden <input> element for the form for a file entry
* @param value {string}
*/
BrowseEverythingForm.prototype.appendFileInputElement = function(value) {
var hidden_input = $("<input type='hidden' class='ev-url' name='browse_everything[selected_files][]'/>").val(value);
// Add the name
var hidden_input = $("<input type='hidden' class='ev-url' name='browse_everything[selected_files][][name]'/>").val(resource.getName());
this.$form.append(hidden_input);

// Add the size
var hidden_input = $("<input type='hidden' class='ev-url' name='browse_everything[selected_files][][size]'/>").val(resource.getSize());
this.$form.append(hidden_input);

};

/**
* Append a hidden <input> element for the form for a directory entry
* @param value {string}
* @param resource {BrowseEverythingResource}
*/
BrowseEverythingForm.prototype.appendDirectoryInputElement = function(value) {
var hidden_input = $("<input type='hidden' class='ev-url' name='browse_everything[selected_directories][]'/>").val(value);
BrowseEverythingForm.prototype.appendDirectoryInputElement = function(resource) {
var hidden_input = $("<input type='hidden' class='ev-url' name='browse_everything[selected_directories][][location]'/>").val(resource.getLocation());
this.$form.append(hidden_input);
};

Expand Down Expand Up @@ -184,9 +185,9 @@ $(function () {

// Support the new API
if (resource instanceof BrowseEverythingDirectory) {
window.browseEverything.form.appendDirectoryInputElement(resource.getLocation());
window.browseEverything.form.appendDirectoryInputElements(resource);
} else {
window.browseEverything.form.appendFileInputElement(resource.getLocation());
window.browseEverything.form.appendFileInputElements(resource);
}

if (!$(row).find('.ev-select-file').prop('checked')) {
Expand Down
7 changes: 5 additions & 2 deletions app/controllers/browse_everything_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -76,17 +76,20 @@ def auth
end

def resolve
# This needs to just pass URLs
selected_files = browse_everything_params || selected_params || []
selected_links = []
selected_directories = []
payload = {}
last_provider_key = nil

selected_files.each do |file|
provider_key_value, uri = file.split(/:/)
binding.pry
location = file[:location]
provider_key_value, id = location.split(/:/)
provider_key = provider_key_value.to_sym

values = browser.providers[provider_key].link_for(uri)
values = browser.providers[provider_key].link_for(id, file[:name], file[:size])
values.each do |value|
(url, extra) = value
result = { url: url }
Expand Down
18 changes: 18 additions & 0 deletions app/helpers/browse_everything_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,24 @@ def current_provider?(provider)
provider.key.to_sym == current_provider_key
end

def max_size
return unless provider.config[:max_upload_file_size]

# This should be shifted into the Driver::Base Class
# provider.max_size
provider.config[:max_upload_file_size].to_i
end

def disabled?(file:)
return false if file.container? || max_size.blank?

file.size > max_size
end

def parent
params[:parent]
end

private

# Find the current provider stored in the session
Expand Down
57 changes: 57 additions & 0 deletions app/views/browse_everything/_file.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@

<tr class="provider-contents-row"
role="row"
tabindex="-1"
data-ev-location="<%= file.location %>"
data-ev-file-name="<%= file.name %>"
data-ev-file-size="<%= file.size %>"
data-ev-file-date="<%= file.mtime %>"
data-tt-id="<%= path %>"
data-tt-parent-id="<%= parent %>"
data-tt-branch="<%= file.container? ? 'true' : 'false' %>">

<td role="gridcell" title="<%= file.name %>" class="<%=file.container? ? 'ev-container' : 'ev-file'%> ev-file-name">
<% if disabled %>
<span title="<%= t('browse_everything.size_disabled', max_size: number_to_human_size(max_size)) %>"
class="<%=file.container? ? 'folder' : 'file'%>" aria-hidden="true">
<%= file.name %>
</span>
<span class="sr-only"><%= file.container? ? ', folder' : ', file' %> </span>
<% else %>
<%= link_to(path, class: 'ev-link') do %>
<span class="<%=file.container? ? 'folder' : 'file'%>" aria-hidden="true"/>
<%= file.name %>
<span class="sr-only"><%= file.container? ? ', folder' : ', file' %> </span>
<% end %>
<% end %>
</td>
<% if file.container? %>
<td role="gridcell" class="ev-directory-select">
<%= check_box_tag(:select_all, "0", false, class: "ev-select-all") %>
</td>
<% else %>
<td role="gridcell" class="ev-file-select">
<%= check_box_tag(file.id.to_s.parameterize, "0", false, class: "ev-select-file") %>
</td>
<% end %>
<% if file.size %>
<td role="gridcell" class="ev-file-size">
<%= number_to_human_size(file.size).sub(/Bytes/,'bytes') %>
</td>
<% else %>
<td role="gridcell" class="ev-file-size">Unknown</td>
<% end %>

<td role="gridcell" class="ev-file-kind">
<%= file.type %>
</td>

<% if file.mtime %>
<td role="gridcell" class="ev-file-date">
<%= file.mtime.strftime('%F %R') %>
</td>
<% else %>
<td role="gridcell" class="ev-file-date">Unknown</td>
<% end %>
</tr>
66 changes: 4 additions & 62 deletions app/views/browse_everything/_files.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -17,68 +17,10 @@
</thead>
<% provider_contents.each_with_index do |file, index| %>
<% next if file.nil? %>
<% path = browse_everything_engine.contents_path(provider_name, file.id) %>
<% parent = params[:parent] %>
<% if file.container? || provider.config[:max_upload_file_size].blank? %>
<% disabled = false %>
<% else %>
<% max_size = provider.config[:max_upload_file_size].to_i %>
<% disabled = file.size > max_size %>
<% end %>

<tr class="provider-contents-row"
role="row"
tabindex="-1"
data-ev-location="<%= file.location %>"
data-tt-id="<%= path %>"
data-tt-parent-id="<%= parent %>"
data-tt-branch="<%= file.container? ? 'true' : 'false' %>">

<td role="gridcell" title="<%= file.name %>" class="<%=file.container? ? 'ev-container' : 'ev-file'%> ev-file-name">
<% if disabled %>
<span title="<%= t('browse_everything.size_disabled', max_size: number_to_human_size(max_size)) %>"
class="<%=file.container? ? 'folder' : 'file'%>" aria-hidden="true">
<%= file.name %>
</span>
<span class="sr-only"><%= file.container? ? ', folder' : ', file' %> </span>
<% else %>
<%= link_to browse_everything_engine.contents_path(provider_name, file.id), class: 'ev-link' do %>
<span class="<%=file.container? ? 'folder' : 'file'%>" aria-hidden="true"/>
<%= file.name %>
<span class="sr-only"><%= file.container? ? ', folder' : ', file' %> </span>
<% end %>
<% end %>
</td>
<% if file.container? %>
<td role="gridcell" class="ev-directory-select">
<%= check_box_tag(:select_all, "0", false, class: "ev-select-all") %>
</td>
<% else %>
<td role="gridcell" class="ev-file-select">
<%= check_box_tag(file.id.to_s.parameterize, "0", false, class: "ev-select-file") %>
</td>
<% end %>
<% if file.size %>
<td role="gridcell" class="ev-file-size">
<%= number_to_human_size(file.size).sub(/Bytes/,'bytes') %>
</td>
<% else %>
<td role="gridcell" class="ev-file-size">Unknown</td>
<% end %>

<td role="gridcell" class="ev-file-kind">
<%= file.type %>
</td>

<% if file.mtime %>
<td role="gridcell" class="ev-file-date">
<%= file.mtime.strftime('%F %R') %>
</td>
<% else %>
<td role="gridcell" class="ev-file-date">Unknown</td>
<% end %>
</tr>
<% end %>
<%= render partial: 'file', locals: { file: file, index: index, path: browse_everything_engine.contents_path(provider_name, file.id), parent: parent, disabled: disabled?(file: file) } %>
<% path = browse_everything_engine.contents_path(provider_name, file.id) %>
<% disabled = disabled?(file: file) %>
<% end %>
<%= render partial: 'files_pages' %>
</table>
1 change: 1 addition & 0 deletions app/views/browse_everything/index.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
<span class="pull-left ev-status">0 files selected</span>
<%= form_tag '#', :class => "ev-submit-form form-horizontal", :data => { :resolver => browse_everything_engine.resolver_path } do %>
<input type="hidden" name="context" value=""/>
<!-- The form values selected by clients are appened here -->
<button class="ev-cancel btn btn-danger"><%= t('browse_everything.modal_form.cancel')%></button>
<button class="ev-submit btn btn-primary" data-loading-text="Loading..."><%= t('browse_everything.modal_form.submit')%></button>
<% end %>
Expand Down
2 changes: 0 additions & 2 deletions app/views/browse_everything/show.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,4 @@
<% else %>
<%= render 'auth' %>
<% end %>
<% end %>

13 changes: 12 additions & 1 deletion lib/browse_everything/driver/google_drive.rb
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,17 @@ def contents(path = '', page_token = nil)
# Retrieve a link for a resource
# @param id [String] identifier for the resource
# @return [Array<String, Hash>] authorized link to the resource
def link_for(id)
def link_for(id, file_name = '', file_size = 0)
# This should be all that is needed
auth_header = { 'Authorization' => "Bearer #{credentials.access_token}" }
extras = {
auth_header: auth_header,
expires: 1.hour.from_now,
file_name: file_name,
file_size: file_size
}
return [[download_url(id), extras]]

file = drive_service.get_file(id, fields: 'id, name, size, mimeType')
if file.mime_type == 'application/vnd.google-apps.folder'
entries = []
Expand Down Expand Up @@ -298,6 +308,7 @@ def scope
end

# Provides the user ID for caching access tokens
#
# (This is a hack which attempts to anonymize the access tokens)
# @return [String] the ID for the user
def user_id
Expand Down

0 comments on commit 410e229

Please sign in to comment.