2026-02-04 16:07:36 +00:00
|
|
|
package rmo
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"encoding/json"
|
2026-02-05 21:43:29 +00:00
|
|
|
"fmt"
|
2026-02-04 16:07:36 +00:00
|
|
|
"net/http"
|
2026-02-05 21:43:29 +00:00
|
|
|
"strconv"
|
2026-02-05 01:35:00 +00:00
|
|
|
"strings"
|
2026-02-04 16:07:36 +00:00
|
|
|
|
|
|
|
|
//"github.com/Gleipnir-Technology/nidus-sync/config"
|
2026-03-18 15:36:20 +00:00
|
|
|
"github.com/Gleipnir-Technology/bob"
|
|
|
|
|
"github.com/Gleipnir-Technology/bob/dialect/psql"
|
|
|
|
|
"github.com/Gleipnir-Technology/bob/dialect/psql/sm"
|
2026-02-04 16:07:36 +00:00
|
|
|
"github.com/Gleipnir-Technology/nidus-sync/db"
|
2026-02-05 21:43:29 +00:00
|
|
|
"github.com/Gleipnir-Technology/nidus-sync/db/enums"
|
2026-03-13 17:33:39 +00:00
|
|
|
"github.com/Gleipnir-Technology/nidus-sync/platform"
|
2026-03-18 15:36:20 +00:00
|
|
|
"github.com/stephenafamo/scan"
|
2026-02-04 16:07:36 +00:00
|
|
|
//"github.com/go-chi/chi/v5"
|
|
|
|
|
//"github.com/rs/zerolog/log"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type ReportSuggestion struct {
|
2026-03-18 15:36:20 +00:00
|
|
|
ID string `json:"id"`
|
|
|
|
|
//Type string `json:"type"`
|
2026-02-04 16:07:36 +00:00
|
|
|
//Location string
|
|
|
|
|
}
|
|
|
|
|
type ReportSuggestionResponse struct {
|
|
|
|
|
Reports []ReportSuggestion `json:"reports"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func getReportSuggestion(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
partial_report_id := r.FormValue("r")
|
|
|
|
|
if partial_report_id == "" {
|
|
|
|
|
respondError(w, "You need at least a bit of an 'r'", nil, http.StatusBadRequest)
|
|
|
|
|
return
|
|
|
|
|
}
|
2026-02-06 16:56:26 +00:00
|
|
|
p := partialSearchParam(partial_report_id)
|
2026-02-04 16:07:36 +00:00
|
|
|
ctx := r.Context()
|
2026-03-18 15:36:20 +00:00
|
|
|
/*
|
|
|
|
|
rows, err := sql.PublicreportPublicIDSuggestion(p).All(ctx, db.PGInstance.BobDB)
|
|
|
|
|
if err != nil {
|
|
|
|
|
respondError(w, "Failed to query DB: %w", err, http.StatusInternalServerError)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
type _Row struct {
|
|
|
|
|
Location string `db:"location"`
|
|
|
|
|
PublicID string `db:"public_id"`
|
2026-02-04 16:07:36 +00:00
|
|
|
}
|
2026-03-18 15:36:20 +00:00
|
|
|
rows, err := bob.All(ctx, db.PGInstance.BobDB, psql.Select(
|
|
|
|
|
sm.Columns("public_id", "location"),
|
|
|
|
|
sm.From("publicreport.report"),
|
|
|
|
|
sm.Where(
|
|
|
|
|
psql.Quote("public_id").Like(psql.Arg(p)),
|
|
|
|
|
),
|
|
|
|
|
), scan.StructMapper[_Row]())
|
|
|
|
|
|
2026-02-04 16:07:36 +00:00
|
|
|
var result ReportSuggestionResponse
|
|
|
|
|
for _, row := range rows {
|
|
|
|
|
/*
|
|
|
|
|
value, err := row.Location.Value()
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Warn().Err(err).Msg("Failed to get value")
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
value_str, ok := value.(string)
|
|
|
|
|
if !ok {
|
|
|
|
|
log.Warn().Msg("Failed to get location as string")
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
log.Debug().Str("location", value_str).Msg("Looking at row")
|
|
|
|
|
*/
|
|
|
|
|
result.Reports = append(result.Reports, ReportSuggestion{
|
2026-03-18 15:36:20 +00:00
|
|
|
//Type: row.TableName,
|
|
|
|
|
ID: row.PublicID,
|
2026-02-04 16:07:36 +00:00
|
|
|
//Location: "",
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
jsonBody, err := json.Marshal(result)
|
|
|
|
|
if err != nil {
|
|
|
|
|
respondError(w, "Failed to marshal JSON: %w", err, http.StatusInternalServerError)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
w.Header().Set("Content-Type", "application/json")
|
|
|
|
|
w.Write(jsonBody)
|
|
|
|
|
}
|
2026-02-05 21:43:29 +00:00
|
|
|
|
2026-03-13 17:33:39 +00:00
|
|
|
func parseLatLng(r *http.Request) (platform.LatLng, error) {
|
|
|
|
|
result := platform.LatLng{
|
2026-02-05 21:43:29 +00:00
|
|
|
AccuracyType: enums.PublicreportAccuracytypeNone,
|
|
|
|
|
AccuracyValue: 0.0,
|
|
|
|
|
Latitude: nil,
|
|
|
|
|
Longitude: nil,
|
|
|
|
|
MapZoom: 0.0,
|
|
|
|
|
}
|
|
|
|
|
latitude_str := r.FormValue("latitude")
|
|
|
|
|
longitude_str := r.FormValue("longitude")
|
|
|
|
|
latlng_accuracy_type_str := r.PostFormValue("latlng-accuracy-type")
|
|
|
|
|
latlng_accuracy_value_str := r.PostFormValue("latlng-accuracy-value")
|
|
|
|
|
map_zoom_str := r.PostFormValue("map-zoom")
|
|
|
|
|
|
|
|
|
|
var err error
|
|
|
|
|
if latlng_accuracy_type_str != "" {
|
|
|
|
|
err := result.AccuracyType.Scan(latlng_accuracy_type_str)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return result, fmt.Errorf("Failed to parse accuracy type '%s': %w", latlng_accuracy_type_str, err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if latlng_accuracy_value_str != "" {
|
|
|
|
|
var t float64
|
|
|
|
|
t, err = strconv.ParseFloat(latlng_accuracy_value_str, 32)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return result, fmt.Errorf("Failed to parse latlng_accuracy_value '%s': %w", latlng_accuracy_value_str, err)
|
|
|
|
|
}
|
2026-03-13 17:33:39 +00:00
|
|
|
result.AccuracyValue = float64(t)
|
2026-02-05 21:43:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if latitude_str != "" {
|
|
|
|
|
var t float64
|
|
|
|
|
t, err = strconv.ParseFloat(latitude_str, 64)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return result, fmt.Errorf("Failed to parse latitude '%s': %w", latitude_str, err)
|
|
|
|
|
}
|
|
|
|
|
result.Latitude = &t
|
|
|
|
|
}
|
|
|
|
|
if longitude_str != "" {
|
|
|
|
|
var t float64
|
|
|
|
|
t, err := strconv.ParseFloat(longitude_str, 64)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return result, fmt.Errorf("Failed to parse longitude '%s': %w", longitude_str, err)
|
|
|
|
|
}
|
|
|
|
|
result.Longitude = &t
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if map_zoom_str != "" {
|
|
|
|
|
var t float64
|
|
|
|
|
t, err = strconv.ParseFloat(map_zoom_str, 32)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return result, fmt.Errorf("Failed to parse map_zoom_str '%s': %w", map_zoom_str, err)
|
|
|
|
|
} else {
|
|
|
|
|
result.MapZoom = float32(t)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return result, nil
|
|
|
|
|
}
|
2026-02-06 16:56:26 +00:00
|
|
|
|
|
|
|
|
func partialSearchParam(p string) string {
|
|
|
|
|
result := strings.ReplaceAll(p, "-", "")
|
|
|
|
|
result = strings.ToUpper(result)
|
|
|
|
|
return result + "%"
|
|
|
|
|
}
|