url-shortener/main.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
}
}