aboutsummaryrefslogtreecommitdiff
path: root/server/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'server/main.go')
-rw-r--r--server/main.go122
1 files changed, 51 insertions, 71 deletions
diff --git a/server/main.go b/server/main.go
index 4618e5b..4737f17 100644
--- a/server/main.go
+++ b/server/main.go
@@ -1,24 +1,22 @@
package main
import (
- "database/sql"
- "encoding/json"
+ "embed"
"flag"
- "fmt"
- "io/ioutil"
+ "github.com/labstack/echo/v4"
+ "github.com/labstack/echo/v4/middleware"
+ "database/sql"
"log"
"math/rand"
"net/http"
- "strings"
"time"
_ "github.com/mattn/go-sqlite3"
- "github.com/rs/cors"
)
var db *sql.DB
-var port int
var dbFilePath string
+var port string
type Bin struct {
Content string `json:"content"`
@@ -30,23 +28,33 @@ const (
shortIDLength = 8
)
-func main() {
- flag.IntVar(&port, "port", 8080, "Port number for the server (default is 8080)")
- flag.StringVar(&dbFilePath, "db", "./minibin.db", "Database file path")
- flag.Parse()
+var (
+ //go:embed all:dist
+ dist embed.FS
+)
- setupServer()
+func RegisterHandlers(e *echo.Echo) {
+ e.Use(middleware.StaticWithConfig(middleware.StaticConfig{
+ Skipper: nil,
+ Root: "dist",
+ Index: "index.html",
+ HTML5: true,
+ Filesystem: http.FS(dist),
+ }))
+ e.Use(middleware.CORS())
+ e.POST("/bin", postBin)
+ e.GET("/bin/:id", getBin)
}
-func setupServer() {
- mux := http.NewServeMux()
- mux.HandleFunc("/bin", postBin)
- mux.HandleFunc("/bin/", getBin)
- handler := cors.Default().Handler(mux)
- serverAddr := fmt.Sprintf(":%d", port)
- log.Printf("Server listening on port %d...\n", port)
+func main() {
+ flag.StringVar(&port, "port", "8080", "HTTP server port")
+ flag.StringVar(&dbFilePath, "db", "minibin.db", "Path to SQLite database file")
+ flag.Parse()
+
initDatabase()
- log.Fatal(http.ListenAndServe(serverAddr, handler))
+ e := echo.New()
+ RegisterHandlers(e)
+ e.Logger.Fatal(e.Start(":" + port))
}
func initDatabase() {
@@ -62,68 +70,40 @@ func initDatabase() {
}
}
-func postBin(w http.ResponseWriter, r *http.Request) {
- handleRequestMethod(w, r, "POST", func() {
- body, err := ioutil.ReadAll(r.Body)
- if handleError(w, err, http.StatusInternalServerError) {
- return
- }
- var bin Bin
- err = json.Unmarshal(body, &bin)
- if handleError(w, err, http.StatusBadRequest) {
- return
- }
- id := generateShortID()
- handleError(w, saveBin(id, bin), http.StatusInternalServerError)
- respondWithJSON(w, http.StatusOK, map[string]string{"id": id, "content": bin.Content, "language": bin.Language})
- })
-}
-
-func getBin(w http.ResponseWriter, r *http.Request) {
- handleRequestMethod(w, r, "GET", func() {
- id := strings.TrimPrefix(r.URL.Path, "/bin/")
- bin, err := getBinById(id)
- handleError(w, err, http.StatusInternalServerError)
- respondWithJSON(w, http.StatusOK, bin)
- })
-}
-
-func handleRequestMethod(w http.ResponseWriter, r *http.Request, expectedMethod string, handler func()) {
- if r.Method != expectedMethod {
- http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
- return
+func postBin(echoContext echo.Context) error {
+ bin := Bin{}
+ err := echoContext.Bind(&bin)
+ if err != nil {
+ return err
}
- handler()
-}
-
-func handleError(w http.ResponseWriter, err error, statusCode int) bool {
+ id := generateShortID()
+ err = saveBin(id, bin)
if err != nil {
- http.Error(w, err.Error(), statusCode)
- return true
+ return err
}
- return false
+ return echoContext.JSON(http.StatusCreated, echo.Map{
+ "id": id,
+ })
}
-func respondWithJSON(w http.ResponseWriter, statusCode int, data interface{}) {
- w.Header().Set("Content-Type", "application/json")
- w.WriteHeader(statusCode)
- json.NewEncoder(w).Encode(data)
+func getBin(echoContext echo.Context) error {
+ id := echoContext.Param("id")
+ bin, err := getBinById(id)
+ if err != nil {
+ return err
+ }
+ return echoContext.JSON(http.StatusOK, bin)
}
func createTable() error {
- _, err := db.Exec(`
- CREATE TABLE IF NOT EXISTS bins (
- id TEXT PRIMARY KEY,
- content TEXT,
- language TEXT
- )
-`)
+ _, err := db.Exec("CREATE TABLE IF NOT EXISTS bins (id TEXT PRIMARY KEY, content TEXT, language TEXT)")
return err
}
func getBinById(id string) (Bin, error) {
- var bin Bin
- err := db.QueryRow("SELECT content, language FROM bins WHERE id = ?", id).Scan(&bin.Content, &bin.Language)
+ row := db.QueryRow("SELECT content, language FROM bins WHERE id = ?", id)
+ bin := Bin{}
+ err := row.Scan(&bin.Content, &bin.Language)
return bin, err
}
@@ -139,4 +119,4 @@ func generateShortID() string {
id[i] = shortIDCharset[rand.Intn(len(shortIDCharset))]
}
return string(id)
-}
+} \ No newline at end of file