podio 0.8.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +3 -0
  3. data/Gemfile +9 -2
  4. data/README.md +1 -4
  5. data/examples/oauth_web_flow/Gemfile +4 -0
  6. data/examples/{sinatra.rb → oauth_web_flow/sinatra.rb} +7 -6
  7. data/lib/podio.rb +18 -3
  8. data/lib/podio/active_podio/base.rb +107 -62
  9. data/lib/podio/client.rb +30 -5
  10. data/lib/podio/error.rb +22 -10
  11. data/lib/podio/middleware/error_response.rb +23 -16
  12. data/lib/podio/middleware/json_response.rb +1 -1
  13. data/lib/podio/middleware/logger.rb +3 -0
  14. data/lib/podio/middleware/oauth2.rb +3 -0
  15. data/lib/podio/models/account_provider.rb +1 -0
  16. data/lib/podio/models/action.rb +19 -2
  17. data/lib/podio/models/activation_status.rb +8 -2
  18. data/lib/podio/models/app_store_category.rb +4 -1
  19. data/lib/podio/models/app_store_share.rb +29 -16
  20. data/lib/podio/models/application.rb +57 -2
  21. data/lib/podio/models/application_email.rb +5 -2
  22. data/lib/podio/models/application_field.rb +5 -2
  23. data/lib/podio/models/batch.rb +8 -0
  24. data/lib/podio/models/by_line.rb +2 -1
  25. data/lib/podio/models/calendar_event.rb +63 -3
  26. data/lib/podio/models/calendar_mute.rb +6 -1
  27. data/lib/podio/models/category.rb +1 -0
  28. data/lib/podio/models/comment.rb +29 -8
  29. data/lib/podio/models/condition.rb +8 -0
  30. data/lib/podio/models/condition_set.rb +40 -0
  31. data/lib/podio/models/contact.rb +13 -2
  32. data/lib/podio/models/contract.rb +85 -1
  33. data/lib/podio/models/contract_event.rb +17 -0
  34. data/lib/podio/models/contract_price.rb +3 -7
  35. data/lib/podio/models/contract_price_v2.rb +31 -0
  36. data/lib/podio/models/contract_user.rb +4 -0
  37. data/lib/podio/models/conversation.rb +114 -13
  38. data/lib/podio/models/conversation_event.rb +51 -0
  39. data/lib/podio/models/conversation_message.rb +2 -1
  40. data/lib/podio/models/conversation_participant.rb +3 -2
  41. data/lib/podio/models/date_election.rb +35 -0
  42. data/lib/podio/models/email_contact.rb +46 -0
  43. data/lib/podio/models/email_subscription_setting.rb +4 -23
  44. data/lib/podio/models/embed.rb +4 -4
  45. data/lib/podio/models/experiment.rb +71 -0
  46. data/lib/podio/models/external_file.rb +7 -2
  47. data/lib/podio/models/file_attachment.rb +23 -0
  48. data/lib/podio/models/form.rb +7 -0
  49. data/lib/podio/models/friend.rb +12 -0
  50. data/lib/podio/models/grant.rb +73 -0
  51. data/lib/podio/models/hook.rb +13 -6
  52. data/lib/podio/models/importer.rb +3 -0
  53. data/lib/podio/models/integration.rb +17 -6
  54. data/lib/podio/models/invoice.rb +30 -0
  55. data/lib/podio/models/item.rb +81 -14
  56. data/lib/podio/models/item_diff.rb +9 -5
  57. data/lib/podio/models/item_field.rb +11 -2
  58. data/lib/podio/models/item_revision.rb +5 -2
  59. data/lib/podio/models/linked_account.rb +1 -0
  60. data/lib/podio/models/live.rb +61 -0
  61. data/lib/podio/models/net_promoter_score.rb +28 -0
  62. data/lib/podio/models/notification.rb +9 -4
  63. data/lib/podio/models/notification_group.rb +5 -2
  64. data/lib/podio/models/o_auth.rb +4 -2
  65. data/lib/podio/models/o_auth_client.rb +1 -2
  66. data/lib/podio/models/organization.rb +22 -10
  67. data/lib/podio/models/organization_contact.rb +2 -1
  68. data/lib/podio/models/organization_member.rb +17 -3
  69. data/lib/podio/models/organization_profile.rb +8 -2
  70. data/lib/podio/models/pin.rb +27 -0
  71. data/lib/podio/models/profile.rb +19 -50
  72. data/lib/podio/models/promotion.rb +91 -0
  73. data/lib/podio/models/rating.rb +23 -5
  74. data/lib/podio/models/recurrence.rb +6 -3
  75. data/lib/podio/models/reference.rb +17 -1
  76. data/lib/podio/models/reminder.rb +8 -3
  77. data/lib/podio/models/search.rb +7 -1
  78. data/lib/podio/models/space.rb +41 -2
  79. data/lib/podio/models/space_contact.rb +1 -2
  80. data/lib/podio/models/space_invitation.rb +4 -5
  81. data/lib/podio/models/space_member.rb +37 -4
  82. data/lib/podio/models/status.rb +20 -8
  83. data/lib/podio/models/stream_activity_group.rb +40 -0
  84. data/lib/podio/models/stream_mute.rb +7 -8
  85. data/lib/podio/models/stream_object.rb +19 -11
  86. data/lib/podio/models/subscription.rb +7 -1
  87. data/lib/podio/models/tag.rb +6 -1
  88. data/lib/podio/models/tag_search.rb +2 -1
  89. data/lib/podio/models/task.rb +74 -18
  90. data/lib/podio/models/task_label.rb +10 -2
  91. data/lib/podio/models/user.rb +50 -6
  92. data/lib/podio/models/user_mail.rb +4 -0
  93. data/lib/podio/models/user_status.rb +7 -0
  94. data/lib/podio/models/view.rb +27 -7
  95. data/lib/podio/models/widget.rb +25 -3
  96. data/lib/podio/version.rb +1 -1
  97. data/podio.gemspec +13 -10
  98. data/script/config.example.rb +6 -0
  99. data/script/referenceGenerator.rb +87 -0
  100. data/test/active_podio_test.rb +44 -34
  101. data/test/client_test.rb +13 -2
  102. metadata +89 -36
  103. data/lib/podio/middleware/date_conversion.rb +0 -37
  104. data/lib/podio/models/bulletin.rb +0 -60
  105. data/lib/podio/models/connection.rb +0 -53
  106. data/lib/podio/models/news.rb +0 -85
@@ -104,7 +104,7 @@ module Podio
104
104
 
105
105
  # Sign in with an OpenID, only available for Podio
106
106
  def authenticate_with_openid(identifier, type)
107
- response = @oauth_connection.post do |req|
107
+ response = @trusted_connection.post do |req|
108
108
  req.url '/oauth/token_by_openid'
109
109
  req.headers['Content-Type'] = 'application/x-www-form-urlencoded'
110
110
  req.body = {:grant_type => type, :client_id => api_key, :client_secret => api_secret, :identifier => identifier}
@@ -115,12 +115,31 @@ module Podio
115
115
  @oauth_token
116
116
  end
117
117
 
118
+ # Sign in with an activation code, only available for Podio
119
+ def authenticate_with_activation_code(activation_code)
120
+ response = @oauth_connection.post do |req|
121
+ req.url '/oauth/token'
122
+ req.headers['Content-Type'] = 'application/x-www-form-urlencoded'
123
+ req.body = {:grant_type => 'activation_code', :client_id => api_key, :client_secret => api_secret, :activation_code => activation_code}
124
+ end
125
+
126
+ @oauth_token = OAuthToken.new(response.body)
127
+ configure_oauth
128
+ @oauth_token
129
+ end
130
+
118
131
  # reconfigure the client with a different access token
119
132
  def oauth_token=(new_oauth_token)
120
133
  @oauth_token = new_oauth_token.is_a?(Hash) ? OAuthToken.new(new_oauth_token) : new_oauth_token
121
134
  configure_oauth
122
135
  end
123
136
 
137
+ def locale=(new_locale)
138
+ @connection.headers['Accept-Language'] = new_locale
139
+ @oauth_connection.headers['Accept-Language'] = new_locale
140
+ @trusted_connection.headers['Accept-Language'] = new_locale
141
+ end
142
+
124
143
  def refresh_access_token
125
144
  response = @oauth_connection.post do |req|
126
145
  req.url '/oauth/token'
@@ -135,9 +154,16 @@ module Podio
135
154
 
136
155
  def configured_headers
137
156
  headers = @headers.dup
138
- headers['User-Agent'] = 'Podio Ruby Library'
139
- headers['authorization'] = "OAuth2 #{oauth_token.access_token}" if oauth_token
140
- headers['X-Podio-Dry-Run'] = @test_mode.to_s if @test_mode
157
+ headers['User-Agent'] = "Podio Ruby Library (#{Podio::VERSION})"
158
+ headers['X-Podio-Dry-Run'] = @test_mode.to_s if @test_mode
159
+
160
+ if oauth_token
161
+ # if we have a token, set up Oauth2
162
+ headers['authorization'] = "OAuth2 #{oauth_token.access_token}"
163
+ elsif api_key && api_secret
164
+ # if we have an auth_client, set up public authentication (only works with trusted auth clients)
165
+ headers['authorization'] = Faraday::Request::BasicAuthentication.header(api_key, api_secret)
166
+ end
141
167
 
142
168
  headers
143
169
  end
@@ -161,7 +187,6 @@ module Podio
161
187
  builder.adapter(*default_adapter)
162
188
 
163
189
  # first response middleware defined get's executed last
164
- # builder.use Middleware::DateConversion
165
190
  builder.use Middleware::ErrorResponse
166
191
  builder.use Middleware::JsonResponse
167
192
  end
@@ -1,12 +1,31 @@
1
1
  module Podio
2
2
  class PodioError < StandardError
3
- attr_reader :response_body, :response_status, :url
3
+ attr_reader :response_body, :response_status, :url, :code, :sub_code, :message, :parameters
4
+ attr_accessor :propagate
4
5
 
5
6
  def initialize(response_body, response_status, url)
6
7
  @response_body, @response_status, @url = response_body, response_status, url
7
8
 
9
+ if response_body.is_a?(Hash)
10
+ @code = response_body["error"]
11
+ @sub_code = response_body["error_detail"]
12
+ @message = response_body["error_description"]
13
+ @propagate = response_body["error_propagate"]
14
+ @parameters = response_body["error_parameters"]
15
+ else
16
+ @message = response_body.to_s
17
+ end
18
+
8
19
  super(response_body.inspect)
9
20
  end
21
+
22
+ def resolved_message(default_message=nil)
23
+ if @propagate
24
+ @message
25
+ else
26
+ default_message || "An unexpected error occurred"
27
+ end
28
+ end
10
29
  end
11
30
 
12
31
  class TokenExpired < PodioError; end
@@ -19,13 +38,6 @@ module Podio
19
38
  class GoneError < PodioError; end
20
39
  class RateLimitError < PodioError; end
21
40
  class UnavailableError < PodioError; end
22
-
23
- class RequestableAuthorizationError < AuthorizationError
24
- attr_reader :request_access_info
25
-
26
- def initialize(response_body, response_status, url)
27
- @request_access_info = response_body['error_parameters']
28
- super
29
- end
30
- end
41
+ class PaymentRequiredError < AuthorizationError; end
42
+ class RequestableAuthorizationError < AuthorizationError; end
31
43
  end
@@ -4,42 +4,49 @@ module Podio
4
4
  module Middleware
5
5
  class ErrorResponse < Faraday::Response::Middleware
6
6
  def on_complete(env)
7
- case env[:status]
7
+ error_class = case env[:status]
8
8
  when 200, 204
9
9
  # pass
10
10
  when 400
11
- if env[:body]['error'] == 'invalid_grant'
12
- raise InvalidGrantError.new(env[:body], env[:status], env[:url])
11
+ case env[:body]['error']
12
+ when 'invalid_grant'
13
+ InvalidGrantError
13
14
  else
14
- raise BadRequestError.new(env[:body], env[:status], env[:url])
15
+ BadRequestError
15
16
  end
16
17
  when 401
17
18
  if env[:body]['error_description'] =~ /expired_token/
18
- raise TokenExpired.new(env[:body], env[:status], env[:url])
19
+ TokenExpired
19
20
  else
20
- raise AuthorizationError.new(env[:body], env[:status], env[:url])
21
+ AuthorizationError
21
22
  end
23
+ when 402
24
+ PaymentRequiredError
22
25
  when 403
23
26
  if env[:body]['error'] == 'requestable_forbidden'
24
- raise RequestableAuthorizationError.new(env[:body], env[:status], env[:url])
27
+ RequestableAuthorizationError
25
28
  else
26
- raise AuthorizationError.new(env[:body], env[:status], env[:url])
29
+ AuthorizationError
27
30
  end
28
31
  when 404
29
- raise NotFoundError.new(env[:body], env[:status], env[:url])
32
+ NotFoundError
30
33
  when 409
31
- raise ConflictError.new(env[:body], env[:status], env[:url])
34
+ ConflictError
32
35
  when 410
33
- raise GoneError.new(env[:body], env[:status], env[:url])
36
+ GoneError
34
37
  when 420
35
- raise RateLimitError.new(env[:body], env[:status], env[:url])
38
+ RateLimitError
36
39
  when 500
37
- raise ServerError.new(env[:body], env[:status], env[:url])
40
+ ServerError
38
41
  when 502, 503
39
- raise UnavailableError.new(env[:body], env[:status], env[:url])
42
+ UnavailableError
40
43
  else
41
- # anything else is something unexpected, so raise it
42
- raise ServerError.new(env[:body], env[:status], env[:url])
44
+ # anything else is something unexpected, so it
45
+ ServerError
46
+ end
47
+
48
+ if error_class
49
+ raise error_class.new(env[:body], env[:status], env[:url])
43
50
  end
44
51
  end
45
52
  end
@@ -7,7 +7,7 @@ module Podio
7
7
  require 'multi_json'
8
8
 
9
9
  def on_complete(env)
10
- if env[:body].is_a?(String) && is_json?(env) && env[:status] < 500
10
+ if env[:body].is_a?(String) && is_json?(env) && env[:status] != 500
11
11
  env[:body] = parse(env[:body])
12
12
  end
13
13
  end
@@ -4,6 +4,9 @@ module Podio
4
4
  module Middleware
5
5
  class Logger < Faraday::Middleware
6
6
  def call(env)
7
+ # Preserve request body
8
+ env[:request_body] = env[:body] if env[:body]
9
+
7
10
  env[:request][:client].log(env) do
8
11
  @app.call(env)
9
12
  end
@@ -15,6 +15,9 @@ module Podio
15
15
  # new access token needs to be put into the header
16
16
  orig_env[:request_headers].merge!(podio_client.configured_headers)
17
17
 
18
+ # rewind the body if this was a file upload
19
+ orig_env[:body].rewind if orig_env[:body].respond_to?(:rewind)
20
+
18
21
  # redo the request with the new access token
19
22
  @app.call(orig_env)
20
23
  end
@@ -3,6 +3,7 @@ class Podio::AccountProvider < ActivePodio::Base
3
3
  property :connect_link, :string
4
4
  property :humanized_name, :string
5
5
  property :capabilities, :array
6
+ property :capability_names, :hash
6
7
 
7
8
  class << self
8
9
 
@@ -1,15 +1,32 @@
1
+ # @see https://developers.podio.com/doc/actions
1
2
  class Podio::Action < ActivePodio::Base
2
3
  property :action_id, :integer
3
4
  property :type, :string
4
5
  property :data, :hash
5
6
  property :text, :string
7
+ property :push, :hash
8
+ property :presence, :hash
9
+ property :pinned, :boolean
10
+ property :created_on, :datetime
11
+ property :subscribed, :boolean
12
+ property :is_liked, :boolean
13
+ property :like_count, :integer
14
+ property :subscribed_count, :integer
15
+ property :push, :hash
16
+ property :presence, :hash
17
+ property :rights, :array
18
+
19
+ has_one :created_by, :class => 'ByLine'
20
+ has_one :created_via, :class => 'Via'
21
+ has_many :comments, :class => 'Comment'
6
22
 
7
23
  alias_method :id, :action_id
8
-
24
+
9
25
  class << self
26
+ # @see https://developers.podio.com/doc/actions/get-action-1701120
10
27
  def find(id)
11
28
  member Podio.connection.get("/action/#{id}").body
12
29
  end
13
30
  end
14
-
31
+
15
32
  end
@@ -1,9 +1,15 @@
1
1
  class Podio::ActivationStatus < ActivePodio::Base
2
+ property :user_id, :integer
3
+ property :status, :string
4
+ property :mail, :string
5
+ property :name, :string
6
+ property :has_valid_password, :boolean
2
7
  property :space_count, :integer
3
-
8
+ property :internal_source, :hash
9
+
4
10
  class << self
5
11
  def find(activation_code)
6
- member Podio.connection.get("/user/status/activation?activation_code=#{activation_code}").body
12
+ member Podio.client.trusted_connection.get("/user/status/activation?activation_code=#{activation_code}").body
7
13
  end
8
14
  end
9
15
  end
@@ -1,3 +1,4 @@
1
+ # @see https://developers.podio.com/doc/app-store
1
2
  class Podio::AppStoreCategory < ActivePodio::Base
2
3
  property :category_id, :integer
3
4
  property :name, :string
@@ -7,10 +8,12 @@ class Podio::AppStoreCategory < ActivePodio::Base
7
8
 
8
9
  class << self
9
10
 
11
+ # @see https://developers.podio.com/doc/app-market/get-shares-by-category-22498
10
12
  def find(category_id)
11
- member Podio.connection.get("/app_store/category/#{category_id}").body
13
+ member Podio.connection.get("/app_store/category/#{category_id}/v2").body
12
14
  end
13
15
 
16
+ # @see https://developers.podio.com/doc/app-market/get-categories-37009
14
17
  def find_all
15
18
  categories = Podio.connection.get("/app_store/category/").body
16
19
 
@@ -1,7 +1,9 @@
1
+ # @see https://developers.podio.com/doc/app-store
1
2
  class Podio::AppStoreShare < ActivePodio::Base
2
3
  property :share_id, :integer
3
4
  property :type, :string
4
5
  property :status, :string
6
+ property :link, :string
5
7
  property :name, :string
6
8
  property :description, :string
7
9
  property :abstract, :string
@@ -30,25 +32,28 @@ class Podio::AppStoreShare < ActivePodio::Base
30
32
 
31
33
  alias_method :id, :share_id
32
34
 
35
+ # @see https://developers.podio.com/doc/app-market/share-app-22504
33
36
  def create
34
37
  self.share_id = self.class.create(self.attributes)
35
38
  end
36
39
 
40
+ # @see https://developers.podio.com/doc/app-market/unshare-app-37917
37
41
  def destroy
38
42
  self.class.destroy(self.share_id)
39
43
  end
40
44
 
45
+ # @see https://developers.podio.com/doc/app-market/install-share-22499
41
46
  def install(space_id, dependencies, social = true)
42
47
  self.class.install(self.share_id, space_id, dependencies, social)
43
48
  end
44
49
 
45
- handle_api_errors_for :create, :install # Call must be made after the methods to handle have been defined
46
-
47
50
  def api_friendly_ref_type
48
51
  'share'
49
52
  end
50
53
 
51
54
  class << self
55
+
56
+ # @see https://developers.podio.com/doc/app-market/share-app-22504
52
57
  def create(attributes)
53
58
  response = Podio.connection.post do |req|
54
59
  req.url "/app_store/"
@@ -58,6 +63,7 @@ class Podio::AppStoreShare < ActivePodio::Base
58
63
  response.body['share_id']
59
64
  end
60
65
 
66
+ # @see https://developers.podio.com/doc/app-market/update-share-38639
61
67
  def update(id, attributes)
62
68
  response = Podio.connection.put do |req|
63
69
  req.url "/app_store/#{id}"
@@ -65,12 +71,14 @@ class Podio::AppStoreShare < ActivePodio::Base
65
71
  end
66
72
  end
67
73
 
74
+ # @see https://developers.podio.com/doc/app-market/unshare-app-37917
68
75
  def destroy(id)
69
76
  response = Podio.connection.delete do |req|
70
77
  req.url "/app_store/#{id}"
71
78
  end
72
79
  end
73
80
 
81
+ # @see https://developers.podio.com/doc/app-market/install-share-22499
74
82
  def install(share_id, space_id, dependencies, social = true)
75
83
  response = Podio.connection.post do |req|
76
84
  req.url "/app_store/#{share_id}/install/v2"
@@ -80,28 +88,32 @@ class Podio::AppStoreShare < ActivePodio::Base
80
88
  response.body
81
89
  end
82
90
 
83
- def find(id)
84
- member Podio.connection.get("/app_store/#{id}/v2").body
91
+ def find(id, options = {})
92
+ member Podio.connection.get { |req|
93
+ req.url "/app_store/#{id}/v2", options
94
+ }.body
85
95
  end
86
96
 
87
- def find_all_own(options = {})
97
+ # @see https://developers.podio.com/doc/app-market/get-own-shares-38645
98
+ def find_all_own(share_type, options = {})
88
99
  shares_collection Podio.connection.get { |req|
89
- req.url "/app_store/own/", options
100
+ req.url "/app_store/#{share_type}/own/", options
90
101
  }.body
91
102
  end
92
103
 
93
- def find_all_private_for_org(org_id, options = {})
104
+ def find_all_private_for_org(share_type, org_id, options = {})
94
105
  shares_collection Podio.connection.get { |req|
95
- req.url "/app_store/org/#{org_id}/", options
106
+ req.url "/app_store/#{share_type}/org/#{org_id}/", options
96
107
  }.body
97
108
  end
98
109
 
99
- def find_all_public_for_org(org_url, options = {})
110
+ def find_all_public_for_org(share_type, org_url, options = {})
100
111
  shares_collection Podio.connection.get { |req|
101
- req.url "/app_store/org/#{org_url}/", options
112
+ req.url "/app_store/#{share_type}/org/#{org_url}/", options
102
113
  }.body
103
114
  end
104
115
 
116
+ # @see https://developers.podio.com/doc/app-market/get-recommended-shares-5340177
105
117
  def find_all_recommended_for_area(area, options = {})
106
118
  list Podio.connection.get { |req|
107
119
  req.url("/app_store/recommended/#{area}/", options)
@@ -117,25 +129,26 @@ class Podio::AppStoreShare < ActivePodio::Base
117
129
  response.status
118
130
  end
119
131
 
132
+ # @see https://developers.podio.com/doc/app-market/get-share-by-reference-45002
120
133
  def find_all_by_reference(ref_type, ref_id)
121
134
  list Podio.connection.get("/app_store/#{ref_type}/#{ref_id}/").body
122
135
  end
123
136
 
124
- def find_top(options = {})
137
+ def find_top(share_type, options = {})
125
138
  shares_collection Podio.connection.get { |req|
126
- req.url("/app_store/top/", options)
139
+ req.url("/app_store/#{share_type}/top/", options)
127
140
  }.body
128
141
  end
129
142
 
130
- def find_all_by_category(category_id, options = {})
143
+ def find_all_by_category(share_type, category_id, options = {})
131
144
  shares_collection Podio.connection.get { |req|
132
- req.url("/app_store/category/#{category_id}/", options)
145
+ req.url("/app_store/#{share_type}/category/#{category_id}/", options)
133
146
  }.body
134
147
  end
135
148
 
136
- def find_all_by_search(options = {})
149
+ def find_all_by_search(share_type, options = {})
137
150
  shares_collection Podio.connection.get { |req|
138
- req.url("/app_store/search/", options)
151
+ req.url("/app_store/#{share_type}/search/", options)
139
152
  }.body
140
153
  end
141
154
 
@@ -1,3 +1,4 @@
1
+ # @see https://developers.podio.com/doc/applications
1
2
  class Podio::Application < ActivePodio::Base
2
3
  property :app_id, :integer
3
4
  property :original, :integer
@@ -5,6 +6,7 @@ class Podio::Application < ActivePodio::Base
5
6
  property :status, :string
6
7
  property :icon, :string
7
8
  property :icon_id, :integer
9
+ property :pinned, :boolean
8
10
  property :space_id, :integer
9
11
  property :owner_id, :integer
10
12
  property :owner, :hash
@@ -26,7 +28,7 @@ class Podio::Application < ActivePodio::Base
26
28
  has_one :integration, :class => 'Integration'
27
29
 
28
30
  alias_method :id, :app_id
29
- delegate_to_hash :config, :allow_edit?, :allow_attachments?, :allow_comments?, :description, :visible?, :usage, :default_view
31
+ delegate_to_hash :config, :allow_edit?, :allow_attachments?, :allow_comments?, :description, :visible?, :usage, :default_view, :show_app_item_id?
30
32
 
31
33
  def name
32
34
  self[:name] || self.config['name']
@@ -37,51 +39,65 @@ class Podio::Application < ActivePodio::Base
37
39
  end
38
40
 
39
41
  class << self
42
+ # @see https://developers.podio.com/doc/applications/get-app-22349
40
43
  def find(app_id, options = {})
41
44
  member Podio.connection.get { |req|
42
45
  req.url("/app/#{app_id}", options)
43
46
  }.body
44
47
  end
45
48
 
49
+ # @see https://developers.podio.com/doc/applications/get-app-on-space-by-url-label-477105
46
50
  def find_by_url_label(space_id, url_label)
47
51
  member Podio.connection.get("/app/space/#{space_id}/#{url_label}").body
48
52
  end
49
53
 
54
+ # @see https://developers.podio.com/doc/applications/get-app-by-org-label-space-label-and-app-label-91708386
55
+ def find_by_org_space_and_app_labels(org_label, space_label, app_label)
56
+ member Podio.connection.get("/app/org/#{org_label}/space/#{space_label}/#{app_label}").body
57
+ end
58
+
50
59
  def find_all(options={})
51
60
  list Podio.connection.get { |req|
52
61
  req.url("/app/", options)
53
62
  }.body
54
63
  end
55
64
 
65
+ # @see https://developers.podio.com/doc/applications/get-all-user-apps-5902728
56
66
  def find_all_for_current_user(options={})
57
67
  list Podio.connection.get { |req|
58
68
  req.url("/app/v2/", options)
59
69
  }.body
60
70
  end
61
71
 
72
+ # @see https://developers.podio.com/doc/applications/get-top-apps-22476
62
73
  def find_top(options={})
63
74
  list Podio.connection.get { |req|
64
75
  req.url("/app/top/", options)
65
76
  }.body
66
77
  end
78
+
79
+ ## @see https://developers.podio.com/doc/applications/get-top-apps-for-organization-1671395
67
80
  def find_top_for_org(org_id, options={})
68
81
  list Podio.connection.get { |req|
69
82
  req.url("/app/org/#{org_id}/top/", options)
70
83
  }.body
71
84
  end
72
85
 
86
+ # @see https://developers.podio.com/doc/applications/get-apps-by-space-22478
73
87
  def find_all_for_space(space_id, options = {})
74
88
  list Podio.connection.get { |req|
75
89
  req.url("/app/space/#{space_id}/", options)
76
90
  }.body
77
91
  end
78
92
 
93
+ # @see https://developers.podio.com/doc/applications/get-calculations-for-app-773005
79
94
  def get_calculations(app_id)
80
95
  list Podio.connection.get { |req|
81
96
  req.url("/app/#{app_id}/calculation/", {})
82
97
  }.body
83
98
  end
84
99
 
100
+ # @see https://developers.podio.com/doc/applications/update-app-order-22463
85
101
  def update_order(space_id, app_ids = [])
86
102
  response = Podio.connection.put do |req|
87
103
  req.url "/app/space/#{space_id}/order"
@@ -91,6 +107,7 @@ class Podio::Application < ActivePodio::Base
91
107
  response.body
92
108
  end
93
109
 
110
+ # @see https://developers.podio.com/doc/applications/add-new-app-22351
94
111
  def create(attributes)
95
112
  response = Podio.connection.post do |req|
96
113
  req.url "/app/"
@@ -99,6 +116,7 @@ class Podio::Application < ActivePodio::Base
99
116
  response.body['app_id']
100
117
  end
101
118
 
119
+ # @see https://developers.podio.com/doc/applications/update-app-22352
102
120
  def update(app_id, attributes)
103
121
  response = Podio.connection.put do |req|
104
122
  req.url "/app/#{app_id}"
@@ -107,6 +125,25 @@ class Podio::Application < ActivePodio::Base
107
125
  response.status
108
126
  end
109
127
 
128
+ # @see https://developers.podio.com/doc/applications/update-app-description-33569973
129
+ def update_description(app_id, description)
130
+ response = Podio.connection.put do |req|
131
+ req.url "/app/#{app_id}/description"
132
+ req.body = {:description => description}
133
+ end
134
+ response.status
135
+ end
136
+
137
+ # @see https://developers.podio.com/doc/applications/update-app-usage-33570086
138
+ def update_usage(app_id, usage)
139
+ response = Podio.connection.put do |req|
140
+ req.url "/app/#{app_id}/usage"
141
+ req.body = {:usage => usage}
142
+ end
143
+ response.status
144
+ end
145
+
146
+ # @see https://developers.podio.com/doc/applications/install-app-22506
110
147
  def install(app_id, attributes)
111
148
  response = Podio.connection.post do |req|
112
149
  req.url "/app/#{app_id}/install"
@@ -115,18 +152,22 @@ class Podio::Application < ActivePodio::Base
115
152
  response.body['app_id']
116
153
  end
117
154
 
155
+ # @see https://developers.podio.com/doc/applications/delete-app-field-22355
118
156
  def delete_field(app_id, field_id)
119
157
  Podio.connection.delete("/app/#{app_id}/field/#{field_id}").status
120
158
  end
121
159
 
160
+ # @see https://developers.podio.com/doc/applications/deactivate-app-43821
122
161
  def deactivate(id)
123
162
  Podio.connection.post("/app/#{id}/deactivate").body
124
163
  end
125
164
 
165
+ # @see https://developers.podio.com/doc/applications/activate-app-43822
126
166
  def activate(id)
127
167
  Podio.connection.post("/app/#{id}/activate").body
128
168
  end
129
169
 
170
+ # @see https://developers.podio.com/doc/applications/delete-app-43693
130
171
  def delete(id)
131
172
  Podio.connection.delete("/app/#{id}").body
132
173
  end
@@ -135,21 +176,35 @@ class Podio::Application < ActivePodio::Base
135
176
  Podio.connection.post("/mobile/install_app/#{id}").body
136
177
  end
137
178
 
179
+ # @see https://developers.podio.com/doc/applications/get-features-43648
138
180
  def features(options)
139
181
  Podio.connection.get { |req|
140
182
  req.url("/app/features/", options)
141
183
  }.body
142
184
  end
143
185
 
186
+ # @see https://developers.podio.com/doc/applications/get-app-dependencies-39159
144
187
  def dependencies(id)
145
188
  Podio.connection.get("/app/#{id}/dependencies/").body
146
189
  end
147
190
 
191
+ # @see https://developers.podio.com/doc/applications/get-space-app-dependencies-45779
148
192
  def space_dependencies(space_id)
149
- result = Podio.connection.get("/app/space/#{space_id}/dependencies/").body
193
+ result = Podio.connection.get("/space/#{space_id}/dependencies/").body
150
194
  result['apps'] = result['apps'].collect { |app| Application.new(app) }
151
195
  result
152
196
  end
153
197
 
198
+ def regenerate_apptoken(app_id)
199
+ Podio.connection.post("/app/#{app_id}/token/regenerate").body
200
+ end
201
+
202
+ # @see https://developers.podio.com/doc/applications/get-icon-suggestions-82045764
203
+ def search_icons(query)
204
+ Podio.connection.get { |req|
205
+ req.url("/app/icon/search", {:query => query})
206
+ }.body
207
+ end
208
+
154
209
  end
155
210
  end