diff --git a/db/manifest b/db/manifest index b2ba28c7c..8adfb91e3 100755 --- a/db/manifest +++ b/db/manifest @@ -316,4 +316,5 @@ acappella.sql purchasable_gift_cards.sql versionable_jamtracks.sql session_controller.sql -jam_tracks_bpm.sql \ No newline at end of file +jam_tracks_bpm.sql +jam_track_sessions.sql \ No newline at end of file diff --git a/db/up/admin_users.sql b/db/up/admin_users.sql index 8933ceaeb..93a12d91a 100644 --- a/db/up/admin_users.sql +++ b/db/up/admin_users.sql @@ -15,7 +15,6 @@ CREATE TABLE admin_users ( updated_at timestamp without time zone NOT NULL ); -ALTER TABLE public.admin_users OWNER TO postgres; CREATE SEQUENCE admin_users_id_seq START WITH 1 INCREMENT BY 1 @@ -23,7 +22,6 @@ CREATE SEQUENCE admin_users_id_seq NO MAXVALUE CACHE 1; -ALTER TABLE public.admin_users_id_seq OWNER TO postgres; ALTER SEQUENCE admin_users_id_seq OWNED BY admin_users.id; SELECT pg_catalog.setval('admin_users_id_seq', 2, true); ALTER TABLE ONLY admin_users ALTER COLUMN id SET DEFAULT nextval('admin_users_id_seq'::regclass); @@ -45,7 +43,6 @@ CREATE TABLE active_admin_comments ( updated_at timestamp without time zone NOT NULL, namespace character varying(255) ); -ALTER TABLE public.active_admin_comments OWNER TO postgres; CREATE SEQUENCE active_admin_comments_id_seq START WITH 1 INCREMENT BY 1 @@ -53,7 +50,6 @@ CREATE SEQUENCE active_admin_comments_id_seq NO MAXVALUE CACHE 1; -ALTER TABLE public.active_admin_comments_id_seq OWNER TO postgres; ALTER SEQUENCE active_admin_comments_id_seq OWNED BY active_admin_comments.id; SELECT pg_catalog.setval('active_admin_comments_id_seq', 1, false); ALTER TABLE ONLY active_admin_comments ALTER COLUMN id SET DEFAULT nextval('active_admin_comments_id_seq'::regclass); diff --git a/db/up/jam_track_sessions.sql b/db/up/jam_track_sessions.sql new file mode 100644 index 000000000..7936b5031 --- /dev/null +++ b/db/up/jam_track_sessions.sql @@ -0,0 +1,9 @@ +CREATE TABLE jam_track_sessions ( + id VARCHAR(64) PRIMARY KEY DEFAULT uuid_generate_v4(), + jam_track_id VARCHAR(64) NOT NULL REFERENCES jam_tracks(id) ON DELETE CASCADE, + session_type VARCHAR(10) NOT NULL, + music_session_id VARCHAR(64) REFERENCES music_sessions(id) ON DELETE SET NULL, + user_id VARCHAR(64) NOT NULL REFERENCES users(id), + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); \ No newline at end of file diff --git a/ruby/lib/jam_ruby.rb b/ruby/lib/jam_ruby.rb index b3772ec14..fd91562ab 100755 --- a/ruby/lib/jam_ruby.rb +++ b/ruby/lib/jam_ruby.rb @@ -256,6 +256,7 @@ require "jam_ruby/models/jam_track_search" require "jam_ruby/models/gift_card" require "jam_ruby/models/gift_card_purchase" require "jam_ruby/models/gift_card_type" +require "jam_ruby/models/jam_track_session" include Jampb diff --git a/ruby/lib/jam_ruby/app/mailers/admin_mailer.rb b/ruby/lib/jam_ruby/app/mailers/admin_mailer.rb index abe1b9564..f1c4e92f0 100644 --- a/ruby/lib/jam_ruby/app/mailers/admin_mailer.rb +++ b/ruby/lib/jam_ruby/app/mailers/admin_mailer.rb @@ -20,6 +20,14 @@ module JamRuby subject: options[:subject]) end + def crash_alert(options) + mail(to: APP_CONFIG.email_crashes_alias, + from: APP_CONFIG.email_generic_from, + body: options[:body], + content_type: "text/plain", + subject: options[:subject]) + end + def social(options) mail(to: APP_CONFIG.email_social_alias, from: APP_CONFIG.email_generic_from, diff --git a/ruby/lib/jam_ruby/models/active_music_session.rb b/ruby/lib/jam_ruby/models/active_music_session.rb index 182157e23..d8a4552f6 100644 --- a/ruby/lib/jam_ruby/models/active_music_session.rb +++ b/ruby/lib/jam_ruby/models/active_music_session.rb @@ -774,6 +774,8 @@ module JamRuby self.opening_jam_track = true self.save self.opening_jam_track = false + + JamTrackSession.create_session(jam_track, user, self.music_session) if jam_track && user #self.tick_track_changes end diff --git a/ruby/lib/jam_ruby/models/jam_track.rb b/ruby/lib/jam_ruby/models/jam_track.rb index eca9cd7ea..2fea1d443 100644 --- a/ruby/lib/jam_ruby/models/jam_track.rb +++ b/ruby/lib/jam_ruby/models/jam_track.rb @@ -73,6 +73,8 @@ module JamRuby # VRFS-2916 jam_tracks.id is varchar: ADD has_many :plays, :class_name => "JamRuby::PlayablePlay", :as => :playable, :dependent => :destroy + has_many :jam_track_session, :class_name => "JamRuby::JamTrackSession" + # when we know what JamTrack this refund is related to, these are associated belongs_to :recurly_transactions, class_name: 'JamRuby::RecurlyTransactionWebHook' diff --git a/ruby/lib/jam_ruby/models/jam_track_session.rb b/ruby/lib/jam_ruby/models/jam_track_session.rb new file mode 100644 index 000000000..6e244e83b --- /dev/null +++ b/ruby/lib/jam_ruby/models/jam_track_session.rb @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +module JamRuby + class JamTrackSession < ActiveRecord::Base + + BROWSER = 'browser' + SESSION = 'session' + TYPES = [BROWSER, SESSION] + + @@log = Logging.logger[JamTrackSession] + + belongs_to :music_session, class_name: 'JamRuby::MusicSession' + belongs_to :user, class_name: 'JamRuby::User' + belongs_to :jam_track, class_name: 'JamRuby::JamTrack' + + def self.create_session(jam_track, user, music_session) + create(jam_track, user, SESSION, music_session) + end + + def self.create_browser(jam_track, user) + create(jam_track, user, BROWSER, nil) + end + + private + def self.create(jam_track, user, type, music_session) + jam_track_session = JamTrackSession.new + jam_track_session.jam_track = jam_track + jam_track_session.user = user + jam_track_session.session_type = type + jam_track_session.music_session = music_session + jam_track_session.save + jam_track_session + end + end +end \ No newline at end of file diff --git a/ruby/lib/jam_ruby/models/music_session.rb b/ruby/lib/jam_ruby/models/music_session.rb index d2998a72b..68c387d47 100644 --- a/ruby/lib/jam_ruby/models/music_session.rb +++ b/ruby/lib/jam_ruby/models/music_session.rb @@ -53,6 +53,7 @@ module JamRuby has_many :invited_fans, :through => :fan_invitations, :class_name => "JamRuby::User", :foreign_key => "receiver_id", :source => :receiver has_many :rsvp_slots, :class_name => "JamRuby::RsvpSlot", :foreign_key => "music_session_id", :dependent => :destroy has_many :music_notations, :class_name => "JamRuby::MusicNotation", :foreign_key => "music_session_id" + has_many :jam_track_session, :class_name => "JamRuby::JamTrackSession" validates :genre, :presence => true validates :description, :presence => true, :no_profanity => true diff --git a/ruby/lib/jam_ruby/models/sale.rb b/ruby/lib/jam_ruby/models/sale.rb index cddf6b8d8..9561c71b5 100644 --- a/ruby/lib/jam_ruby/models/sale.rb +++ b/ruby/lib/jam_ruby/models/sale.rb @@ -71,6 +71,8 @@ module JamRuby def self.ios_purchase(current_user, jam_track, receipt) + current_user.redeem_free_credit + jam_track_right = JamRuby::JamTrackRight.find_or_create_by_user_id_and_jam_track_id(current_user.id, jam_track.id) do |jam_track_right| jam_track_right.redeemed = false jam_track_right.version = jam_track.version @@ -336,16 +338,9 @@ module JamRuby # first, mark the free has_redeemable_jamtrack field if that's still true # and if still they have more free things, then redeem the giftable_jamtracks if shopping_cart.free? - if user.has_redeemable_jamtrack - User.where(id: current_user.id).update_all(has_redeemable_jamtrack: false) - current_user.has_redeemable_jamtrack = false - else - User.where(id: current_user.id).update_all(gifted_jamtracks: current_user.gifted_jamtracks - 1) - current_user.gifted_jamtracks = current_user.gifted_jamtracks - 1 - end + current_user.redeem_free_credit end - # this can't go in the block above, as it's here to fix bad subscription UUIDs in an update path if jam_track_right.recurly_adjustment_uuid != recurly_adjustment_uuid jam_track_right.recurly_adjustment_uuid = recurly_adjustment_uuid @@ -426,4 +421,4 @@ module JamRuby WHERE sale_type = '#{JAMTRACK_SALE}'") end end -end \ No newline at end of file +end diff --git a/ruby/lib/jam_ruby/models/user.rb b/ruby/lib/jam_ruby/models/user.rb index 842d4beef..ab4f6f306 100644 --- a/ruby/lib/jam_ruby/models/user.rb +++ b/ruby/lib/jam_ruby/models/user.rb @@ -183,6 +183,8 @@ module JamRuby has_one :musician_search, :class_name => 'JamRuby::MusicianSearch' has_one :band_search, :class_name => 'JamRuby::BandSearch' + has_many :jam_track_session, :class_name => "JamRuby::JamTrackSession" + before_save :default_anonymous_names before_save :create_remember_token, :if => :should_validate_password? before_save :stringify_avatar_info , :if => :updating_avatar @@ -1740,6 +1742,22 @@ module JamRuby false end end + + def redeem_free_credit + yn = false + if self.has_redeemable_jamtrack + User.where(id: self.id).update_all(has_redeemable_jamtrack: false) + self.has_redeemable_jamtrack = false + yn = true + + elsif 0 < self.gifted_jamtracks + User.where(id: self.id).update_all(gifted_jamtracks: self.gifted_jamtracks - 1) + self.gifted_jamtracks = self.gifted_jamtracks - 1 + yn = true + end + yn + end + private def create_remember_token self.remember_token = SecureRandom.urlsafe_base64 diff --git a/ruby/spec/support/utilities.rb b/ruby/spec/support/utilities.rb index 425d40a2f..abe518a98 100644 --- a/ruby/spec/support/utilities.rb +++ b/ruby/spec/support/utilities.rb @@ -15,6 +15,10 @@ def app_config 'alerts@jamkazam.com' end + def email_crashes_alias + 'clientcrash@jamkazam.com' + end + def email_recurly_notice 'recurly-alerts@jamkazam.com' end diff --git a/web/app/controllers/api_users_controller.rb b/web/app/controllers/api_users_controller.rb index e664e4697..dde826090 100644 --- a/web/app/controllers/api_users_controller.rb +++ b/web/app/controllers/api_users_controller.rb @@ -626,6 +626,12 @@ ApiUsersController < ApiController logger.debug("crash_dump can read from url #{read_url}") + body = "Client crash for user #{current_user.email} (#{current_user.name})\n" + body << "Client type: #{@dump.client_type}" + body << "Client version: #{@dump.client_version}" + body << "Download at: #{read_url}\n" + body << "User admin url: #{current_user.admin_url}" + AdminMailer.crash_alert(subject: "Crash for #{@dump.client_type} #{current_user.email} (#{current_user.name})", body:body) redirect_to write_url, status: 307 else # we should store it here to aid in development, but we don't have to until someone wants the feature diff --git a/web/app/controllers/popups_controller.rb b/web/app/controllers/popups_controller.rb index 6f0903151..b445e567e 100644 --- a/web/app/controllers/popups_controller.rb +++ b/web/app/controllers/popups_controller.rb @@ -33,6 +33,11 @@ class PopupsController < ApplicationController @jamtrack_id = params[:jam_track_id] @websocket = true gon.jamtrack_id = @jamtrack_id + + jam_track = JamTrack.find_by_id(@jamtrack_id) + + JamTrackSession.create_browser(jam_track, current_user) if jam_track && current_user + render :layout => "minimal" end diff --git a/web/config/application.rb b/web/config/application.rb index 7428e6d5c..16d06931b 100644 --- a/web/config/application.rb +++ b/web/config/application.rb @@ -240,6 +240,7 @@ if defined?(Bundler) config.num_packaging_nodes = 2 config.email_social_alias = 'social@jamkazam.com' + config.email_crashes_alias = 'clientcrash@jamkazam.com' config.email_alerts_alias = 'alerts@jamkazam.com' # should be used for 'oh no' server down/service down sorts of emails config.email_generic_from = 'nobody@jamkazam.com' config.email_recurly_notice = 'recurly-alerts@jamkazam.com' diff --git a/web/config/environments/development.rb b/web/config/environments/development.rb index fdfbb2d01..4601ce003 100644 --- a/web/config/environments/development.rb +++ b/web/config/environments/development.rb @@ -95,6 +95,7 @@ SampleApp::Application.configure do config.video_available= ENV['VIDEO_AVAILABILITY'] || "full" config.email_generic_from = 'nobody-dev@jamkazam.com' config.email_alerts_alias = ENV['ALERT_EMAIL'] || 'alerts-dev@jamkazam.com' + config.email_crashes_alias = ENV['ALERT_EMAIL'] || 'clientcrash@jamkazam.com' config.email_social_alias = ENV['ALERT_EMAIL'] || 'social-dev@jamkazam.com' config.guard_against_fraud = true config.guard_against_browser_fraud = false