package data import ( "context" "database/sql" "fmt" "strings" ) // GetStationName returns stations.name by station_id; empty string if not found/null. func GetStationName(ctx context.Context, stationID string) (string, error) { const q = `SELECT COALESCE(name, '') FROM stations WHERE station_id = $1` var name sql.NullString err := DB().QueryRowContext(ctx, q, stationID).Scan(&name) if err != nil { if err == sql.ErrNoRows { return "", nil } return "", err } if name.Valid { return name.String, nil } return "", nil } // StationInfo contains minimal fields for alert checks. type StationInfo struct { ID string Name string Location string Latitude float64 Longitude float64 Altitude float64 } // ListEligibleStations returns WH65LP stations with required non-empty fields. func ListEligibleStations(ctx context.Context) ([]StationInfo, error) { const q = ` SELECT station_id, COALESCE(NULLIF(BTRIM(name), ''), station_id) AS name, location, latitude::float8, longitude::float8, altitude::float8 FROM stations WHERE device_type = 'WH65LP' AND name IS NOT NULL AND BTRIM(name) <> '' AND location IS NOT NULL AND BTRIM(location) <> '' AND latitude IS NOT NULL AND latitude <> 0 AND longitude IS NOT NULL AND longitude <> 0 AND altitude IS NOT NULL AND altitude <> 0` rows, err := DB().QueryContext(ctx, q) if err != nil { return nil, err } defer rows.Close() var out []StationInfo for rows.Next() { var st StationInfo if err := rows.Scan(&st.ID, &st.Name, &st.Location, &st.Latitude, &st.Longitude, &st.Altitude); err != nil { continue } out = append(out, st) } return out, nil } // ListStationsByIDs returns stations by a given id list (ignores missing ones). func ListStationsByIDs(ctx context.Context, ids []string) ([]StationInfo, error) { if len(ids) == 0 { return nil, nil } var placeholders []string args := make([]interface{}, 0, len(ids)) for i, id := range ids { placeholders = append(placeholders, fmt.Sprintf("$%d", i+1)) args = append(args, id) } q := fmt.Sprintf(` SELECT station_id, COALESCE(NULLIF(BTRIM(name), ''), station_id) AS name, location, latitude::float8, longitude::float8, altitude::float8 FROM stations WHERE station_id IN (%s)`, strings.Join(placeholders, ",")) rows, err := DB().QueryContext(ctx, q, args...) if err != nil { return nil, err } defer rows.Close() var out []StationInfo for rows.Next() { var st StationInfo if err := rows.Scan(&st.ID, &st.Name, &st.Location, &st.Latitude, &st.Longitude, &st.Altitude); err != nil { continue } out = append(out, st) } return out, nil }