freelancer 0.1.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.
- data/.gitignore +3 -0
- data/Gemfile +14 -0
- data/LICENSE +20 -0
- data/README.rdoc +56 -0
- data/Rakefile +34 -0
- data/VERSION +1 -0
- data/freelancer.gemspec +299 -0
- data/init.rb +2 -0
- data/lib/freelancer.rb +59 -0
- data/lib/freelancer/api.rb +20 -0
- data/lib/freelancer/api/common.rb +58 -0
- data/lib/freelancer/api/employer.rb +56 -0
- data/lib/freelancer/api/freelancer.rb +36 -0
- data/lib/freelancer/api/job.rb +46 -0
- data/lib/freelancer/api/message.rb +89 -0
- data/lib/freelancer/api/notification.rb +25 -0
- data/lib/freelancer/api/payment.rb +123 -0
- data/lib/freelancer/api/profile.rb +30 -0
- data/lib/freelancer/api/project.rb +133 -0
- data/lib/freelancer/api/user.rb +86 -0
- data/lib/freelancer/client.rb +152 -0
- data/lib/freelancer/extensions/hash.rb +11 -0
- data/lib/freelancer/models/address.rb +46 -0
- data/lib/freelancer/models/balance.rb +22 -0
- data/lib/freelancer/models/bid.rb +41 -0
- data/lib/freelancer/models/config_version.rb +21 -0
- data/lib/freelancer/models/eligibility.rb +23 -0
- data/lib/freelancer/models/job.rb +33 -0
- data/lib/freelancer/models/job_category.rb +18 -0
- data/lib/freelancer/models/message.rb +32 -0
- data/lib/freelancer/models/milestone.rb +57 -0
- data/lib/freelancer/models/news.rb +15 -0
- data/lib/freelancer/models/notification.rb +15 -0
- data/lib/freelancer/models/notification_status.rb +45 -0
- data/lib/freelancer/models/project.rb +116 -0
- data/lib/freelancer/models/project_budget.rb +21 -0
- data/lib/freelancer/models/project_fee.rb +18 -0
- data/lib/freelancer/models/project_options.rb +34 -0
- data/lib/freelancer/models/rating.rb +21 -0
- data/lib/freelancer/models/review.rb +87 -0
- data/lib/freelancer/models/transaction.rb +39 -0
- data/lib/freelancer/models/user.rb +225 -0
- data/lib/freelancer/models/withdrawal.rb +51 -0
- data/lib/freelancer/models/withdrawal_fee.rb +39 -0
- data/lib/freelancer/support/json_mapper.rb +95 -0
- data/test/fixtures/common/get_config_version.json +1 -0
- data/test/fixtures/common/get_config_version.xml +5 -0
- data/test/fixtures/common/get_pending_feedback.json +1 -0
- data/test/fixtures/common/get_pending_feedback.xml +20 -0
- data/test/fixtures/common/get_terms.json +1 -0
- data/test/fixtures/common/get_terms.xml +4 -0
- data/test/fixtures/common/post_feedback.json +1 -0
- data/test/fixtures/common/post_feedback.xml +4 -0
- data/test/fixtures/common/post_reply_for_feedback.json +1 -0
- data/test/fixtures/common/post_reply_for_feedback.xml +4 -0
- data/test/fixtures/common/request_cancel_project.json +1 -0
- data/test/fixtures/common/request_cancel_project.xml +4 -0
- data/test/fixtures/common/request_withdraw_feedback.json +1 -0
- data/test/fixtures/common/request_withdraw_feedback.xml +4 -0
- data/test/fixtures/employer/choose_winner_for_project.json +1 -0
- data/test/fixtures/employer/choose_winner_for_project.xml +3 -0
- data/test/fixtures/employer/delete_draft_project.json +1 -0
- data/test/fixtures/employer/delete_draft_project.xml +4 -0
- data/test/fixtures/employer/eligible_for_trial_project.json +1 -0
- data/test/fixtures/employer/eligible_for_trial_project.xml +5 -0
- data/test/fixtures/employer/get_posted_project_list.json +1 -0
- data/test/fixtures/employer/get_posted_project_list.xml +38 -0
- data/test/fixtures/employer/invite_user_for_project.json +1 -0
- data/test/fixtures/employer/invite_user_for_project.xml +4 -0
- data/test/fixtures/employer/post_new_draft_project.json +1 -0
- data/test/fixtures/employer/post_new_draft_project.xml +5 -0
- data/test/fixtures/employer/post_new_project.json +1 -0
- data/test/fixtures/employer/post_new_project.xml +5 -0
- data/test/fixtures/employer/post_new_trial_project.json +1 -0
- data/test/fixtures/employer/post_new_trial_project.xml +5 -0
- data/test/fixtures/employer/publish_draft_project.json +1 -0
- data/test/fixtures/employer/publish_draft_project.xml +4 -0
- data/test/fixtures/employer/update_project_details.json +1 -0
- data/test/fixtures/employer/update_project_details.xml +4 -0
- data/test/fixtures/employer/upgrade_trial_project.json +1 -0
- data/test/fixtures/employer/upgrade_trial_project.xml +4 -0
- data/test/fixtures/freelancer/accept_bid_won.json +1 -0
- data/test/fixtures/freelancer/accept_bid_won.xml +4 -0
- data/test/fixtures/freelancer/get_project_list_for_placed_bids.json +1 -0
- data/test/fixtures/freelancer/get_project_list_for_placed_bids.xml +16 -0
- data/test/fixtures/freelancer/place_bid_on_project.json +1 -0
- data/test/fixtures/freelancer/place_bid_on_project.xml +4 -0
- data/test/fixtures/freelancer/retract_bid_from_project.json +1 -0
- data/test/fixtures/freelancer/retract_bid_from_project.xml +4 -0
- data/test/fixtures/job/get_category_job_list.json +1 -0
- data/test/fixtures/job/get_category_job_list.xml +34 -0
- data/test/fixtures/job/get_job_list.json +1 -0
- data/test/fixtures/job/get_job_list.xml +17 -0
- data/test/fixtures/job/get_my_job_list.json +1 -0
- data/test/fixtures/job/get_my_job_list.xml +11 -0
- data/test/fixtures/message/get_inbox_messages.json +1 -0
- data/test/fixtures/message/get_inbox_messages.xml +22 -0
- data/test/fixtures/message/get_sent_messages.json +1 -0
- data/test/fixtures/message/get_sent_messages.xml +22 -0
- data/test/fixtures/message/get_unread_count.json +1 -0
- data/test/fixtures/message/get_unread_count.xml +4 -0
- data/test/fixtures/message/load_message_thread.json +1 -0
- data/test/fixtures/message/load_message_thread.xml +54 -0
- data/test/fixtures/message/mark_message_as_read.json +1 -0
- data/test/fixtures/message/mark_message_as_read.xml +4 -0
- data/test/fixtures/message/send_message.json +1 -0
- data/test/fixtures/message/send_message.xml +4 -0
- data/test/fixtures/notification/get_news.json +1 -0
- data/test/fixtures/notification/get_news.xml +14 -0
- data/test/fixtures/notification/get_notification.json +1 -0
- data/test/fixtures/notification/get_notification.xml +10 -0
- data/test/fixtures/payment/cancel_milestone.json +1 -0
- data/test/fixtures/payment/cancel_milestone.xml +4 -0
- data/test/fixtures/payment/create_milestone_payment.json +1 -0
- data/test/fixtures/payment/create_milestone_payment.xml +4 -0
- data/test/fixtures/payment/get_account_balance_status.json +1 -0
- data/test/fixtures/payment/get_account_balance_status.xml +12 -0
- data/test/fixtures/payment/get_account_milestone_list.json +1 -0
- data/test/fixtures/payment/get_account_milestone_list.xml +30 -0
- data/test/fixtures/payment/get_account_transaction_list.json +1 -0
- data/test/fixtures/payment/get_account_transaction_list.xml +57 -0
- data/test/fixtures/payment/get_account_withdrawal_list.json +1 -0
- data/test/fixtures/payment/get_account_withdrawal_list.xml +42 -0
- data/test/fixtures/payment/get_balance.json +1 -0
- data/test/fixtures/payment/get_balance.xml +4 -0
- data/test/fixtures/payment/get_project_list_for_transfer.json +1 -0
- data/test/fixtures/payment/get_project_list_for_transfer.xml +52 -0
- data/test/fixtures/payment/get_withdrawal_fees.json +1 -0
- data/test/fixtures/payment/get_withdrawal_fees.xml +41 -0
- data/test/fixtures/payment/prepare_transfer.json +1 -0
- data/test/fixtures/payment/prepare_transfer.xml +4 -0
- data/test/fixtures/payment/release_milestone.json +1 -0
- data/test/fixtures/payment/release_milestone.xml +4 -0
- data/test/fixtures/payment/request_cancel_withdrawal.json +1 -0
- data/test/fixtures/payment/request_cancel_withdrawal.xml +4 -0
- data/test/fixtures/payment/request_release_milestone.json +1 -0
- data/test/fixtures/payment/request_release_milestone.xml +4 -0
- data/test/fixtures/payment/request_withdrawal.json +1 -0
- data/test/fixtures/payment/request_withdrawal.xml +6 -0
- data/test/fixtures/payment/transfer_money.json +1 -0
- data/test/fixtures/payment/transfer_money.xml +4 -0
- data/test/fixtures/profile/get_account_details.json +1 -0
- data/test/fixtures/profile/get_account_details.xml +71 -0
- data/test/fixtures/profile/get_profile_info.json +1 -0
- data/test/fixtures/profile/get_profile_info.xml +53 -0
- data/test/fixtures/profile/set_profile_info.json +1 -0
- data/test/fixtures/profile/set_profile_info.xml +4 -0
- data/test/fixtures/project/get_bids_details.json +1 -0
- data/test/fixtures/project/get_bids_details.xml +19 -0
- data/test/fixtures/project/get_project_budget_config.json +1 -0
- data/test/fixtures/project/get_project_budget_config.xml +42 -0
- data/test/fixtures/project/get_project_details.json +1 -0
- data/test/fixtures/project/get_project_details.xml +78 -0
- data/test/fixtures/project/get_project_fees.json +1 -0
- data/test/fixtures/project/get_project_fees.xml +31 -0
- data/test/fixtures/project/get_public_messages.json +1 -0
- data/test/fixtures/project/get_public_messages.xml +27 -0
- data/test/fixtures/project/get_sent_messages.xml +22 -0
- data/test/fixtures/project/get_unread_count.xml +4 -0
- data/test/fixtures/project/load_message_thread.xml +54 -0
- data/test/fixtures/project/mark_message_as_read.xml +4 -0
- data/test/fixtures/project/post_public_message.json +1 -0
- data/test/fixtures/project/post_public_message.xml +4 -0
- data/test/fixtures/project/search_projects.json +1 -0
- data/test/fixtures/project/search_projects.xml +37 -0
- data/test/fixtures/project/send_message.xml +4 -0
- data/test/fixtures/user/get_user_details.json +1 -0
- data/test/fixtures/user/get_user_details.xml +32 -0
- data/test/fixtures/user/get_user_feedback.json +1 -0
- data/test/fixtures/user/get_user_feedback.xml +58 -0
- data/test/fixtures/user/get_users_by_search.json +1 -0
- data/test/fixtures/user/get_users_by_search.xml +26 -0
- data/test/freelancer/api/common_api_test.rb +82 -0
- data/test/freelancer/api/employer_api_test.rb +105 -0
- data/test/freelancer/api/freelancer_api_test.rb +72 -0
- data/test/freelancer/api/job_api_test.rb +76 -0
- data/test/freelancer/api/message_api_test.rb +144 -0
- data/test/freelancer/api/notification_api_test.rb +56 -0
- data/test/freelancer/api/payment_api_test.rb +225 -0
- data/test/freelancer/api/profile_api_test.rb +54 -0
- data/test/freelancer/api/project_api_test.rb +229 -0
- data/test/freelancer/api/user_api_test.rb +153 -0
- data/test/freelancer/client_test.rb +5 -0
- data/test/freelancer/models/balance_test.rb +24 -0
- data/test/freelancer/models/bid_test.rb +25 -0
- data/test/freelancer/models/config_version.rb +14 -0
- data/test/freelancer/models/eligibility_test.rb +14 -0
- data/test/freelancer/models/job_category_test.rb +16 -0
- data/test/freelancer/models/job_test.rb +19 -0
- data/test/freelancer/models/message_test.rb +42 -0
- data/test/freelancer/models/milestone_test.rb +21 -0
- data/test/freelancer/models/news_test.rb +15 -0
- data/test/freelancer/models/notification_test.rb +15 -0
- data/test/freelancer/models/project_budget_test.rb +18 -0
- data/test/freelancer/models/project_fee_test.rb +17 -0
- data/test/freelancer/models/project_test.rb +97 -0
- data/test/freelancer/models/review_test.rb +36 -0
- data/test/freelancer/models/transaction_test.rb +29 -0
- data/test/freelancer/models/user_test.rb +94 -0
- data/test/freelancer/models/withdrawal_fee_test.rb +19 -0
- data/test/freelancer/models/withdrawal_test.rb +20 -0
- data/test/freelancer/oauth_test.rb +112 -0
- data/test/freelancer_test.rb +1 -0
- data/test/test_helper.rb +42 -0
- metadata +427 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module Freelancer
|
|
2
|
+
module API
|
|
3
|
+
module Profile
|
|
4
|
+
module InstanceMethods
|
|
5
|
+
|
|
6
|
+
# Retrieve profile information for the current user
|
|
7
|
+
def account_details
|
|
8
|
+
|
|
9
|
+
result = api_get("/Profile/getAccountDetails.json")
|
|
10
|
+
::Freelancer::Models::User.parse(result, :shift => :"json-result")
|
|
11
|
+
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# Retrieve profile information about a specific user
|
|
15
|
+
#
|
|
16
|
+
# Valid parameters are:
|
|
17
|
+
# - user_id: the user id to retrieve profile for
|
|
18
|
+
def profile_info(*args)
|
|
19
|
+
|
|
20
|
+
params = extract_params(args)
|
|
21
|
+
|
|
22
|
+
result = api_get("/Profile/getProfileInfo.json", { :userid => params[:user_id] })
|
|
23
|
+
::Freelancer::Models::User.parse(result, :shift => :"json-result")
|
|
24
|
+
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
module Freelancer
|
|
2
|
+
module API
|
|
3
|
+
module Project
|
|
4
|
+
module InstanceMethods
|
|
5
|
+
|
|
6
|
+
# Search for projects using a specified set of criterias.
|
|
7
|
+
#
|
|
8
|
+
# Valid parameters are:
|
|
9
|
+
# - featured: if only featured projects should be returned
|
|
10
|
+
# - non_public: if only non-public projects should be returned
|
|
11
|
+
# - keyword: the keyword to use for searching
|
|
12
|
+
# - job: a specific job type, or an array of job types, to search for
|
|
13
|
+
# - status: the project status to filter projects by
|
|
14
|
+
# - minimum_budget: the minimum budget to return projects by
|
|
15
|
+
# - maximum_budget: the maximum budget to return projects by
|
|
16
|
+
# - full_time: if only full time projects should be returned
|
|
17
|
+
# - trial: if only trial projects should be returned
|
|
18
|
+
# - gold_members_only: if only gold member only-projects should be returned
|
|
19
|
+
# - duration: the bid end duration for the project (submitdate (default), bid_enddate, id or state)
|
|
20
|
+
# - count: the number of results to return (defaults to 50)
|
|
21
|
+
# - page: the page to retrieve (defaults to 0)
|
|
22
|
+
def project_search(*args)
|
|
23
|
+
|
|
24
|
+
params = extract_params(args)
|
|
25
|
+
|
|
26
|
+
# Handle the job attribute, make sure it's an array and not set to nil to
|
|
27
|
+
# simplify the handling below.
|
|
28
|
+
params[:job] ||= []
|
|
29
|
+
params[:job] = params[:job].to_a unless params[:job].is_a?(Array)
|
|
30
|
+
|
|
31
|
+
# Delete some boolean data from the params if the values are set to fault,
|
|
32
|
+
# since that's the default already
|
|
33
|
+
[ :featured, :non_public, :full_time, :trial, :gold_members_only ].each do |k|
|
|
34
|
+
params.delete(k) if params.key?(k) && params[k] == false
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Execute the service call
|
|
38
|
+
result = api_get("/Project/searchProjects.json", build_api_params({
|
|
39
|
+
:isfeatured => params[:featured],
|
|
40
|
+
:isnonpublic => params[:non_public],
|
|
41
|
+
:searchkeyword => params[:keyword],
|
|
42
|
+
:searchjobtypecsv => params[:job].join(","),
|
|
43
|
+
:status => params[:status],
|
|
44
|
+
:budgetmin => params[:minimum_budget],
|
|
45
|
+
:budgetmax => params[:maximum_budget],
|
|
46
|
+
:isfulltime => params[:full_time],
|
|
47
|
+
:istrial => params[:trial],
|
|
48
|
+
:isgoldmembersonly => params[:gold_members_only],
|
|
49
|
+
:bidendsduration => params[:duration],
|
|
50
|
+
:count => params[:count],
|
|
51
|
+
:page => params[:page]
|
|
52
|
+
}))
|
|
53
|
+
|
|
54
|
+
# Parse and return the response
|
|
55
|
+
::Freelancer::Models::Project.parse_collection(result, :shift => [ :"json-result", :items ])
|
|
56
|
+
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Retrieve the available project type fees
|
|
60
|
+
def project_fees
|
|
61
|
+
|
|
62
|
+
result = api_get("/Project/getProjectFees.json")
|
|
63
|
+
::Freelancer::Models::ProjectFee.parse_collection(result, :shift => [ :"json-result", :items ])
|
|
64
|
+
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Retrieve information about a project
|
|
68
|
+
#
|
|
69
|
+
# Valid parameters are:
|
|
70
|
+
# - project_id: the id of the project to retrieve
|
|
71
|
+
def project_details(*args)
|
|
72
|
+
|
|
73
|
+
params = extract_params(args)
|
|
74
|
+
|
|
75
|
+
# Execute the service call
|
|
76
|
+
result = api_get("/Project/getProjectDetails.json", build_api_params({
|
|
77
|
+
:projectid => params[:project_id]
|
|
78
|
+
}))
|
|
79
|
+
|
|
80
|
+
# Parse and return the response
|
|
81
|
+
::Freelancer::Models::Project.parse(result, :shift => :"json-result")
|
|
82
|
+
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Retrieve the bids for a project
|
|
86
|
+
#
|
|
87
|
+
# Valid parameters are:
|
|
88
|
+
# - project_id: the id of the project to retrieve bids for
|
|
89
|
+
def project_bids(*args)
|
|
90
|
+
|
|
91
|
+
params = extract_params(args)
|
|
92
|
+
|
|
93
|
+
# Execute the service call
|
|
94
|
+
result = api_get("/Project/getBidsDetails.json", build_api_params({
|
|
95
|
+
:projectid => params[:project_id]
|
|
96
|
+
}))
|
|
97
|
+
|
|
98
|
+
# Parse and return the response
|
|
99
|
+
::Freelancer::Models::Bid.parse_collection(result, :shift => [ :"json-result", :items ])
|
|
100
|
+
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# Retrieve the public messages for a project
|
|
104
|
+
#
|
|
105
|
+
# Valid parameters are:
|
|
106
|
+
# - project_id: the id of the project to retrieve bids for
|
|
107
|
+
def public_messages(*args)
|
|
108
|
+
|
|
109
|
+
params = extract_params(args)
|
|
110
|
+
|
|
111
|
+
# Execute the service call
|
|
112
|
+
result = api_get("/Project/getPublicMessages.json", build_api_params({
|
|
113
|
+
:projectid => params[:project_id]
|
|
114
|
+
}))
|
|
115
|
+
|
|
116
|
+
# Parse and return the response
|
|
117
|
+
::Freelancer::Models::Message.parse_collection(result, :shift => [ :"json-result", :items ])
|
|
118
|
+
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# Retrieve the project budget configurations
|
|
122
|
+
def project_budgets
|
|
123
|
+
|
|
124
|
+
result = api_get("/Project/getProjectBudgetConfig.json")
|
|
125
|
+
::Freelancer::Models::ProjectBudget.parse_collection(result, :shift => [ :"json-result", :items ])
|
|
126
|
+
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
module Freelancer
|
|
2
|
+
module API
|
|
3
|
+
module User
|
|
4
|
+
module InstanceMethods
|
|
5
|
+
|
|
6
|
+
# Search for users
|
|
7
|
+
#
|
|
8
|
+
# Valid parameters are:
|
|
9
|
+
# - username: the username to search for
|
|
10
|
+
# - expertise: a specific expertise, or an array of expertises, to search for
|
|
11
|
+
# - country: a specific country, or an array of countries, to search for
|
|
12
|
+
# - rating: the minimum rating to search for
|
|
13
|
+
# - count: the number of results to return (defaults to 50)
|
|
14
|
+
# - page: the page to retrieve (defaults to 0)
|
|
15
|
+
def user_search(*args)
|
|
16
|
+
|
|
17
|
+
params = extract_params(args)
|
|
18
|
+
|
|
19
|
+
# Handle the expertise and country attributes. Make sure they're an array and not set
|
|
20
|
+
# to nil to simplify the handling below.
|
|
21
|
+
params[:country] ||= []
|
|
22
|
+
params[:country] = params[:country].to_a unless params[:country].is_a?(Array)
|
|
23
|
+
params[:expertise] ||= []
|
|
24
|
+
params[:expertise] = params[:expertise].to_a unless params[:expertise].is_a?(Array)
|
|
25
|
+
|
|
26
|
+
# Execute the service call
|
|
27
|
+
result = api_get("/User/getUsersBySearch.json", build_api_params({
|
|
28
|
+
:username => params[:username],
|
|
29
|
+
:expertise_csv => params[:expertise].join(","),
|
|
30
|
+
:country_csv => params[:country].join(","),
|
|
31
|
+
:rating => params[:rating],
|
|
32
|
+
:count => params[:count],
|
|
33
|
+
:page => params[:page]
|
|
34
|
+
}))
|
|
35
|
+
|
|
36
|
+
# Parse and return the response
|
|
37
|
+
::Freelancer::Models::User.parse_collection(result, :shift => [ :"json-result", :items ])
|
|
38
|
+
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Search for users
|
|
42
|
+
#
|
|
43
|
+
# Valid parameters are:
|
|
44
|
+
# - username: the username to list feedback for
|
|
45
|
+
# - user_id: the user id to list feedback for
|
|
46
|
+
# - type: the type of feedback to show ("P" = provider only, "B" = buyer only, "A" = all (default))
|
|
47
|
+
def user_feedback(*args)
|
|
48
|
+
|
|
49
|
+
params = extract_params(args)
|
|
50
|
+
|
|
51
|
+
# Execute the service call
|
|
52
|
+
result = api_get("/User/getUserFeedback.json", build_api_params({
|
|
53
|
+
:username => params[:username],
|
|
54
|
+
:userid => params[:user_id],
|
|
55
|
+
:type => params[:type]
|
|
56
|
+
}))
|
|
57
|
+
|
|
58
|
+
# Parse and return the response
|
|
59
|
+
::Freelancer::Models::Review.parse_collection(result, :shift => [ :user, :totalreviews, :items ])
|
|
60
|
+
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Retrieve user details for a specific user
|
|
64
|
+
#
|
|
65
|
+
# Valid parameters are:
|
|
66
|
+
# - username: the username to retrieve details for
|
|
67
|
+
# - user_id: the user id to retrieve details for
|
|
68
|
+
def user_details(*args)
|
|
69
|
+
|
|
70
|
+
params = extract_params(args)
|
|
71
|
+
|
|
72
|
+
# Execute the service call
|
|
73
|
+
result = api_get("/User/getUserDetails.json", build_api_params({
|
|
74
|
+
:username => params[:username],
|
|
75
|
+
:userid => params[:user_id]
|
|
76
|
+
}))
|
|
77
|
+
|
|
78
|
+
# Parse and return the response
|
|
79
|
+
::Freelancer::Models::User.parse(result, :shift => :user)
|
|
80
|
+
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
module Freelancer
|
|
2
|
+
class Client
|
|
3
|
+
|
|
4
|
+
extend API
|
|
5
|
+
|
|
6
|
+
# Load the different API plugins
|
|
7
|
+
api API::User
|
|
8
|
+
api API::Job
|
|
9
|
+
api API::Profile
|
|
10
|
+
api API::Employer
|
|
11
|
+
api API::Freelancer
|
|
12
|
+
api API::Common
|
|
13
|
+
api API::Payment
|
|
14
|
+
api API::Notification
|
|
15
|
+
api API::Project
|
|
16
|
+
api API::Message
|
|
17
|
+
|
|
18
|
+
attr_reader :consumer_token, :consumer_secret, :consumer_options
|
|
19
|
+
|
|
20
|
+
# Initialize a new Freelancer API client
|
|
21
|
+
def initialize(consumer_token, consumer_secret, consumer_options = {})
|
|
22
|
+
|
|
23
|
+
default_options = {
|
|
24
|
+
:request_token_path => "/RequestRequestToken/requestRequestToken.xml",
|
|
25
|
+
:authorize_url => "http://www.sandbox.freelancer.com/users/api-token/auth.php",
|
|
26
|
+
:access_token_path => "/RequestAccessToken/requestAccessToken.xml",
|
|
27
|
+
:scheme => :query_string,
|
|
28
|
+
:http_method => :get
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
@consumer_token, @consumer_secret, @consumer_options = consumer_token, consumer_secret, consumer_options.merge(default_options)
|
|
32
|
+
@api_endpoint = "http://api.sandbox.freelancer.com"
|
|
33
|
+
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Get the current oAuth consumer instance
|
|
37
|
+
def consumer
|
|
38
|
+
@consumer ||= ::OAuth::Consumer.new(consumer_token, consumer_secret, { :site => @api_endpoint }.merge(consumer_options))
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Set the callback URL for an oAuth request
|
|
42
|
+
def set_callback_url(url)
|
|
43
|
+
clear_request_token
|
|
44
|
+
request_token :oauth_callback => url
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Get the current oAuth request token
|
|
48
|
+
def request_token(options = {})
|
|
49
|
+
@request_token_instance ||= consumer.get_request_token(options)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Authorize a user from an oAuth request
|
|
53
|
+
def authorize_from_request(request_token, request_secret, verifier)
|
|
54
|
+
|
|
55
|
+
request_token = ::OAuth::RequestToken.new(consumer, request_token, request_secret)
|
|
56
|
+
access_token = request_token.get_access_token(:oauth_verifier => verifier)
|
|
57
|
+
@access_token, @access_secret = access_token.token, access_token.secret
|
|
58
|
+
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Get the current oAuth access token
|
|
62
|
+
def access_token
|
|
63
|
+
@access_token_instance ||= ::OAuth::AccessToken.new(consumer, @access_token, @access_secret)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Authorize a user from an oAuth access token
|
|
67
|
+
def authorize_from_access(access_token, access_secret)
|
|
68
|
+
@access_token, @access_secret = access_token, access_secret
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Execute a GET-request for the specified API method
|
|
72
|
+
def api_get(method, options = {})
|
|
73
|
+
response = access_token.get(to_uri(method, options))
|
|
74
|
+
raise_api_errors!(response)
|
|
75
|
+
return response.body
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Execute a GET-requset for the specified API method and return the raw
|
|
79
|
+
# result.
|
|
80
|
+
def api_get_raw(method, options = {})
|
|
81
|
+
response = access_token.get(to_uri(method, options))
|
|
82
|
+
raise_api_errors!(response)
|
|
83
|
+
response.body
|
|
84
|
+
end
|
|
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
|
+
private
|
|
95
|
+
|
|
96
|
+
# Extract params from an array of arguments. Copied from ActiveSupport.
|
|
97
|
+
def extract_params(args)
|
|
98
|
+
args.last.is_a?(Hash) ? args.last : {}
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Build a hash of parameters based on the arguments, stripping out any blank
|
|
102
|
+
# arguments.
|
|
103
|
+
def build_api_params(params)
|
|
104
|
+
params.reject { |key, value| value.nil? || value == "" }
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Clear the current oAuth request token
|
|
108
|
+
def clear_request_token
|
|
109
|
+
@request_token_instance = nil
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Raise an error for the specified API method response if any
|
|
113
|
+
def raise_api_errors!(response)
|
|
114
|
+
|
|
115
|
+
case response.code.to_i
|
|
116
|
+
when 1..199
|
|
117
|
+
raise "Response code #{response.code}: #{response}"
|
|
118
|
+
when 201..503
|
|
119
|
+
raise "Response code: #{response.code}: #{response}"
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# Create a URI from the specified method and options
|
|
125
|
+
def to_uri(method, options)
|
|
126
|
+
|
|
127
|
+
uri = URI.parse(method)
|
|
128
|
+
unless options.nil? || options.empty?
|
|
129
|
+
uri.query = to_query(options)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
return uri.to_s
|
|
133
|
+
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
# Convert a hash to a proper query string
|
|
137
|
+
def to_query(params)
|
|
138
|
+
params.inject([]) do |collection, options|
|
|
139
|
+
options[1] = URI.escape(options[1]) if options[1].is_a?(String) && !options[1].nil?
|
|
140
|
+
collection << "#{options[0]}=#{options[1]}"
|
|
141
|
+
collection
|
|
142
|
+
end * "&"
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# Decode any HTML entities in the given string
|
|
146
|
+
def html_decode(str)
|
|
147
|
+
encoder = HTMLEntities.new
|
|
148
|
+
encoder.decode(str)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
end
|
|
152
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
module Freelancer
|
|
2
|
+
module Models
|
|
3
|
+
class Address
|
|
4
|
+
|
|
5
|
+
include JSONMapper
|
|
6
|
+
|
|
7
|
+
# The first streetname of the address
|
|
8
|
+
#
|
|
9
|
+
# Provided from:
|
|
10
|
+
# - /Profile/getAccountDetails.json
|
|
11
|
+
json_attribute :street_name, :addressline1, String
|
|
12
|
+
|
|
13
|
+
# The second streetname of the address
|
|
14
|
+
#
|
|
15
|
+
# Provided from:
|
|
16
|
+
# - /Profile/getAccountDetails.json
|
|
17
|
+
json_attribute :street_name_2, :addressline2, String
|
|
18
|
+
|
|
19
|
+
# The postal code of the address
|
|
20
|
+
#
|
|
21
|
+
# Provided from:
|
|
22
|
+
# - /Profile/getAccountDetails.json
|
|
23
|
+
json_attribute :postal_code, :postalcode, String
|
|
24
|
+
|
|
25
|
+
# The city part of the address
|
|
26
|
+
#
|
|
27
|
+
# Provided from:
|
|
28
|
+
# - /User/getUserDetails.json
|
|
29
|
+
json_attribute :city, String
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
# The state part of the address
|
|
33
|
+
#
|
|
34
|
+
# Provided from:
|
|
35
|
+
# - /Profile/getAccountDetails.json
|
|
36
|
+
json_attribute :state, String
|
|
37
|
+
|
|
38
|
+
# The country the address is located in
|
|
39
|
+
#
|
|
40
|
+
# Provided from:
|
|
41
|
+
# - /User/getUserDetails.json
|
|
42
|
+
json_attribute :country, String
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|