VRFS-1020 fix share token design

This commit is contained in:
Brian Smith 2014-02-06 00:45:48 -05:00
parent 3f9bb9bdad
commit bc305cac5e
14 changed files with 53 additions and 15 deletions

View File

@ -1,5 +1,5 @@
GEM GEM
remote: https://rubygems.org/ remote: http://rubygems.org/
specs: specs:
little-plugger (1.1.3) little-plugger (1.1.3)
logging (1.7.2) logging (1.7.2)

View File

@ -98,4 +98,5 @@ invited_users_facebook_support.sql
first_recording_at.sql first_recording_at.sql
share_token.sql share_token.sql
facebook_signup.sql facebook_signup.sql
audiomixer_mp3.sql audiomixer_mp3.sql
share_token_2.sql

14
db/up/share_token_2.sql Normal file
View File

@ -0,0 +1,14 @@
alter table music_sessions_history drop column share_token;
alter table claimed_recordings drop column share_token;
CREATE TABLE share_tokens
(
id character varying(64) NOT NULL DEFAULT uuid_generate_v4(),
token varchar(15) NOT NULL,
shareable_id varchar(64) NOT NULL,
shareable_type varchar(50) NOT NULL,
created_at timestamp without time zone NOT NULL DEFAULT now(),
updated_at timestamp without time zone NOT NULL DEFAULT now(),
CONSTRAINT token_uniqkey UNIQUE (token),
CONSTRAINT share_tokens_pkey PRIMARY KEY (id)
);

View File

@ -94,6 +94,7 @@ require "jam_ruby/models/recording_liker"
require "jam_ruby/models/recording_play" require "jam_ruby/models/recording_play"
require "jam_ruby/models/recorded_track" require "jam_ruby/models/recorded_track"
require "jam_ruby/models/recorded_track_observer" require "jam_ruby/models/recorded_track_observer"
require "jam_ruby/models/share_token"
require "jam_ruby/models/mix" require "jam_ruby/models/mix"
require "jam_ruby/models/claimed_recording" require "jam_ruby/models/claimed_recording"
require "jam_ruby/models/crash_dump" require "jam_ruby/models/crash_dump"

View File

@ -8,12 +8,12 @@ module JamRuby
validates :genre, presence: true validates :genre, presence: true
validates_uniqueness_of :recording_id, :scope => :user_id validates_uniqueness_of :recording_id, :scope => :user_id
belongs_to :recording, :class_name => "JamRuby::Recording", :inverse_of => :claimed_recordings belongs_to :recording, :class_name => "JamRuby::Recording", :inverse_of => :claimed_recordings
belongs_to :user, :class_name => "JamRuby::User", :inverse_of => :claimed_recordings belongs_to :user, :class_name => "JamRuby::User", :inverse_of => :claimed_recordings
belongs_to :genre, :class_name => "JamRuby::Genre" belongs_to :genre, :class_name => "JamRuby::Genre"
has_many :recorded_tracks, :through => :recording, :class_name => "JamRuby::RecordedTrack" has_many :recorded_tracks, :through => :recording, :class_name => "JamRuby::RecordedTrack"
has_many :playing_sessions, :class_name => "JamRuby::MusicSession" has_many :playing_sessions, :class_name => "JamRuby::MusicSession"
has_one :share_token, :class_name => "JamRuby::ShareToken", :as => :shareable
before_create :generate_share_token before_create :generate_share_token
@ -54,12 +54,16 @@ module JamRuby
private private
def generate_share_token def generate_share_token
self.share_token = loop do token = loop do
token = SecureRandom.urlsafe_base64(SHARE_TOKEN_LENGTH, false) token = SecureRandom.urlsafe_base64(SHARE_TOKEN_LENGTH, false)
token = remove_non_alpha_num(token) token = remove_non_alpha_num(token)
token.upcase! token.upcase!
break token unless MusicSessionHistory.exists?(share_token: token) break token unless ShareToken.exists?(token: token)
end end
self.share_token = ShareToken.new
self.share_token.token = token
self.share_token.shareable_type = "recording"
end end
end end
end end

View File

@ -22,6 +22,7 @@ module JamRuby
has_many :music_session_user_histories, :class_name => "JamRuby::MusicSessionUserHistory", :foreign_key => "music_session_id" has_many :music_session_user_histories, :class_name => "JamRuby::MusicSessionUserHistory", :foreign_key => "music_session_id"
has_many :comments, :class_name => "JamRuby::MusicSessionComment", :foreign_key => "music_session_id" has_many :comments, :class_name => "JamRuby::MusicSessionComment", :foreign_key => "music_session_id"
has_many :likes, :class_name => "JamRuby::MusicSessionLiker", :foreign_key => "music_session_id" has_many :likes, :class_name => "JamRuby::MusicSessionLiker", :foreign_key => "music_session_id"
has_one :share_token, :class_name => "JamRuby::ShareToken", :as => :shareable
before_create :generate_share_token before_create :generate_share_token
@ -155,12 +156,16 @@ module JamRuby
private private
def generate_share_token def generate_share_token
self.share_token = loop do token = loop do
token = SecureRandom.urlsafe_base64(SHARE_TOKEN_LENGTH, false) token = SecureRandom.urlsafe_base64(SHARE_TOKEN_LENGTH, false)
token = remove_non_alpha_num(token) token = remove_non_alpha_num(token)
token.upcase! token.upcase!
break token unless MusicSessionHistory.exists?(share_token: token) break token unless ShareToken.exists?(token: token)
end end
self.share_token = ShareToken.new
self.share_token.token = token
self.share_token.shareable_type = "session"
end end
end end

View File

@ -0,0 +1,5 @@
module JamRuby
class ShareToken < ActiveRecord::Base
belongs_to :shareable, :polymorphic => true
end
end

View File

@ -36,8 +36,6 @@
}); });
$(".landing-comment-scroller").prepend(commentHtml); $(".landing-comment-scroller").prepend(commentHtml);
$("#txtRecordingComment").val("Enter a comment...");
}); });
} }
} }

View File

@ -28,8 +28,6 @@
}); });
$(".landing-comment-scroller").prepend(commentHtml); $(".landing-comment-scroller").prepend(commentHtml);
$("#txtSessionComment").val("Enter a comment...");
}); });
} }
} }

View File

@ -43,4 +43,15 @@ class SpikesController < ApplicationController
render :layout => 'web' render :layout => 'web'
end end
def shareable_resolver
share_token = ShareToken.find_by_token(params[:id])
# TODO: clean this up later to truly use polymorphic associations
if share_token.shareable_type == "session"
msh = MusicSessionHistory.find(share_token.shareable_id)
redirect_to "/sessions/#{msh.music_session_id}"
else
redirect_to "/recordings/#{share_token.shareable_id}"
end
end
end end

View File

@ -21,8 +21,8 @@
<td valign="top" width="48%"> <td valign="top" width="48%">
<div class="ml10"> <div class="ml10">
<h3>Share a Link:</h3><br /> <h3>Share a Link:</h3><br />
<% unless share_token.blank? %> <% unless true %>
<%= "#{root_url}#{share_token}" %> <%= "#{root_url}" %>
<% end %><br/><br/> <% end %><br/><br/>
<div class="right"><a class="button-orange">COPY LINK</a></div> <div class="right"><a class="button-orange">COPY LINK</a></div>
</div> </div>

View File

@ -78,7 +78,7 @@
<%= javascript_include_tag "web/sessions" %> <%= javascript_include_tag "web/sessions" %>
<%= render :partial => "clients/shareDialog", :locals => {:session => @music_session, :share_token => @music_session.share_token} %> <%= render :partial => "clients/shareDialog", :locals => {:session => @music_session} %>
<% content_for :extra_js do %> <% content_for :extra_js do %>
<script type="text/javascript"> <script type="text/javascript">

View File

@ -4,7 +4,7 @@
<%= image_tag "shared/avatar_generic.png", {:alt => ""} %> <%= image_tag "shared/avatar_generic.png", {:alt => ""} %>
</div> </div>
<div class="left w80 p10"> <div class="left w80 p10">
<textarea id="<%= id %>" class="w100 p5 f15" rows="2" onfocus="$(this).html('')" onblur="if($(this).html() == ''){$(this).html('Enter a comment...')}">Enter a comment...</textarea> <textarea id="<%= id %>" class="w100 p5 f15" rows="2" placeholder="Enter a comment..."></textarea>
</div> </div>
<br clear="all" /> <br clear="all" />

View File

@ -63,6 +63,7 @@ SampleApp::Application.routes.draw do
match '/facebook_invite', to: 'spikes#facebook_invite' match '/facebook_invite', to: 'spikes#facebook_invite'
match '/gmail_contacts', to: 'spikes#gmail_contacts' match '/gmail_contacts', to: 'spikes#gmail_contacts'
match '/listen_in', to: 'spikes#listen_in' match '/listen_in', to: 'spikes#listen_in'
match '/:id', to: 'spikes#shareable_resolver'
# password reset # password reset
match '/request_reset_password' => 'users#request_reset_password', :via => :get match '/request_reset_password' => 'users#request_reset_password', :via => :get