Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sundowndev
GitHub Repository: sundowndev/phoneinfoga
Path: blob/master/lib/remote/suppliers/ovh.go
994 views
1
package suppliers
2
3
import (
4
"encoding/json"
5
"errors"
6
"fmt"
7
"github.com/sundowndev/phoneinfoga/v2/lib/number"
8
"net/http"
9
"reflect"
10
"strings"
11
)
12
13
type OVHSupplierInterface interface {
14
Search(number.Number) (*OVHScannerResponse, error)
15
}
16
17
// OVHAPIResponseNumber is a type that describes an OVH number range
18
type OVHAPIResponseNumber struct {
19
MatchingCriteria interface{} `json:"matchingCriteria"`
20
City string `json:"city"`
21
ZneList []string `json:"zne-list"`
22
InternationalNumber string `json:"internationalNumber"`
23
Country string `json:"country"`
24
AskedCity interface{} `json:"askedCity"`
25
ZipCode string `json:"zipCode"`
26
Number string `json:"number"`
27
Prefix int `json:"prefix"`
28
}
29
30
type OVHAPIErrorResponse struct {
31
Message string `json:"message"`
32
}
33
34
// OVHScannerResponse is the OVH scanner response
35
type OVHScannerResponse struct {
36
Found bool
37
NumberRange string
38
City string
39
ZipCode string
40
}
41
42
type OVHSupplier struct{}
43
44
func NewOVHSupplier() *OVHSupplier {
45
return &OVHSupplier{}
46
}
47
48
func (s *OVHSupplier) Search(num number.Number) (*OVHScannerResponse, error) {
49
countryCode := strings.ToLower(num.Country)
50
51
if countryCode == "" {
52
return nil, fmt.Errorf("country code +%d wasn't recognized", num.CountryCode)
53
}
54
55
// Build the request
56
response, err := http.Get(fmt.Sprintf("https://api.ovh.com/1.0/telephony/number/detailedZones?country=%s", countryCode))
57
if err != nil {
58
return nil, err
59
}
60
defer response.Body.Close()
61
62
if response.StatusCode >= 400 {
63
var result OVHAPIErrorResponse
64
err = json.NewDecoder(response.Body).Decode(&result)
65
if err != nil {
66
return nil, err
67
}
68
return nil, errors.New(result.Message)
69
}
70
71
// Fill the response with the data from the JSON
72
var results []OVHAPIResponseNumber
73
74
// Use json.Decode for reading streams of JSON data
75
err = json.NewDecoder(response.Body).Decode(&results)
76
if err != nil {
77
return nil, err
78
}
79
80
var foundNumber OVHAPIResponseNumber
81
82
rt := reflect.TypeOf(results)
83
if rt.Kind() == reflect.Slice && len(num.RawLocal) > 6 {
84
askedNumber := num.RawLocal[0:6] + "xxxx"
85
86
for _, result := range results {
87
if result.Number == askedNumber {
88
foundNumber = result
89
}
90
}
91
}
92
93
return &OVHScannerResponse{
94
Found: len(foundNumber.Number) > 0,
95
NumberRange: foundNumber.Number,
96
City: foundNumber.City,
97
ZipCode: foundNumber.ZipCode,
98
}, nil
99
}
100
101