diff --git a/app/models/asciicast.rb b/app/models/asciicast.rb index 8164f0a..4ea2c2a 100644 --- a/app/models/asciicast.rb +++ b/app/models/asciicast.rb @@ -29,6 +29,8 @@ class Asciicast < ActiveRecord::Base featured.by_random.limit(n).includes(:user) } + before_create :generate_secret_token + def self.cache_key timestamps = scoped.select(:updated_at).map { |o| o.updated_at.to_i } Digest::MD5.hexdigest timestamps.join('/') @@ -62,6 +64,10 @@ class Asciicast < ActiveRecord::Base value ? super(value.strip[0...255]) : super end + def self.generate_secret_token + SecureRandom.hex.to_i(16).to_s(36) + end + def stdout return @stdout if @stdout @stdout = Stdout::Buffered.new(get_stdout) @@ -103,4 +109,10 @@ class Asciicast < ActiveRecord::Base Digest::SHA1.hexdigest(input) end + def generate_secret_token + begin + self.secret_token = self.class.generate_secret_token + end while self.class.exists?(secret_token: secret_token) + end + end diff --git a/app/models/user.rb b/app/models/user.rb index 2534092..1bedcd6 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -131,7 +131,7 @@ class User < ActiveRecord::Base def generate_auth_token begin self[:auth_token] = self.class.generate_auth_token - end while User.exists?(auth_token: self[:auth_token]) + end while self.class.exists?(auth_token: self[:auth_token]) end end diff --git a/db/migrate/20141115172153_add_secret_token_to_asciicasts.rb b/db/migrate/20141115172153_add_secret_token_to_asciicasts.rb new file mode 100644 index 0000000..7984244 --- /dev/null +++ b/db/migrate/20141115172153_add_secret_token_to_asciicasts.rb @@ -0,0 +1,11 @@ +class AddSecretTokenToAsciicasts < ActiveRecord::Migration + def change + add_column :asciicasts, :secret_token, :string + + Asciicast.find_each do |asciicast| + asciicast.update_attribute(:secret_token, SecureRandom.hex.to_i(16).to_s(36)) + end + + change_column :asciicasts, :secret_token, :string, null: false + end +end diff --git a/db/migrate/20141115172558_add_private_to_asciicasts.rb b/db/migrate/20141115172558_add_private_to_asciicasts.rb new file mode 100644 index 0000000..7ec6eea --- /dev/null +++ b/db/migrate/20141115172558_add_private_to_asciicasts.rb @@ -0,0 +1,5 @@ +class AddPrivateToAsciicasts < ActiveRecord::Migration + def change + add_column :asciicasts, :private, :boolean, null: false, default: false + end +end diff --git a/db/migrate/20141115172711_add_index_on_asciicasts_private.rb b/db/migrate/20141115172711_add_index_on_asciicasts_private.rb new file mode 100644 index 0000000..0fa3072 --- /dev/null +++ b/db/migrate/20141115172711_add_index_on_asciicasts_private.rb @@ -0,0 +1,5 @@ +class AddIndexOnAsciicastsPrivate < ActiveRecord::Migration + def change + add_index :asciicasts, :private + end +end diff --git a/db/migrate/20141115174443_add_unique_index_to_asciicasts_secret_token.rb b/db/migrate/20141115174443_add_unique_index_to_asciicasts_secret_token.rb new file mode 100644 index 0000000..df3f92f --- /dev/null +++ b/db/migrate/20141115174443_add_unique_index_to_asciicasts_secret_token.rb @@ -0,0 +1,5 @@ +class AddUniqueIndexToAsciicastsSecretToken < ActiveRecord::Migration + def change + add_index :asciicasts, :secret_token, unique: true + end +end diff --git a/db/schema.rb b/db/schema.rb index c8575be..3b62c01 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -59,11 +59,15 @@ ActiveRecord::Schema.define(version: 20150401161102) do t.string "image" t.integer "image_width" t.integer "image_height" + t.string "secret_token", null: false + t.boolean "private", default: false, null: false end add_index "asciicasts", ["created_at"], name: "index_asciicasts_on_created_at", using: :btree add_index "asciicasts", ["featured"], name: "index_asciicasts_on_featured", using: :btree add_index "asciicasts", ["likes_count"], name: "index_asciicasts_on_likes_count", using: :btree + add_index "asciicasts", ["private"], name: "index_asciicasts_on_private", using: :btree + add_index "asciicasts", ["secret_token"], name: "index_asciicasts_on_secret_token", unique: true, using: :btree add_index "asciicasts", ["user_id"], name: "index_asciicasts_on_user_id", using: :btree add_index "asciicasts", ["views_count"], name: "index_asciicasts_on_views_count", using: :btree