88 lines
2.9 KiB
Go
88 lines
2.9 KiB
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
"flag"
|
|
"fmt"
|
|
"net/http"
|
|
"path"
|
|
|
|
"github.com/Cameron-Reed1/todo-web/api"
|
|
"github.com/Cameron-Reed1/todo-web/db"
|
|
"github.com/Cameron-Reed1/todo-web/pages"
|
|
)
|
|
|
|
func main() {
|
|
db_path := flag.String("db", "./main.db", "Path to the main sqlite3 database")
|
|
user_db_dir := flag.String("user-dbs", "./user_dbs", "Path to the directory containing per-user sqlite3 databases")
|
|
bind_port := flag.Int("p", 8080, "Port to bind to")
|
|
bind_addr := flag.String("a", "0.0.0.0", "Address to bind to")
|
|
static_dir := flag.String("static", "./static", "Path to static files")
|
|
noFront := flag.Bool("no-frontend", false, "Disable the frontend endpoints")
|
|
// a := false; noBack := &a // flag.Bool("no-backend", false, "Disable the backend endpoints") // This didn't really make sense
|
|
|
|
flag.Parse()
|
|
|
|
mux := http.NewServeMux()
|
|
|
|
if !*noFront {
|
|
addFrontendEndpoints(mux, *static_dir)
|
|
}
|
|
addBackendEndpoints(mux)
|
|
|
|
db.SetUserDBDir(*user_db_dir)
|
|
db.OpenMainDB(*db_path)
|
|
defer db.CloseMainDB()
|
|
|
|
addr := fmt.Sprintf("%s:%d", *bind_addr, *bind_port)
|
|
server := http.Server{ Addr: addr, Handler: mux }
|
|
fmt.Printf("Starting server on %s...\n", addr)
|
|
err := server.ListenAndServe()
|
|
|
|
if errors.Is(err, http.ErrServerClosed) {
|
|
fmt.Printf("Server closed\n")
|
|
} else if err != nil {
|
|
fmt.Printf("Error starting server: %s\n", err)
|
|
}
|
|
}
|
|
|
|
func addFrontendEndpoints(mux *http.ServeMux, static_path string) {
|
|
fmt.Println("Frontend enabled")
|
|
|
|
mux.HandleFunc("/", Error404)
|
|
|
|
mux.HandleFunc("/{$}", pages.RootPage)
|
|
mux.HandleFunc("/overdue", pages.OverdueFragment)
|
|
mux.HandleFunc("/today", pages.TodayFragment)
|
|
mux.HandleFunc("/upcoming", pages.UpcomingFragment)
|
|
mux.HandleFunc("/login", pages.Login)
|
|
mux.HandleFunc("/create-account", pages.CreateAccount)
|
|
// mux.HandleFunc("/account", pages.AccountPage)
|
|
mux.HandleFunc("POST /logout", pages.Logout)
|
|
mux.HandleFunc("DELETE /delete/{id}", pages.DeleteItem)
|
|
mux.HandleFunc("PATCH /set/{id}", pages.SetItemCompleted)
|
|
mux.HandleFunc("PUT /update", pages.UpdateItem)
|
|
mux.HandleFunc("POST /new", pages.CreateItem)
|
|
|
|
fileServer := http.FileServer(http.Dir(static_path))
|
|
mux.Handle("/css/", fileServer)
|
|
mux.Handle("/js/", fileServer)
|
|
mux.Handle("/img/", fileServer)
|
|
mux.HandleFunc("/img/login.jpg", func(w http.ResponseWriter, r *http.Request) { pages.RandomImage(w, r, path.Join(static_path, "img/login/")) })
|
|
mux.HandleFunc("/img/login/", Error404)
|
|
}
|
|
|
|
func addBackendEndpoints(mux *http.ServeMux) {
|
|
fmt.Println("Backend enabled")
|
|
|
|
mux.HandleFunc("/api/", api.InvalidEndpoint)
|
|
|
|
mux.HandleFunc("GET /api/get", api.GetAll)
|
|
mux.HandleFunc("GET /api/get/{id}", api.GetTodo)
|
|
mux.HandleFunc("POST /api/new", api.AddTodo)
|
|
}
|
|
|
|
func Error404(w http.ResponseWriter, r *http.Request) {
|
|
w.Write([]byte("Error 404: Page not found\n"))
|
|
}
|