1
0
mirror of https://github.com/raseels-repos/golang-saas-starter-kit.git synced 2025-06-10 23:57:45 +02:00

159 lines
4.1 KiB
Go

package handlers
import (
"context"
"fmt"
"net/http"
"strings"
"geeks-accelerator/oss/saas-starter-kit/internal/geonames"
"geeks-accelerator/oss/saas-starter-kit/internal/platform/web"
"github.com/jmoiron/sqlx"
"gopkg.in/DataDog/dd-trace-go.v1/contrib/go-redis/redis"
)
// Check provides support for orchestration geo endpoints.
type Geo struct {
MasterDB *sqlx.DB
Redis *redis.Client
}
// GeonameByPostalCode...
func (h *Geo) GeonameByPostalCode(ctx context.Context, w http.ResponseWriter, r *http.Request, params map[string]string) error {
var filters []string
var args []interface{}
if qv := r.URL.Query().Get("country_code"); qv != "" {
filters = append(filters, "country_code = ?")
args = append(args, strings.ToUpper(qv))
}
if qv := r.URL.Query().Get("postal_code"); qv != "" {
filters = append(filters, "postal_code = ?")
args = append(args, strings.ToLower(qv))
} else {
filters = append(filters, "lower(postal_code) = ?")
args = append(args, strings.ToLower(params["postalCode"]))
}
where := strings.Join(filters, " AND ")
res, err := geonames.FindGeonames(ctx, h.MasterDB, "postal_code", where, args...)
if err != nil {
fmt.Printf("%+v", err)
return web.RespondJsonError(ctx, w, err)
}
var resp interface{}
if len(res) == 1 {
resp = res[0]
} else {
// Autocomplete does not like null returned.
resp = make(map[string]interface{})
}
return web.RespondJson(ctx, w, resp, http.StatusOK)
}
// PostalCodesAutocomplete...
func (h *Geo) PostalCodesAutocomplete(ctx context.Context, w http.ResponseWriter, r *http.Request, params map[string]string) error {
var filters []string
var args []interface{}
if qv := r.URL.Query().Get("country_code"); qv != "" {
filters = append(filters, "country_code = ?")
args = append(args, strings.ToUpper(qv))
}
if qv := r.URL.Query().Get("query"); qv != "" {
filters = append(filters, "lower(postal_code) like ?")
args = append(args, strings.ToLower(qv+"%"))
}
where := strings.Join(filters, " AND ")
res, err := geonames.FindGeonamePostalCodes(ctx, h.MasterDB, where, args...)
if err != nil {
return web.RespondJsonError(ctx, w, err)
}
var list []string = res
return web.RespondJson(ctx, w, list, http.StatusOK)
}
// RegionsAutocomplete...
func (h *Geo) RegionsAutocomplete(ctx context.Context, w http.ResponseWriter, r *http.Request, params map[string]string) error {
var filters []string
var args []interface{}
if qv := r.URL.Query().Get("country_code"); qv != "" {
filters = append(filters, "country_code = ?")
args = append(args, strings.ToUpper(qv))
}
if qv := r.URL.Query().Get("query"); qv != "" {
filters = append(filters, "(lower(state_name) like ? or state_code like ?)")
args = append(args, strings.ToLower(qv+"%"), strings.ToUpper(qv+"%"))
}
where := strings.Join(filters, " AND ")
res, err := geonames.FindGeonameRegions(ctx, h.MasterDB, "state_name", where, args...)
if err != nil {
fmt.Printf("%+v", err)
return web.RespondJsonError(ctx, w, err)
}
var resp interface{}
if qv := r.URL.Query().Get("select"); qv != "" {
list := []map[string]string{}
for _, c := range res {
list = append(list, map[string]string{
"value": c.Code,
"text": c.Name,
})
}
resp = list
} else {
list := []string{}
for _, c := range res {
list = append(list, c.Name)
}
resp = list
}
return web.RespondJson(ctx, w, resp, http.StatusOK)
}
// CountryTimezones....
func (h *Geo) CountryTimezones(ctx context.Context, w http.ResponseWriter, r *http.Request, params map[string]string) error {
var filters []string
var args []interface{}
if qv := r.URL.Query().Get("country_code"); qv != "" {
filters = append(filters, "country_code = ?")
args = append(args, strings.ToUpper(qv))
} else {
filters = append(filters, "country_code = ?")
args = append(args, strings.ToUpper(params["countryCode"]))
}
where := strings.Join(filters, " AND ")
res, err := geonames.FindCountryTimezones(ctx, h.MasterDB, "timezone_id", where, args...)
if err != nil {
return web.RespondJsonError(ctx, w, err)
}
list := []string{}
for _, t := range res {
list = append(list, t.TimezoneId)
}
return web.RespondJson(ctx, w, list, http.StatusOK)
}