diff --git a/.github/workflows/golangci-lint.yaml b/.github/workflows/golangci-lint.yaml index e4519a7..c15563e 100644 --- a/.github/workflows/golangci-lint.yaml +++ b/.github/workflows/golangci-lint.yaml @@ -12,9 +12,9 @@ jobs: steps: - uses: actions/setup-go@v3 with: - go-version: 1.18 + go-version: 1.18.x - uses: actions/checkout@v3 - name: golangci-lint uses: golangci/golangci-lint-action@v3 with: - version: v1.46 \ No newline at end of file + version: v1.50.0 \ No newline at end of file diff --git a/.golangci.yaml b/.golangci.yaml index fc94e3b..23a5ad2 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -1,6 +1,17 @@ run: timeout: 3m go: '1.18' +skip-dirs: + skip-files: + - "./*_test.go$" +linters: + enable: + - whitespace + - gocritic + - prealloc + - unparam + - usestdlibvars + - goimports linters-settings: forbidigo: # Forbid the following identifiers (list of regexp). @@ -8,4 +19,10 @@ linters-settings: forbid: - ^print.*$ - 'fmt\.Print.*' - exclude_godoc_examples: false \ No newline at end of file + exclude_godoc_examples: false + gocritic: + enabled-tags: + - diagnostic + - style + - opinionated + - experimental \ No newline at end of file diff --git a/api/lambda/handlers/tracker_test.go b/api/lambda/handlers/tracker_test.go index 3ed1590..35ea0f5 100644 --- a/api/lambda/handlers/tracker_test.go +++ b/api/lambda/handlers/tracker_test.go @@ -68,7 +68,7 @@ func TestHandleLambdaEvent(t *testing.T) { tracker := &parcelTrackerMock{} tc.setupTrackerMock(tracker) - req := events.APIGatewayProxyRequest{Body: fmt.Sprintf(`{"track_id":["%s"]}`, tc.trackId)} + req := events.APIGatewayProxyRequest{Body: fmt.Sprintf(`{"track_id":[%q]}`, tc.trackId)} gotResp, gotErr := Tracking(tracker, 10)(context.Background(), req) assert.Equal(t, tc.expResp, gotResp) diff --git a/api/rest/handlers/tracker_test.go b/api/rest/handlers/tracker_test.go index 1cb6de1..e7ff59b 100644 --- a/api/rest/handlers/tracker_test.go +++ b/api/rest/handlers/tracker_test.go @@ -3,7 +3,7 @@ package handlers import ( "context" "fmt" - "io/ioutil" + "io" "net/http" "net/http/httptest" "strings" @@ -74,7 +74,7 @@ func TestHandleRest(t *testing.T) { tracker := &parcelTrackerMock{} tc.setupTrackerMock(tracker) - data := strings.NewReader(fmt.Sprintf(`{"track_id":["%s"]}`, tc.testId)) + data := strings.NewReader(fmt.Sprintf(`{"track_id":[%q]}`, tc.testId)) req, err := http.NewRequest(tc.method, "", data) assert.NoError(t, err) @@ -87,7 +87,7 @@ func TestHandleRest(t *testing.T) { res := rec.Result() defer res.Body.Close() - gotResp, err := ioutil.ReadAll(res.Body) + gotResp, err := io.ReadAll(res.Body) assert.NoError(t, err) assert.Equal(t, tc.expResp, string(gotResp)) diff --git a/cmd/rest-server/main.go b/cmd/rest-server/main.go index dc9034a..7716696 100644 --- a/cmd/rest-server/main.go +++ b/cmd/rest-server/main.go @@ -31,7 +31,7 @@ func main() { g, gCtx := errgroup.WithContext(ctx) g.Go(func() error { - fmt.Println("Server is listening...") + fmt.Print("Server is listening...") return httpServer.ListenAndServe() }) g.Go(func() error { diff --git a/logic/track.go b/logic/track.go index a86e66b..b0aa410 100644 --- a/logic/track.go +++ b/logic/track.go @@ -55,13 +55,9 @@ func (p ParcelsTracker) TrackParcels(_ context.Context, parcelIds []string) (map for { select { case err := <-chanErr: - { - return nil, err - } + return nil, err case idsToCarriers := <-chanIdsToCarriers: - { - go track(idsToCarriers, chanParcels, chanErr) - } + go track(idsToCarriers, chanParcels, chanErr) case parcels := <-chanParcels: return parcels, nil } @@ -87,7 +83,6 @@ func (p ParcelsTracker) matchParcelIdsToCarriers(parcelIds []string, chanIdsToCa defer mu.Unlock() idsToCarriers[carrier] = append(idsToCarriers[carrier], parcelId) }(parcelId) - } wg.Wait() diff --git a/pkg/determine-delivery/carriers/dhl/api_test.go b/pkg/determine-delivery/carriers/dhl/api_test.go index aff8b3c..699e14c 100644 --- a/pkg/determine-delivery/carriers/dhl/api_test.go +++ b/pkg/determine-delivery/carriers/dhl/api_test.go @@ -2,9 +2,9 @@ package dhl import ( "errors" - "io/ioutil" "net/http" "net/http/httptest" + "os" "testing" "github.com/stretchr/testify/assert" @@ -43,7 +43,7 @@ func TestApi_TrackByTrackingNumber(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(testCase.status) - b, err := ioutil.ReadFile(testCase.file) + b, err := os.ReadFile(testCase.file) if err != nil { t.Fatal(err) } diff --git a/pkg/determine-delivery/carriers/dhl/carrier.go b/pkg/determine-delivery/carriers/dhl/carrier.go index 5c5ebf5..9d0af23 100644 --- a/pkg/determine-delivery/carriers/dhl/carrier.go +++ b/pkg/determine-delivery/carriers/dhl/carrier.go @@ -10,53 +10,53 @@ import ( ) var patterns = map[string]*regexp.Regexp{ - //It starts with 000 + // It starts with 000 "start000": regexp.MustCompile(`^000`), - //It starts with JVGL + // It starts with JVGL "startJVGL": regexp.MustCompile(`(?i)^JVGL`), - //It starts with GM + // It starts with GM "startGM": regexp.MustCompile(`(?i)^GM`), - //It starts with LX + // It starts with LX "startLX": regexp.MustCompile(`(?i)^LX`), - //It starts with RX + // It starts with RX "startRX": regexp.MustCompile(`(?i)^RX`), - //It starts with 3S + // It starts with 3S "start3S": regexp.MustCompile(`(?i)^3S`), - //It starts with JJD + // It starts with JJD "startJJD": regexp.MustCompile(`(?i)^JJD`), - //Starts with 1 number, followed by 2 letters and 4 to 6 numbers - //Example: 1AB12345 - "pattern1": regexp.MustCompile(`(?i)^[\d]{1}[a-z]{2}[\d]{4,6}$`), + // Starts with 1 number, followed by 2 letters and 4 to 6 numbers + // Example: 1AB12345 + "pattern1": regexp.MustCompile(`(?i)^\d[a-z]{2}\d{4,6}$`), - //Starts with 3 to 4 letters - //Example: ABC123456 - "pattern2": regexp.MustCompile(`(?i)^[a-z]{3}[\d]{6}$`), + // Starts with 3 to 4 letters + // Example: ABC123456 + "pattern2": regexp.MustCompile(`(?i)^[a-z]{3}\d{6}$`), - //Starts with 3-digit carrier code, followed by hyphen (-), followed by the 8-digit masterbill number. - //Example: 123-12345678 - "pattern3": regexp.MustCompile(`^[\d]{3}-[\d]{8}$`), + // Starts with 3-digit carrier code, followed by hyphen (-), followed by the 8-digit masterbill number. + // Example: 123-12345678 + "pattern3": regexp.MustCompile(`^\d{3}-\d{8}$`), - //Order Code: starts with 2 to 3 letters, followed by hyphen (-), 2 to 3 letters, hyphen (-) and 7 numbers - //Example: ABC-DE-1234567 - "pattern4": regexp.MustCompile(`(?i)^[a-z]{2,3}-[a-z]{2,3}-[\d]{7}$`), + // Order Code: starts with 2 to 3 letters, followed by hyphen (-), 2 to 3 letters, hyphen (-) and 7 numbers + // Example: ABC-DE-1234567 + "pattern4": regexp.MustCompile(`(?i)^[a-z]{2,3}-[a-z]{2,3}-\d{7}$`), - //Starts with 4 numbers, followed by hyphen (-) and 5 numbers - //Example: 1234-12345 - "pattern5": regexp.MustCompile(`^[\d]{4}-[\d]{5}$`), + // Starts with 4 numbers, followed by hyphen (-) and 5 numbers + // Example: 1234-12345 + "pattern5": regexp.MustCompile(`^\d{4}-\d{5}$`), - //Numeric only with the length 7,9,10 or 14 - //Example: 123456789 - //9 and 10 in UPS as well !!! - "numbers7": regexp.MustCompile(`^[\d]{7}$`), - "numbers9_10": regexp.MustCompile(`^[\d]{9,10}$`), - "numbers14": regexp.MustCompile(`^[\d]{14}$`), + // Numeric only with the length 7,9,10 or 14 + // Example: 123456789 + // 9 and 10 in UPS as well !!! + "numbers7": regexp.MustCompile(`^\d{7}$`), + "numbers9_10": regexp.MustCompile(`^\d{9,10}$`), + "numbers14": regexp.MustCompile(`^\d{14}$`), } const layout = "2006-01-02T15:04:05Z" diff --git a/pkg/determine-delivery/carriers/fedex/api.go b/pkg/determine-delivery/carriers/fedex/api.go index fd2a348..5b4081c 100644 --- a/pkg/determine-delivery/carriers/fedex/api.go +++ b/pkg/determine-delivery/carriers/fedex/api.go @@ -83,7 +83,7 @@ func (api *Api) TrackByTrackingNumber(trackingRequest TrackingRequest) (*Trackin return nil, err } - if err = getErrors(trackingResponse.Errors); err != nil { + if err := getErrors(trackingResponse.Errors); err != nil { return nil, err } @@ -142,7 +142,7 @@ func (api *Api) authorize() (string, error) { if err := json.Unmarshal(response, res); err != nil { return "", err } - if err = getErrors(res.Errors); err != nil { + if err := getErrors(res.Errors); err != nil { return "", err } } diff --git a/pkg/determine-delivery/carriers/fedex/api_test.go b/pkg/determine-delivery/carriers/fedex/api_test.go index 7c20edd..881003f 100644 --- a/pkg/determine-delivery/carriers/fedex/api_test.go +++ b/pkg/determine-delivery/carriers/fedex/api_test.go @@ -2,9 +2,9 @@ package fedex import ( "errors" - "io/ioutil" "net/http" "net/http/httptest" + "os" "testing" "time" @@ -54,7 +54,7 @@ func TestApi_TrackByTrackingNumber(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(testCase.status) - b, err := ioutil.ReadFile(testCase.file) + b, err := os.ReadFile(testCase.file) if err != nil { t.Fatal(err) } @@ -106,7 +106,7 @@ func TestApi_authorize(t *testing.T) { for _, testCase := range testCases { t.Run(testCase.name, func(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - b, err := ioutil.ReadFile(testCase.file) + b, err := os.ReadFile(testCase.file) if err != nil { t.Fatal(err) } diff --git a/pkg/determine-delivery/carriers/fedex/carrier.go b/pkg/determine-delivery/carriers/fedex/carrier.go index 93f00f6..839330a 100644 --- a/pkg/determine-delivery/carriers/fedex/carrier.go +++ b/pkg/determine-delivery/carriers/fedex/carrier.go @@ -9,15 +9,15 @@ import ( ) var patterns = map[string]*regexp.Regexp{ - //Numeric only with the length 12 - "numbers12": regexp.MustCompile(`^[\d]{12}$`), - //Numeric only with the length 15 - "numbers15": regexp.MustCompile(`^[\d]{15}$`), - //Numeric only with the length 20 - "numbers20": regexp.MustCompile(`^[\d]{20}$`), - //Numeric only with the length 22 - //22 in UPS as well !!! - "numbers22": regexp.MustCompile(`^[\d]{22}$`), + // Numeric only with the length 12 + "numbers12": regexp.MustCompile(`^\d{12}$`), + // Numeric only with the length 15 + "numbers15": regexp.MustCompile(`^\d{15}$`), + // Numeric only with the length 20 + "numbers20": regexp.MustCompile(`^\d{20}$`), + // Numeric only with the length 22 + // 22 in UPS as well !!! + "numbers22": regexp.MustCompile(`^\d{22}$`), } type api interface { @@ -83,14 +83,9 @@ func (c *Carrier) track(trackNumbers []string, chanParcels chan []carriers.Parce return } - p, err := prepareResponse(response) - if err != nil { - chanErr <- err - return - } mu.Lock() defer mu.Unlock() - parcels = append(parcels, p...) + parcels = append(parcels, prepareResponse(response)...) }(trackNumber) } @@ -98,7 +93,7 @@ func (c *Carrier) track(trackNumbers []string, chanParcels chan []carriers.Parce chanParcels <- parcels } -func prepareResponse(response *TrackingResponse) ([]carriers.Parcel, error) { +func prepareResponse(response *TrackingResponse) []carriers.Parcel { parcels := make([]carriers.Parcel, len(response.Output.CompleteTrackResults)) for i, d := range response.Output.CompleteTrackResults { parcels[i] = carriers.Parcel{ @@ -108,7 +103,7 @@ func prepareResponse(response *TrackingResponse) ([]carriers.Parcel, error) { DeliveryDate: d.TrackResults[0].EstimatedDeliveryTimeWindow.Window.Ends, } } - return parcels, nil + return parcels } func getPlaces(result TrackResult) []carriers.Place { diff --git a/pkg/determine-delivery/carriers/fedex/carrier_test.go b/pkg/determine-delivery/carriers/fedex/carrier_test.go index 67ce28c..8720e39 100644 --- a/pkg/determine-delivery/carriers/fedex/carrier_test.go +++ b/pkg/determine-delivery/carriers/fedex/carrier_test.go @@ -44,7 +44,6 @@ func TestCarrier_Track(t *testing.T) { name: "Ok response", trackNumbers: []string{"12A12345", "12A12346"}, setupApiMock: func(api *apiMock, trackNumbers []string) { - trackingInfo := TrackingInfo{ TrackingNumberInfo: TrackingNumberInfo{ TrackingNumber: trackNumbers[0], diff --git a/pkg/determine-delivery/carriers/me/api.go b/pkg/determine-delivery/carriers/me/api.go index b3c3ee3..bdc22d7 100644 --- a/pkg/determine-delivery/carriers/me/api.go +++ b/pkg/determine-delivery/carriers/me/api.go @@ -11,11 +11,11 @@ import ( "github.com/valyala/fasthttp" ) -const statusOk = "000" //Ok +const statusOk = "000" // Ok var handleErrors = map[string]error{ - "103": response_errors.NotFound, //Document not found - "104": response_errors.NotFound, //Directory not found + "103": response_errors.NotFound, // Document not found + "104": response_errors.NotFound, // Directory not found } type Api struct { @@ -51,7 +51,6 @@ func (api *Api) TrackByTrackingNumber(trackNumber string) (*ShipmentsTrackRespon } if shipmentsTrackResponse.Errors.Code != statusOk { - if err, ok := handleErrors[shipmentsTrackResponse.Errors.Code]; ok { return nil, err } diff --git a/pkg/determine-delivery/carriers/me/api_test.go b/pkg/determine-delivery/carriers/me/api_test.go index 6ad34e6..ad8c127 100644 --- a/pkg/determine-delivery/carriers/me/api_test.go +++ b/pkg/determine-delivery/carriers/me/api_test.go @@ -2,9 +2,9 @@ package me import ( "errors" - "io/ioutil" "net/http" "net/http/httptest" + "os" "testing" "github.com/stretchr/testify/assert" @@ -37,7 +37,7 @@ func TestApi_TrackByTrackingNumber(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) - b, err := ioutil.ReadFile(testCase.file) + b, err := os.ReadFile(testCase.file) if err != nil { t.Fatal(err) } diff --git a/pkg/determine-delivery/carriers/me/carrier.go b/pkg/determine-delivery/carriers/me/carrier.go index f786485..2397c5a 100644 --- a/pkg/determine-delivery/carriers/me/carrier.go +++ b/pkg/determine-delivery/carriers/me/carrier.go @@ -10,13 +10,13 @@ import ( ) var patterns = map[string]*regexp.Regexp{ - //Starts with CV, 9 numbers and 2 letters at the end - //CV999999999AA - "startCV": regexp.MustCompile(`(?i)^CV[\d]{9}[a-z]{2}$`), + // Starts with CV, 9 numbers and 2 letters at the end + // CV999999999AA + "startCV": regexp.MustCompile(`(?i)^CV\d{9}[a-z]{2}$`), - //Starts with MYCV, 9 numbers and 2 letters at the end - //MYCV999999999AA - "startMYCV": regexp.MustCompile(`(?i)^MYCV[\d]{9}[a-z]{2}$`), + // Starts with MYCV, 9 numbers and 2 letters at the end + // MYCV999999999AA + "startMYCV": regexp.MustCompile(`(?i)^MYCV\d{9}[a-z]{2}$`), } const layout = "2016-06-30 13: 42: 11" diff --git a/pkg/determine-delivery/carriers/me/response.go b/pkg/determine-delivery/carriers/me/response.go index f23a960..b890c1c 100644 --- a/pkg/determine-delivery/carriers/me/response.go +++ b/pkg/determine-delivery/carriers/me/response.go @@ -13,25 +13,25 @@ type ShipmentsTrackResponse struct { } type ShipmentTrackResponse struct { - ShipmentIdRef string `xml:"ShipmentIdRef"` //0xa969003048d2b47311e3fc6109445fb1 - DocumentIdRef string `xml:"DocumentIdRef"` //0xa969003048d2b47311e3fc6109445fb4 - AgentsIdRef string `xml:"AgentsIdRef"` //0xb95653547d06ad014b2580d2c4be55b2 - ShipmentNumberSender string `xml:"ShipmentNumberSender"` //001-0255371 + ShipmentIdRef string `xml:"ShipmentIdRef"` // 0xa969003048d2b47311e3fc6109445fb1 + DocumentIdRef string `xml:"DocumentIdRef"` // 0xa969003048d2b47311e3fc6109445fb4 + AgentsIdRef string `xml:"AgentsIdRef"` // 0xb95653547d06ad014b2580d2c4be55b2 + ShipmentNumberSender string `xml:"ShipmentNumberSender"` // 001-0255371 ShipmentNumberTransit string `xml:"ShipmentNumberTransit"` ShipmentClientID string `xml:"ShipmentClientID"` - DateTimeAction string `xml:"DateTimeAction"` //2016-06-25 15:05:53 - Country string `xml:"Country"` //УКРАЇНА - City string `xml:"City"` //Дніпродзержинськ - ActionId int `xml:"ActionId"` //6 - StatusCode string `xml:"StatusCode"` //606 - ActionMessages_UA string `xml:"ActionMessages_UA"` //Поступлення відправлення на відділення - ActionMessages_RU string `xml:"ActionMessages_RU"` //Поступление отправления на отделение - ActionMessages_EN string `xml:"ActionMessages_EN"` //Accepted by the branch - DetailMessages_UA string `xml:"DetailMessages_UA"` //Дніпродзержинськ - DetailMessages_RU string `xml:"DetailMessages_RU"` //Дніпродзержинськ - DetailMessages_EN string `xml:"DetailMessages_EN"` //Дніпродзержинськ - DetailPlacesAction string `xml:"DetailPlacesAction"` //1/1 - CountryDel string `xml:"CountryDel"` //UA + DateTimeAction string `xml:"DateTimeAction"` // 2016-06-25 15:05:53 + Country string `xml:"Country"` // УКРАЇНА + City string `xml:"City"` // Дніпродзержинськ + ActionId int `xml:"ActionId"` // 6 + StatusCode string `xml:"StatusCode"` // 606 + ActionMessages_UA string `xml:"ActionMessages_UA"` // Поступлення відправлення на відділення + ActionMessages_RU string `xml:"ActionMessages_RU"` // Поступление отправления на отделение + ActionMessages_EN string `xml:"ActionMessages_EN"` // Accepted by the branch + DetailMessages_UA string `xml:"DetailMessages_UA"` // Дніпродзержинськ + DetailMessages_RU string `xml:"DetailMessages_RU"` // Дніпродзержинськ + DetailMessages_EN string `xml:"DetailMessages_EN"` // Дніпродзержинськ + DetailPlacesAction string `xml:"DetailPlacesAction"` // 1/1 + CountryDel string `xml:"CountryDel"` // UA Recipient_Country string `xml:"Recipient_Country"` Deliverydate string `xml:"Deliverydate"` } diff --git a/pkg/determine-delivery/carriers/np/api.go b/pkg/determine-delivery/carriers/np/api.go index a877cc8..5f81f34 100644 --- a/pkg/determine-delivery/carriers/np/api.go +++ b/pkg/determine-delivery/carriers/np/api.go @@ -12,24 +12,24 @@ import ( const URL = "/v2.0/json/" var handleErrors = map[string]error{ - "20000500603": response_errors.NotFound, //Not found - "20000300415": response_errors.NotFound, //Document not found - "20000200161": response_errors.NotFound, //Documents not found - "20000200157": response_errors.InvalidNumber, //Document number empty - "20000200158": response_errors.InvalidNumber, //Document number incorrect - "20001401442": response_errors.InvalidNumber, //Document number is not correct - "20001401158": response_errors.InvalidNumber, //Error: wrong format of the document number - "20000202391": response_errors.InvalidNumber, //Invalid document number - "20000401614": response_errors.InvalidNumber, //Wrong DocumentNumber - "20000401620": response_errors.InvalidNumber, //DocumentNumber is invalid - "20000201873": response_errors.InvalidNumber, //DocumentNumber invalid - "20000201994": response_errors.InvalidNumber, //Invalid DocumentNumber - "20002102188": response_errors.InvalidNumber, //DocumentNumber is incorrect - "20001402465": response_errors.InvalidNumber, //DocumentNumber invalid format - "20002102542": response_errors.InvalidNumber, //Invalid DocumentNumber format - "20002102543": response_errors.InvalidNumber, //Document not found by DocumentNumber - "20001402806": response_errors.InvalidNumber, //DocumentNumber invalid format. - "20002502852": response_errors.InvalidNumber, //DocumentNumber is empty + "20000500603": response_errors.NotFound, // Not found + "20000300415": response_errors.NotFound, // Document not found + "20000200161": response_errors.NotFound, // Documents not found + "20000200157": response_errors.InvalidNumber, // Document number empty + "20000200158": response_errors.InvalidNumber, // Document number incorrect + "20001401442": response_errors.InvalidNumber, // Document number is not correct + "20001401158": response_errors.InvalidNumber, // Error: wrong format of the document number + "20000202391": response_errors.InvalidNumber, // Invalid document number + "20000401614": response_errors.InvalidNumber, // Wrong DocumentNumber + "20000401620": response_errors.InvalidNumber, // DocumentNumber is invalid + "20000201873": response_errors.InvalidNumber, // DocumentNumber invalid + "20000201994": response_errors.InvalidNumber, // Invalid DocumentNumber + "20002102188": response_errors.InvalidNumber, // DocumentNumber is incorrect + "20001402465": response_errors.InvalidNumber, // DocumentNumber invalid format + "20002102542": response_errors.InvalidNumber, // Invalid DocumentNumber format + "20002102543": response_errors.InvalidNumber, // Document not found by DocumentNumber + "20001402806": response_errors.InvalidNumber, // DocumentNumber invalid format. + "20002502852": response_errors.InvalidNumber, // DocumentNumber is empty } type Api struct { @@ -86,17 +86,17 @@ func (api *Api) makeRequest(r novaPoshtaRequest, method string) ([]byte, error) return res.Body(), nil } -func getErrors(TrackingDocumentsResponse *TrackingDocumentsResponse) error { - for _, code := range TrackingDocumentsResponse.ErrorCodes { +func getErrors(trackingDocumentsResponse *TrackingDocumentsResponse) error { + for _, code := range trackingDocumentsResponse.ErrorCodes { if err, ok := handleErrors[code]; ok { return err } } - lenErrors := len(TrackingDocumentsResponse.Errors) + lenErrors := len(trackingDocumentsResponse.Errors) if lenErrors > 0 { errorMsgs := "" - for i, e := range TrackingDocumentsResponse.Errors { + for i, e := range trackingDocumentsResponse.Errors { errorMsgs += e if i < -1 { errorMsgs += ", " diff --git a/pkg/determine-delivery/carriers/np/api_test.go b/pkg/determine-delivery/carriers/np/api_test.go index 42c8565..26db433 100644 --- a/pkg/determine-delivery/carriers/np/api_test.go +++ b/pkg/determine-delivery/carriers/np/api_test.go @@ -1,9 +1,9 @@ package np import ( - "io/ioutil" "net/http" "net/http/httptest" + "os" "testing" response_errors "github.com/RomaBilka/parcel-tracking/pkg/response-errors" @@ -50,7 +50,7 @@ func TestApi_TrackByTrackingNumber(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) - b, err := ioutil.ReadFile(testCase.file) + b, err := os.ReadFile(testCase.file) if err != nil { t.Fatal(err) } @@ -71,7 +71,6 @@ func TestApi_TrackByTrackingNumber(t *testing.T) { if res != nil { assert.Equal(t, testCase.document.DocumentNumber, res.Data[0].Number) } - }) } } diff --git a/pkg/determine-delivery/carriers/np/carrier.go b/pkg/determine-delivery/carriers/np/carrier.go index c568d29..6b74d5b 100644 --- a/pkg/determine-delivery/carriers/np/carrier.go +++ b/pkg/determine-delivery/carriers/np/carrier.go @@ -8,17 +8,17 @@ import ( ) var patterns = map[string]*regexp.Regexp{ - //Starts with 59, length 14, only numbers - //59************ - "start59": regexp.MustCompile(`^59[\d]{12}$`), + // Starts with 59, length 14, only numbers + // 59************ + "start59": regexp.MustCompile(`^59\d{12}$`), - //Starts with 20, length 14, only numbers - //20************ - "start20": regexp.MustCompile(`^20[\d]{12}$`), + // Starts with 20, length 14, only numbers + // 20************ + "start20": regexp.MustCompile(`^20\d{12}$`), - //Starts with 1, length 14, only numbers - //1************* - "start1": regexp.MustCompile(`^1[\d]{13}$`), + // Starts with 1, length 14, only numbers + // 1************* + "start1": regexp.MustCompile(`^1\d{13}$`), } const layout = "08.03.2022 15:16:47" @@ -66,7 +66,6 @@ func (c *Carrier) Track(trackingIds []string) ([]carriers.Parcel, error) { parcels := make([]carriers.Parcel, len(response.Data)) for i, d := range response.Data { - scheduledDeliveryDate, err := helpers.ParseTime(layout, d.ScheduledDeliveryDate) if err != nil { return nil, err diff --git a/pkg/determine-delivery/carriers/np/response.go b/pkg/determine-delivery/carriers/np/response.go index 08698fe..6f59735 100644 --- a/pkg/determine-delivery/carriers/np/response.go +++ b/pkg/determine-delivery/carriers/np/response.go @@ -17,61 +17,61 @@ type TrackingDocumentsResponse struct { } type TrackingDocumentResponse struct { - Number string `json:"Number"` //"20400048799000" - Redelivery any `json:"Redelivery"` //"0" - RedeliverySum any `json:"RedeliverySum"` //"0" - RedeliveryNum string `json:"RedeliveryNum"` //"" - RedeliveryPayer string `json:"RedeliveryPayer"` //"Sender/Recipient" - OwnerDocumentType string `json:"OwnerDocumentType"` //"" - LastCreatedOnTheBasisDocumentType string `json:"LastCreatedOnTheBasisDocumentType"` //"" - LastCreatedOnTheBasisPayerType string `json:"LastCreatedOnTheBasisPayerType"` //"" - LastCreatedOnTheBasisDateTime string `json:"LastCreatedOnTheBasisDateTime"` //"" - LastTransactionStatusGM string `json:"LastTransactionStatusGM"` //"" - LastTransactionDateTimeGM string `json:"LastTransactionDateTimeGM"` //"" - LastAmountTransferGM string `json:"LastAmountTransferGM"` //"" - DateCreated string `json:"DateCreated"` //"18-11-2021 11:52:42" - DocumentWeight any `json:"DocumentWeight"` //"3" - FactualWeight string `json:"FactualWeight"` //"3" - VolumeWeight string `json:"VolumeWeight"` //"0.1", - CheckWeight any `json:"CheckWeight"` //"" - DocumentCost any `json:"DocumentCost"` //"51" - SumBeforeCheckWeight any `json:"SumBeforeCheckWeight"` //"" - PayerType string `json:"PayerType"` //"Sender" - RecipientFullName string `json:"RecipientFullName"` //"ПІБ" - RecipientDateTime string `json:"RecipientDateTime"` //"21.11.2021 13:53:47" - ScheduledDeliveryDate string `json:"ScheduledDeliveryDate"` //"19.11.2021 13:53:47" - PaymentMethod string `json:"PaymentMethod"` //"Cash" - CargoDescriptionString string `json:"CargoDescriptionString"` //"Одяг" - CargoType string `json:"CargoType"` //"Cargo", - CitySender string `json:"CitySender"` //"Київ" - CityRecipient string `json:"CityRecipient"` //"Київ" - WarehouseRecipient string `json:"WarehouseRecipient"` // "Відділення №101 (до 15 кг), Міні-відділення: вул. Велика Васильківська, 143/2, (маг. "Фора")" - CounterpartyType string `json:"CounterpartyType"` //"PrivatePerson" - AfterpaymentOnGoodsCost any `json:"AfterpaymentOnGoodsCost"` //"0" - ServiceType string `json:"ServiceType"` //"WarehouseWarehouse" - UndeliveryReasonsSubtypeDescription string `json:"UndeliveryReasonsSubtypeDescription"` //"" - WarehouseRecipientNumber any `json:"WarehouseRecipientNumber"` //"101" - LastCreatedOnTheBasisNumber string `json:"LastCreatedOnTheBasisNumber"` //"" - PhoneRecipient string `json:"PhoneRecipient"` //"380600000000" - RecipientFullNameEW string `json:"RecipientFullNameEW"` //"" - WarehouseRecipientInternetAddressRef string `json:"WarehouseRecipientInternetAddressRef"` //"00000000-0000-0000-0000-000000000000" - MarketplacePartnerToken string `json:"MarketplacePartnerToken"` //"" - ClientBarcode string `json:"ClientBarcode"` //"" - RecipientAddress string `json:"RecipientAddress"` //"м. Київ, Відділення №101 (до 15 кг), Міні-відділення, вул. Велика Васильківська, 143/2" - CounterpartyRecipientDescription string `json:"CounterpartyRecipientDescription"` //"Приватна особа" - CounterpartySenderType string `json:"CounterpartySenderType"` //"PrivatePerson", - DateScan string `json:"DateScan"` //"0001-01-01 00:00:00" - PaymentStatus string `json:"PaymentStatus"` //"" - PaymentStatusDate string `json:"PaymentStatusDate"` //"" - AmountToPay string `json:"AmountToPay"` //"" - AmountPaid string `json:"AmountPaid"` //"" - Status string `json:"Status"` //"" - StatusCode string `json:"StatusCode"` //"" - RefEW string `json:"RefEW"` //"00000000-0000-0000-0000-000000000000" - BackwardDeliverySubTypesActions string `json:"BackwardDeliverySubTypesActions"` //"" - BackwardDeliverySubTypesServices string `json:"BackwardDeliverySubTypesServices"` //"" - UndeliveryReasons string `json:"UndeliveryReasons"` //"" - DatePayedKeeping string `json:"DatePayedKeeping"` //"" - ActualDeliveryDate string `json:"ActualDeliveryDate"` //"" - WarehouseSender string `json:"WarehouseSender"` //"" + Number string `json:"Number"` // "20400048799000" + Redelivery any `json:"Redelivery"` // "0" + RedeliverySum any `json:"RedeliverySum"` // "0" + RedeliveryNum string `json:"RedeliveryNum"` // "" + RedeliveryPayer string `json:"RedeliveryPayer"` // "Sender/Recipient" + OwnerDocumentType string `json:"OwnerDocumentType"` // "" + LastCreatedOnTheBasisDocumentType string `json:"LastCreatedOnTheBasisDocumentType"` // "" + LastCreatedOnTheBasisPayerType string `json:"LastCreatedOnTheBasisPayerType"` // "" + LastCreatedOnTheBasisDateTime string `json:"LastCreatedOnTheBasisDateTime"` // "" + LastTransactionStatusGM string `json:"LastTransactionStatusGM"` // "" + LastTransactionDateTimeGM string `json:"LastTransactionDateTimeGM"` // "" + LastAmountTransferGM string `json:"LastAmountTransferGM"` // "" + DateCreated string `json:"DateCreated"` // "18-11-2021 11:52:42" + DocumentWeight any `json:"DocumentWeight"` // "3" + FactualWeight string `json:"FactualWeight"` // "3" + VolumeWeight string `json:"VolumeWeight"` // "0.1", + CheckWeight any `json:"CheckWeight"` // "" + DocumentCost any `json:"DocumentCost"` // "51" + SumBeforeCheckWeight any `json:"SumBeforeCheckWeight"` // "" + PayerType string `json:"PayerType"` // "Sender" + RecipientFullName string `json:"RecipientFullName"` // "ПІБ" + RecipientDateTime string `json:"RecipientDateTime"` // "21.11.2021 13:53:47" + ScheduledDeliveryDate string `json:"ScheduledDeliveryDate"` // "19.11.2021 13:53:47" + PaymentMethod string `json:"PaymentMethod"` // "Cash" + CargoDescriptionString string `json:"CargoDescriptionString"` // "Одяг" + CargoType string `json:"CargoType"` // "Cargo", + CitySender string `json:"CitySender"` // "Київ" + CityRecipient string `json:"CityRecipient"` // "Київ" + WarehouseRecipient string `json:"WarehouseRecipient"` // "Відділення №101 (до 15 кг), Міні-відділення: вул. Велика Васильківська, 143/2, (маг. "Фора")" + CounterpartyType string `json:"CounterpartyType"` // "PrivatePerson" + AfterpaymentOnGoodsCost any `json:"AfterpaymentOnGoodsCost"` // "0" + ServiceType string `json:"ServiceType"` // "WarehouseWarehouse" + UndeliveryReasonsSubtypeDescription string `json:"UndeliveryReasonsSubtypeDescription"` // "" + WarehouseRecipientNumber any `json:"WarehouseRecipientNumber"` // "101" + LastCreatedOnTheBasisNumber string `json:"LastCreatedOnTheBasisNumber"` // "" + PhoneRecipient string `json:"PhoneRecipient"` // "380600000000" + RecipientFullNameEW string `json:"RecipientFullNameEW"` // "" + WarehouseRecipientInternetAddressRef string `json:"WarehouseRecipientInternetAddressRef"` // "00000000-0000-0000-0000-000000000000" + MarketplacePartnerToken string `json:"MarketplacePartnerToken"` // "" + ClientBarcode string `json:"ClientBarcode"` // "" + RecipientAddress string `json:"RecipientAddress"` // "м. Київ, Відділення №101 (до 15 кг), Міні-відділення, вул. Велика Васильківська, 143/2" + CounterpartyRecipientDescription string `json:"CounterpartyRecipientDescription"` // "Приватна особа" + CounterpartySenderType string `json:"CounterpartySenderType"` // "PrivatePerson", + DateScan string `json:"DateScan"` // "0001-01-01 00:00:00" + PaymentStatus string `json:"PaymentStatus"` // "" + PaymentStatusDate string `json:"PaymentStatusDate"` // "" + AmountToPay string `json:"AmountToPay"` // "" + AmountPaid string `json:"AmountPaid"` // "" + Status string `json:"Status"` // "" + StatusCode string `json:"StatusCode"` // "" + RefEW string `json:"RefEW"` // "00000000-0000-0000-0000-000000000000" + BackwardDeliverySubTypesActions string `json:"BackwardDeliverySubTypesActions"` // "" + BackwardDeliverySubTypesServices string `json:"BackwardDeliverySubTypesServices"` // "" + UndeliveryReasons string `json:"UndeliveryReasons"` // "" + DatePayedKeeping string `json:"DatePayedKeeping"` // "" + ActualDeliveryDate string `json:"ActualDeliveryDate"` // "" + WarehouseSender string `json:"WarehouseSender"` // "" } diff --git a/pkg/determine-delivery/carriers/ukrposhta/api_test.go b/pkg/determine-delivery/carriers/ukrposhta/api_test.go index 94a37f8..a62bf8e 100644 --- a/pkg/determine-delivery/carriers/ukrposhta/api_test.go +++ b/pkg/determine-delivery/carriers/ukrposhta/api_test.go @@ -1,9 +1,9 @@ package ukrposhta import ( - "io/ioutil" "net/http" "net/http/httptest" + "os" "testing" "github.com/stretchr/testify/assert" @@ -31,7 +31,7 @@ func TestApi_TrackByTrackingNumber(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) - b, err := ioutil.ReadFile(testCase.file) + b, err := os.ReadFile(testCase.file) if err != nil { t.Fatal(err) } diff --git a/pkg/determine-delivery/carriers/ukrposhta/carrier.go b/pkg/determine-delivery/carriers/ukrposhta/carrier.go index dc72745..e59da2f 100644 --- a/pkg/determine-delivery/carriers/ukrposhta/carrier.go +++ b/pkg/determine-delivery/carriers/ukrposhta/carrier.go @@ -8,11 +8,11 @@ import ( ) var patterns = map[string]*regexp.Regexp{ - //Starts with 2 letters 9 numbers and ends with 2 letters - "pattern1": regexp.MustCompile(`(?i)^[a-z]{2}[\d]{9}[a-z]{2}$`), + // Starts with 2 letters 9 numbers and ends with 2 letters + "pattern1": regexp.MustCompile(`(?i)^[a-z]{2}\d{9}[a-z]{2}$`), - //Numeric only with the length 13 - "numbers13": regexp.MustCompile(`^[\d]{13}$`), + // Numeric only with the length 13 + "numbers13": regexp.MustCompile(`^\d{13}$`), } const layout = "2019-02-07T16:36:00" diff --git a/pkg/determine-delivery/carriers/ups/api.go b/pkg/determine-delivery/carriers/ups/api.go index dc2c3fb..fbff4e5 100644 --- a/pkg/determine-delivery/carriers/ups/api.go +++ b/pkg/determine-delivery/carriers/ups/api.go @@ -10,15 +10,15 @@ import ( ) var handleErrors = map[string]error{ - "150022": response_errors.InvalidNumber, //Invalid tracking number - "150028": response_errors.InvalidNumber, //Hard Invalid shipper number length - "151018": response_errors.InvalidNumber, //Invalid tracking number - "151044": response_errors.NotFound, //No tracking information available - "151045": response_errors.NotFound, //No information found - "151062": response_errors.NotFound, //No tracking information available - "151068": response_errors.InvalidNumber, //Invalid Shipper Number - "152110": response_errors.NotFound, //No information found for reference number - "154030": response_errors.NotFound, //No information for this tracking number + "150022": response_errors.InvalidNumber, // Invalid tracking number + "150028": response_errors.InvalidNumber, // Hard Invalid shipper number length + "151018": response_errors.InvalidNumber, // Invalid tracking number + "151044": response_errors.NotFound, // No tracking information available + "151045": response_errors.NotFound, // No information found + "151062": response_errors.NotFound, // No tracking information available + "151068": response_errors.InvalidNumber, // Invalid Shipper Number + "152110": response_errors.NotFound, // No information found for reference number + "154030": response_errors.NotFound, // No information for this tracking number } diff --git a/pkg/determine-delivery/carriers/ups/api_test.go b/pkg/determine-delivery/carriers/ups/api_test.go index 210d1ea..a213a09 100644 --- a/pkg/determine-delivery/carriers/ups/api_test.go +++ b/pkg/determine-delivery/carriers/ups/api_test.go @@ -1,9 +1,9 @@ package ups import ( - "io/ioutil" "net/http" "net/http/httptest" + "os" "testing" response_errors "github.com/RomaBilka/parcel-tracking/pkg/response-errors" @@ -32,7 +32,7 @@ func TestApi_TrackByTrackingNumber(t *testing.T) { for _, testCase := range testCases { t.Run(testCase.name, func(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - b, err := ioutil.ReadFile(testCase.file) + b, err := os.ReadFile(testCase.file) if err != nil { t.Fatal(err) } diff --git a/pkg/determine-delivery/carriers/ups/carrier.go b/pkg/determine-delivery/carriers/ups/carrier.go index 2527839..04a3736 100644 --- a/pkg/determine-delivery/carriers/ups/carrier.go +++ b/pkg/determine-delivery/carriers/ups/carrier.go @@ -9,34 +9,34 @@ import ( ) var patterns = map[string]*regexp.Regexp{ - //Starts with 1Z, 5 or 6 digits, 1 letter and 9 or 10 digits, length 18 - //1Z12345E6605272234 - "start1z": regexp.MustCompile(`(?i)^1Z[\d]{5,6}[a-z]{1}[\d]{9,10}$`), - - //Starts with 1Z, 4 digits, WWE and 9 digits, length 18 - //1Z4861WWE194914215 - "WWE": regexp.MustCompile(`(?i)^1Z[\d]{4}WWE[\d]{9}$`), - - //Starts with 1ZWX, 4 digits, 2 letters and 8 digits, length 18 - //1ZWX0692YP40636269 - "start1ZWX": regexp.MustCompile(`(?i)^1ZWX[\d]{4}[a-z]{2}[\d]{8}$`), - - //Starts with ER and 15 digits, length 17 - //ER751105042015062 - "startER": regexp.MustCompile(`(?i)^ER[\d]{15}`), - - //Numeric only with the length 9 or 10 - //Example: 123456789 - //9 and 10 in DHL as well !!! - "numbers9_10": regexp.MustCompile(`^[\d]{9,10}$`), - - //Numeric only with the length 22 - //22 in Fedex as well !!! - "numbers22": regexp.MustCompile(`^[\d]{22}$`), - - //Starts with cgish and 9 digits - //cgish000116630 - "startCGISH": regexp.MustCompile(`(?i)^cgish[\d]{9}$`), + // Starts with 1Z, 5 or 6 digits, 1 letter and 9 or 10 digits, length 18 + // 1Z12345E6605272234 + "start1z": regexp.MustCompile(`(?i)^1Z\d{5,6}[a-z]\d{9,10}$`), + + // Starts with 1Z, 4 digits, WWE and 9 digits, length 18 + // 1Z4861WWE194914215 + "WWE": regexp.MustCompile(`(?i)^1Z\d{4}WWE\d{9}$`), + + // Starts with 1ZWX, 4 digits, 2 letters and 8 digits, length 18 + // 1ZWX0692YP40636269 + "start1ZWX": regexp.MustCompile(`(?i)^1ZWX\d{4}[a-z]{2}\d{8}$`), + + // Starts with ER and 15 digits, length 17 + // ER751105042015062 + "startER": regexp.MustCompile(`(?i)^ER\d{15}`), + + // Numeric only with the length 9 or 10 + // Example: 123456789 + // 9 and 10 in DHL as well !!! + "numbers9_10": regexp.MustCompile(`^\d{9,10}$`), + + // Numeric only with the length 22 + // 22 in Fedex as well !!! + "numbers22": regexp.MustCompile(`^\d{22}$`), + + // Starts with cgish and 9 digits + // cgish000116630 + "startCGISH": regexp.MustCompile(`(?i)^cgish\d{9}$`), } type api interface { diff --git a/pkg/determine-delivery/carriers/usps/api.go b/pkg/determine-delivery/carriers/usps/api.go index 5886528..6782f02 100644 --- a/pkg/determine-delivery/carriers/usps/api.go +++ b/pkg/determine-delivery/carriers/usps/api.go @@ -14,11 +14,11 @@ type Api struct { sourceId string } -func NewApi(apiURL, userId, SourceId string) *Api { +func NewApi(apiURL, userId, sourceId string) *Api { return &Api{ apiURL: apiURL, userId: userId, - sourceId: SourceId, + sourceId: sourceId, } } diff --git a/pkg/determine-delivery/carriers/usps/api_test.go b/pkg/determine-delivery/carriers/usps/api_test.go index 16c9b41..655c856 100644 --- a/pkg/determine-delivery/carriers/usps/api_test.go +++ b/pkg/determine-delivery/carriers/usps/api_test.go @@ -1,9 +1,9 @@ package usps import ( - "io/ioutil" "net/http" "net/http/httptest" + "os" "testing" "github.com/stretchr/testify/assert" @@ -33,7 +33,7 @@ func TestApi_TrackByTrackingNumber(t *testing.T) { for _, testCase := range testCases { t.Run(testCase.name, func(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - b, err := ioutil.ReadFile(testCase.file) + b, err := os.ReadFile(testCase.file) if err != nil { t.Fatal(err) } diff --git a/pkg/determine-delivery/carriers/usps/carrier.go b/pkg/determine-delivery/carriers/usps/carrier.go index 7310318..e120c1a 100644 --- a/pkg/determine-delivery/carriers/usps/carrier.go +++ b/pkg/determine-delivery/carriers/usps/carrier.go @@ -7,39 +7,39 @@ import ( ) var patterns = map[string]*regexp.Regexp{ - // 9400100000000000000000 length 22 - "start94001": regexp.MustCompile(`(?i)^94001[\d]{17}$`), + // 9400100000000000000000 length 22 + "start94001": regexp.MustCompile(`(?i)^94001\d{17}$`), - // 9205500000000000000000 length 22 - "start92055": regexp.MustCompile(`(?i)^92055[\d]{17}$`), + // 9205500000000000000000 length 22 + "start92055": regexp.MustCompile(`(?i)^92055\d{17}$`), - // 9407300000000000000000 length 22 - "start94073": regexp.MustCompile(`(?i)^94073[\d]{17}$`), + // 9407300000000000000000 length 22 + "start94073": regexp.MustCompile(`(?i)^94073\d{17}$`), - // 9303300000000000000000 length 22 - "start93033": regexp.MustCompile(`(?i)^93033[\d]{17}$`), + // 9303300000000000000000 length 22 + "start93033": regexp.MustCompile(`(?i)^93033\d{17}$`), - // 9208800000000000000000 length 22 - "start92088": regexp.MustCompile(`(?i)^92088[\d]{17}$`), + // 9208800000000000000000 length 22 + "start92088": regexp.MustCompile(`(?i)^92088\d{17}$`), - // 9202100000000000000000 length 22 - "start92021": regexp.MustCompile(`(?i)^92021[\d]{17}$`), + // 9202100000000000000000 length 22 + "start92021": regexp.MustCompile(`(?i)^92021\d{17}$`), - // 9270100000000000000000 length 22 - "start92701": regexp.MustCompile(`(?i)^92701[\d]{17}$`), + // 9270100000000000000000 length 22 + "start92701": regexp.MustCompile(`(?i)^92701\d{17}$`), - // EC000000000US length 13 - "startEC_endUS": regexp.MustCompile(`(?i)^EC[\d]{9}US$`), + // EC000000000US length 13 + "startEC_endUS": regexp.MustCompile(`(?i)^EC\d{9}US$`), - // EA000000000US length 13 - "startEA_endUS": regexp.MustCompile(`(?i)^EA[\d]{9}US$`), + // EA000000000US length 13 + "startEA_endUS": regexp.MustCompile(`(?i)^EA\d{9}US$`), - // CP000000000US length 13 - "startCP_endUS": regexp.MustCompile(`(?i)^CP[\d]{9}US$`), + // CP000000000US length 13 + "startCP_endUS": regexp.MustCompile(`(?i)^CP\d{9}US$`), - // 8200000000 length 10 - //10 in UPS and DHL as well !!! - "start80": regexp.MustCompile(`(?i)^82[\d]{8}$`), + // 8200000000 length 10 + // 10 in UPS and DHL as well !!! + "start80": regexp.MustCompile(`(?i)^82\d{8}$`), } type api interface {