package admin import ( "bytes" "cic-dw/pkg/address" "context" "encoding/base64" "net/http" "strings" "github.com/grassrootseconomics/cic-go/meta" "github.com/labstack/echo/v4" "github.com/mapaiva/vcard-go" ) type metaRes struct { Person meta.PersonResponse `json:"person"` Name string `json:"name"` } func handlePhone2Address(c echo.Context) error { var ( api = c.Get("api").(*api) phone = c.Param("phone") address string ) if err := api.db.QueryRow(context.Background(), api.q["phone-2-address"], phone).Scan(&address); err != nil { return c.String(http.StatusNotFound, "phone not found") } return c.String(http.StatusOK, address) } func handleAddress2Phone(c echo.Context) error { var ( api = c.Get("api").(*api) phone string ) sarafuAddress, err := address.SarafuAddress(c.Param("address")) if err != nil { return err } if err := api.db.QueryRow(context.Background(), api.q["address-2-phone"], sarafuAddress).Scan(&phone); err != nil { return c.String(http.StatusNotFound, "address not found") } return c.String(http.StatusOK, phone) } func handleMetaProxy(c echo.Context) error { var ( api = c.Get("api").(*api) address = c.Param("address") ) person, err := api.m.GetPersonMetadata(address) if err != nil { if strings.Contains(err.Error(), "404") { return c.String(http.StatusNotFound, "meta resource not found") } else { return err } } vCard, err := parseVCard(person.VCard) if err != nil { return err } return c.JSON(http.StatusOK, &metaRes{ Person: person, Name: vCard.FormattedName, }) } func parseVCard(encodedVCard string) (vcard.VCard, error) { data, err := base64.StdEncoding.DecodeString(encodedVCard) if err != nil { return vcard.VCard{}, err } reader := bytes.NewReader(data) vCards, err := vcard.GetVCardsByReader(reader) if err != nil { return vcard.VCard{}, nil } return vCards[0], nil }