summaryrefslogtreecommitdiff
path: root/handlers.go
blob: df1794a8a247c0ac82cc94102490fc9be20175f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package main

import (
	"database/sql"
	"embed"
	"encoding/json"
	"fmt"
	"io/fs"
	"log"
	"net/http"

	"github.com/gorilla/mux"
)

//go:embed build/frontend/public
var frontendEmbed embed.FS

func registerHandlers(r *mux.Router, db *sql.DB) {
	r.Handle("/api/version", version(db))
	r.Handle("/api/registration", ApiRegistration(db))
	r.Handle("/api/authentication", ApiAuthentication(db))

	// frontend must come last to make sure /api takes precedence
	frontend, err := fs.Sub(frontendEmbed, "build/frontend/public")
	if err != nil {
		log.Fatalf("No embedded frontend: %v.", err)
	}
	r.PathPrefix("/").Handler(http.FileServerFS(frontend))
}

func version(db *sql.DB) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprint(w, versionTxt)
	})
}

func ApiRegistration(db *sql.DB) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		var data struct {
			Username string
			Password string
		}

		dec := json.NewDecoder(r.Body)
		dec.DisallowUnknownFields()

		err := dec.Decode(&data)
		if err != nil {
			log.Printf("Failed to decode: %v", err)
			w.WriteHeader(http.StatusBadRequest)
			return
		}

		if data.Username == "" {
			log.Print("Got registration request with empty username")
			w.WriteHeader(http.StatusBadRequest)
			return
		}

		if data.Password == "" {
			log.Print("Got registration request with empty password")
			w.WriteHeader(http.StatusBadRequest)
			return
		}

		err = Register(db, data.Username, data.Password)
		if err != nil {
			log.Printf("Failed to register new user: %v", err)
			w.WriteHeader(http.StatusInternalServerError)
			return
		}
	})
}

func ApiAuthentication(db *sql.DB) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		var data struct {
			Username string
			Password string
		}

		dec := json.NewDecoder(r.Body)
		dec.DisallowUnknownFields()

		err := dec.Decode(&data)
		if err != nil {
			log.Printf("Failed to decode: %v", err)
			w.WriteHeader(http.StatusBadRequest)
			return
		}

		if data.Username == "" {
			log.Print("Got registration request with empty username.")
			w.WriteHeader(http.StatusBadRequest)
			return
		}

		if data.Password == "" {
			log.Print("Got registration request with empty password.")
			w.WriteHeader(http.StatusBadRequest)
			return
		}
	})
}