coach_client 0.1.1

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.
@@ -0,0 +1,99 @@
1
+ module CoachClient
2
+ # A partnership subscription resource of the CyberCoach service.
3
+ class PartnershipSubscription < CoachClient::Subscription
4
+ # @return [Integer]
5
+ attr_reader :id, :datesubscribed
6
+
7
+ # @return [CoachClient::Partnership]
8
+ attr_accessor :partnership
9
+
10
+ # Returns the relative path to the partnership subscription resource.
11
+ #
12
+ # @return [String] the relative path
13
+ def self.path
14
+ 'partnerships/'
15
+ end
16
+
17
+ # Creates a new partnership subscription.
18
+ #
19
+ # @param [CoachClient::Client] client
20
+ # @param [String, CoachClient::Partnership] partnership
21
+ # @param [String, Symbol, CoachClient::Sport] sport
22
+ # @param [Integer] publicvisible
23
+ # @return [CoachClient::PartnershipSubscription]
24
+ def initialize(client, partnership, sport, publicvisible: nil)
25
+ super(client, sport, publicvisible: publicvisible)
26
+ @partnership = if partnership.is_a?(CoachClient::Partnership)
27
+ partnership
28
+ else
29
+ uri = "partnerships/#{partnership}/"
30
+ users = CoachClient::Partnership.extract_users_from_uri(uri)
31
+ CoachClient::Partnership.new(client, *users)
32
+ end
33
+ end
34
+
35
+ # Updates the partnership subscription with the data from the CyberCoach
36
+ # service.
37
+ #
38
+ # @raise [CoachClient::NotFound] if the partnership subscription does not
39
+ # exist
40
+ # @return [CoachClient::PartnershipSubscription] the updated partnership
41
+ # subscription
42
+ def update
43
+ if @partnership.user1.authenticated?
44
+ super(@partnership.user1)
45
+ else
46
+ super(@partnership.user2)
47
+ end
48
+ end
49
+
50
+ # Saves the partnership subscription to the CyberCoach service.
51
+ #
52
+ # The partnership subscription is created if it does not exist on the
53
+ # CyberCoach service, otherwise it tries to overwrite it.
54
+ #
55
+ # @raise [CoachClient::Unauthorized] if not authorized
56
+ # @raise [CoachClient::IncompleteInformation] if not all needed information
57
+ # is given
58
+ # @raise [CoachClient::NotSaved] if the partnership subscription could not
59
+ # be saved
60
+ # @return [CoachClient::PartnershipSubscription] the saved partnership
61
+ # subscription
62
+ def save
63
+ if @partnership.user1.authenticated?
64
+ super(@partnership.user1)
65
+ else
66
+ super(@partnership.user2)
67
+ end
68
+ end
69
+
70
+ # Deletes the partnership subscription on the CyberCoach service.
71
+ #
72
+ # @raise [CoachClient::NotFound] if the partnership subscription does not
73
+ # exist
74
+ # @raise [CoachClient::Unauthorized] if not authorized
75
+ # @return [true]
76
+ def delete
77
+ if @partnership.user1.authenticated?
78
+ super(@partnership.user1)
79
+ else
80
+ super(@partnership.user2)
81
+ end
82
+ end
83
+
84
+ # Returns the URL of the partnership subscription.
85
+ #
86
+ # @return [String] the url of the partnership subscription
87
+ def url
88
+ "#{@partnership.url}/#{@sport}"
89
+ end
90
+
91
+ # Returns the string representation of the partnership subscription.
92
+ #
93
+ # @return [String]
94
+ def to_s
95
+ "#{@partnership}/#{@sport}"
96
+ end
97
+ end
98
+ end
99
+
@@ -0,0 +1,99 @@
1
+ module CoachClient
2
+ # Request methods for the HTTP verbs GET, PUT, POST, DELETE.
3
+ module Request
4
+ # The default header.
5
+ DEFAULT_HEADER = { accept: :json }
6
+
7
+ # GET request to the RESTful service.
8
+ #
9
+ # @param [String] url
10
+ # @param [String] username
11
+ # @param [String] password
12
+ # @param [Hash] header
13
+ # @return [CoachClient::Response]
14
+ def self.get(url, username: nil, password: nil, **header)
15
+ header.merge!(DEFAULT_HEADER)
16
+ begin
17
+ response = RestClient::Request.execute(method: :get, url: url,
18
+ user: username,
19
+ password: password,
20
+ headers: header)
21
+ rescue RestClient::ResourceNotFound => e
22
+ raise CoachClient::NotFound, e.message
23
+ rescue RestClient::Unauthorized => e
24
+ raise CoachClient::Unauthorized, e.message
25
+ end
26
+ CoachClient::Response.new(response.headers, response.body, response.code)
27
+ end
28
+
29
+ # PUT request to the RESTful service.
30
+ #
31
+ # @param [String] url
32
+ # @param [String] username
33
+ # @param [String] password
34
+ # @param [String] payload required
35
+ # @param [Hash] header
36
+ # @return [CoachClient::Response]
37
+ def self.put(url, username: nil, password: nil, payload:, **header)
38
+ header.merge!(DEFAULT_HEADER)
39
+ begin
40
+ response = RestClient::Request.execute(method: :put, url: url,
41
+ user: username,
42
+ password: password,
43
+ payload: payload,
44
+ headers: header)
45
+ rescue RestClient::ResourceNotFound => e
46
+ raise CoachClient::NotFound, e.message
47
+ rescue RestClient::Unauthorized => e
48
+ raise CoachClient::Unauthorized, e.message
49
+ end
50
+ CoachClient::Response.new(response.headers, response.body, response.code)
51
+ end
52
+
53
+ # POST request to the RESTful service.
54
+ #
55
+ # @param [String] url
56
+ # @param [String] username
57
+ # @param [String] password
58
+ # @param [String] payload required
59
+ # @param [Hash] header
60
+ # @return [CoachClient::Response]
61
+ def self.post(url, username: nil, password: nil, payload:, **header)
62
+ header.merge!(DEFAULT_HEADER)
63
+ begin
64
+ response = RestClient::Request.execute(method: :post, url: url,
65
+ user: username,
66
+ password: password,
67
+ payload: payload,
68
+ headers: header)
69
+ rescue RestClient::ResourceNotFound => e
70
+ raise CoachClient::NotFound, e.message
71
+ rescue RestClient::Unauthorized => e
72
+ raise CoachClient::Unauthorized, e.message
73
+ end
74
+ CoachClient::Response.new(response.headers, response.body, response.code)
75
+ end
76
+
77
+ # DELETE request to the RESTful service.
78
+ #
79
+ # @param [String] url
80
+ # @param [String] username
81
+ # @param [String] password
82
+ # @param [Hash] header
83
+ # @return [CoachClient::Response]
84
+ def self.delete(url, username: nil, password: nil, **header)
85
+ begin
86
+ response = RestClient::Request.execute(method: :delete, url: url,
87
+ user: username,
88
+ password: password,
89
+ headers: header)
90
+ rescue RestClient::ResourceNotFound => e
91
+ raise CoachClient::NotFound, e.message
92
+ rescue RestClient::Unauthorized => e
93
+ raise CoachClient::Unauthorized, e.message
94
+ end
95
+ CoachClient::Response.new(response.headers, response.body, response.code)
96
+ end
97
+ end
98
+ end
99
+
@@ -0,0 +1,48 @@
1
+ module CoachClient
2
+ # A resource of the CyberCoach service.
3
+ class Resource
4
+ # @return [CoachClient::Client]
5
+ attr_accessor :client
6
+
7
+ # Creates a new resource.
8
+ #
9
+ # @param [CoachClient::Client] client
10
+ # @return [CoachClient::Resource]
11
+ def initialize(client)
12
+ @client = client
13
+ end
14
+
15
+ # Returns whether the resource exists on the CyberCoach service.
16
+ #
17
+ # @param [String] username
18
+ # @param [String] password
19
+ # @return [Boolean]
20
+ def exist?(username: nil, password: nil)
21
+ begin
22
+ CoachClient::Request.get(url, username: username, password: password)
23
+ true
24
+ rescue CoachClient::NotFound
25
+ false
26
+ end
27
+ end
28
+
29
+ # Returns the hash representation of the resource.
30
+ #
31
+ # @return [Hash]
32
+ def to_h
33
+ hash = {}
34
+ instance_variables.each do |var|
35
+ next if var.to_s == '@client'
36
+ value = instance_variable_get(var)
37
+ hash[var.to_s.delete('@').to_sym] =
38
+ if value && value.respond_to?(:to_h) && !value.is_a?(Array)
39
+ value.to_h
40
+ else
41
+ value
42
+ end
43
+ end
44
+ hash
45
+ end
46
+ end
47
+ end
48
+
@@ -0,0 +1,37 @@
1
+ module CoachClient
2
+ # A response from RESTful request to the CyberCoach service.
3
+ class Response
4
+ # @return [Integer] the HTTP code
5
+ attr_reader :code
6
+
7
+ # @return [String] the HTTP headers
8
+ attr_reader :header
9
+
10
+ # Creates a new response.
11
+ #
12
+ # @param [String] header the headers of the HTTP response
13
+ # @param [String] body the body of the HTTP response
14
+ # @param [Integer] code the HTTP response code
15
+ # @return [CoachClient::Response]
16
+ def initialize(header, body, code)
17
+ @header = header
18
+ @body = body
19
+ @code = code
20
+ end
21
+
22
+ # Returns the body as Ruby Hash.
23
+ #
24
+ # @return [Hash]
25
+ def to_h
26
+ JSON.parse(@body, symbolize_names: true)
27
+ end
28
+
29
+ # Returns the body as String.
30
+ #
31
+ # @return [String]
32
+ def to_s
33
+ @body.to_s
34
+ end
35
+ end
36
+ end
37
+
@@ -0,0 +1,88 @@
1
+ module CoachClient
2
+ # A sport resource of the CyberCoach service.
3
+ class Sport < CoachClient::Resource
4
+ # @return [Integer]
5
+ attr_reader :id
6
+
7
+ # @return [Symbol]
8
+ attr_reader :sport
9
+
10
+ # @return [String]
11
+ attr_reader :name, :description
12
+
13
+ # Returns the relative path to the sport resource.
14
+ #
15
+ # @return [String] the relative path
16
+ def self.path
17
+ 'sports/'
18
+ end
19
+
20
+ # Returns the total number of sports present on the CyberCoach service.
21
+ #
22
+ # @param [CoachClient::Client] client
23
+ # @return [Integer] the total number of sports
24
+ def self.total(client)
25
+ response = CoachClient::Request.get(client.url + path,
26
+ params: { size: 0 })
27
+ response.to_h[:available]
28
+ end
29
+
30
+ # Returns a list of sports from the CyberCoach service for which the given
31
+ # block returns a true value.
32
+ #
33
+ # If no block is given, the whole list is returned.
34
+ #
35
+ # @param [CoachClient::Client] client
36
+ # @yieldparam [CoachClient::Sport] sport the sport
37
+ # @yieldreturn [Boolean] whether the sport should be added to the list
38
+ # @return [Array<CoachClient::Sport>] the list of sports
39
+ def self.list(client)
40
+ sportlist = []
41
+ response = CoachClient::Request.get(client.url + path)
42
+ response.to_h[:sports].each do |s|
43
+ sport = self.new(client, s[:name])
44
+ sportlist << sport if !block_given? || yield(sport)
45
+ end
46
+ sportlist
47
+ end
48
+
49
+ # Creates a new sport.
50
+ #
51
+ # @param [CoachClient::Client] client
52
+ # @param [String, Symbol] sport
53
+ # @return [CoachClient::Sport]
54
+ def initialize(client, sport)
55
+ super(client)
56
+ @sport = sport.downcase.to_sym
57
+ end
58
+
59
+ # Updates the sport with the data from the CyberCoach service.
60
+ #
61
+ # @raise [CoachClient::NotFound] if the sport does not exist
62
+ # @return [CoachClient::Sport] the updated sport
63
+ def update
64
+ raise CoachClient::NotFound, 'Sport not found' unless exist?
65
+ response = CoachClient::Request.get(url)
66
+ response = response.to_h
67
+ @id = response[:id]
68
+ @name = response[:name]
69
+ @description = response[:description]
70
+ self
71
+ end
72
+
73
+ # Returns the URL of the sport.
74
+ #
75
+ # @return [String] the url of the sport
76
+ def url
77
+ @client.url + self.class.path + @sport.to_s
78
+ end
79
+
80
+ # Returns the string representation of the sport.
81
+ #
82
+ # @return [String]
83
+ def to_s
84
+ @sport.to_s
85
+ end
86
+ end
87
+ end
88
+
@@ -0,0 +1,116 @@
1
+ module CoachClient
2
+ # A subscription resource of the CyberCoach service.
3
+ #
4
+ # @note Use the subclass {CoachClient::UserSubscription} or
5
+ # {CoachClient::PartnershipSubscription} for a user or partnership
6
+ # subscription respectively.
7
+ class Subscription < CoachClient::Resource
8
+ # @return [Integer]
9
+ attr_reader :id, :datesubscribed
10
+
11
+ # @return [Array<CoachClient::Entry>]
12
+ attr_reader :entries
13
+
14
+ # @return [CoachClient::Sport]
15
+ attr_accessor :sport
16
+
17
+ # @return [Integer]
18
+ attr_accessor :publicvisible
19
+
20
+ # Creates a new subscription.
21
+ #
22
+ # @param [CoachClient::Client] client
23
+ # @param [String, Symbol, CoachClient::Sport] sport
24
+ # @param [Integer] publicvisible
25
+ # @return [CoachClient::Subscription]
26
+ def initialize(client, sport, publicvisible: nil)
27
+ super(client)
28
+ @sport = if sport.is_a?(CoachClient::Sport)
29
+ sport
30
+ else
31
+ CoachClient::Sport.new(client, sport)
32
+ end
33
+ @publicvisible = publicvisible
34
+ end
35
+
36
+ # Updates the subscription with the data from the CyberCoach service.
37
+ #
38
+ # @raise [CoachClient::NotFound] if the subscription does not exist
39
+ # @param [CoachClient::User] user
40
+ # @return [CoachClient::Subscription] the updated subscription
41
+ def update(user)
42
+ raise CoachClient::NotFound, 'Subscription not found' unless exist?
43
+ response = if user.authenticated?
44
+ CoachClient::Request.get(url, username: user.username,
45
+ password: user.password)
46
+ else
47
+ CoachClient::Request.get(url)
48
+ end
49
+ response = response.to_h
50
+ @id = response[:id]
51
+ @datesubscribed = response[:datesubscribed]
52
+ @publicvisible = response[:publicvisible]
53
+ @entries = []
54
+ unless response[:entries].nil?
55
+ response[:entries].each do |e|
56
+ tag = "entry#{@sport}"
57
+ id = CoachClient::Entry.extract_id_from_uri(e[tag.to_sym][:uri])
58
+ @entries << CoachClient::Entry.new(client, self, id: id)
59
+ end
60
+ end
61
+ self
62
+ end
63
+
64
+ # Saves the subscription to the CyberCoach service.
65
+ #
66
+ # The subscription is created if it does not exist on the CyberCoach service,
67
+ # otherwise it tries to overwrite it.
68
+ #
69
+ # @raise [CoachClient::Unauthorized] if not authorized
70
+ # @raise [CoachClient::IncompleteInformation] if not all needed information
71
+ # is given
72
+ # @raise [CoachClient::NotSaved] if the subscription could not be saved
73
+ # @param [CoachClient::User] user
74
+ # @return [CoachClient::Subscription] the saved subscription
75
+ def save(user)
76
+ vals = self.to_h
77
+ vals.delete(:user)
78
+ vals.delete(:partnership)
79
+ vals.delete(:sport)
80
+ vals.delete_if { |_k, v| v.nil? || v.to_s.empty? }
81
+ payload = Gyoku.xml(subscription: vals)
82
+ unless user.authenticated?
83
+ raise CoachClient::Unauthorized.new(user), 'Unauthorized'
84
+ end
85
+ begin
86
+ response = CoachClient::Request.put(url, username: user.username,
87
+ password: user.password,
88
+ payload: payload,
89
+ content_type: :xml)
90
+ rescue RestClient::Conflict
91
+ raise CoachClient::IncompleteInformation.new(self), 'Incomplete information'
92
+ end
93
+ unless response.code == 200 || response.code == 201
94
+ raise CoachClient::NotSaved.new(self), 'Could not save subscription'
95
+ end
96
+ self
97
+ end
98
+
99
+ # Deletes the subscription on the CyberCoach service.
100
+ #
101
+ # @raise [CoachClient::NotFound] if the subscription does not exist
102
+ # @raise [CoachClient::Unauthorized] if not authorized
103
+ # @param [CoachClient::User] user
104
+ # @return [true]
105
+ def delete(user)
106
+ raise CoachClient::NotFound unless exist?
107
+ unless user.authenticated?
108
+ raise CoachClient::Unauthorized.new(user), 'Unauthorized'
109
+ end
110
+ CoachClient::Request.delete(url, username: user.username,
111
+ password: user.password)
112
+ true
113
+ end
114
+ end
115
+ end
116
+