Backbone ProtectedModel, WIP
This commit is contained in:
parent
7cef7bfc9c
commit
95ac3e6eef
|
@ -1,2 +1,2 @@
|
||||||
class BeatHaven.Models.Artist extends Backbone.Model
|
class BeatHaven.Models.Artist extends BeatHaven.Modules.ProtectedModel
|
||||||
urlRoot: "/api/artists"
|
urlRoot: "/api/artists"
|
||||||
|
|
|
@ -2,7 +2,7 @@ class BeatHaven.Models.User extends Backbone.Model
|
||||||
|
|
||||||
auth: ->
|
auth: ->
|
||||||
BH.log "Authenticating user ..."
|
BH.log "Authenticating user ..."
|
||||||
this.query "/api/session/auth", {}, (response) ->
|
this.query "/api/session/auth", { user: @.get("vk_session")["user"] }, (response) ->
|
||||||
if response.error?
|
if response.error?
|
||||||
# report error
|
# report error
|
||||||
else
|
else
|
||||||
|
@ -12,11 +12,20 @@ class BeatHaven.Models.User extends Backbone.Model
|
||||||
# BH.VK.set_favorites()
|
# BH.VK.set_favorites()
|
||||||
|
|
||||||
query: (path, params, callback) ->
|
query: (path, params, callback) ->
|
||||||
query_params = $.extend {}, @.get("vk_session"), params
|
query_params = $.extend {}, @auth_params(), params
|
||||||
query_params.authenticity_token = $('meta[name="csrf-token"]').attr("content")
|
query_params.authenticity_token = $('meta[name="csrf-token"]').attr("content")
|
||||||
$.post path, query_params, callback
|
$.get path, query_params, callback
|
||||||
false
|
false
|
||||||
|
|
||||||
|
auth_params: ->
|
||||||
|
params = @.get("vk_session")
|
||||||
|
vk_auth:
|
||||||
|
expire: params["expire"]
|
||||||
|
mid: params["mid"]
|
||||||
|
secret: params["secret"]
|
||||||
|
sid: params["sid"]
|
||||||
|
sig: params["sig"]
|
||||||
|
|
||||||
set_favorites: (tracks) ->
|
set_favorites: (tracks) ->
|
||||||
BH.log tracks
|
BH.log tracks
|
||||||
BH.log "Sending your Vkontakte media collection to BeatHaven ..."
|
BH.log "Sending your Vkontakte media collection to BeatHaven ..."
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
class BeatHaven.Modules.ProtectedModel extends Backbone.Model
|
||||||
|
|
||||||
|
fetch: (options) ->
|
||||||
|
options = options ? _.clone(options) : {}
|
||||||
|
model = this
|
||||||
|
success = options.success
|
||||||
|
options.success = (resp, status, xhr) ->
|
||||||
|
if (!model.set(model.parse(resp, xhr), options)) return false;
|
||||||
|
if (success) success(model, resp);
|
||||||
|
};
|
||||||
|
options.error = Backbone.wrapError(options.error, model, options);
|
||||||
|
return (this.sync || Backbone.sync).call(this, 'read', this, options);
|
|
@ -1,13 +1,16 @@
|
||||||
module Api
|
module Api
|
||||||
class AlbumsController < BaseController
|
class AlbumsController < BaseController
|
||||||
|
before_filter :validate_request!
|
||||||
|
|
||||||
def picture
|
def picture
|
||||||
album = Album.find(params[:id])
|
album = Album.find(params[:id])
|
||||||
redirect_to album.load_pic
|
redirect_to album.update_image.sized(:extralarge)
|
||||||
end
|
end
|
||||||
|
|
||||||
def show
|
def show
|
||||||
@album = Album.find(params[:id])
|
@album = Album.find(params[:id])
|
||||||
return render json: { fail: true } if @album.nil?
|
return render json: { fail: true } if @album.nil?
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
module Api
|
module Api
|
||||||
class ArtistsController < BaseController
|
class ArtistsController < BaseController
|
||||||
|
before_filter :validate_request!
|
||||||
|
|
||||||
def show
|
def show
|
||||||
@artist = Artist.with_name(params[:id].gsub("+", " "))
|
@artist = Artist.with_name(params[:id].gsub("+", " "))
|
||||||
return render json: { fail: true } if @artist.nil?
|
return render json: { fail: true } if @artist.nil?
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,5 +1,27 @@
|
||||||
module Api
|
module Api
|
||||||
class BaseController < ::ApplicationController
|
class BaseController < ::ApplicationController
|
||||||
respond_to :json
|
respond_to :json
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def validate_request!
|
||||||
|
@user = nil
|
||||||
|
render json: { error: "Signature verification failed!" } unless request_valid?
|
||||||
|
|
||||||
|
@user = User.find_by_vk_id(params[:vk_auth][:mid])
|
||||||
|
end
|
||||||
|
|
||||||
|
def request_valid?
|
||||||
|
%w[ expire mid secret sid sig ].each do |key|
|
||||||
|
raise "Parameter not set: #{key} (VK auth)" if params[:vk_auth][key].nil?
|
||||||
|
end
|
||||||
|
|
||||||
|
validation_string = %w[ expire mid secret sid ].map{ |key|
|
||||||
|
"#{key}=#{params[:vk_auth][key]}"
|
||||||
|
}.join() << BeatHaven::Application.config.api_accounts["vk"]["api_secret"]
|
||||||
|
|
||||||
|
params[:vk_auth][:sig] == Digest::MD5.hexdigest(validation_string)
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
module Api
|
module Api
|
||||||
class SearchController < BaseController
|
class SearchController < BaseController
|
||||||
|
before_filter :validate_request!
|
||||||
|
|
||||||
def complete
|
def complete
|
||||||
return render json: { suggestions: [] } if params[:query].to_s.length == 0
|
return render json: { suggestions: [] } if params[:query].to_s.length == 0
|
||||||
|
|
||||||
|
@ -31,5 +33,6 @@ module Api
|
||||||
|
|
||||||
render json: { found: nil }
|
render json: { found: nil }
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,35 +1,19 @@
|
||||||
module Api
|
module Api
|
||||||
class SessionController < BaseController
|
class SessionController < BaseController
|
||||||
|
before_filter :validate_request!
|
||||||
|
|
||||||
def auth
|
def auth
|
||||||
render json: { error: "Signature verification failed!" } unless request_valid?
|
|
||||||
|
|
||||||
user_name = "#{params[:user][:first_name]} #{params[:user][:last_name]}"
|
user_name = "#{params[:user][:first_name]} #{params[:user][:last_name]}"
|
||||||
|
|
||||||
user = User.find_by_vk_id(params[:mid].to_i)
|
|
||||||
is_newbie = false
|
is_newbie = false
|
||||||
if user.nil?
|
if @user.nil?
|
||||||
user = User.create(name: user_name, vk_id: params[:mid].to_i)
|
@user = User.create(name: user_name, vk_id: params[:vk_auth][:mid].to_i)
|
||||||
is_newbie = true
|
is_newbie = true
|
||||||
elsif user.name != user_name
|
elsif @user.name != user_name
|
||||||
user.update_attributes(name: user_name)
|
@user.update_attributes(name: user_name)
|
||||||
end
|
end
|
||||||
|
|
||||||
render json: { user: user.dump_json, is_newbie: is_newbie }
|
render json: { user: @user.dump_json, is_newbie: is_newbie }
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def request_valid?
|
|
||||||
%w[ expire mid secret sid sig ].map(&:to_sym).each do |key|
|
|
||||||
raise "Parameter not set: #{key}" if params[key].nil?
|
|
||||||
end
|
|
||||||
|
|
||||||
validation_string = %w[ expire mid secret sid ].map{ |key|
|
|
||||||
"#{key}=#{params[key.to_sym]}"
|
|
||||||
}.join() << BeatHaven::Application.config.api_accounts["vk"]["api_secret"]
|
|
||||||
|
|
||||||
params[:sig] == Digest::MD5.hexdigest(validation_string)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -17,8 +17,8 @@ class Album < ActiveRecord::Base
|
||||||
VA = "Various Artists"
|
VA = "Various Artists"
|
||||||
|
|
||||||
def pic_safe
|
def pic_safe
|
||||||
unless pic.nil?
|
unless image.nil?
|
||||||
pic
|
image.sized(:extralarge)
|
||||||
else
|
else
|
||||||
"/api/albums/#{id}/picture"
|
"/api/albums/#{id}/picture"
|
||||||
end
|
end
|
||||||
|
|
|
@ -14,7 +14,7 @@ class Artist < ActiveRecord::Base
|
||||||
}
|
}
|
||||||
|
|
||||||
def loaded?
|
def loaded?
|
||||||
image? && bio?
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
def update_image
|
def update_image
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
json.artist_title @artist.name
|
json.artist_title @artist.name
|
||||||
json.artist_pic @artist.pic
|
json.artist_pic @artist.image.sized(:extralarge)
|
||||||
json.artist_bio @artist.bio
|
json.artist_bio @artist.bio(@user.lang || "en")
|
||||||
json.artist_loaded @artist.loaded?
|
json.artist_loaded @artist.loaded?
|
||||||
json.artist_url @artist.url
|
json.artist_url @artist.url
|
||||||
json.artist_albums @artist.albums.shown.to_a do |json, album|
|
json.artist_albums @artist.albums.shown.to_a do |json, album|
|
||||||
|
|
|
@ -8,7 +8,7 @@ BeatHaven::Application.routes.draw do
|
||||||
collection { get :complete; get :wtfis }
|
collection { get :complete; get :wtfis }
|
||||||
end
|
end
|
||||||
resources :session, only: [] do
|
resources :session, only: [] do
|
||||||
collection { post :auth }
|
collection { get :auth }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue