go-pb-jubilee/fsexplore/fsexplore.go

259 lines
5.8 KiB
Go
Raw Permalink Normal View History

2024-08-27 23:24:33 +00:00
package fsexplore
import (
"encoding/json"
"fmt"
"github.com/pocketbase/dbx"
"github.com/pocketbase/pocketbase"
"github.com/pocketbase/pocketbase/models"
"jubilee-server/fsq"
"jubilee-server/structs"
"log"
"strconv"
)
type (
ReducedDetail struct {
Name string `json:"name"`
Description string `json:"description"`
Category string `json:"category"`
Icon string `json:"icon"`
Id string `json:"id"`
Provider string `json:"provider"`
Address string `json:"address"`
City string `json:"city"`
State string `json:"state"`
Postcode string `json:"postcode"`
Twitter string `json:"twitter"`
Facebook string `json:"facebook"`
Url string `json:"url"`
Latitude float64 `json:"latitude"`
Longitude float64 `json:"longitude"`
Images []string `json:"images"`
}
DbRecord struct {
Fsqid string `json:"fsqid" db:"fsqid"`
Data string `json:"data" db:"data"`
}
)
func FsRequest(latLong structs.LatLong, soqval string, soqtype string, limit string) string {
log.Println("$$:fsexplore:FsRequest")
log.Printf("latLong: %s", latLong)
log.Printf("soqval: %s", soqval)
log.Printf("limit: %s", limit)
log.Printf("soqtype: %s", soqtype)
data := GetRemoteFSRequest(latLong, soqval, soqtype, limit)
return data
}
func FsRequestDetails(app *pocketbase.PocketBase, fsqid string) string {
log.Println("$$:fsexplore:FsRequestDetails")
log.Printf("fsqid: %s", fsqid)
formattedDetails := &DbRecord{}
dberr := app.Dao().DB().
Select("fsqid", "data").From("fsdetails").
Where(dbx.NewExp("fsqid = {:fsqid}", dbx.Params{"fsqid": fsqid})).One(&formattedDetails)
if dberr == nil {
log.Printf("-- Cache hit fsDetails %+v\n", formattedDetails.Fsqid)
return formattedDetails.Data
}
data := GetRemoteDetailRequest(fsqid)
formattedDetails.Fsqid = fsqid
formattedDetails.Data = data
go func() {
err := SaveReducedDetails(app, *formattedDetails)
if err != nil {
log.Println(err)
}
}()
return data
}
func GetRemoteFSRequest(ll structs.LatLong, soqval string, soqtype string, limit string) string {
lat := strconv.FormatFloat(ll.Lat, 'f', -1, 64)
long := strconv.FormatFloat(ll.Long, 'f', -1, 64)
var modifiertype string
if soqtype == "q" {
modifiertype = "chain"
} else {
modifiertype = "category"
}
modifier := soqval
client := fsq.NewQueryForLocation("fsq3ksL8PkGBLhDJ6Bydixoa9Lah6djwvm5a5LIWrtmFexc=", lat, long, "", 1000, modifiertype, modifier)
log.Printf("client: %s", client)
s, err := client.SearchRaw()
if err != nil {
log.Println("Error:", err)
}
return s
}
func GetRemoteDetailRequest(fsqid string) string {
client := fsq.NewQueryPlaceDetails("fsq3ksL8PkGBLhDJ6Bydixoa9Lah6djwvm5a5LIWrtmFexc=", fsqid)
details, de := client.GetDetailsRaw()
if de != nil {
log.Println("Error:", de)
}
photos, pe := client.GetPhotosRaw()
if pe != nil {
log.Println("Error:", pe)
}
mergedData, _ := mergeDetails(details, photos)
return mergedData
}
func mergeDetails(details string, photos string) (jstr string, err error) {
rd := reduceDetails(details)
images := reducePhotos(photos)
rd.Images = images
log.Printf("RD: %+v\n", rd)
j, err := json.Marshal(rd)
return string(j), err
}
func reduceDetails(details string) *ReducedDetail {
dataPtr := &fsq.Results4sqPlaces{}
reducedDetails := ReducedDetail{}
err := json.Unmarshal([]byte(details), dataPtr)
log.Println("Error", err)
reducedDetails.Name = dataPtr.Name
reducedDetails.Description = dataPtr.Description
reducedDetails.Category = dataPtr.Categories[0].ShortName
reducedDetails.Icon = dataPtr.Categories[0].Icon.Prefix + "64" + dataPtr.Categories[0].Icon.Suffix
reducedDetails.Id = dataPtr.FsqId
reducedDetails.Provider = "foursquare"
reducedDetails.Address = dataPtr.Location.FormattedAddress
reducedDetails.City = dataPtr.Location.PostTown
reducedDetails.State = dataPtr.Location.Region
reducedDetails.Postcode = dataPtr.Location.Postcode
reducedDetails.Twitter = dataPtr.SocialMedia.Twitter
reducedDetails.Facebook = dataPtr.SocialMedia.FacebookId
reducedDetails.Longitude = dataPtr.Geocodes.Main.Longitude
reducedDetails.Latitude = dataPtr.Geocodes.Main.Latitude
return &reducedDetails
}
func reducePhotos(photos string) []string {
dataPtr := &[]fsq.Photos4sqPlaces{}
var images []string
err := json.Unmarshal([]byte(photos), dataPtr)
log.Println("Error", err)
for _, photo := range *dataPtr {
prefix := photo.Prefix
suffix := photo.Suffix
width := photo.Width
height := photo.Height
ratioHeight := 480
log.Printf("%+v,%+v => 640, %+v \n", width, height, ratioHeight)
output := fmt.Sprintf("%s640%s", prefix, suffix)
log.Println(output)
images = append(images, output)
}
return images
}
func SaveReducedDetails(app *pocketbase.PocketBase, newDetails DbRecord) error {
log.Println("$$:SaveReducedDetails", newDetails.Fsqid)
collection, err := app.Dao().FindCollectionByNameOrId("fsdetails")
if err != nil {
log.Println(err)
return err
}
record, recErr := app.Dao().FindRecordsByExpr("fsdetails", dbx.NewExp("fsqid = {:fsqid}", dbx.Params{"fsqid": newDetails.Fsqid}))
if recErr != nil {
log.Println(recErr)
return recErr
}
if len(record) == 0 {
log.Println("-- Insert new fsdetails record")
record := models.NewRecord(collection)
record.Set("fsqid", newDetails.Fsqid)
record.Set("data", newDetails.Data)
if err := app.Dao().SaveRecord(record); err != nil {
log.Println("ERROR!! SaveReducedDetails NewRecord")
log.Println(err)
return err
}
} else {
log.Println("-- Update weather record")
rec := record[0]
rec.Set("data", newDetails.Data)
if err := app.Dao().SaveRecord(rec); err != nil {
log.Println("ERROR!! SaveReducedDetails SaveRecord")
log.Println(err)
return err
}
}
return nil
}