summaryrefslogtreecommitdiffstats
path: root/main.go
diff options
context:
space:
mode:
authorraylu <raylu@mixpanel.com>2011-08-07 18:48:51 -0700
committerraylu <raylu@mixpanel.com>2011-08-07 18:48:51 -0700
commitc5856a0d115cb46760a359d45a3a734fc1d51b52 (patch)
treef3cccc20d5f4793490ccc9208de7524896edd6a0 /main.go
parentf61e03f7f43536adce71c5783536aa67f63f029d (diff)
downloadaudioaxis-c5856a0d115cb46760a359d45a3a734fc1d51b52.tar.xz
move (reorder) and move updates
Diffstat (limited to 'main.go')
-rw-r--r--main.go101
1 files changed, 71 insertions, 30 deletions
diff --git a/main.go b/main.go
index 29724b2..c5023f6 100644
--- a/main.go
+++ b/main.go
@@ -24,33 +24,6 @@ var templates map[string]*template.Template
const debug = true
var db *mysql.Client
-// given an id ('abcd1234'), return the pid (1)
-func getpid(id string) int {
- query, err := db.Prepare("SELECT `pid` FROM `playlist` WHERE `id` = ?;")
- if err != nil {
- return -1
- }
- err = query.BindParams(id)
- if err != nil {
- return -1
- }
- err = query.Execute()
- if err != nil {
- return -1
- }
- var pid int
- query.BindResult(&pid)
- _, err = query.Fetch()
- if err != nil {
- return -1
- }
- err = query.FreeResult()
- if err != nil {
- return -1
- }
- return pid
-}
-
func home(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "path is %s", r.URL.Path[1:])
}
@@ -91,7 +64,7 @@ func add(w http.ResponseWriter, r *http.Request) {
return
}
- sql :="INSERT INTO `song` (`pid`,`yid`,`title`,`user`) VALUES(%d,'%s','%s','%s')"
+ sql := "INSERT INTO `song` (`pid`,`yid`,`title`,`user`) VALUES(%d,'%s','%s','%s')"
sql = fmt.Sprintf(sql, pid,
db.Escape(q.Get("yid")),
db.Escape(q.Get("title")),
@@ -115,7 +88,7 @@ func remove(w http.ResponseWriter, r *http.Request) {
return
}
- sql :="DELETE FROM `song` WHERE `pid` = %d AND yid = '%s'"
+ sql := "DELETE FROM `song` WHERE `pid` = %d AND yid = '%s'"
sql = fmt.Sprintf(sql, pid, q.Get("yid"))
err := db.Query(sql)
if err != nil {
@@ -127,11 +100,78 @@ func remove(w http.ResponseWriter, r *http.Request) {
addUpdate(pid, removeAction, &Song{Yid: q.Get("yid")})
}
+func move(w http.ResponseWriter, r *http.Request) {
+ q := r.URL.Query()
+ pid := getpid(q.Get("pid"))
+ if pid == -1 {
+ http.Error(w, "invalid pid", http.StatusInternalServerError)
+ return
+ }
+
+ direction, err := strconv.Atoui(q.Get("direction"))
+ if err != nil {
+ http.Error(w, err.String(), http.StatusInternalServerError)
+ return
+ }
+
+ err = db.Start()
+ if err != nil {
+ http.Error(w, err.String(), http.StatusInternalServerError)
+ return
+ }
+
+ order, err := queryInt("SELECT `order` FROM `song` WHERE `yid` = ? AND `pid` = ?",
+ q.Get("yid"), pid)
+ if err != nil {
+ http.Error(w, err.String(), http.StatusInternalServerError)
+ return
+ }
+ newOrder := order
+ if direction == moveUpAction && order > 0 {
+ newOrder--
+ } else if direction == moveDownAction {
+ newOrder++
+ } else {
+ http.Error(w, "invalid direction or cannot move up", http.StatusInternalServerError)
+ return
+ }
+
+ sql := "UPDATE `song` SET `order` = %d WHERE `order` = %d AND pid = %d"
+ sql = fmt.Sprintf(sql, order, newOrder, pid)
+ err = db.Query(sql)
+ if err != nil {
+ http.Error(w, err.String(), http.StatusInternalServerError)
+ return
+ } else if db.AffectedRows != 1 {
+ db.Rollback()
+ http.Error(w, "invalid direction for this song", http.StatusInternalServerError)
+ return
+ }
+ // there are now two songs with that order, so also check yid
+ sql = "UPDATE `song` SET `order` = %d WHERE `order` = %d AND pid = %d AND yid = '%s'"
+ sql = fmt.Sprintf(sql, newOrder, order, pid, q.Get("yid"))
+ err = db.Query(sql)
+ if err != nil {
+ db.Rollback()
+ http.Error(w, err.String(), http.StatusInternalServerError)
+ return
+ }
+
+ err = db.Commit()
+ if err != nil {
+ http.Error(w, err.String(), http.StatusInternalServerError)
+ return
+ }
+
+ w.Write([]byte("1"))
+ addUpdate(pid, direction, &Song{Yid: q.Get("yid")})
+}
+
func poll(w http.ResponseWriter, r *http.Request) {
q := r.URL.Query()
timestamp := q.Get("timestamp")
if timestamp == "0" {
- query, err := db.Prepare("SELECT `yid`,`title`,`user` FROM `playlist` JOIN `song` WHERE `id` = ?;")
+ query, err := db.Prepare("SELECT `yid`,`title`,`user` FROM `playlist` JOIN `song` WHERE `id` = ? ORDER BY `order` ASC")
if err != nil {
http.Error(w, err.String(), http.StatusInternalServerError)
return
@@ -227,6 +267,7 @@ func main() {
http.HandleFunc("/p/", playlist)
http.HandleFunc("/add/", add)
http.HandleFunc("/remove/", remove)
+ http.HandleFunc("/move/", move)
http.HandleFunc("/poll/", poll)
err = http.ListenAndServe("localhost:8000", nil)
if err != nil {