// devices is the logic implementation of the Devices page. func devices(p *page.Params) { c := p.AppCtx fv := p.Request.PostFormValue // Initial values: p.Custom["SearchPrecision"] = 1000 p.Custom["LogsRetention"] = 60 // Detect form submits: switch { case fv("submitAdd") != "": // Add New Device form submitted! // Checks: switch { case !checkName(p, fv("name")): case !checkSearchPrecision(p, fv("searchPrecision")): case !checkLogsRetention(p, fv("logsRetention")): } if p.ErrorMsg == nil { // All data OK, save new Device searchPrecision, _ := strconv.ParseInt(fv("searchPrecision"), 10, 64) logsRetention, _ := strconv.Atoi(fv("logsRetention")) dev := ds.Device{fv("name"), 0, logsRetention, "", time.Now(), 0} dev.SetSearchPrecision(searchPrecision) genNewRandID(p, &dev) if p.Err != nil { return } if _, p.Err = datastore.Put(c, datastore.NewIncompleteKey(c, ds.ENameDevice, p.Account.GetKey(c)), &dev); p.Err != nil { return // Datastore error } p.InfoMsg = "New Device saved successfully." // Clear from memcache: cache.ClearDevListForAccKey(c, p.Account.GetKey(c)) } else { // Submitted values p.Custom["Name"] = fv("name") p.Custom["SearchPrecision"] = fv("searchPrecision") p.Custom["LogsRetention"] = fv("logsRetention") } case fv("submitRename") != "": // Rename Device form submitted! if !checkName(p, fv("name")) { break } if devID, err := strconv.ParseInt(string(fv("devID")), 10, 64); err != nil { p.ErrorMsg = "Invalid Device!" } else { devKey := datastore.NewKey(c, ds.ENameDevice, "", devID, p.Account.GetKey(c)) var dev ds.Device if err = datastore.Get(c, devKey, &dev); err != nil { if err == datastore.ErrNoSuchEntity { p.ErrorMsg = "You do not have access to the specified Device!" } else { // Real datastore error p.Err = err return } } else { // Proceed to rename dev.Name = fv("name") if _, p.Err = datastore.Put(c, devKey, &dev); p.Err != nil { return // Datastore error } p.InfoMsg = "Device renamed successfully." // Clear from memcache: cache.ClearDevListForAccKey(c, p.Account.GetKey(c)) cache.ClearDeviceForRandID(c, dev.RandID) dev.KeyID = devID // This is important (device is loaded freshly and not yet set)! cache.CacheDevice(c, &dev) } } case fv("submitGenNewKey") != "": // Generate New Key form submitted! if devID, err := strconv.ParseInt(string(fv("devID")), 10, 64); err != nil { p.ErrorMsg = "Invalid Device!" } else { devKey := datastore.NewKey(c, ds.ENameDevice, "", devID, p.Account.GetKey(c)) var dev ds.Device if err = datastore.Get(c, devKey, &dev); err != nil { if err == datastore.ErrNoSuchEntity { p.ErrorMsg = "You do not have access to the specified Device!" } else { // Real datastore error p.Err = err return } } else { // Proceed to generate new key // Store old RandID to remove it from cache if saving succeeds oldRandID := dev.RandID genNewRandID(p, &dev) if p.Err != nil { return } if _, p.Err = datastore.Put(c, devKey, &dev); p.Err != nil { return // Datastore error } p.InfoMsg = template.HTML("New Key generated successfully.") p.ImportantMsg = template.HTML("<b>Important!</b> You have to update the URL in the client application else further GPS tracking calls will be discarded!") cache.ClearDeviceForRandID(c, oldRandID) dev.KeyID = devID // This is important (device is loaded freshly and not yet set)! cache.CacheDevice(c, &dev) } } } q := datastore.NewQuery(ds.ENameDevice).Ancestor(p.Account.GetKey(c)).Order(ds.PNameName) var devices []*ds.Device var devKeys []*datastore.Key if devKeys, p.Err = q.GetAll(c, &devices); p.Err != nil { return } for i := range devices { devices[i].KeyID = devKeys[i].IntID() } p.Custom["Devices"] = devices }