youcanbookme 0.0.1.alpha
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.github/workflows/gem-push.yml +37 -0
- data/.github/workflows/test.yml +21 -0
- data/.gitignore +10 -0
- data/.rubocom.yml +69 -0
- data/CHANGELOG.md +7 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +21 -0
- data/README.md +119 -0
- data/Rakefile +12 -0
- data/bin/console +7 -0
- data/bin/setup +6 -0
- data/lib/youcanbookme.rb +22 -0
- data/lib/youcanbookme/client.rb +85 -0
- data/lib/youcanbookme/common_module.rb +32 -0
- data/lib/youcanbookme/configuration.rb +20 -0
- data/lib/youcanbookme/error.rb +15 -0
- data/lib/youcanbookme/http_command.rb +94 -0
- data/lib/youcanbookme/models/account.rb +125 -0
- data/lib/youcanbookme/models/action.rb +91 -0
- data/lib/youcanbookme/models/answer.rb +19 -0
- data/lib/youcanbookme/models/appointment_type.rb +7 -0
- data/lib/youcanbookme/models/booking.rb +167 -0
- data/lib/youcanbookme/models/booking_lobby.rb +13 -0
- data/lib/youcanbookme/models/calendar.rb +67 -0
- data/lib/youcanbookme/models/caligraph_calendar.rb +29 -0
- data/lib/youcanbookme/models/caligraph_event.rb +8 -0
- data/lib/youcanbookme/models/caligraph_link.rb +17 -0
- data/lib/youcanbookme/models/caligraph_local_account.rb +47 -0
- data/lib/youcanbookme/models/caligraph_permission.rb +32 -0
- data/lib/youcanbookme/models/caligraph_remote_account.rb +23 -0
- data/lib/youcanbookme/models/caligraph_safe_local_account.rb +13 -0
- data/lib/youcanbookme/models/card.rb +25 -0
- data/lib/youcanbookme/models/event.rb +98 -0
- data/lib/youcanbookme/models/instant.rb +9 -0
- data/lib/youcanbookme/models/link.rb +17 -0
- data/lib/youcanbookme/models/local_account.rb +180 -0
- data/lib/youcanbookme/models/model_utils.rb +88 -0
- data/lib/youcanbookme/models/name_and_address.rb +25 -0
- data/lib/youcanbookme/models/participant.rb +25 -0
- data/lib/youcanbookme/models/permission.rb +39 -0
- data/lib/youcanbookme/models/profile.rb +114 -0
- data/lib/youcanbookme/models/profile_afterwards.rb +34 -0
- data/lib/youcanbookme/models/profile_appointment_type.rb +23 -0
- data/lib/youcanbookme/models/profile_appointment_types.rb +27 -0
- data/lib/youcanbookme/models/profile_calendar.rb +21 -0
- data/lib/youcanbookme/models/profile_calendars.rb +19 -0
- data/lib/youcanbookme/models/profile_cancel_or_reschedule.rb +21 -0
- data/lib/youcanbookme/models/profile_display.rb +55 -0
- data/lib/youcanbookme/models/profile_local_account.rb +19 -0
- data/lib/youcanbookme/models/profile_payments.rb +23 -0
- data/lib/youcanbookme/models/profile_remote_account.rb +25 -0
- data/lib/youcanbookme/models/profile_remote_reminder.rb +15 -0
- data/lib/youcanbookme/models/profile_team_member.rb +33 -0
- data/lib/youcanbookme/models/profile_team_members.rb +29 -0
- data/lib/youcanbookme/models/profile_tentative.rb +16 -0
- data/lib/youcanbookme/models/profile_times.rb +79 -0
- data/lib/youcanbookme/models/profile_vouchers.rb +17 -0
- data/lib/youcanbookme/models/provider.rb +17 -0
- data/lib/youcanbookme/models/purchase.rb +126 -0
- data/lib/youcanbookme/models/purchases_sync_changes.rb +19 -0
- data/lib/youcanbookme/models/query.rb +8 -0
- data/lib/youcanbookme/models/question.rb +24 -0
- data/lib/youcanbookme/models/reminder.rb +21 -0
- data/lib/youcanbookme/models/remote_account.rb +63 -0
- data/lib/youcanbookme/models/team_member.rb +8 -0
- data/lib/youcanbookme/models/template_event.rb +17 -0
- data/lib/youcanbookme/models/transaction.rb +42 -0
- data/lib/youcanbookme/models/warning.rb +27 -0
- data/lib/youcanbookme/version.rb +5 -0
- data/youcanbookme.gemspec +41 -0
- metadata +244 -0
@@ -0,0 +1,88 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'time'
|
4
|
+
|
5
|
+
module YouCanBookMe
|
6
|
+
# YouCanBook.me model utility.
|
7
|
+
module ModelUtils
|
8
|
+
# @param [Hash] attrs the attributes of the model.
|
9
|
+
# @param [YouCanBookMe::Client] the api client.
|
10
|
+
def initialize(attrs = nil, client = nil)
|
11
|
+
@client = client
|
12
|
+
set_attributes attrs
|
13
|
+
end
|
14
|
+
|
15
|
+
def inspect
|
16
|
+
"\#<#{self.class}:#{object_id}>"
|
17
|
+
end
|
18
|
+
|
19
|
+
module ClassMethods
|
20
|
+
# @param [String] prefix
|
21
|
+
# @return [Array<String>]
|
22
|
+
def fields(prefix = nil)
|
23
|
+
instance = new
|
24
|
+
ret_fields = []
|
25
|
+
instance.methods.each do |m|
|
26
|
+
next if %i[=== == !=].include? m
|
27
|
+
next unless m.to_s.end_with? '='
|
28
|
+
|
29
|
+
field = m.to_s.split('=')[0]
|
30
|
+
ret_fields << (prefix ? "#{prefix}.#{field}" : field)
|
31
|
+
end
|
32
|
+
ret_fields
|
33
|
+
end
|
34
|
+
|
35
|
+
# @param [String] prefix
|
36
|
+
# @param [Integer] max_depth
|
37
|
+
# @return [Array<String>]
|
38
|
+
def deep_fields(prefix = nil, max_depth: 3)
|
39
|
+
ret_fields = []
|
40
|
+
fields(prefix).each do |field_with_prefix|
|
41
|
+
ret_fields << field_with_prefix
|
42
|
+
depth = field_with_prefix.split('.').length
|
43
|
+
field = field_with_prefix.split('.')[-1].to_sym
|
44
|
+
next unless defined? self::ASSOCIATION
|
45
|
+
next unless self::ASSOCIATION.key? field
|
46
|
+
|
47
|
+
child_klass = self::ASSOCIATION[field]
|
48
|
+
child_fields = if (self == child_klass) || depth >= max_depth
|
49
|
+
c_klass.fields(field_with_prefix)
|
50
|
+
else
|
51
|
+
c_klass.deep_fields(field_with_prefix, max_depth: max_depth)
|
52
|
+
end
|
53
|
+
child_fields.each { |c_field| ret_fields << c_field }
|
54
|
+
end
|
55
|
+
ret_fields
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.included(base)
|
60
|
+
base.extend ClassMethods
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
def set_attributes(attrs)
|
66
|
+
return if attrs.nil?
|
67
|
+
return unless attrs.is_a? Hash
|
68
|
+
return if attrs.empty?
|
69
|
+
|
70
|
+
attrs.each do |key, value|
|
71
|
+
next unless respond_to? "#{key}=".to_sym
|
72
|
+
|
73
|
+
if defined?(self.class::ASSOCIATION) && self.class::ASSOCIATION.key?(key)
|
74
|
+
klass = self.class::ASSOCIATION[key]
|
75
|
+
if value.is_a? Array
|
76
|
+
value = value.map { |item| klass.new item, @client }
|
77
|
+
elsif value.is_a? Hash
|
78
|
+
value = klass.new value, @client
|
79
|
+
end
|
80
|
+
end
|
81
|
+
instance_variable_set "@#{key}", value
|
82
|
+
end
|
83
|
+
after_set_attributes(attrs)
|
84
|
+
end
|
85
|
+
|
86
|
+
def after_set_attributes(attrs); end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module YouCanBookMe
|
4
|
+
# YouCanBookMe's NameAndAddress model.
|
5
|
+
class NameAndAddress
|
6
|
+
include ModelUtils
|
7
|
+
|
8
|
+
# @return [String]
|
9
|
+
attr_accessor :address
|
10
|
+
# @return [String]
|
11
|
+
attr_accessor :city
|
12
|
+
# @return [String]
|
13
|
+
attr_accessor :country
|
14
|
+
# @return [String]
|
15
|
+
attr_accessor :familyName
|
16
|
+
# @return [String]
|
17
|
+
attr_accessor :givenName
|
18
|
+
# @return [String]
|
19
|
+
attr_accessor :organizationName
|
20
|
+
# @return [String]
|
21
|
+
attr_accessor :postalCode
|
22
|
+
# @return [String]
|
23
|
+
attr_accessor :region
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module YouCanBookMe
|
4
|
+
# YouCanBookMe's Participant model.
|
5
|
+
class Participant
|
6
|
+
include ModelUtils
|
7
|
+
|
8
|
+
ASSOCIATION = {
|
9
|
+
links: Link
|
10
|
+
}.freeze
|
11
|
+
|
12
|
+
# @return [String]
|
13
|
+
attr_accessor :email
|
14
|
+
# @return [String]
|
15
|
+
attr_accessor :id
|
16
|
+
# @return [Array<YouCanBookMe::Link>]
|
17
|
+
attr_accessor :links
|
18
|
+
# @return [Boolean]
|
19
|
+
attr_accessor :required
|
20
|
+
# @return [String]
|
21
|
+
attr_accessor :role
|
22
|
+
# @return [String]
|
23
|
+
attr_accessor :status
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module YouCanBookMe
|
4
|
+
# YouCanBookMe's Permission model.
|
5
|
+
class Permission
|
6
|
+
include ModelUtils
|
7
|
+
|
8
|
+
ASSOCIATION = {
|
9
|
+
databaseVersion: Permission,
|
10
|
+
fromLocalAccount: LocalAccount,
|
11
|
+
toLocalAccount: LocalAccount
|
12
|
+
}.freeze
|
13
|
+
|
14
|
+
# @return [String]
|
15
|
+
attr_accessor :createdAt
|
16
|
+
# @return [YouCanBookMe::Permission]
|
17
|
+
attr_accessor :databaseVersion
|
18
|
+
# @return [String]
|
19
|
+
attr_accessor :expiresAt
|
20
|
+
# @return [YouCanBookMe::LocalAccount]
|
21
|
+
attr_accessor :fromLocalAccount
|
22
|
+
# @return [String]
|
23
|
+
attr_accessor :id
|
24
|
+
# @return [String]
|
25
|
+
attr_accessor :requestedAction
|
26
|
+
# @return [String]
|
27
|
+
attr_accessor :resource
|
28
|
+
# @return [String]
|
29
|
+
attr_accessor :status
|
30
|
+
# @return [Integer]
|
31
|
+
attr_accessor :statusHibernate
|
32
|
+
# @return [YouCanBookMe::LocalAccount]
|
33
|
+
attr_accessor :toLocalAccount
|
34
|
+
# @return [String]
|
35
|
+
attr_accessor :type
|
36
|
+
# @return [String]
|
37
|
+
attr_accessor :updatedAt
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module YouCanBookMe
|
4
|
+
# YouCanBookMe's Profile model.
|
5
|
+
class Profile
|
6
|
+
include ModelUtils
|
7
|
+
|
8
|
+
ASSOCIATION = {
|
9
|
+
actions: Action,
|
10
|
+
afterwards: ProfileAfterwards,
|
11
|
+
appointmentTypes: ProfileAppointmentTypes,
|
12
|
+
availableAccounts: ProfileLocalAccount,
|
13
|
+
calendars: ProfileCalendars,
|
14
|
+
cancelOrReschedule: ProfileCancelOrReschedule,
|
15
|
+
databaseVersion: Profile,
|
16
|
+
display: ProfileDisplay,
|
17
|
+
payments: ProfilePayments,
|
18
|
+
questions: Question,
|
19
|
+
remoteReminders: ProfileRemoteReminder,
|
20
|
+
services: ProfileAppointmentTypes,
|
21
|
+
teamMembers: ProfileTeamMembers,
|
22
|
+
tentative: ProfileTentative,
|
23
|
+
times: ProfileTimes,
|
24
|
+
vouchers: ProfileVouchers
|
25
|
+
}.freeze
|
26
|
+
|
27
|
+
# @return [String]
|
28
|
+
attr_accessor :accessCode
|
29
|
+
# @return [Boolean]
|
30
|
+
attr_accessor :accountCanAccessRestrictedFeatures
|
31
|
+
# @return [String]
|
32
|
+
attr_accessor :accountEmail
|
33
|
+
# @return [String]
|
34
|
+
attr_accessor :accountId
|
35
|
+
# @return [String]
|
36
|
+
attr_accessor :accountLocale
|
37
|
+
# @return [String]
|
38
|
+
attr_accessor :accountMobile
|
39
|
+
# @return [String]
|
40
|
+
attr_accessor :accountTimeZone
|
41
|
+
# @return [Array<YouCanBookMe::Action>]
|
42
|
+
attr_accessor :actions
|
43
|
+
# @return [YouCanBookMe::ProfileAfterwards]
|
44
|
+
attr_accessor :afterwards
|
45
|
+
# @return [YouCanBookMe::ProfileAppointmentTypes]
|
46
|
+
attr_accessor :appointmentTypes
|
47
|
+
# @return [Array<YouCanBookMe::ProfileLocalAccount>]
|
48
|
+
attr_accessor :availableAccounts
|
49
|
+
# @return [Array<YouCanBookMe::ProfileCalendars>]
|
50
|
+
attr_accessor :calendars
|
51
|
+
# @return [YouCanBookMe::ProfileCancelOrReschedule]
|
52
|
+
attr_accessor :cancelOrReschedule
|
53
|
+
# @return [Boolean]
|
54
|
+
attr_accessor :captchaActive
|
55
|
+
# @return [String]
|
56
|
+
attr_accessor :createdAt
|
57
|
+
# @return [YouCanBookMe::Profile]
|
58
|
+
attr_accessor :databaseVersion
|
59
|
+
# @return [String]
|
60
|
+
attr_accessor :datesPattern
|
61
|
+
# @return [String]
|
62
|
+
attr_accessor :description
|
63
|
+
# @return [YouCanBookMe::ProfileDisplay]
|
64
|
+
attr_accessor :display
|
65
|
+
# @return [Boolean]
|
66
|
+
attr_accessor :htmlAllowed
|
67
|
+
# @return [String]
|
68
|
+
attr_accessor :id
|
69
|
+
# @return [String]
|
70
|
+
attr_accessor :locale
|
71
|
+
# @return [String]
|
72
|
+
attr_accessor :logo
|
73
|
+
# @return [String]
|
74
|
+
attr_accessor :parentId
|
75
|
+
# @return [String]
|
76
|
+
attr_accessor :password
|
77
|
+
# @return [YouCanBookMe::ProfilePayments]
|
78
|
+
attr_accessor :payments
|
79
|
+
# @return [Boolean]
|
80
|
+
attr_accessor :protectedByAccessCode
|
81
|
+
# @return [Array<YouCanBookMe::Question>]
|
82
|
+
attr_accessor :questions
|
83
|
+
# @return [String]
|
84
|
+
attr_accessor :realtimeTopic
|
85
|
+
# @return [Array<YouCanBookMe::ProfileRemoteReminder>]
|
86
|
+
attr_accessor :remoteReminders
|
87
|
+
# @return [String]
|
88
|
+
attr_accessor :requestedAction
|
89
|
+
# @return [YouCanBookMe::ProfileAppointmentTypes]
|
90
|
+
attr_accessor :services
|
91
|
+
# @return [String]
|
92
|
+
attr_accessor :status
|
93
|
+
# @return [String]
|
94
|
+
attr_accessor :subdomain
|
95
|
+
# @return [YouCanBookMe::ProfileTeamMembers]
|
96
|
+
attr_accessor :teamMembers
|
97
|
+
# @return [YouCanBookMe::ProfileTentative]
|
98
|
+
attr_accessor :tentative
|
99
|
+
# @return [String]
|
100
|
+
attr_accessor :timeZone
|
101
|
+
# @return [Boolean]
|
102
|
+
attr_accessor :timeZoneOverride
|
103
|
+
# @return [YouCanBookMe::ProfileTimes]
|
104
|
+
attr_accessor :times
|
105
|
+
# @return [String]
|
106
|
+
attr_accessor :timesPattern
|
107
|
+
# @return [String]
|
108
|
+
attr_accessor :title
|
109
|
+
# @return [String]
|
110
|
+
attr_accessor :updatedAt
|
111
|
+
# @return [YouCanBookMe::ProfileVouchers]
|
112
|
+
attr_accessor :vouchers
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module YouCanBookMe
|
4
|
+
# YouCanBookMe's ProfileAfterwards model.
|
5
|
+
class ProfileAfterwards
|
6
|
+
include ModelUtils
|
7
|
+
|
8
|
+
ASSOCIATION = {
|
9
|
+
bookerEvent: TemplateEvent,
|
10
|
+
ownerEvent: TemplateEvent
|
11
|
+
}.freeze
|
12
|
+
|
13
|
+
# @return [YouCanBookMe::TemplateEvent]
|
14
|
+
attr_accessor :bookerEvent
|
15
|
+
# @return [String]
|
16
|
+
attr_accessor :bookingDescription
|
17
|
+
# @return [String]
|
18
|
+
attr_accessor :bookingLocation
|
19
|
+
# @return [String]
|
20
|
+
attr_accessor :bookingTitle
|
21
|
+
# @return [Boolean]
|
22
|
+
attr_accessor :isUrl
|
23
|
+
# @return [YouCanBookMe::TemplateEvent]
|
24
|
+
attr_accessor :ownerEvent
|
25
|
+
# @return [Boolean]
|
26
|
+
attr_accessor :scrollToTop
|
27
|
+
# @return [String]
|
28
|
+
attr_accessor :text
|
29
|
+
# @return [Boolean]
|
30
|
+
attr_accessor :updateWholeBrowserWindow
|
31
|
+
# @return [String]
|
32
|
+
attr_accessor :url
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module YouCanBookMe
|
4
|
+
# YouCanBookMe's ProfileAppointmentType model.
|
5
|
+
class ProfileAppointmentType
|
6
|
+
include ModelUtils
|
7
|
+
|
8
|
+
# @return [String]
|
9
|
+
attr_accessor :description
|
10
|
+
# @return [String]
|
11
|
+
attr_accessor :id
|
12
|
+
# @return [String]
|
13
|
+
attr_accessor :name
|
14
|
+
# @return [Integer]
|
15
|
+
attr_accessor :numberOfSlots
|
16
|
+
# @return [String]
|
17
|
+
attr_accessor :pic
|
18
|
+
# @return [Integer]
|
19
|
+
attr_accessor :price
|
20
|
+
# @return [Integer]
|
21
|
+
attr_accessor :slotLengthMinutes
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module YouCanBookMe
|
4
|
+
# YouCanBookMe's ProfileAppointmentTypes model.
|
5
|
+
class ProfileAppointmentTypes
|
6
|
+
include ModelUtils
|
7
|
+
|
8
|
+
ASSOCIATION = {
|
9
|
+
items: ProfileAppointmentType
|
10
|
+
}.freeze
|
11
|
+
|
12
|
+
# @return [Boolean]
|
13
|
+
attr_accessor :active
|
14
|
+
# @return [Boolean]
|
15
|
+
attr_accessor :combinable
|
16
|
+
# @return [String]
|
17
|
+
attr_accessor :description
|
18
|
+
# @return [Boolean]
|
19
|
+
attr_accessor :groupsActive
|
20
|
+
# @return [String]
|
21
|
+
attr_accessor :groupsDivider
|
22
|
+
# @return [Array<ProfileAppointmentType>]
|
23
|
+
attr_accessor :items
|
24
|
+
# @return [Boolean]
|
25
|
+
attr_accessor :randomizable
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module YouCanBookMe
|
4
|
+
# YouCanBookMe's ProfileCalendar model.
|
5
|
+
class ProfileCalendar
|
6
|
+
include ModelUtils
|
7
|
+
|
8
|
+
# @return [String]
|
9
|
+
attr_accessor :id
|
10
|
+
# @return [String]
|
11
|
+
attr_accessor :timeZone
|
12
|
+
# @return [String]
|
13
|
+
attr_accessor :title
|
14
|
+
# @return [String]
|
15
|
+
attr_accessor :url
|
16
|
+
# @return [String]
|
17
|
+
attr_accessor :userName
|
18
|
+
# @return [Boolean]
|
19
|
+
attr_accessor :writeable
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module YouCanBookMe
|
4
|
+
# YouCanBookMe's ProfileCalendars model.
|
5
|
+
class ProfileCalendars
|
6
|
+
include ModelUtils
|
7
|
+
|
8
|
+
ASSOCIATION = {
|
9
|
+
targetCalendar: ProfileCalendar
|
10
|
+
}.freeze
|
11
|
+
|
12
|
+
# @return [Array<String>]
|
13
|
+
attr_accessor :calendarIds
|
14
|
+
# @return [YouCanBookMe::ProfileCalendar]
|
15
|
+
attr_accessor :targetCalendar
|
16
|
+
# @return [String]
|
17
|
+
attr_accessor :targetCalendarId
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module YouCanBookMe
|
4
|
+
# YouCanBookMe's ProfileCancelOrReschedule model.
|
5
|
+
class ProfileCancelOrReschedule
|
6
|
+
include ModelUtils
|
7
|
+
|
8
|
+
# @return [Boolean]
|
9
|
+
attr_accessor :allowed
|
10
|
+
# @return [String]
|
11
|
+
attr_accessor :cancellationInstructions
|
12
|
+
# @return [String]
|
13
|
+
attr_accessor :limitMessage
|
14
|
+
# @return [Integer]
|
15
|
+
attr_accessor :limitMinutes
|
16
|
+
# @return [Boolean]
|
17
|
+
attr_accessor :reasonRequired
|
18
|
+
# @return [Boolean]
|
19
|
+
attr_accessor :showReasonTextBox
|
20
|
+
end
|
21
|
+
end
|