func satellitePostContactHandler( sdb *db.StationDB, cdb *db.ContactDB, w http.ResponseWriter, r *http.Request, user userView) { if r.Method != "POST" { http.Redirect(w, r, satelliteListUrl, http.StatusFound) return } if err := r.ParseForm(); err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } log.Printf("satellitePostContactHandler form: %v\n\n", r.Form) satellite_id := r.Form.Get("satellite_id") if satellite_id == "" { http.Error(w, "Missing satellite id", http.StatusBadRequest) return } sat := db.GlobalSatelliteDB().Map[satellite_id] if sat == nil { http.Error(w, "Unknown satellite id", http.StatusBadRequest) return } timestamp, err := strconv.ParseInt(r.Form.Get("timestamp"), 10, 64) if err != nil { http.Error(w, "Can't parse timestamp.", http.StatusBadRequest) return } data := r.Form.Get("data") frame := ([]byte)(data) var station *pb.Station // There are two options: logged-in or anonymous. if user.Id == "" { // Anonymous station = nil } else { // Logged-in user station_id := r.Form.Get("station_id") if station_id == "" { http.Error( w, "Missing station id", http.StatusBadRequest) return } station, err = sdb.Lookup(station_id) if err != nil { log.Printf("Error looking up station: %s", err.Error()) http.Error(w, "", http.StatusInternalServerError) return } } contact, poperr := contacts.PopulateContact( satellite_id, timestamp, "FREEFORM", frame, user.Id, "", station) if poperr != nil { poperr.HttpError(w) return } log.Printf("Contact: %s", contact) err = cdb.Store(contact) if err != nil { log.Printf("Error storing contact: %s", err.Error()) http.Error(w, "", http.StatusInternalServerError) return } var cc contactConfirmContext cc.SatelliteUrl = satelliteViewURL(*sat.Id) cc.SatelliteName = RenderSatelliteName(sat.Name) cc.Data = data if sat.Schema != nil { t := make([]pb.TelemetryDatum, 0) for _, b := range contact.Blob { if b.Format != nil && *b.Format == pb.Contact_Blob_DATUM { t = append(t, *b.Datum) } } cc.Telemetry = fe_telemetry.RenderTelemetry( *sat.Schema, t, "en") } err = contactConfirmTemplate.Get().ExecuteTemplate( w, "contact_confirm.html", NewRenderContext(user, cc)) if err != nil { log.Printf( "Error rendering contact_confirm view: %s", err.Error()) http.Error(w, "", http.StatusInternalServerError) return } }
func satelliteViewHandler( cdb *db.ContactDB, userdb *db.UserDB, stationdb *db.StationDB, commentdb *db.CommentDB, w http.ResponseWriter, r *http.Request, user userView) { if len(r.URL.Path) < len(satelliteURLPrefix) { http.Error(w, "Invalid path", http.StatusBadRequest) return } id := r.URL.Path[len(satelliteURLPrefix):] sat := db.GlobalSatelliteDB().Map[id] if sat == nil { http.NotFound(w, r) return } // TODO: It would be better if we could restrict to contacts which // have telemetry. contacts, err := cdb.SearchBySatelliteId(id, 100) if err != nil { log.Printf("cdb.SearchBySatelliteId error: %s", err.Error()) // Continue since this isn't a critical error. } t := make([]pb.TelemetryDatum, 0) var latest_contact *contactView for _, c := range contacts { for _, b := range c.Blob { if b.Format != nil && *b.Format == pb.Contact_Blob_DATUM { t = append(t, *b.Datum) if latest_contact == nil { latest_contact = fillContactView( *c, userdb) } } } } sv := satelliteViewContext{} sv.S = sat if sat.Schema != nil { t := fe_telemetry.RenderTelemetry(*sat.Schema, t, "en") if len(t) > 0 { sv.TelemetryHead = t[0] } if len(t) > 1 { sv.TelemetryTail = t[1:] } } sv.LatestContact = latest_contact sv.Comments, _ = LoadCommentsByObjectId( satelliteObjectId(id), commentdb, userdb) sv.Stations, err = stationdb.UserStations(user.Id) if err != nil { log.Printf("Error getting user stations: %s", err.Error()) // Continue rendering since it's not a critial error. } c := NewRenderContext(user, &sv) err = satelliteViewTemplate.Get().ExecuteTemplate( w, "satellite.html", c) if err != nil { log.Printf("Error rendering satellite view: %s", err.Error()) http.Error(w, "", http.StatusInternalServerError) return } }