56 lines
1.1 KiB
Go
56 lines
1.1 KiB
Go
package controllers
|
|
|
|
import (
|
|
"addrss/pkg/postal"
|
|
"addrss/pkg/router"
|
|
)
|
|
|
|
type Api struct{}
|
|
|
|
func (a Api) AddRoutes() {
|
|
router.AddGet("/suggestions", suggestions).Anonymous()
|
|
router.AddGet("/parse", parse).Anonymous()
|
|
}
|
|
|
|
func suggestions(ctx *router.Context) {
|
|
address, err := ctx.Request.Query("address")
|
|
if err != nil {
|
|
ctx.Response.BadRequest(err)
|
|
}
|
|
|
|
var parsedSlice []map[string]any
|
|
|
|
expansions := postal.ExpandAddress(address.(string))
|
|
for i := 0; i < len(expansions); i++ {
|
|
parsed := parseAddress(expansions[i])
|
|
parsedSlice = append(parsedSlice, parsed)
|
|
}
|
|
|
|
ctx.Response.OK(parsedSlice)
|
|
}
|
|
|
|
func parse(ctx *router.Context) {
|
|
address, err := ctx.Request.Query("address")
|
|
if err != nil {
|
|
ctx.Response.BadRequest(err)
|
|
}
|
|
|
|
parsed := parseAddress(address.(string))
|
|
ctx.Response.OK(parsed)
|
|
}
|
|
|
|
func parseAddress(address string) map[string]any {
|
|
pa := postal.ParseAddress(address)
|
|
addr := map[string]any{}
|
|
|
|
for i := 0; i < len(pa); i++ {
|
|
// This is hacky, but renaming in libpostal involves retraining the model.
|
|
if pa[i].Label == "postcode" {
|
|
pa[i].Label = "zip_code"
|
|
}
|
|
addr[pa[i].Label] = pa[i].Value
|
|
}
|
|
|
|
return addr
|
|
}
|