Browse Source

add /create

raylu 14 years ago
parent
commit
014af112e9
1 changed files with 41 additions and 4 deletions
  1. 41 4
      main.go

+ 41 - 4
main.go

@@ -8,6 +8,9 @@ import (
 	"json"
 	"strconv"
 	"time"
+	"rand"
+	"unicode"
+	"utf8"
 )
 
 type Song struct {
@@ -24,7 +27,7 @@ const debug = true
 
 func main() {
 	templates = template.SetMust(template.ParseTemplateFiles("templates/*.html"))
-
+	rand.Seed(time.Nanoseconds())
 	initDb()
 
 	http.HandleFunc("/", home)
@@ -33,6 +36,7 @@ func main() {
 	http.HandleFunc("/remove/", remove)
 	http.HandleFunc("/move/", move)
 	http.HandleFunc("/poll/", poll)
+	http.HandleFunc("/create/", create)
 	err := http.ListenAndServe("localhost:8000", nil)
 	if err != nil {
 		fmt.Println(err)
@@ -62,10 +66,19 @@ func home(w http.ResponseWriter, r *http.Request) {
 
 func playlist(w http.ResponseWriter, r *http.Request) {
 	id := r.URL.Path[len("/p/"):]
-	if len(id) != 8 {
-		http.Redirect(w, r, "/", 303)
+	if len(id) < 8 {
+		http.Redirect(w, r, "/", http.StatusSeeOther)
+		return
+	}
+
+	db := <-dbPool
+	defer func () {dbPool <- db}()
+	count, err := queryInt(db, "SELECT COUNT(`pid`) FROM `playlist` WHERE `id` = ?", id)
+	if count == 0 || err != nil {
+		http.Redirect(w, r, "/", http.StatusSeeOther)
 		return
 	}
+
 	p := Playlist{Id: id}
 	renderPage(w, "p", p)
 }
@@ -245,7 +258,7 @@ func poll(w http.ResponseWriter, r *http.Request) {
 		defer func () {dbPool <- db}()
 
 		query, err := prepare(db,
-				"SELECT `yid`,`title`,`user` FROM `playlist` JOIN `song` WHERE `id` = ? ORDER BY `order` ASC",
+				"SELECT `yid`,`title`,`user` FROM `playlist` JOIN `song` USING(`pid`) WHERE `id` = ? ORDER BY `order` ASC",
 				q.Get("pid"))
 
 		updates := make([]Update, 0, 2)
@@ -299,3 +312,27 @@ func poll(w http.ResponseWriter, r *http.Request) {
 		w.Write([]byte("[]"))
 	}
 }
+
+func create(w http.ResponseWriter, r *http.Request) {
+	id := make([]byte, 24)
+	pos := id
+	for i := 0; i < 8; i++ {
+		for {
+			rune := rand.Intn(65536) // mysql only supports the first 65535 code points
+			if unicode.IsGraphic(rune) {
+				bytes := utf8.EncodeRune(pos, rune)
+				pos = pos[bytes:]
+				break
+			}
+		}
+	}
+	idStr := string(id)
+	db := <-dbPool
+	defer func () {dbPool <- db}()
+	_, err := prepare(db, "INSERT INTO `playlist` (`id`) VALUES(?)", idStr)
+	if err != nil {
+		http.Error(w, err.String(), http.StatusInternalServerError)
+		return
+	}
+	http.Redirect(w, r, "/p/" + idStr, http.StatusSeeOther)
+}