kenpo_api 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.dockerignore +4 -0
- data/.ruby-version +1 -0
- data/.travis.yml +1 -1
- data/README.md +94 -6
- data/docker-compose.yml +10 -0
- data/docker/ruby/Dockerfile +16 -0
- data/kenpo_api.gemspec +6 -4
- data/lib/kenpo_api/client.rb +11 -6
- data/lib/kenpo_api/resort.rb +147 -26
- data/lib/kenpo_api/service_category.rb +1 -0
- data/lib/kenpo_api/version.rb +1 -1
- metadata +25 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 56f484d8e49df945bc18578d6128d2946ed24d23
|
4
|
+
data.tar.gz: 542ca13d65a0016f15ba443923765c1204e3f934
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a154c2cbe55dca226388bfbf8c1a68aefe8c69897e93b4f3bf881aa4f672357fa7e8afd1fb69141f276d292154b956df6ec59d3de9afb3cf24dfab9a23c5e8ae
|
7
|
+
data.tar.gz: 44fd1c0fcf38ae5d144744c9c8a5ddf4a6130338449379973e926c117c4add0aab87692301e6d1caf8c0f6de72863e6b9fecc195202202067b031bf84d8c061a
|
data/.dockerignore
ADDED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.4.2
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -24,12 +24,21 @@ Or install it yourself as:
|
|
24
24
|
|
25
25
|
## Usage
|
26
26
|
|
27
|
+
*PLEASE DO NOT ABUSE THE RESERVATION!!*
|
28
|
+
|
29
|
+
### Resort reservation by lottery
|
30
|
+
|
27
31
|
```ruby
|
28
|
-
#
|
32
|
+
# Request email.
|
29
33
|
resort_names = KenpoApi::Resort.resort_names
|
30
34
|
KenpoApi::Resort.request_reservation_url(resort_name: 'トスラブ箱根和奏林', email: 'matsuno_osomatsu@example.com')
|
35
|
+
|
36
|
+
# Check email and copy the url in the email.
|
31
37
|
url = 'https://as.its-kenpo.or.jp/apply/new?c=aaaaaaaa-bbbb-cccc-dddd-012345678901'
|
32
|
-
|
38
|
+
# Check criteria.
|
39
|
+
criteria = KenpoApi::Resort.check_reservation_criteria(url, type: :lottery)
|
40
|
+
|
41
|
+
# Apply for the reservation by lottery.
|
33
42
|
reservation_data = {
|
34
43
|
sign_no: 6666,
|
35
44
|
insured_no: 666,
|
@@ -44,20 +53,72 @@ reservation_data = {
|
|
44
53
|
postal_code: '180-0004',
|
45
54
|
state: 13,
|
46
55
|
address: '武蔵野市本町666-666',
|
47
|
-
join_time: '
|
56
|
+
join_time: '2018-02-15',
|
48
57
|
night_count: 1,
|
49
58
|
stay_persons: 6,
|
50
59
|
room_persons: 6, (1 room) # or [3, 3] (2 rooms) or [2, 2, 2] (3 rooms) ...
|
51
60
|
meeting_dates: nil, # (none) or [1] (first day only) or [1, 2] (both days) ...
|
52
61
|
must_meeting: false,
|
53
62
|
}
|
54
|
-
KenpoApi::Resort.apply_reservation(url, reservation_data)
|
63
|
+
KenpoApi::Resort.apply_reservation(url, reservation_data, type: :lottery)
|
64
|
+
```
|
65
|
+
|
66
|
+
### Resort reservation for vacant rooms
|
67
|
+
|
68
|
+
```ruby
|
69
|
+
# Check criteria.
|
70
|
+
resort_name = 'トスラブ箱根和奏林'
|
71
|
+
KenpoApi::Resort.check_vacant_search_criteria(resort_name: resort_name)
|
72
|
+
|
73
|
+
# Search vacant rooms.
|
74
|
+
search_condition = {
|
75
|
+
join_time: '2018-02-27',
|
76
|
+
night_count: 1,
|
77
|
+
stay_persons: 6,
|
78
|
+
room_persons: 6, # (1 room) or [3, 3] (2 rooms) or [2, 2, 2] (3 rooms) ...
|
79
|
+
}
|
80
|
+
KenpoApi::Resort.search_vacant_rooms(resort_name: resort_name, search_condition: search_condition)
|
81
|
+
|
82
|
+
# Request email.
|
83
|
+
res = KenpoApi::Resort.request_reservation_url_for_vacant_rooms(resort_name: resort_name, search_condition: search_condition, vacant_room_id: 525968, email: 'matsuno_osomatsu@example.com')
|
84
|
+
|
85
|
+
# Check email and copy the url in the email.
|
86
|
+
url = 'https://as.its-kenpo.or.jp/apply/new?c=aaaaaaaa-bbbb-cccc-dddd-234567890123'
|
87
|
+
# Check criteria.
|
88
|
+
KenpoApi::Resort.check_reservation_criteria(url, type: :vacant)
|
89
|
+
|
90
|
+
# Apply for the reservation by lottery.
|
91
|
+
reservation_data = {
|
92
|
+
sign_no: 6666,
|
93
|
+
insured_no: 666,
|
94
|
+
office_name: '株式会社FLAG',
|
95
|
+
kana_name: 'マツノ オソマツ',
|
96
|
+
birth_year: 1962,
|
97
|
+
birth_month: 5,
|
98
|
+
birth_day: 24,
|
99
|
+
gender: :man,
|
100
|
+
relationship: :myself,
|
101
|
+
contact_phone: '666-6666-6666',
|
102
|
+
postal_code: '180-0004',
|
103
|
+
state: 13,
|
104
|
+
address: '武蔵野市本町666-666',
|
105
|
+
}
|
106
|
+
KenpoApi::Resort.apply_reservation(url, reservation_data, type: :vacant)
|
107
|
+
```
|
108
|
+
|
109
|
+
### Sport reservation by lottery
|
55
110
|
|
56
|
-
|
111
|
+
```ruby
|
112
|
+
# Request email.
|
57
113
|
sport_names = KenpoApi::Sport.sport_names
|
58
114
|
KenpoApi::Sport.request_reservation_url(sport_name: 'サマディ門前仲町', email: 'matsuno_osomatsu@example.com')
|
115
|
+
|
116
|
+
# Check email and copy the url in the email.
|
59
117
|
url = 'https://as.its-kenpo.or.jp/apply/new?c=aaaaaaaa-bbbb-cccc-dddd-901234567890'
|
118
|
+
# Check criteria.
|
60
119
|
criteria = KenpoApi::Sport.check_reservation_criteria(url)
|
120
|
+
|
121
|
+
# Apply for the reservation by lottery.
|
61
122
|
reservation_data = {
|
62
123
|
sign_no: 6666,
|
63
124
|
insured_no: 666,
|
@@ -70,19 +131,46 @@ reservation_data = {
|
|
70
131
|
postal_code: '180-0004',
|
71
132
|
state: 13,
|
72
133
|
address: '武蔵野市本町666-666',
|
73
|
-
join_time: '
|
134
|
+
join_time: '2018-03-11',
|
74
135
|
use_time_from: '13:00',
|
75
136
|
use_time_to: '15:00',
|
76
137
|
}
|
77
138
|
KenpoApi::Sport.apply_reservation(url, reservation_data)
|
78
139
|
```
|
79
140
|
|
141
|
+
### Low-level APIs
|
142
|
+
|
143
|
+
```ruby
|
144
|
+
categories = KenpoApi::ServiceCategory.list
|
145
|
+
|
146
|
+
category = KenpoApi::ServiceCategory.find(:resort_reserve)
|
147
|
+
category.available?
|
148
|
+
category.service_groups
|
149
|
+
|
150
|
+
group = KenpoApi::ServiceGroup.find(category, 'トスラブ箱根ビオーレ')
|
151
|
+
group.available?
|
152
|
+
group.services
|
153
|
+
```
|
154
|
+
|
155
|
+
|
80
156
|
## Development
|
81
157
|
|
82
158
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
83
159
|
|
84
160
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
85
161
|
|
162
|
+
### Use Docker env
|
163
|
+
|
164
|
+
```sh
|
165
|
+
$ docker-compose up -d
|
166
|
+
$ docker-compose exec ruby sh
|
167
|
+
|
168
|
+
# # Start interactive console.
|
169
|
+
# pry --gem
|
170
|
+
# # Execute tests.
|
171
|
+
# rake spec
|
172
|
+
```
|
173
|
+
|
86
174
|
## Contributing
|
87
175
|
|
88
176
|
Bug reports and pull requests are welcome on GitHub at https://github.com/tearoom6/kenpo_api.
|
data/docker-compose.yml
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
FROM ruby:2.4.2-alpine3.6
|
2
|
+
|
3
|
+
ENV LANG=ja_JP.UTF-8\
|
4
|
+
APP_ROOT=/kenpo_api
|
5
|
+
|
6
|
+
RUN apk update && \
|
7
|
+
apk upgrade && \
|
8
|
+
apk add --update --no-cache --virtual build-dependencies build-base && \
|
9
|
+
apk add --update --no-cache tzdata git less && \
|
10
|
+
mkdir -p $APP_ROOT
|
11
|
+
|
12
|
+
WORKDIR $APP_ROOT
|
13
|
+
COPY . $APP_ROOT
|
14
|
+
|
15
|
+
RUN bundle install --jobs=4 && \
|
16
|
+
apk del build-dependencies
|
data/kenpo_api.gemspec
CHANGED
@@ -32,8 +32,10 @@ Gem::Specification.new do |spec|
|
|
32
32
|
spec.add_development_dependency 'bundler', '~> 1'
|
33
33
|
spec.add_development_dependency 'rake', '~> 10'
|
34
34
|
spec.add_development_dependency 'rspec', '~> 3'
|
35
|
-
spec.add_development_dependency '
|
36
|
-
|
37
|
-
spec.
|
38
|
-
spec.
|
35
|
+
spec.add_development_dependency 'pry', '~> 0.11.3'
|
36
|
+
|
37
|
+
spec.add_dependency 'faraday', '~> 0.10'
|
38
|
+
spec.add_dependency 'cookiejar', '~> 0.3'
|
39
|
+
spec.add_dependency 'nokogiri', '~> 1'
|
40
|
+
spec.add_dependency 'dry-validation', '~> 0.10'
|
39
41
|
end
|
data/lib/kenpo_api/client.rb
CHANGED
@@ -22,16 +22,21 @@ module KenpoApi
|
|
22
22
|
@cookiejar = CookieJar::Jar.new
|
23
23
|
end
|
24
24
|
|
25
|
-
def access(path:, method: :get, params: {})
|
25
|
+
def access(path:, method: :get, params: {}, headers: {}, redirect_limit: 0)
|
26
26
|
response = @conn.send(method, path, params) do |req|
|
27
27
|
req.options.timeout = @timeout
|
28
28
|
req.options.open_timeout = @open_timeout
|
29
|
+
req.headers = headers
|
29
30
|
req.headers['cookie'] = @cookiejar.get_cookie_header(@conn.url_prefix.to_s)
|
30
31
|
end
|
31
|
-
raise NetworkError.new("Failed to fetch http content. path: #{path} status_code: #{response.status}") unless response.
|
32
|
+
raise NetworkError.new("Failed to fetch http content. path: #{path} status_code: #{response.status}") unless (200...400).include?(response.status)
|
32
33
|
|
33
34
|
@cookiejar.set_cookie(@conn.url_prefix.to_s, response.headers['set-cookie']) if response.headers.has_key?('set-cookie')
|
34
35
|
|
36
|
+
if (redirect_limit > 0) && (location = response['location'])
|
37
|
+
response = self.access(path: location, method: method, params: params, headers: headers, redirect_limit: redirect_limit - 1)
|
38
|
+
end
|
39
|
+
|
35
40
|
return (yield response) if block_given?
|
36
41
|
response
|
37
42
|
rescue KenpoApiError => e
|
@@ -40,16 +45,16 @@ module KenpoApi
|
|
40
45
|
raise NetworkError.new("Failed to fetch http content. path: #{path} original_error: #{e.message}")
|
41
46
|
end
|
42
47
|
|
43
|
-
def fetch_document(path:, method: :get, params: {})
|
44
|
-
response = access(path: path, method: method, params: params)
|
48
|
+
def fetch_document(path:, method: :get, params: {}, headers: {})
|
49
|
+
response = access(path: path, method: method, params: params, headers: headers)
|
45
50
|
document = Nokogiri::HTML(response.body)
|
46
51
|
|
47
52
|
return (yield document) if block_given?
|
48
53
|
document
|
49
54
|
end
|
50
55
|
|
51
|
-
def parse_single_form_page(path:, method: :get, params: {})
|
52
|
-
document = fetch_document(path: path, method: method, params: params)
|
56
|
+
def parse_single_form_page(path:, method: :get, params: {}, headers: {})
|
57
|
+
document = fetch_document(path: path, method: method, params: params, headers: headers)
|
53
58
|
form_element = document.xpath('//form').first
|
54
59
|
|
55
60
|
next_page_info = nil
|
data/lib/kenpo_api/resort.rb
CHANGED
@@ -15,22 +15,85 @@ module KenpoApi
|
|
15
15
|
request_application_url(service_path: service.path, email: email)
|
16
16
|
end
|
17
17
|
|
18
|
-
def self.check_reservation_criteria(application_url)
|
18
|
+
def self.check_reservation_criteria(application_url, type: :lottery)
|
19
19
|
html_document = Client.instance.fetch_document(path: application_url)
|
20
20
|
raise NotAvailableError.new("Application URL is invalid: #{html_document.xpath('//p').first.content}") if html_document.xpath('//form').first.nil?
|
21
|
-
reservation_criteria(html_document)
|
21
|
+
reservation_criteria(html_document, type: type)
|
22
22
|
end
|
23
23
|
|
24
|
-
def self.apply_reservation(application_url, application_data)
|
24
|
+
def self.apply_reservation(application_url, application_data, type: :lottery)
|
25
25
|
apply(application_url: application_url) do |html_document|
|
26
|
-
reservation_data = self.validate_reservation_data(application_data, html_document)
|
27
|
-
convert_to_reservation_post_params(reservation_data)
|
26
|
+
reservation_data = self.validate_reservation_data(application_data, html_document, type: type)
|
27
|
+
convert_to_reservation_post_params(reservation_data, type: type)
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
+
def self.check_vacant_search_criteria(resort_name:)
|
32
|
+
service = find_service(category_code: :resort_search_vacant, group_name: resort_name)
|
33
|
+
html_document = Client.instance.fetch_document(path: service.path)
|
34
|
+
raise NotAvailableError.new("Application URL is invalid: #{html_document.xpath('//p').first.content}") if html_document.xpath('//form').first.nil?
|
35
|
+
vacant_search_criteria(html_document)
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.search_vacant_rooms(resort_name:, search_condition:)
|
39
|
+
vacant_rooms_info = prepare_for_vacant_rooms_reservation(resort_name, search_condition)
|
40
|
+
vacant_rooms_info[:vacant_rooms]
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.request_reservation_url_for_vacant_rooms(resort_name:, search_condition:, vacant_room_id:, email:)
|
44
|
+
vacant_rooms_info = prepare_for_vacant_rooms_reservation(resort_name, search_condition)
|
45
|
+
params = vacant_rooms_info[:params].merge({"apply[coma[#{vacant_room_id}]]" => vacant_room_id})
|
46
|
+
response = Client.instance.access(path: vacant_rooms_info[:path], method: vacant_rooms_info[:method], params: params)
|
47
|
+
if response.status == 200
|
48
|
+
document = Nokogiri::HTML(response.body)
|
49
|
+
raise NotAvailableError.new("Application URL is invalid: #{document.xpath('id("errorExplanation")').first.content}")
|
50
|
+
end
|
51
|
+
request_application_url(service_path: response.headers['location'], email: email)
|
52
|
+
end
|
53
|
+
|
31
54
|
private
|
32
55
|
|
33
|
-
def self.
|
56
|
+
def self.prepare_for_vacant_rooms_reservation(resort_name, search_condition)
|
57
|
+
service = find_service(category_code: :resort_search_vacant, group_name: resort_name)
|
58
|
+
next_page_info, html_document = Client.instance.parse_single_form_page(path: service.path)
|
59
|
+
raise NotAvailableError.new("Application URL is invalid: #{html_document.xpath('//p').first.content}") if next_page_info.nil?
|
60
|
+
|
61
|
+
# Call Ajax API to search vacant rooms.
|
62
|
+
search_condition = self.validate_vacant_search_condition(search_condition, html_document)
|
63
|
+
params = convert_to_vacant_search_post_params(search_condition)
|
64
|
+
params = params.merge(next_page_info[:params])
|
65
|
+
query_params = URI::parse(next_page_info[:path]).query
|
66
|
+
headers = {'X-Requested-With' => 'XMLHttpRequest'}
|
67
|
+
ajax_response = Client.instance.access(path: "/apply/empty_new?#{query_params}", method: :post, params: params, headers: headers)
|
68
|
+
|
69
|
+
# Parse Ajax response.
|
70
|
+
matched = /\<\\\/script\>(.+)\"\)\;/.match(ajax_response.body)
|
71
|
+
ajax_document = Nokogiri::HTML(matched[1].gsub(/\\n/, '').gsub(/\s{2,}/, '').gsub(/\\/, ''))
|
72
|
+
ids = ajax_document.xpath('id("coma_search_result")/tr/td/input/@value').map {|attr| attr.value }
|
73
|
+
|
74
|
+
vacant_rooms = ajax_document.xpath('id("coma_search_result")/tr').map.with_index do |elem, index|
|
75
|
+
values = elem.xpath('td/text()').map {|text| text.content }
|
76
|
+
{
|
77
|
+
id: ids[index],
|
78
|
+
room_number: values[0],
|
79
|
+
join_time: values[1],
|
80
|
+
room_type: values[2],
|
81
|
+
room_persons: values[3],
|
82
|
+
room_status: values[4],
|
83
|
+
}
|
84
|
+
end
|
85
|
+
|
86
|
+
additional_params = ajax_document.xpath('//input[@type="hidden"]').select {|input| ! input['name'].nil?}.map {|input| [input['name'], input['value']]}.to_h
|
87
|
+
params = params.merge(additional_params)
|
88
|
+
{
|
89
|
+
path: next_page_info[:path],
|
90
|
+
method: next_page_info[:method],
|
91
|
+
params: params,
|
92
|
+
vacant_rooms: vacant_rooms,
|
93
|
+
}
|
94
|
+
end
|
95
|
+
|
96
|
+
def self.reservation_criteria(html_document, type: :lottery)
|
34
97
|
criteria = {}
|
35
98
|
criteria[:note] = html_document.xpath('//div[@class="note mb10"]').first.text
|
36
99
|
criteria[:service_name] = html_document.xpath('//form/div[@class="form_box"]//dd[@class="elements"]').first.text
|
@@ -40,26 +103,44 @@ module KenpoApi
|
|
40
103
|
criteria[:gender] = html_document.xpath('id("apply_gender")/*/@value') .map {|attr| attr.value }.map {|val| val.to_sym } # [:man, :woman]
|
41
104
|
criteria[:relationship] = html_document.xpath('id("apply_relationship")/*/@value').map {|attr| attr.value }.map {|val| val.to_sym } # [:myself, :family]
|
42
105
|
criteria[:state] = html_document.xpath('id("apply_state")/*/@value') .map {|attr| attr.value }.select {|val| val != '' } # (1..47)
|
106
|
+
if type == :lottery
|
107
|
+
criteria[:join_time] = html_document.xpath('id("apply_join_time")/*/@value') .map {|attr| attr.value }.select {|val| val != '' } # ['2017-04-01', .., '2017-04-30']
|
108
|
+
criteria[:night_count] = html_document.xpath('id("apply_night_count")/*/@value') .map {|attr| attr.value }.select {|val| val != '' } # (1..2)
|
109
|
+
criteria[:room_count] = html_document.xpath('id("house_select")/*/@value') .map {|attr| attr.value.to_i } # (1..10)
|
110
|
+
end
|
111
|
+
criteria
|
112
|
+
end
|
113
|
+
|
114
|
+
def self.vacant_search_criteria(html_document)
|
115
|
+
criteria = {}
|
43
116
|
criteria[:join_time] = html_document.xpath('id("apply_join_time")/*/@value') .map {|attr| attr.value }.select {|val| val != '' } # ['2017-04-01', .., '2017-04-30']
|
44
117
|
criteria[:night_count] = html_document.xpath('id("apply_night_count")/*/@value') .map {|attr| attr.value }.select {|val| val != '' } # (1..2)
|
45
|
-
criteria[:
|
118
|
+
criteria[:room_count] = html_document.xpath('id("house_select")/*/@value') .map {|attr| attr.value.to_i } # (1..10)
|
46
119
|
criteria
|
47
120
|
end
|
48
121
|
|
49
|
-
def self.preprocess_reservation_data(reservation_data)
|
122
|
+
def self.preprocess_reservation_data(reservation_data, type: :lottery)
|
50
123
|
reservation_data[:birth_year] = reservation_data[:birth_year].to_s
|
51
124
|
reservation_data[:birth_month] = reservation_data[:birth_month].to_s
|
52
125
|
reservation_data[:birth_day] = reservation_data[:birth_day].to_s
|
53
126
|
reservation_data[:state] = reservation_data[:state].to_s
|
54
|
-
|
55
|
-
|
56
|
-
|
127
|
+
if type == :lottery
|
128
|
+
reservation_data[:night_count] = reservation_data[:night_count].to_s
|
129
|
+
reservation_data[:room_persons] = Array(reservation_data[:room_persons])
|
130
|
+
reservation_data[:meeting_dates] = Array(reservation_data[:meeting_dates])
|
131
|
+
end
|
57
132
|
reservation_data
|
58
133
|
end
|
59
134
|
|
60
|
-
def self.
|
61
|
-
|
62
|
-
|
135
|
+
def self.preprocess_vacant_search_condition(search_condition)
|
136
|
+
search_condition[:night_count] = search_condition[:night_count].to_s
|
137
|
+
search_condition[:room_persons] = Array(search_condition[:room_persons])
|
138
|
+
search_condition
|
139
|
+
end
|
140
|
+
|
141
|
+
def self.validate_reservation_data(reservation_data, html_document, type: :lottery)
|
142
|
+
reservation_data = preprocess_reservation_data(reservation_data, type: type)
|
143
|
+
criteria = reservation_criteria(html_document, type: type)
|
63
144
|
|
64
145
|
schema = Dry::Validation.Schema do
|
65
146
|
required(:sign_no) .filled(:int?)
|
@@ -75,21 +156,40 @@ module KenpoApi
|
|
75
156
|
required(:postal_code) .filled(format?: /^[0-9]{3}-[0-9]{4}$/)
|
76
157
|
required(:state) .filled(included_in?: criteria[:state])
|
77
158
|
required(:address) .filled(:str?)
|
159
|
+
if type == :lottery
|
160
|
+
required(:join_time) .filled(included_in?: criteria[:join_time])
|
161
|
+
required(:night_count) .filled(included_in?: criteria[:night_count])
|
162
|
+
required(:stay_persons) .filled(:int?)
|
163
|
+
required(:room_persons) .filled{ array? & each(:int?) & size?(criteria[:room_count]) }
|
164
|
+
required(:meeting_dates).value{ array? & each{ int? & included_in?([1,2,3]) } & size?((0..3)) }
|
165
|
+
required(:must_meeting) .maybe(:bool?)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
result = schema.call(reservation_data)
|
170
|
+
raise ValidationError.new("Reservation data is invalid. #{result.messages.to_s}") if result.failure?
|
171
|
+
raise ValidationError.new('Stay persons count should match the sum of room persons') unless reservation_data[:stay_persons] == reservation_data[:room_persons].inject(:+)
|
172
|
+
result.output
|
173
|
+
end
|
174
|
+
|
175
|
+
def self.validate_vacant_search_condition(search_condition, html_document)
|
176
|
+
search_condition = preprocess_vacant_search_condition(search_condition)
|
177
|
+
criteria = vacant_search_criteria(html_document)
|
178
|
+
|
179
|
+
schema = Dry::Validation.Schema do
|
78
180
|
required(:join_time) .filled(included_in?: criteria[:join_time])
|
79
181
|
required(:night_count) .filled(included_in?: criteria[:night_count])
|
80
182
|
required(:stay_persons) .filled(:int?)
|
81
|
-
required(:room_persons) .filled{ array? & each(:int?) & size?(criteria[:
|
82
|
-
required(:meeting_dates).value{ array? & each{ int? & included_in?([1,2,3]) } & size?((0..3)) }
|
83
|
-
required(:must_meeting) .maybe(:bool?)
|
183
|
+
required(:room_persons) .filled{ array? & each(:int?) & size?(criteria[:room_count]) }
|
84
184
|
end
|
85
185
|
|
86
|
-
result = schema.call(
|
87
|
-
raise ValidationError.new("
|
88
|
-
|
186
|
+
result = schema.call(search_condition)
|
187
|
+
raise ValidationError.new("Search condition is invalid. #{result.messages.to_s}") if result.failure?
|
188
|
+
raise ValidationError.new('Stay persons count should match the sum of room persons') unless search_condition[:stay_persons] == search_condition[:room_persons].inject(:+)
|
89
189
|
result.output
|
90
190
|
end
|
91
191
|
|
92
|
-
def self.convert_to_reservation_post_params(original_data)
|
192
|
+
def self.convert_to_reservation_post_params(original_data, type: :lottery)
|
93
193
|
post_params = {}
|
94
194
|
post_params['apply[sign_no]'] = original_data[:sign_no]
|
95
195
|
post_params['apply[insured_no]'] = original_data[:insured_no]
|
@@ -104,6 +204,32 @@ module KenpoApi
|
|
104
204
|
post_params['apply[postal]'] = original_data[:postal_code]
|
105
205
|
post_params['apply[state]'] = original_data[:state]
|
106
206
|
post_params['apply[address]'] = original_data[:address]
|
207
|
+
if type == :lottery
|
208
|
+
post_params['apply[join_time]'] = original_data[:join_time]
|
209
|
+
post_params['apply[night_count]'] = original_data[:night_count]
|
210
|
+
post_params['apply[stay_persons]'] = original_data[:stay_persons]
|
211
|
+
post_params['apply[hope_rooms]'] = original_data[:room_persons].size()
|
212
|
+
post_params['apply[hope_room1]'] = original_data[:room_persons][0]
|
213
|
+
post_params['apply[hope_room2]'] = original_data[:room_persons][1] || ''
|
214
|
+
post_params['apply[hope_room3]'] = original_data[:room_persons][2] || ''
|
215
|
+
post_params['apply[hope_room4]'] = original_data[:room_persons][3] || ''
|
216
|
+
post_params['apply[hope_room5]'] = original_data[:room_persons][4] || ''
|
217
|
+
post_params['apply[hope_room6]'] = original_data[:room_persons][5] || ''
|
218
|
+
post_params['apply[hope_room7]'] = original_data[:room_persons][6] || ''
|
219
|
+
post_params['apply[hope_room8]'] = original_data[:room_persons][7] || ''
|
220
|
+
post_params['apply[hope_room9]'] = original_data[:room_persons][8] || ''
|
221
|
+
post_params['apply[hope_room10]'] = original_data[:room_persons][9] || ''
|
222
|
+
post_params['apply[use_meeting_flag]'] = original_data[:meeting_dates].any? ? 'use' : 'no_use'
|
223
|
+
post_params['apply[use_meeting1]'] = original_data[:meeting_dates].include?(1) ? '1' : '0'
|
224
|
+
post_params['apply[use_meeting2]'] = original_data[:meeting_dates].include?(2) ? '1' : '0'
|
225
|
+
post_params['apply[use_meeting3]'] = (original_data[:meeting_dates].include?(3) && original_data[:night_count] >= 2) ? '1' : '0'
|
226
|
+
post_params['apply[must_meeting]'] = original_data[:must_meeting] ? 'must' : 'not_must'
|
227
|
+
end
|
228
|
+
post_params
|
229
|
+
end
|
230
|
+
|
231
|
+
def self.convert_to_vacant_search_post_params(original_data)
|
232
|
+
post_params = {}
|
107
233
|
post_params['apply[join_time]'] = original_data[:join_time]
|
108
234
|
post_params['apply[night_count]'] = original_data[:night_count]
|
109
235
|
post_params['apply[stay_persons]'] = original_data[:stay_persons]
|
@@ -118,11 +244,6 @@ module KenpoApi
|
|
118
244
|
post_params['apply[hope_room8]'] = original_data[:room_persons][7] || ''
|
119
245
|
post_params['apply[hope_room9]'] = original_data[:room_persons][8] || ''
|
120
246
|
post_params['apply[hope_room10]'] = original_data[:room_persons][9] || ''
|
121
|
-
post_params['apply[use_meeting_flag]'] = original_data[:meeting_dates].any? ? 'use' : 'no_use'
|
122
|
-
post_params['apply[use_meeting1]'] = original_data[:meeting_dates].include?(1) ? '1' : '0'
|
123
|
-
post_params['apply[use_meeting2]'] = original_data[:meeting_dates].include?(2) ? '1' : '0'
|
124
|
-
post_params['apply[use_meeting3]'] = (original_data[:meeting_dates].include?(3) && original_data[:night_count] >= 2) ? '1' : '0'
|
125
|
-
post_params['apply[must_meeting]'] = original_data[:must_meeting] ? 'must' : 'not_must'
|
126
247
|
post_params
|
127
248
|
end
|
128
249
|
|
data/lib/kenpo_api/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kenpo_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- tearoom6
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-12-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '3'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.11.3
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.11.3
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: faraday
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -59,7 +73,7 @@ dependencies:
|
|
59
73
|
- - "~>"
|
60
74
|
- !ruby/object:Gem::Version
|
61
75
|
version: '0.10'
|
62
|
-
type: :
|
76
|
+
type: :runtime
|
63
77
|
prerelease: false
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
65
79
|
requirements:
|
@@ -73,7 +87,7 @@ dependencies:
|
|
73
87
|
- - "~>"
|
74
88
|
- !ruby/object:Gem::Version
|
75
89
|
version: '0.3'
|
76
|
-
type: :
|
90
|
+
type: :runtime
|
77
91
|
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
@@ -87,7 +101,7 @@ dependencies:
|
|
87
101
|
- - "~>"
|
88
102
|
- !ruby/object:Gem::Version
|
89
103
|
version: '1'
|
90
|
-
type: :
|
104
|
+
type: :runtime
|
91
105
|
prerelease: false
|
92
106
|
version_requirements: !ruby/object:Gem::Requirement
|
93
107
|
requirements:
|
@@ -101,7 +115,7 @@ dependencies:
|
|
101
115
|
- - "~>"
|
102
116
|
- !ruby/object:Gem::Version
|
103
117
|
version: '0.10'
|
104
|
-
type: :
|
118
|
+
type: :runtime
|
105
119
|
prerelease: false
|
106
120
|
version_requirements: !ruby/object:Gem::Requirement
|
107
121
|
requirements:
|
@@ -115,8 +129,10 @@ executables: []
|
|
115
129
|
extensions: []
|
116
130
|
extra_rdoc_files: []
|
117
131
|
files:
|
132
|
+
- ".dockerignore"
|
118
133
|
- ".gitignore"
|
119
134
|
- ".rspec"
|
135
|
+
- ".ruby-version"
|
120
136
|
- ".travis.yml"
|
121
137
|
- Gemfile
|
122
138
|
- LICENSE
|
@@ -124,6 +140,8 @@ files:
|
|
124
140
|
- Rakefile
|
125
141
|
- bin/console
|
126
142
|
- bin/setup
|
143
|
+
- docker-compose.yml
|
144
|
+
- docker/ruby/Dockerfile
|
127
145
|
- kenpo_api.gemspec
|
128
146
|
- lib/kenpo_api.rb
|
129
147
|
- lib/kenpo_api/client.rb
|
@@ -153,7 +171,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
153
171
|
version: '0'
|
154
172
|
requirements: []
|
155
173
|
rubyforge_project:
|
156
|
-
rubygems_version: 2.
|
174
|
+
rubygems_version: 2.6.13
|
157
175
|
signing_key:
|
158
176
|
specification_version: 4
|
159
177
|
summary: Unofficial API for ITS kenpo reservation system.
|