safen 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.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/README.md +109 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/safen.rb +127 -0
- data/lib/safen/body.rb +53 -0
- data/lib/safen/error.rb +9 -0
- data/lib/safen/header.rb +32 -0
- data/lib/safen/version.rb +3 -0
- data/safen.gemspec +26 -0
- metadata +99 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 17a10cc0c9cfacaa50984aa85ca92507361975d1
|
4
|
+
data.tar.gz: faf894f100c853dbd9a72c32b7364fcbe7756f0b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 188d2c54068b41b1a0d120b78c24db0e697e161b2893c43462294ca16d441a0cdb4c31d7a93de8619adbd70ba41815be5f31f40d8ceebc78eb1851ffab45f5c9
|
7
|
+
data.tar.gz: aa9e2d62f739dcea36baee8114c34c041327ad7e19a9914430995e271af3275caa844688b842c8165150dea2864791b2d8f616d79d8001290ce330f75b4beeb7
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
# Safen
|
2
|
+
|
3
|
+
SKT Safen 연동 API
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'safen'
|
11
|
+
```
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install safen
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
### 매핑 요청
|
24
|
+
|
25
|
+
```
|
26
|
+
Safen.new('xxxx', ['xxx.xxx.xxx.xxx:xxxx']).create old_tel_num, group_code
|
27
|
+
```
|
28
|
+
|
29
|
+
**params**
|
30
|
+
|
31
|
+
- `old_tel_num`: 실제 사용중인 착신번호
|
32
|
+
- `group_code`: 그룹코드
|
33
|
+
|
34
|
+
**ret**
|
35
|
+
|
36
|
+
연동 성공시 연동된 0504 전화번호, 실패시 결과 코드표 참고
|
37
|
+
|
38
|
+
### 수정 요청
|
39
|
+
|
40
|
+
```
|
41
|
+
Safen.new('xxxx', ['xxx.xxx.xxx.xxx:xxxx']).update old_tel_num, group_code, new_tel_num
|
42
|
+
```
|
43
|
+
|
44
|
+
**params**
|
45
|
+
|
46
|
+
- `old_tel_num`: 실제 사용중인 착신번호
|
47
|
+
- `group_code`: 그룹코드
|
48
|
+
- `new_tel_num`: 맵핑할 번호
|
49
|
+
|
50
|
+
**ret**
|
51
|
+
|
52
|
+
연동 성공시 0000, 실패시 결과 코드표 참고
|
53
|
+
|
54
|
+
### 취소 요청
|
55
|
+
|
56
|
+
```
|
57
|
+
Safen.new('xxxx', ['xxx.xxx.xxx.xxx:xxxx']).remove new_tel_num, group_code
|
58
|
+
```
|
59
|
+
|
60
|
+
**params**
|
61
|
+
|
62
|
+
- `new_tel_num`: 0504 연동 번호
|
63
|
+
- `group_code`: 그룹코드
|
64
|
+
|
65
|
+
**ret**
|
66
|
+
|
67
|
+
연동 성공시 0000, 실패시 결과 코드표 참고
|
68
|
+
|
69
|
+
### 매핑 조회
|
70
|
+
|
71
|
+
```
|
72
|
+
Safen.new('xxxx', ['xxx.xxx.xxx.xxx:xxxx']).show new_tel_num, group_code
|
73
|
+
```
|
74
|
+
|
75
|
+
**params**
|
76
|
+
|
77
|
+
- `corp_code`: 업체코드
|
78
|
+
- `new_tel_num`: 0504 연동 번호
|
79
|
+
|
80
|
+
**ret**
|
81
|
+
|
82
|
+
연동 성공시 연동된 착신번호, 해지된 안심번호 조회 요청시 E401
|
83
|
+
|
84
|
+
### 결과 코드표
|
85
|
+
|
86
|
+
| 코드 | 확인 | 설명 |
|
87
|
+
|---|---|---|
|
88
|
+
| 0000 | 성공 처리 | 인증서버에서 요청 처리가 성공. |
|
89
|
+
| E101 | Network 장애 | 인증서버와 연결 실패. |
|
90
|
+
| E102 | System 장애. | 인증서버의 일시적 장애. 재시도 요망. |
|
91
|
+
| E201 | 제휴사 인증 실패. | 유효한 제휴사 코드가 아님. |
|
92
|
+
| E202 | 유효 기간 만료. | 제휴사와의 계약기간 만료. |
|
93
|
+
| E203 | 부가서비스 인증 실패 | 제휴사의 부가서비스 인증 실패. |
|
94
|
+
| E301 | 안심 번호 소진. | 유효한 안심번호 자원이 없슴. |
|
95
|
+
| E401 | Data Not Found | 요청한 Data와 일치하는 Data가 없슴. |
|
96
|
+
| E402 | Data Overlap | 요청한 Data가 이미 존재함. |
|
97
|
+
| E501 | 전문 오류 | 전문 공통부 혹은 본문의 Data가 비정상일 경우. |
|
98
|
+
| E502 | 전화 번호 오류 | 요청한 착신번호가 맵핑불가 번호일 경우 |
|
99
|
+
| E503 | 금칙어 오류 | 요청한 알림 내용이 금칙어를 포함한 경우 |
|
100
|
+
|
101
|
+
## Development
|
102
|
+
|
103
|
+
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.
|
104
|
+
|
105
|
+
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).
|
106
|
+
|
107
|
+
## Contributing
|
108
|
+
|
109
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/subicura/safen.
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "safen"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
data/lib/safen.rb
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'socket'
|
2
|
+
require 'safen/version'
|
3
|
+
require 'safen/header'
|
4
|
+
require 'safen/body'
|
5
|
+
require 'safen/error'
|
6
|
+
|
7
|
+
class Safen
|
8
|
+
attr_reader :api_server_entpoints, :corp_code
|
9
|
+
|
10
|
+
# 고객코드와 api server endpoint 리스트로 초기화
|
11
|
+
# @param corp_code [String] 고객코드
|
12
|
+
# @param api_server_entpoints list[String] endpoint ip:port
|
13
|
+
def initialize(corp_code, api_server_entpoints)
|
14
|
+
@corp_code = corp_code
|
15
|
+
@api_server_entpoints = api_server_entpoints
|
16
|
+
end
|
17
|
+
|
18
|
+
def call_api(header, body)
|
19
|
+
ret = {}
|
20
|
+
|
21
|
+
@api_server_entpoints.each_with_index do |endpoint, idx|
|
22
|
+
ip, port = endpoint.split(':')
|
23
|
+
|
24
|
+
begin
|
25
|
+
socket = TCPSocket.new(ip, port.to_i)
|
26
|
+
socket.puts("#{header}#{body}")
|
27
|
+
|
28
|
+
ret[:size] = socket.read(4).to_i
|
29
|
+
ret[:code] = socket.read(4)
|
30
|
+
ret[:corp_code] = socket.read(4)
|
31
|
+
|
32
|
+
ret[:data] = socket.read(ret[:size])
|
33
|
+
|
34
|
+
break # 성공시 탈출
|
35
|
+
rescue => e
|
36
|
+
if idx == @api_server_entpoints.size - 1 # last
|
37
|
+
raise e
|
38
|
+
else
|
39
|
+
next # 실패시 다음 엔드포인드 진행
|
40
|
+
end
|
41
|
+
ensure
|
42
|
+
socket.close if socket
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
if ret[:code] == '2001' # 매핑 응답
|
47
|
+
return ret[:data][20...24], ret[:data][0...20].strip
|
48
|
+
elsif ret[:code] == '2002' # 해제 응답
|
49
|
+
return ret[:data][0...4], nil
|
50
|
+
elsif ret[:code] == '2003' # 수정 응답
|
51
|
+
return ret[:data][0...4], nil
|
52
|
+
elsif ret[:code] == '2004' # 조회 응답
|
53
|
+
return ret[:data][0...4], ret[:data][4...24].strip
|
54
|
+
end
|
55
|
+
|
56
|
+
return nil, nil
|
57
|
+
end
|
58
|
+
|
59
|
+
# 매핑 요청
|
60
|
+
# @param old_tel_num [String] 실제 사용중인 착신번호
|
61
|
+
# @param group_code [String] 그룹코드
|
62
|
+
# @return [String] 매핑된 전화 번호
|
63
|
+
def create(old_tel_num, group_code)
|
64
|
+
header = Header.mapping_request(@corp_code)
|
65
|
+
body = Body.mapping_request(old_tel_num, group_code)
|
66
|
+
|
67
|
+
code, data = call_api(header, body)
|
68
|
+
|
69
|
+
if code != '0000'
|
70
|
+
raise SafenError.new(code), "Safen API call error #{code}"
|
71
|
+
end
|
72
|
+
|
73
|
+
data
|
74
|
+
end
|
75
|
+
|
76
|
+
# 수정 요청
|
77
|
+
# @param old_tel_num [String] 실제 사용중인 착신번호
|
78
|
+
# @param group_code [String] 그룹코드
|
79
|
+
# @param new_tel_num [String] 매핑할 번호
|
80
|
+
# @return [bool] 성공여부
|
81
|
+
def update(old_tel_num, group_code, new_tel_num)
|
82
|
+
header = Header.mapping_update_request(@corp_code)
|
83
|
+
body = Body.mapping_update_request(old_tel_num, new_tel_num, group_code)
|
84
|
+
|
85
|
+
code, data = call_api(header, body)
|
86
|
+
|
87
|
+
if code != '0000'
|
88
|
+
raise SafenError.new(code), "Safen API call error #{code}"
|
89
|
+
end
|
90
|
+
|
91
|
+
true
|
92
|
+
end
|
93
|
+
|
94
|
+
# 취소 요청
|
95
|
+
# @param new_tel_num [String] 매핑할 번호
|
96
|
+
# @param group_code [String] 그룹코드
|
97
|
+
# @return [bool] 성공여부
|
98
|
+
def remove(new_tel_num, group_code)
|
99
|
+
header = Header.mapping_cancel_request(@corp_code)
|
100
|
+
body = Body.mapping_cancel_request(new_tel_num, group_code)
|
101
|
+
|
102
|
+
code, data = call_api(header, body)
|
103
|
+
|
104
|
+
if code != '0000'
|
105
|
+
raise SafenError.new(code), "Safen API call error #{code}"
|
106
|
+
end
|
107
|
+
|
108
|
+
true
|
109
|
+
end
|
110
|
+
|
111
|
+
# 매핑 조회 요청
|
112
|
+
# @param new_tel_num [String] 매핑된 번호
|
113
|
+
# @param group_code [String] 그룹 코드
|
114
|
+
# @return [bool] 매핑된 전화 번호
|
115
|
+
def show(new_tel_num, group_code)
|
116
|
+
header = Header.mapping_show_request(@corp_code)
|
117
|
+
body = Body.mapping_show_request( new_tel_num, group_code)
|
118
|
+
|
119
|
+
code, data = call_api(header, body)
|
120
|
+
|
121
|
+
if code != '0000'
|
122
|
+
raise SafenError.new(code), "Safen API call error #{code}"
|
123
|
+
end
|
124
|
+
|
125
|
+
data
|
126
|
+
end
|
127
|
+
end
|
data/lib/safen/body.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
class Safen
|
2
|
+
class Body
|
3
|
+
class << self
|
4
|
+
# 전화번호 매핑
|
5
|
+
#
|
6
|
+
# 설명 offset, length
|
7
|
+
# 착신번호1 0, 20 (연동할 전화번호)
|
8
|
+
# 착신번호2 20, 20 (현재는 착신번호1과 동일하게 사용)
|
9
|
+
# 그룹코드 40, 10 (수정할 그룹코드)
|
10
|
+
# Reserved1 50, 50 (예약필드)
|
11
|
+
# Reserved2 100, 10 (예약필드)
|
12
|
+
def mapping_request(old_tel_num, group_code)
|
13
|
+
tel_num = old_tel_num.gsub(/-/, '')
|
14
|
+
"#{tel_num.ljust(20, ' ')}#{tel_num.ljust(20, ' ')}#{group_code.ljust(10, ' ')}#{' ' * 50}#{' ' * 10}"
|
15
|
+
end
|
16
|
+
|
17
|
+
# 전화번호 매핑 수정
|
18
|
+
def mapping_update_request(old_tel_num, new_tel_num, group_code)
|
19
|
+
default_old_tel_num = '1234567890'
|
20
|
+
old_tel_num_nomalize = old_tel_num.gsub(/-/, '')
|
21
|
+
new_tel_num_nomalize = new_tel_num.gsub(/-/, '')
|
22
|
+
|
23
|
+
ret = ''
|
24
|
+
ret += "#{new_tel_num_nomalize.ljust(20, ' ')}"
|
25
|
+
ret += "#{default_old_tel_num.ljust(20, ' ')}#{old_tel_num_nomalize.ljust(20, ' ')}"
|
26
|
+
ret += "#{default_old_tel_num.ljust(20, ' ')}#{old_tel_num_nomalize.ljust(20, ' ')}"
|
27
|
+
ret += "#{group_code.ljust(10, ' ')}"
|
28
|
+
ret += "#{' ' * 50}#{' ' * 10}"
|
29
|
+
|
30
|
+
ret
|
31
|
+
end
|
32
|
+
|
33
|
+
# 전화번호 매핑 해제
|
34
|
+
#
|
35
|
+
# 설명 offset, length
|
36
|
+
# 0504 매핑번호 0, 20 (매핑된 전화번호)
|
37
|
+
# 그룹코드 20, 10 (수정할 그룹코드)
|
38
|
+
def mapping_cancel_request(new_tel_num, group_code)
|
39
|
+
tel_num = new_tel_num.gsub(/-/, '')
|
40
|
+
"#{tel_num.ljust(20, ' ')}#{group_code.ljust(10, ' ')}"
|
41
|
+
end
|
42
|
+
|
43
|
+
# 전화번호 매핑 조회
|
44
|
+
#
|
45
|
+
# 설명 offset, length
|
46
|
+
# 0504 매핑번호 0, 20 (매핑된 전화번호)
|
47
|
+
def mapping_show_request(new_tel_num, group_code)
|
48
|
+
tel_num = new_tel_num.gsub(/-/, '')
|
49
|
+
"#{tel_num.ljust(20, ' ')}"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/safen/error.rb
ADDED
data/lib/safen/header.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
class Safen
|
2
|
+
class Header
|
3
|
+
class << self
|
4
|
+
# 전화번호 매핑
|
5
|
+
def mapping_request(corp_code)
|
6
|
+
create_header 110, '1001', corp_code
|
7
|
+
end
|
8
|
+
|
9
|
+
# 전화번호 매핑 수정
|
10
|
+
def mapping_update_request(corp_code)
|
11
|
+
create_header 170, '1003', corp_code
|
12
|
+
end
|
13
|
+
|
14
|
+
# 전화번호 매핑 해제
|
15
|
+
def mapping_cancel_request(corp_code)
|
16
|
+
create_header 30, '1002', corp_code
|
17
|
+
end
|
18
|
+
|
19
|
+
# 전화번호 매핑 조회
|
20
|
+
def mapping_show_request(corp_code)
|
21
|
+
create_header 20, '1004', corp_code
|
22
|
+
end
|
23
|
+
|
24
|
+
# 전문길이 (4byte) Header를 제외한 Body data size
|
25
|
+
# 업무구분코드 (4byte)
|
26
|
+
# 업체코드 (4byte) Telink 에서 부여.
|
27
|
+
def create_header(len, code, corp_code)
|
28
|
+
"#{len.to_s.rjust(4, '0')}#{code}#{corp_code}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/safen.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'safen/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'safen'
|
8
|
+
spec.version = Safen::VERSION
|
9
|
+
spec.authors = ['subicura']
|
10
|
+
spec.email = ['subicura@subicura.com']
|
11
|
+
|
12
|
+
spec.summary = %q{Ruby bindings for the SKT safen API}
|
13
|
+
spec.description = %q{SKT safen is 0504 tel service.}
|
14
|
+
spec.homepage = 'https://github.com/subicura/safen-ruby'
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
17
|
+
f.match(%r{^(test|spec|features)/})
|
18
|
+
end
|
19
|
+
spec.bindir = 'exe'
|
20
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
21
|
+
spec.require_paths = ['lib']
|
22
|
+
|
23
|
+
spec.add_development_dependency 'bundler', '~> 1.15'
|
24
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
25
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
26
|
+
end
|
metadata
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: safen
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- subicura
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-08-01 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.15'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.15'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
description: SKT safen is 0504 tel service.
|
56
|
+
email:
|
57
|
+
- subicura@subicura.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- ".gitignore"
|
63
|
+
- ".rspec"
|
64
|
+
- ".travis.yml"
|
65
|
+
- Gemfile
|
66
|
+
- README.md
|
67
|
+
- Rakefile
|
68
|
+
- bin/console
|
69
|
+
- bin/setup
|
70
|
+
- lib/safen.rb
|
71
|
+
- lib/safen/body.rb
|
72
|
+
- lib/safen/error.rb
|
73
|
+
- lib/safen/header.rb
|
74
|
+
- lib/safen/version.rb
|
75
|
+
- safen.gemspec
|
76
|
+
homepage: https://github.com/subicura/safen-ruby
|
77
|
+
licenses: []
|
78
|
+
metadata: {}
|
79
|
+
post_install_message:
|
80
|
+
rdoc_options: []
|
81
|
+
require_paths:
|
82
|
+
- lib
|
83
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '0'
|
93
|
+
requirements: []
|
94
|
+
rubyforge_project:
|
95
|
+
rubygems_version: 2.5.2
|
96
|
+
signing_key:
|
97
|
+
specification_version: 4
|
98
|
+
summary: Ruby bindings for the SKT safen API
|
99
|
+
test_files: []
|