81 lines
1.7 KiB
Go
81 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/sony/sonyflake"
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
)
|
|
|
|
var sf *sonyflake.Sonyflake
|
|
|
|
const (
|
|
base62 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
)
|
|
|
|
func main() {
|
|
db := connectDB()
|
|
router := http.NewServeMux()
|
|
port := os.Getenv("APP_PORT")
|
|
var st sonyflake.Settings
|
|
sf = sonyflake.NewSonyflake(st)
|
|
if sf == nil {
|
|
panic("Sonyflake not created")
|
|
}
|
|
|
|
router.HandleFunc("GET /", func(w http.ResponseWriter, r *http.Request) {
|
|
path := r.URL.Path
|
|
code := path[1:]
|
|
if code == "" {
|
|
http.Error(w, "Page not found", http.StatusNotFound)
|
|
return
|
|
}
|
|
url, err := getUrlByCode(db, code)
|
|
if url == "" || err != nil {
|
|
http.Error(w, "Page not found", http.StatusNotFound)
|
|
return
|
|
}
|
|
|
|
http.Redirect(w, r, url, http.StatusFound)
|
|
})
|
|
|
|
router.HandleFunc("POST /shorten", func(w http.ResponseWriter, r *http.Request) {
|
|
originalURL := r.FormValue("url")
|
|
if originalURL == "" {
|
|
http.Error(w, "URL parameter is missing", http.StatusBadRequest)
|
|
return
|
|
}
|
|
codeExisted, err := checkURLAlreadyExists(db, originalURL)
|
|
if err != nil {
|
|
log.Fatalf("Error checking URL exists: %v\n", err)
|
|
}
|
|
|
|
if codeExisted == "" {
|
|
code, err := insertURL(db, originalURL)
|
|
if err != nil {
|
|
log.Fatalf("Error when insert URL: %v\n", err)
|
|
}
|
|
_, writeErr := w.Write([]byte(fmt.Sprintf("%s/%s", r.Host, code)))
|
|
if writeErr != nil {
|
|
return
|
|
}
|
|
}
|
|
_, writeErr := w.Write([]byte(fmt.Sprintf("%s/%s", r.Host, codeExisted)))
|
|
if writeErr != nil {
|
|
return
|
|
}
|
|
})
|
|
|
|
server := http.Server{Addr: fmt.Sprintf(":%s", port), Handler: router}
|
|
|
|
fmt.Println(fmt.Sprintf("App is running in port: %s", port))
|
|
|
|
err := server.ListenAndServe()
|
|
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
}
|
|
}
|