social 0.0.11 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +72 -40
  3. data/lib/social.rb +65 -30
  4. data/lib/social/balance.rb +1 -14
  5. data/lib/social/config/ok.rb +16 -18
  6. data/lib/social/config/vk.rb +15 -17
  7. data/lib/social/determinant.rb +4 -0
  8. data/lib/social/determinant/request_param.rb +56 -0
  9. data/lib/social/determinant/social_prefix.rb +81 -0
  10. data/lib/social/env.rb +21 -15
  11. data/lib/social/network.rb +9 -1
  12. data/lib/social/network/base.rb +60 -9
  13. data/lib/social/network/graph.rb +1 -40
  14. data/lib/social/network/graph/ok.rb +1 -5
  15. data/lib/social/network/graph/ok/base.rb +50 -56
  16. data/lib/social/network/graph/ok/notification.rb +9 -15
  17. data/lib/social/network/graph/ok/user.rb +61 -67
  18. data/lib/social/network/graph/tail.rb +14 -20
  19. data/lib/social/network/graph/vk.rb +1 -5
  20. data/lib/social/network/graph/vk/base.rb +27 -33
  21. data/lib/social/network/graph/vk/notification.rb +11 -17
  22. data/lib/social/network/graph/vk/user.rb +55 -61
  23. data/lib/social/network/ok.rb +9 -17
  24. data/lib/social/network/stub.rb +2 -7
  25. data/lib/social/network/vk.rb +9 -17
  26. data/lib/social/version.rb +1 -1
  27. data/social.gemspec +1 -0
  28. data/spec/lib/social/ok_api_spec.rb +8 -8
  29. data/spec/lib/social/vk_api_spec.rb +2 -2
  30. data/spec/spec_helper.rb +1 -4
  31. metadata +80 -48
  32. data/lib/social/auth.rb +0 -4
  33. data/lib/social/auth/controller.rb +0 -144
  34. data/lib/social/builder.rb +0 -22
  35. data/lib/social/cache.rb +0 -26
  36. data/lib/social/helper.rb +0 -4
  37. data/lib/social/helper/controller.rb +0 -43
  38. data/lib/social/helper/model.rb +0 -61
  39. data/lib/social/network/params.rb +0 -31
  40. data/lib/social/provider.rb +0 -42
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a3becb7a8ded7114cb92fbe39b3aa334e8f1c058
4
+ data.tar.gz: b40e98c12f7143e7dd9332b227ffeb09c2a373ea
5
+ SHA512:
6
+ metadata.gz: 038fbcc6d9745a44cfad4750a2933efcc77bc92361ae9df9c2b9dfcb12c2467cdf5baccbaeb90cdbbbaafef5f7905356ab0e3eb8dae64c68a8d44336d7e7bed9
7
+ data.tar.gz: 861d167d64dac6f76c0f8525c907f9e512dec581c5d019d910c14bbc40bedc567b7a0786ed4b4647d7c4f4d86898b725ba227e9b27fadbf338b2a4a66e8626bf
data/README.md CHANGED
@@ -1,82 +1,114 @@
1
- Social API wrapper and Tools
1
+ Social
2
2
  ====================
3
3
 
4
- This is social networks api wrapper and authorization tools for social applications.
4
+ Библиотека для обращения к API социальных сетей со стороны сервера. Содержит методы API и средства определения текущей социальной сети.
5
5
 
6
- Now it is a compilation of terrible code from various projects. Without tests and benchmark. =(
6
+ Данная библиотека была создана в рамках проекта SocialFrame - Шаблон для IFrame приложений на базе Sinatra (Padrino). Но библиотеку можно также использовать и для Rails-приложений и других.
7
7
 
8
- ## NOT RECOMMENDED USE IN PRODUCTION
8
+ Библиотека решает следующие задачи:
9
+ * Определение типа соцсети до создания сессии и авторизации по средствам Rack::Builder
10
+ * Осуществление общих запросов к API соцсети
11
+ * Генерирует уникальный пользовательский UID и уникальный SESSION_ID для сессии на основе SID соцсети
9
12
 
10
- Now supported networks:
11
-
12
- * vk.com
13
+ Поддержка социальных сетей:
14
+ * vk.com
13
15
  * odnoklassniki.ru
14
- * mail.ru (plans to support)
15
- * facebook.com (plans to support)
16
-
17
- Now supported features:
18
16
 
19
- * Get user profile
20
- * Get user friend profiles
21
- * Get user balance and charge off (only vk.com)
22
- * Initialize environment by request (example /odkl/*, /vk/* and other) - Rack Middleware
23
- * Authorization user for Rails application (support transition between pages)
24
- * Parameterized wrapper to call the API methods
17
+ Поддерживаемые методы API:
18
+ * Получает профиль пользователя
19
+ * Получить список друзей для пользователя
20
+ * Получить профили друзей
21
+ * Работа с балансом пользователя (только для vk.com)
25
22
 
26
- Install
23
+ Установка
24
+ ---------------------
27
25
 
28
26
  gem install social
29
27
 
28
+ Для Gemfile
30
29
 
31
- Use wrapper
30
+ gem 'social'
31
+
32
+ Использование
32
33
  ---------------------
33
34
 
35
+ Получение профиля пользователя (get user profile)
36
+
34
37
  Social::Network(:ok).user.get_info(uid)
35
38
 
36
- or
39
+ или
37
40
 
38
41
  Social::Network::Vk.user.get_info(uid)
39
42
 
40
- or
43
+ или отправка нотификации
41
44
 
42
- Social::Network(socio_type).notification.send(:message => msg, :uids => [ ... ])
45
+ Social::Network(social_type).notification.send(:message => msg, :uids => [ ... ])
43
46
 
44
- Use environment tools
47
+ Обращение к текущей социальной сети осуществляется после Глобального определения этого типа (см. ниже). При этом возможны следующие вызовы.
48
+
49
+ Social::Network.current.user.get_info(uid)
50
+
51
+
52
+ Глобальное определение типа социальной сети
45
53
  ---------------------
46
54
 
47
- In config.ru
55
+ Social::Env.init(params[:social_types])
48
56
 
49
- builder = Social::Builder::produce(App::Application)
57
+ Определение соцсети с помощью SocialPrefix
58
+ ---------------------
59
+
60
+ SocialPrefix позволяет определять социальную сеть по строке запроса т.е.
61
+
62
+ - без использования субдоменов
63
+ - без определения соц.сети по параметрам запроса (что также поддерживается)
64
+ - без добавления доп.роутов в приложение
65
+
66
+ Также пользоволяет решить проблему с показам аватаров пользователей в Одноклассниках, для которых в REFERRAL должно быть слово "odnoklassniki" или "odkl".
67
+
68
+ config.ru
69
+
70
+ builder = Social::Builder::produce(Example::Application)
50
71
  run builder
51
72
 
52
- Adds an initializing environment.
73
+ При этом в параметры запроса добавляется ключ social_env
74
+ со следующим содержанием
53
75
 
54
- request['social_env'] = {
76
+ request.params['social_env'] = {
55
77
  'prefix' => <SOCIAL_PREFIX>,
56
78
  'type' => <SOCIAL_TYPE_NAME>,
57
79
  'id' => <SOCIAL_TYPE_ID>
58
80
  }
59
81
 
60
- For example, on request /odkl/*
82
+ Например, при запросе /odkl/*
61
83
 
62
84
  params[:social_env][:id] # => 1
85
+ params[:social_env][:prefix] # => 'odkl'
86
+ params[:social_env][:type] # => :ok
87
+
88
+ Для SinglePage приложения:
89
+ Предпологается, что первый GET запрос приходит на URL из SocialPrefix,
90
+ а последующие запросы идут уже без без SocialPrefix и тип соцсети
91
+ берется из сессии и передается в метод Social::Env.init(<SOCIAL_TYPE>).
63
92
 
64
- and after
65
-
66
- include Social::Helper::Controller
93
+ Для "Многостраничного" приложения:
94
+ Предпологается, что все запросы все запросы осуществляются с помощью
95
+ SocialPrefix
96
+
97
+ Определение соцсети с помощью
98
+ ---------------------
67
99
 
68
- in your Rails application controller
100
+ Помимо SocialPrefix определение соцсети можно осуществлять
101
+ с помощью параметров запроса. Например если запрос содержит
102
+ параметры viewer_id и sid, то можно сказать что это
103
+ соцсеть ВКонтакт.
69
104
 
70
- Social::Env.id # => 1
71
- Social::Env.type # => :ok
72
- Social::Env.prefix # => :odkl
105
+ Этот способ также предпологает использование Rack::Builder.
73
106
 
74
107
  TODO
75
108
  ---------------------
76
109
 
77
- * Tests, tests, tests ...
78
- * More network
79
- * More and beautiful API for Rails, Sinatra and Rack applications
80
- * More supported features
110
+ * Тесты с использованием VCR
111
+ * Поддержка Mail.ru
112
+ * Поддержка Facebook
113
+ * Больше поддерживаемых "общих" методов API
81
114
 
82
- ### Welcome to contributing!
@@ -2,32 +2,27 @@ require 'singleton'
2
2
  require 'active_support/all'
3
3
  require 'rack'
4
4
  require 'social/version'
5
- require 'social/provider'
6
- require 'social/builder'
7
- require 'social/cache'
5
+ require 'social/determinant'
6
+ require 'social/determinant/social_prefix'
7
+ require 'social/determinant/request_param'
8
+ require 'social/config'
8
9
  require 'social/config/vk'
9
10
  require 'social/config/ok'
10
- require 'social/config'
11
11
  require 'social/env'
12
- require 'social/helper/controller'
13
- require 'social/helper/model'
14
- require 'social/helper'
15
- require 'social/auth/controller'
16
- require 'social/auth'
17
- require 'social/network/graph/tail'
18
- require 'social/network/params'
19
- require 'social/network/base'
12
+ require 'social/network'
20
13
  require 'social/network/graph'
14
+ require 'social/network/base'
21
15
  require 'social/network/ok'
22
16
  require 'social/network/vk'
17
+ require 'social/network/graph/tail'
18
+ require 'social/network/graph/ok'
23
19
  require 'social/network/graph/ok/base'
24
20
  require 'social/network/graph/ok/notification'
25
21
  require 'social/network/graph/ok/user'
26
- require 'social/network/graph/ok'
22
+ require 'social/network/graph/vk'
27
23
  require 'social/network/graph/vk/base'
28
24
  require 'social/network/graph/vk/notification'
29
25
  require 'social/network/graph/vk/user'
30
- require 'social/network/graph/vk'
31
26
  require 'social/network/stub'
32
27
  require 'social/network'
33
28
  require 'social/networks'
@@ -46,30 +41,71 @@ module Social
46
41
  :fb => 'fb'
47
42
  }
48
43
 
44
+ VK_PARAMS = %w(
45
+ api_url api_id api_settings viewer_id
46
+ viewer_type sid secret access_token
47
+ user_id group_id is_app_user auth_key
48
+ language parent_language ad_info
49
+ is_secure ads_app_id referrer lc_name hash
50
+ )
51
+
52
+ OK_PARAMS = %w(
53
+ authorized ip_geo_location api_server
54
+ new_sig apiconnection first_start
55
+ clientLog session_secret_key
56
+ application_key auth_sig web_server
57
+ session_key logged_user_id sig
58
+ )
59
+
49
60
  class << self
50
61
 
51
- def current_id=(id)
52
- @id = id
62
+ def social_params(params)
63
+ params.slice(VK_PARAMS + OK_PARAMS)
53
64
  end
54
65
 
55
- def current_id
56
- @id
66
+ def social_request?(params)
67
+ request_social_type(params).present?
57
68
  end
58
-
59
- def current_type=(type)
60
- @type = type
69
+
70
+ def request_social_type(params)
71
+ if social_env = (params[:social_env])
72
+ # Если параметр задается с помощью RackBuilder
73
+ # через SocialPrefix и передается как social_env
74
+ # через параметры приложения
75
+ params[:social_env][:type]
76
+ else
77
+ params_social_type(params)
78
+ end
61
79
  end
62
80
 
63
- def current_type
64
- @type
81
+ # Определяем тип социальной сети по параметрам
82
+ # первоначального запроса. Например если передан параметр
83
+ # viewer_id и sid, то это Вконтакте
84
+ def params_social_type(params)
85
+ case
86
+ when params[:viewer_id].present? && params[:sid].present? then :vk
87
+ when params[:logged_user_id].present? && params[:session_key].present? then :ok
88
+ else
89
+ nil
90
+ end
65
91
  end
66
92
 
67
- def current_prefix=(prefix)
68
- @prefix = prefix
93
+ def request_session_token(params)
94
+ case request_social_type(params)
95
+ when :vk then "vk::#{params[:sid]}"
96
+ when :ok then "ok::#{params[:session_key]}"
97
+ else
98
+ raise 'Not defined social type'
99
+ end
69
100
  end
70
101
 
71
- def current_prefix
72
- @prefix
102
+ def request_uid(params)
103
+ case request_social_type(params)
104
+ when :vk then "vk::#{params[:user_id]}"
105
+ when :ok then "ok::#{params[:logged_user_id]}"
106
+ else
107
+ raise 'Not defined social type'
108
+ end
73
109
  end
74
110
 
75
111
  def Network(network, params = nil)
@@ -100,9 +136,8 @@ module Social
100
136
  id_by_type(type_by_prefix(prefix))
101
137
  end
102
138
 
103
- def typing(index)
104
- return type_by_id(index) if SOCIAL_TYPES.keys.include?(index.to_i)
105
- return index.to_sym if SOCIAL_TYPES.values.include?(index.to_sym)
139
+ def prefix_by_type(type)
140
+ SOCIAL_PREFIX[type]
106
141
  end
107
142
 
108
143
  def type_codes
@@ -1,6 +1,7 @@
1
1
  module Social
2
2
  module Balance
3
3
 
4
+ # @deprecated
4
5
  def self.included(base)
5
6
  base.instance_eval do
6
7
 
@@ -21,20 +22,6 @@ module Social
21
22
  end
22
23
  end
23
24
 
24
- def payments
25
- Payment.where(:uid => self.uid, :social_type_id => self.social_type_id)
26
- end
27
-
28
- def payments_create(hash)
29
- param = {:uid => self.uid, :social_type_id => self.social_type_id, :user_id => nil}.merge(hash)
30
- param.delete(:initiatable) if param[:initiatable].is_a? Profile
31
- Payment.create(param)
32
- end
33
-
34
- def initiated
35
- []
36
- end
37
-
38
25
  end
39
26
 
40
27
  end
@@ -1,24 +1,22 @@
1
- module Social
2
- class Config
3
- module Ok
1
+ class Social::Config
2
+ module Ok
4
3
 
5
- def config
6
-
7
- unless @config
8
- @env = ENV['APP_ENV'] || ENV['RACK_ENV'] || ENV['RAILS_ENV'] || 'development'
9
- @config_ins = Social::Config.new(:ok)
10
- @config = @config_ins.config[@env]
11
- end
12
-
13
- @config
4
+ def config
5
+
6
+ unless @config
7
+ @env = ENV['APP_ENV'] || ENV['RACK_ENV'] || ENV['RAILS_ENV'] || 'development'
8
+ @config_ins = Social::Config.new(:ok)
9
+ @config = @config_ins.config[@env]
14
10
  end
15
11
 
16
- def safe_config(auth_params = {})
17
- auth_params.merge \
18
- :api_server => Social::Network(:ok).config[:api_server],
19
- :application_key => Social::Network(:ok).config[:application_key],
20
- :logged_user_id => auth_params['uid']
21
- end
12
+ @config
13
+ end
14
+
15
+ def safe_config(auth_params = {})
16
+ auth_params.merge \
17
+ :api_server => Social::Network(:ok).config[:api_server],
18
+ :application_key => Social::Network(:ok).config[:application_key],
19
+ :logged_user_id => auth_params['uid']
22
20
  end
23
21
  end
24
22
  end
@@ -1,24 +1,22 @@
1
- module Social
2
- class Config
3
- module Vk
1
+ class Social::Config
2
+ module Vk
3
+
4
+ def config
4
5
 
5
- def config
6
-
7
- unless @config
8
- @env = ENV['APP_ENV'] || ENV['RACK_ENV'] || ENV['RAILS_ENV'] || 'development'
9
- @config_ins = Social::Config.new(:vk)
10
- @config = @config_ins.config[@env]
11
- end
12
-
13
- @config
6
+ unless @config
7
+ @env = ENV['APP_ENV'] || ENV['RACK_ENV'] || ENV['RAILS_ENV'] || 'development'
8
+ @config_ins = Social::Config.new(:vk)
9
+ @config = @config_ins.config[@env]
14
10
  end
15
11
 
16
- def safe_config(auth_params = {})
17
- auth_params.merge \
18
- :app_id => Social::Network(:vk).config['app_id'],
19
- :logged_user_id => auth_params['uid']
20
- end
12
+ @config
13
+ end
21
14
 
15
+ def safe_config(auth_params = {})
16
+ auth_params.merge \
17
+ :app_id => Social::Network(:vk).config['app_id'],
18
+ :logged_user_id => auth_params['uid']
22
19
  end
20
+
23
21
  end
24
22
  end
@@ -0,0 +1,4 @@
1
+ module Social
2
+ class Determinant < Rack::Builder
3
+ end
4
+ end
@@ -0,0 +1,56 @@
1
+ require 'active_support/hash_with_indifferent_access'
2
+
3
+ class Social::Determinant
4
+ class RequestParam < self
5
+
6
+ class Provider
7
+
8
+ def self.build(social_type)
9
+ klass = Class.new do
10
+
11
+ class << self
12
+ attr_accessor :social_type
13
+ end
14
+
15
+ def initialize(app)
16
+ @app = app
17
+ end
18
+
19
+ def call(env)
20
+ request = Rack::Request.new(env)
21
+ social_type = self.class.social_type
22
+ prefix = Social.prefix_by_type(social_type)
23
+ id = Social.id_by_type(social_type)
24
+
25
+ request.GET['social_env'] = {
26
+ 'prefix' => prefix, 'type' => social_type, 'id' => id
27
+ }
28
+
29
+ @app.call(request.env)
30
+ end
31
+
32
+ end
33
+
34
+ klass.social_type = social_type
35
+ klass
36
+ end
37
+
38
+ end
39
+
40
+ def self.produce(app)
41
+ new do
42
+
43
+ map '/' do
44
+ params = HashWithIndifferentAccess.new(Social.social_params(request.GET))
45
+ if params.present? && type = Social.params_social_type(params)
46
+ use Provider.build(type)
47
+ run app
48
+ else
49
+ run app
50
+ end
51
+ end
52
+
53
+ end
54
+ end
55
+ end
56
+ end