freelancer 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/Gemfile +2 -2
- data/README.rdoc +9 -12
- data/Rakefile +55 -12
- data/VERSION +1 -1
- data/freelancer.gemspec +12 -9
- data/lib/freelancer.rb +3 -0
- data/lib/freelancer/api/common.rb +98 -0
- data/lib/freelancer/api/employer.rb +169 -0
- data/lib/freelancer/api/freelancer.rb +85 -0
- data/lib/freelancer/api/message.rb +42 -0
- data/lib/freelancer/api/payment.rb +184 -0
- data/lib/freelancer/api/profile.rb +40 -0
- data/lib/freelancer/api/project.rb +20 -0
- data/lib/freelancer/client.rb +23 -13
- data/lib/freelancer/models/project.rb +6 -0
- data/lib/freelancer/models/status_confirmation.rb +28 -0
- data/test/fixtures/error.json +1 -0
- data/test/fixtures/status_confirmation.json +1 -0
- data/test/freelancer/api/common_api_test.rb +97 -0
- data/test/freelancer/api/employer_api_test.rb +258 -0
- data/test/freelancer/api/freelancer_api_test.rb +76 -0
- data/test/freelancer/api/message_api_test.rb +44 -0
- data/test/freelancer/api/payment_api_test.rb +169 -1
- data/test/freelancer/api/profile_api_test.rb +57 -0
- data/test/freelancer/api/project_api_test.rb +19 -0
- data/test/freelancer/client_test.rb +22 -2
- metadata +15 -10
@@ -30,6 +30,91 @@ module Freelancer
|
|
30
30
|
|
31
31
|
end
|
32
32
|
|
33
|
+
# Place a bid on a project
|
34
|
+
#
|
35
|
+
# Valid parameters are:
|
36
|
+
# - project_id: the id of the project to bid on
|
37
|
+
# - amount: the amount of money to offer taking the project for
|
38
|
+
# - description: the bid description
|
39
|
+
# - days: the estimated number of days to complete the project
|
40
|
+
# - notify_on_underbid: if notifications should be send when someone bids lower than this bid
|
41
|
+
# - highlighted: if this bid is highlighted or not
|
42
|
+
# - milestone: declares the initial milestone percentage for the bid
|
43
|
+
def bid_on_project(*args)
|
44
|
+
|
45
|
+
params = extract_params(args)
|
46
|
+
|
47
|
+
# Execute the service call
|
48
|
+
result = api_get("/Freelancer/placeBidOnProject.json", build_api_params({
|
49
|
+
:projectid => params[:project_id],
|
50
|
+
:amount => params[:amount],
|
51
|
+
:description => params[:description],
|
52
|
+
:days => params[:days],
|
53
|
+
:notificationStatus => params[:notify_on_underbid],
|
54
|
+
:highlighted => params[:highlighted],
|
55
|
+
:milestone => params[:milestone]
|
56
|
+
}))
|
57
|
+
|
58
|
+
# Parse and return the response
|
59
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
# Retract a bid from a project
|
64
|
+
#
|
65
|
+
# Valid parameters are:
|
66
|
+
# - project_id: the id of the project to withdraw bid from
|
67
|
+
def retract_bid_from_project(*args)
|
68
|
+
|
69
|
+
params = extract_params(args)
|
70
|
+
|
71
|
+
# Execute the service call
|
72
|
+
result = api_get("/Freelancer/retractBidFromProject.json", build_api_params({
|
73
|
+
:projectid => params[:project_id]
|
74
|
+
}))
|
75
|
+
|
76
|
+
# Parse and return the response
|
77
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
# Accept a won bid
|
82
|
+
#
|
83
|
+
# Valid parameters are:
|
84
|
+
# - project_id: the id of the project to accept the offer on
|
85
|
+
def accept_won_bid(*args)
|
86
|
+
|
87
|
+
params = extract_params(args)
|
88
|
+
|
89
|
+
# Execute the service call
|
90
|
+
result = api_get("/Freelancer/acceptBidWon.json", build_api_params({
|
91
|
+
:projectid => params[:project_id]
|
92
|
+
}))
|
93
|
+
|
94
|
+
# Parse and return the response
|
95
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
# Reject a won bid
|
100
|
+
#
|
101
|
+
# Valid parameters are:
|
102
|
+
# - project_id: the id of the project to reject the offer on
|
103
|
+
def reject_won_bid(*args)
|
104
|
+
|
105
|
+
params = extract_params(args)
|
106
|
+
|
107
|
+
# Execute the service call
|
108
|
+
result = api_get("/Freelancer/acceptBidWon.json", build_api_params({
|
109
|
+
:projectid => params[:project_id],
|
110
|
+
:state => 0
|
111
|
+
}))
|
112
|
+
|
113
|
+
# Parse and return the response
|
114
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
115
|
+
|
116
|
+
end
|
117
|
+
|
33
118
|
end
|
34
119
|
end
|
35
120
|
end
|
@@ -83,6 +83,48 @@ module Freelancer
|
|
83
83
|
|
84
84
|
end
|
85
85
|
|
86
|
+
# Send a private message to another user
|
87
|
+
#
|
88
|
+
# Valid parameters are:
|
89
|
+
# - project_id: the id of the project to send message for
|
90
|
+
# - text: the text of the message to send
|
91
|
+
# - user_id: the id of the user to send the message to
|
92
|
+
# - username: the username of the user to send the message to
|
93
|
+
def send_message(*args)
|
94
|
+
|
95
|
+
params = extract_params(args)
|
96
|
+
|
97
|
+
# Execute the service call
|
98
|
+
result = api_get("/Message/sendMessage.json", build_api_params({
|
99
|
+
:projectid => params[:project_id],
|
100
|
+
:messagetext => params[:text],
|
101
|
+
:userid => params[:user_id],
|
102
|
+
:username => params[:username]
|
103
|
+
}))
|
104
|
+
|
105
|
+
# Parse and return the response
|
106
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
# Mark a message as read
|
111
|
+
#
|
112
|
+
# Valid parameters are:
|
113
|
+
# - message_id: the id of the message to mark as read
|
114
|
+
def mark_message_as_read(*args)
|
115
|
+
|
116
|
+
params = extract_params(args)
|
117
|
+
|
118
|
+
# Execute the service call
|
119
|
+
result = api_get("/Message/markMessageAsRead.json", build_api_params({
|
120
|
+
:id => params[:message_id]
|
121
|
+
}))
|
122
|
+
|
123
|
+
# Parse and return the response
|
124
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
125
|
+
|
126
|
+
end
|
127
|
+
|
86
128
|
end
|
87
129
|
end
|
88
130
|
end
|
@@ -117,6 +117,190 @@ module Freelancer
|
|
117
117
|
|
118
118
|
end
|
119
119
|
|
120
|
+
# Request withdrawal of funds
|
121
|
+
#
|
122
|
+
# Valid parameters are:
|
123
|
+
# - amount: the amount of money to withdraw
|
124
|
+
# - method: the withdrawal method (paypal, moneybooker, wire, paynoneer)
|
125
|
+
# - wire_comment: withdrawal comment for wire transfer
|
126
|
+
# - paypal_email: paypal account to withdraw to
|
127
|
+
# - moneybooker_account: moneybooker account to withdraw to
|
128
|
+
# - description: description for wire transfer withdrawal
|
129
|
+
# - country_code: country code for wire transfer withdrawal
|
130
|
+
def request_withdrawal(*args)
|
131
|
+
|
132
|
+
params = extract_params(args)
|
133
|
+
|
134
|
+
# Execute the service call
|
135
|
+
result = api_get("/Payment/requestWithdrawal.json", build_api_params({
|
136
|
+
:amount => params[:amount],
|
137
|
+
:method => params[:method],
|
138
|
+
:additionaltext => params[:wire_comment],
|
139
|
+
:paypalemail => params[:paypal_email],
|
140
|
+
:mb_account => params[:moneybooker_account],
|
141
|
+
:description => params[:description],
|
142
|
+
:country_code => params[:country_code]
|
143
|
+
}))
|
144
|
+
|
145
|
+
# Parse and return the response
|
146
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
147
|
+
|
148
|
+
end
|
149
|
+
|
150
|
+
# Create a new milestone payment
|
151
|
+
#
|
152
|
+
# Valid parameters are:
|
153
|
+
# - project_id: the id of the project to create the payment for
|
154
|
+
# - amount: the amount of money to add to the milestone payment
|
155
|
+
# - user_id: the id of the user to make out the payment to
|
156
|
+
# - username: the username of the user to make out the payment to
|
157
|
+
# - comment: the comment of the payment
|
158
|
+
# - type: the milestone payment type (partial, full or other)
|
159
|
+
def create_milestone_payment(*args)
|
160
|
+
|
161
|
+
params = extract_params(args)
|
162
|
+
|
163
|
+
# Execute the service call
|
164
|
+
result = api_get("/Payment/createMilestonePayment.json", build_api_params({
|
165
|
+
:projectid => params[:project_id],
|
166
|
+
:amount => params[:amount],
|
167
|
+
:touserid => params[:user_id],
|
168
|
+
:tousername => params[:username],
|
169
|
+
:reasontext => params[:comment],
|
170
|
+
:reasontype => params[:type]
|
171
|
+
}))
|
172
|
+
|
173
|
+
# Parse and return the response
|
174
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
175
|
+
|
176
|
+
end
|
177
|
+
|
178
|
+
# Transfer money to another user
|
179
|
+
#
|
180
|
+
# Valid parameters are:
|
181
|
+
# - project_id: the id of the project to transfer money for
|
182
|
+
# - amount: the amount of money to transfer
|
183
|
+
# - user_id: the id of the user to transfer the money to
|
184
|
+
# - username: the username of the user to transfer the money to
|
185
|
+
# - comment: the comment of the transfer
|
186
|
+
# - type: the transfer type (partial, full or other)
|
187
|
+
def transfer_money(*args)
|
188
|
+
|
189
|
+
params = extract_params(args)
|
190
|
+
|
191
|
+
# Execute the service call
|
192
|
+
result = api_get("/Payment/transferMoney.json", build_api_params({
|
193
|
+
:projectid => params[:project_id],
|
194
|
+
:amount => params[:amount],
|
195
|
+
:touserid => params[:user_id],
|
196
|
+
:tousername => params[:username],
|
197
|
+
:reasontext => params[:comment],
|
198
|
+
:reasontype => params[:type]
|
199
|
+
}))
|
200
|
+
|
201
|
+
# Parse and return the response
|
202
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
203
|
+
|
204
|
+
end
|
205
|
+
|
206
|
+
# Cancel a money withdrawal request
|
207
|
+
#
|
208
|
+
# Valid parameters are:
|
209
|
+
# - withdrawal_id: the id of the withdrawal to cancel
|
210
|
+
def cancel_withdrawal(*args)
|
211
|
+
|
212
|
+
params = extract_params(args)
|
213
|
+
|
214
|
+
# Execute the service call
|
215
|
+
result = api_get("/Payment/requestCancelWithdrawal.json", build_api_params({
|
216
|
+
:withdrawalid => params[:withdrawal_id]
|
217
|
+
}))
|
218
|
+
|
219
|
+
# Parse and return the response
|
220
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
221
|
+
|
222
|
+
end
|
223
|
+
|
224
|
+
# Cancel a milestone payment
|
225
|
+
#
|
226
|
+
# Valid parameters are:
|
227
|
+
# - transaction_id: the id of the milestone transaction to cancel
|
228
|
+
def cancel_milestone(*args)
|
229
|
+
|
230
|
+
params = extract_params(args)
|
231
|
+
|
232
|
+
# Execute the service call
|
233
|
+
result = api_get("/Payment/cancelMilestone.json", build_api_params({
|
234
|
+
:transactionid => params[:transaction_id]
|
235
|
+
}))
|
236
|
+
|
237
|
+
# Parse and return the response
|
238
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
239
|
+
|
240
|
+
end
|
241
|
+
|
242
|
+
# Request to release a milestone payment
|
243
|
+
#
|
244
|
+
# Valid parameters are:
|
245
|
+
# - transaction_id: the id of the milestone transaction to release
|
246
|
+
def request_release_milestone(*args)
|
247
|
+
|
248
|
+
params = extract_params(args)
|
249
|
+
|
250
|
+
# Execute the service call
|
251
|
+
result = api_get("/Payment/requestReleaseMilestone.json", build_api_params({
|
252
|
+
:transactionid => params[:transaction_id]
|
253
|
+
}))
|
254
|
+
|
255
|
+
# Parse and return the response
|
256
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
257
|
+
|
258
|
+
end
|
259
|
+
|
260
|
+
# Release a milestone payment
|
261
|
+
#
|
262
|
+
# Valid parameters are:
|
263
|
+
# - transaction_id: the id of the milestone transaction to release
|
264
|
+
# - full_name: the full name of the payer (signature)
|
265
|
+
def release_milestone(*args)
|
266
|
+
|
267
|
+
params = extract_params(args)
|
268
|
+
|
269
|
+
# Execute the service call
|
270
|
+
result = api_get("/Payment/releaseMilestone.json", build_api_params({
|
271
|
+
:transactionid => params[:transaction_id],
|
272
|
+
:fullname => params[:full_name]
|
273
|
+
}))
|
274
|
+
|
275
|
+
# Parse and return the response
|
276
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
277
|
+
|
278
|
+
end
|
279
|
+
|
280
|
+
# Prepare a transfer to validate it before actually transfering
|
281
|
+
#
|
282
|
+
# Valid parameters are:
|
283
|
+
# - project_id: the id of the project to transfer money for
|
284
|
+
# - amount: the amount of money to transfer
|
285
|
+
# - user_id: the id of the user to transfer money to
|
286
|
+
# - type: the type of transfer (partial, full or other)
|
287
|
+
def prepare_transfer(*args)
|
288
|
+
|
289
|
+
params = extract_params(args)
|
290
|
+
|
291
|
+
# Execute the service call
|
292
|
+
result = api_get("/Payment/prepareTransfer.json", build_api_params({
|
293
|
+
:projectid => params[:project_id],
|
294
|
+
:amount => params[:amount],
|
295
|
+
:touserid => params[:user_id],
|
296
|
+
:reasontype => params[:type]
|
297
|
+
}))
|
298
|
+
|
299
|
+
# Parse and return the response
|
300
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
301
|
+
|
302
|
+
end
|
303
|
+
|
120
304
|
end
|
121
305
|
end
|
122
306
|
end
|
@@ -11,6 +11,46 @@ module Freelancer
|
|
11
11
|
|
12
12
|
end
|
13
13
|
|
14
|
+
# Update one or more attributes for the current user. This method takes a
|
15
|
+
# User object, and this should in most cases have been populated by the
|
16
|
+
# account_details method before passed to the update_account_details
|
17
|
+
# method to ensure that no data gets lost.
|
18
|
+
def update_account_details(account)
|
19
|
+
|
20
|
+
# Prepare a map of update parameters
|
21
|
+
params = {}
|
22
|
+
params[:fullname] = account.name
|
23
|
+
params[:company_name] = account.company
|
24
|
+
params[:type_of_work] = account.type_of_work
|
25
|
+
params[:addressline1] = account.address.street_name
|
26
|
+
params[:addressline2] = account.address.street_name_2
|
27
|
+
params[:city] = account.address.city
|
28
|
+
params[:state] = account.address.state
|
29
|
+
params[:country] = account.address.country
|
30
|
+
params[:postalcode] = account.address.postal_code
|
31
|
+
params[:phone] = account.phone_number
|
32
|
+
params[:fax] = account.fax_number
|
33
|
+
params[:notificationformat] = account.notifications.notification_format
|
34
|
+
params[:emailnotificationstatus] = account.notifications.email
|
35
|
+
params[:receivenewsstatus] = account.notifications.news
|
36
|
+
params[:bidwonnotificationstatus] = account.notifications.bid_won
|
37
|
+
params[:bidplacednotificationstatus] = account.notifications.bid_placed
|
38
|
+
params[:newprivatemessagestatus] = account.notifications.new_private_message
|
39
|
+
params[:qualificationcsv] = account.qualifications.join(",")
|
40
|
+
params[:profiletext] = account.profile_text
|
41
|
+
params[:vision] = account.vision
|
42
|
+
params[:keywords] = account.keywords
|
43
|
+
params[:hourlyrate] = account.hourly_rate
|
44
|
+
params[:skills] = account.skills.join("\n")
|
45
|
+
|
46
|
+
# Execute the service call
|
47
|
+
result = api_get("/Profile/setProfileInfo.json", params)
|
48
|
+
|
49
|
+
# Parse and return the response
|
50
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
51
|
+
|
52
|
+
end
|
53
|
+
|
14
54
|
# Retrieve profile information about a specific user
|
15
55
|
#
|
16
56
|
# Valid parameters are:
|
@@ -126,6 +126,26 @@ module Freelancer
|
|
126
126
|
|
127
127
|
end
|
128
128
|
|
129
|
+
# Post a public message for a project
|
130
|
+
#
|
131
|
+
# Valid parameters are:
|
132
|
+
# - project_id: the id of the project to post the message to
|
133
|
+
# - message: the message to post
|
134
|
+
def post_public_project_message(*args)
|
135
|
+
|
136
|
+
params = extract_params(args)
|
137
|
+
|
138
|
+
# Execute the service call
|
139
|
+
result = api_get("/Project/postPublicMessage.json", build_api_params({
|
140
|
+
:projectid => params[:project_id],
|
141
|
+
:messagetext => params[:message]
|
142
|
+
}))
|
143
|
+
|
144
|
+
# Parse and return the response
|
145
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
146
|
+
|
147
|
+
end
|
148
|
+
|
129
149
|
end
|
130
150
|
|
131
151
|
end
|
data/lib/freelancer/client.rb
CHANGED
@@ -75,7 +75,7 @@ module Freelancer
|
|
75
75
|
return response.body
|
76
76
|
end
|
77
77
|
|
78
|
-
# Execute a GET-
|
78
|
+
# Execute a GET-request for the specified API method and return the raw
|
79
79
|
# result.
|
80
80
|
def api_get_raw(method, options = {})
|
81
81
|
response = access_token.get(to_uri(method, options))
|
@@ -83,14 +83,6 @@ module Freelancer
|
|
83
83
|
response.body
|
84
84
|
end
|
85
85
|
|
86
|
-
# Execute a POST-request for the specified API method
|
87
|
-
# TODO: Finish this method, it should probably return some JSON decoded
|
88
|
-
# string.
|
89
|
-
def api_post(method, body)
|
90
|
-
response = access_token.post(method, body)
|
91
|
-
response.body
|
92
|
-
end
|
93
|
-
|
94
86
|
private
|
95
87
|
|
96
88
|
# Extract params from an array of arguments. Copied from ActiveSupport.
|
@@ -114,11 +106,29 @@ module Freelancer
|
|
114
106
|
|
115
107
|
case response.code.to_i
|
116
108
|
when 1..199
|
117
|
-
raise "
|
109
|
+
raise FreelancerRequestError.new("Got response code #{response.code} when executing API request")
|
118
110
|
when 201..503
|
119
|
-
raise "
|
111
|
+
raise FreelancerRequestError.new("Got response code #{response.code} when executing API request")
|
120
112
|
end
|
121
|
-
|
113
|
+
|
114
|
+
# Attempt to convert the response to a JSON data structure
|
115
|
+
json = JSONMapper::Parser.parse(response.body)
|
116
|
+
|
117
|
+
# If we didn't get a proper response, raise an error
|
118
|
+
raise FreelancerResponseError.new("No or invalid response received when executing API request") if json.nil?
|
119
|
+
|
120
|
+
# If the JSON data has an error element as the only element,
|
121
|
+
# assume this request fails
|
122
|
+
if json.keys.size == 1 && json.keys.first == :errors
|
123
|
+
|
124
|
+
error_code = json[:errors][:error][:code]
|
125
|
+
error_message = json[:errors][:error][:msg]
|
126
|
+
error_description = json[:errors][:error][:longmsg]
|
127
|
+
|
128
|
+
raise FreelancerResponseError.new("#{error_message} - #{error_description} (code #{error_code})")
|
129
|
+
|
130
|
+
end
|
131
|
+
|
122
132
|
end
|
123
133
|
|
124
134
|
# Create a URI from the specified method and options
|
@@ -128,7 +138,7 @@ module Freelancer
|
|
128
138
|
unless options.nil? || options.empty?
|
129
139
|
uri.query = to_query(options)
|
130
140
|
end
|
131
|
-
|
141
|
+
|
132
142
|
return uri.to_s
|
133
143
|
|
134
144
|
end
|