Improve api

This commit is contained in:
Eliot Whalan 2016-08-10 18:45:15 +10:00
parent e89eae4262
commit b99c59b130
1 changed files with 41 additions and 36 deletions

View File

@ -6,7 +6,6 @@ import (
"database/sql" "database/sql"
"encoding/base64" "encoding/base64"
"encoding/json" "encoding/json"
"encoding/xml"
"fmt" "fmt"
"html" "html"
"html/template" "html/template"
@ -54,12 +53,14 @@ var syntax, _ = ioutil.ReadFile("assets/syntax.html")
// Response API struct // Response API struct
type Response struct { type Response struct {
ID string `json:"id"` SUCCESS bool `json:"success"`
TITLE string `json:"title"` STATUS string `json:"status"`
SHA1 string `json:"sha1"` ID string `json:"id"`
URL string `json:"url"` TITLE string `json:"title"`
SIZE int `json:"size"` SHA1 string `json:"sha1"`
DELKEY string `json:"delkey"` URL string `json:"url"`
SIZE int `json:"size"`
DELKEY string `json:"delkey"`
} }
// Page generation struct // Page generation struct
@ -145,7 +146,7 @@ func Save(raw string, lang string, title string, expiry string) Response {
err := query.Scan(&id, &title, &hash, &paste, &delkey) err := query.Scan(&id, &title, &hash, &paste, &delkey)
Check(err) Check(err)
url := configuration.Address + "/p/" + id url := configuration.Address + "/p/" + id
return Response{id, title, hash, url, len(paste), delkey} return Response{true, "saved", id, title, hash, url, len(paste), delkey}
} }
} }
id := GenerateName() id := GenerateName()
@ -168,7 +169,7 @@ func Save(raw string, lang string, title string, expiry string) Response {
_, err = stmt.Exec(id, html.EscapeString(title), sha, dataEscaped, delKey, expiryTime) _, err = stmt.Exec(id, html.EscapeString(title), sha, dataEscaped, delKey, expiryTime)
Check(err) Check(err)
return Response{id, title, sha, url, len(dataEscaped), delKey} return Response{true, "saved", id, title, sha, url, len(dataEscaped), delKey}
} }
// DelHandler checks to see if delkey and pasteid exist in the database. // DelHandler checks to see if delkey and pasteid exist in the database.
@ -176,7 +177,7 @@ func Save(raw string, lang string, title string, expiry string) Response {
func DelHandler(w http.ResponseWriter, r *http.Request) { func DelHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r) vars := mux.Vars(r)
id := vars["pasteId"] id := vars["pasteId"]
delkey := vars["delKey"] delkey := r.FormValue("delkey")
db, err := sql.Open("mysql", DATABASE) db, err := sql.Open("mysql", DATABASE)
Check(err) Check(err)
@ -190,7 +191,13 @@ func DelHandler(w http.ResponseWriter, r *http.Request) {
_, err = res.RowsAffected() _, err = res.RowsAffected()
if err != sql.ErrNoRows { if err != sql.ErrNoRows {
io.WriteString(w, id+" deleted") w.Header().Set("Content-Type", "application/json")
b := Response{STATUS: "DELETED " + id}
err := json.NewEncoder(w).Encode(b)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
} }
} }
@ -211,7 +218,7 @@ func SaveHandler(w http.ResponseWriter, r *http.Request) {
b := Save(paste, lang, title, expiry) b := Save(paste, lang, title, expiry)
switch output { switch output {
case "json": default:
w.Header().Set("Content-Type", "application/json") w.Header().Set("Content-Type", "application/json")
err := json.NewEncoder(w).Encode(b) err := json.NewEncoder(w).Encode(b)
if err != nil { if err != nil {
@ -219,28 +226,8 @@ func SaveHandler(w http.ResponseWriter, r *http.Request) {
return return
} }
case "xml":
x, err := xml.MarshalIndent(b, "", " ")
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/xml")
w.Write(x)
case "html":
w.Header().Set("Content-Type", "text/html")
io.WriteString(w, "<p><b>URL</b>: <a href='"+b.URL+"'>"+b.URL+"</a></p>")
io.WriteString(w, "<p><b>Delete Key</b>: <a href='"+configuration.Address+"/del/"+b.ID+"/"+b.DELKEY+"'>"+b.DELKEY+"</a></p>")
case "redirect": case "redirect":
http.Redirect(w, r, b.URL, 301) http.Redirect(w, r, b.URL, 301)
default:
w.Header().Set("Content-Type", "text/plain; charset=UTF-8; imeanit=yes")
io.WriteString(w, b.URL+"\n")
io.WriteString(w, "delete key: "+b.DELKEY+"\n")
} }
} }
@ -269,7 +256,7 @@ func GetPaste(paste string, lang string) (string, string) {
var expiry string var expiry string
err = db.QueryRow("select title, data, expiry from pastebin where id=?", param1).Scan(&title, &s, &expiry) err = db.QueryRow("select title, data, expiry from pastebin where id=?", param1).Scan(&title, &s, &expiry)
Check(err) Check(err)
if time.Now().Format("2006-01-02 15:04:05") > expiry { if time.Now().Format("2006-01-02 15:04:05") >= expiry {
stmt, err := db.Prepare("delete from pastebin where id=?") stmt, err := db.Prepare("delete from pastebin where id=?")
Check(err) Check(err)
_, err = stmt.Exec(param1) _, err = stmt.Exec(param1)
@ -288,6 +275,21 @@ func GetPaste(paste string, lang string) (string, string) {
return html.UnescapeString(s), html.UnescapeString(title) return html.UnescapeString(s), html.UnescapeString(title)
} }
// APIHandler handles get requests of pastes
func APIHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
paste := vars["pasteId"]
b, _ := GetPaste(paste, "")
w.Header().Set("Content-Type", "application/json")
err := json.NewEncoder(w).Encode(b)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
}
// PasteHandler handles the generation of paste pages with the links // PasteHandler handles the generation of paste pages with the links
func PasteHandler(w http.ResponseWriter, r *http.Request) { func PasteHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r) vars := mux.Vars(r)
@ -399,14 +401,17 @@ func main() {
// create new mux router // create new mux router
router := mux.NewRouter() router := mux.NewRouter()
// serverside rending stuff
router.HandleFunc("/p/{pasteId}", PasteHandler).Methods("GET") router.HandleFunc("/p/{pasteId}", PasteHandler).Methods("GET")
router.HandleFunc("/raw/{pasteId}", RawHandler).Methods("GET") router.HandleFunc("/raw/{pasteId}", RawHandler).Methods("GET")
router.HandleFunc("/p/{pasteId}/{lang}", PasteHandler).Methods("GET") router.HandleFunc("/p/{pasteId}/{lang}", PasteHandler).Methods("GET")
router.HandleFunc("/clone/{pasteId}", CloneHandler).Methods("GET") router.HandleFunc("/clone/{pasteId}", CloneHandler).Methods("GET")
router.HandleFunc("/download/{pasteId}", DownloadHandler).Methods("GET") router.HandleFunc("/download/{pasteId}", DownloadHandler).Methods("GET")
router.HandleFunc("/p", SaveHandler).Methods("POST") // api
router.HandleFunc("/p/{output}", SaveHandler).Methods("POST") router.HandleFunc("/api", SaveHandler).Methods("POST")
router.HandleFunc("/p/{pasteId}/{delKey}", DelHandler).Methods("DELETE") router.HandleFunc("/api/{output}", SaveHandler).Methods("POST")
router.HandleFunc("/api/{pasteid}", APIHandler).Methods("GET")
router.HandleFunc("/api/{pasteId}", DelHandler).Methods("DELETE")
router.HandleFunc("/", RootHandler) router.HandleFunc("/", RootHandler)
err = http.ListenAndServe(configuration.Port, router) err = http.ListenAndServe(configuration.Port, router)
if err != nil { if err != nil {