From 4d8b56b0b239177442a0fdec39e16b6b83c64d07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Mon, 26 Sep 2022 22:16:52 +0300 Subject: [PATCH] Working version Need some refactoring, but working. --- Makefile | 5 ++- readme.md | 8 +++++ src/client_server/handlers.go | 49 +++++++++++++++++++++++----- src/custom_types/partners_address.go | 6 ++++ src/requests_types/response_type.go | 11 ++++--- 5 files changed, 64 insertions(+), 15 deletions(-) create mode 100644 src/custom_types/partners_address.go diff --git a/Makefile b/Makefile index 9d8f223..0b82deb 100644 --- a/Makefile +++ b/Makefile @@ -1,2 +1,5 @@ run: - go run src/main.go -p 5053 + go run src/main.go -p 5053 -d "127.0.0.1:5059" + +build: + go build -o bin/simple-choose-ad src/main.go diff --git a/readme.md b/readme.md index e69de29..c67a218 100644 --- a/readme.md +++ b/readme.md @@ -0,0 +1,8 @@ +# Микросервис для выбора рекламных предложений от партнеров + +Запуск +```shell +make build +./bin/simple-choose-ad -p PORT -d "IP:PORT" +``` +где `PORT` это порт для входящих запросов, который слушает сервис, а `IP:PORT,IP2:PORT` список рекламных партнеров. diff --git a/src/client_server/handlers.go b/src/client_server/handlers.go index 009e8df..a080861 100644 --- a/src/client_server/handlers.go +++ b/src/client_server/handlers.go @@ -11,6 +11,7 @@ import ( "net/http" customtypes "sample-choose-ad/src/custom_types" req_types "sample-choose-ad/src/requests_types" + "sort" ) // Create requset body based in incoming reqest `ir` and return @@ -79,7 +80,13 @@ func handleRequest(partners []customtypes.PartnersAddress) http.HandlerFunc { p_body := constructPartnersRequestBody(&incReq) - var partnersRespones []req_types.SuccesResponse + // Two data structures: + // partnersRespones for getting price with O(1) complexity + // []prices as slice of actual prices + // var partnersRespones map[float64]req_types.RespImp + partnersRespones := make(map[uint]map[float64]req_types.RespImp) + prices := make(map[uint][]float64) + for _, p := range partners { url := fmt.Sprintf("http://%v:%v", p.Ip, p.Port) @@ -90,7 +97,14 @@ func handleRequest(partners []customtypes.PartnersAddress) http.HandlerFunc { continue } // adding only successful responses - partnersRespones = append(partnersRespones, re) + for _, r := range re.Imp { + if partnersRespones[r.Id] == nil { + partnersRespones[r.Id] = make(map[float64]req_types.RespImp) + } + partnersRespones[r.Id][r.Price] = r + prices[r.Id] = append(prices[r.Id], r.Price) + } + } if len(partnersRespones) == 0 { @@ -98,17 +112,34 @@ func handleRequest(partners []customtypes.PartnersAddress) http.HandlerFunc { return } - // для каждого tile в incReq надо найти - // maxPrice := 0 + // Sorting prices, now biggest price at index len-1 + for _, p := range prices { + sort.Float64s(p) + } - // var bestOptionRespone req_types.SuccesResponse - var bestOptions []req_types.Imp - _ = bestOptions + var bestOptions []req_types.RespImp + // for each tile peak best price for _, tile := range incReq.Tiles { - for _, partner := range partnersRespones { - } + last := len(prices[tile.Id]) - 1 + biggestPrice := prices[tile.Id][last] + _ = biggestPrice + bestOptions = append(bestOptions, partnersRespones[tile.Id][biggestPrice]) + } + + response := req_types.SuccesResponse{ + Id: *incReq.Id, + Imp: bestOptions, + } + + respJSON, err := json.Marshal(response) + + if err != nil { + log.Println(err) } + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + w.Write(respJSON) } } diff --git a/src/custom_types/partners_address.go b/src/custom_types/partners_address.go new file mode 100644 index 0000000..fac959f --- /dev/null +++ b/src/custom_types/partners_address.go @@ -0,0 +1,6 @@ +package customtypes + +type PartnersAddress struct { + Ip string + Port int64 +} diff --git a/src/requests_types/response_type.go b/src/requests_types/response_type.go index 2164814..6dabcf8 100644 --- a/src/requests_types/response_type.go +++ b/src/requests_types/response_type.go @@ -1,11 +1,12 @@ package req_types type RespImp struct { - Width uint - Height uint - Tile string - Url string - Price float64 + Id uint `json:"id"` + Width uint `json:"width"` + Height uint `json:"height"` + Tile string `json:"tile"` + Url string `json:"url"` + Price float64 `json:"price"` } // Response from ad partners