This commit is contained in:
		@@ -45,22 +45,14 @@ func (h handler) Handle(w http.ResponseWriter, req *http.Request) {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func writeError[T any](t T, err error) func(w http.ResponseWriter) (T, bool) {
 | 
			
		||||
	return func(w http.ResponseWriter) (T, bool) {
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			http.Error(w, err.Error(), http.StatusInternalServerError)
 | 
			
		||||
		}
 | 
			
		||||
		return t, err == nil
 | 
			
		||||
	}
 | 
			
		||||
func writeJSONerror(w http.ResponseWriter, err string, status int) {
 | 
			
		||||
	writeJSON(w, struct{ Status, Reason string }{Status: "error", Reason: err}, status)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func writeNoBody(w http.ResponseWriter, status int) {
 | 
			
		||||
	w.WriteHeader(status)
 | 
			
		||||
}
 | 
			
		||||
func writeJSON(w http.ResponseWriter, b any, status int) {
 | 
			
		||||
	bytes, err := json.Marshal(b)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		http.Error(w, err.Error(), http.StatusInternalServerError)
 | 
			
		||||
		writeJSONerror(w, err.Error(), http.StatusInternalServerError)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	w.Header().Set("Content-Type", "application/json; charset=utf-8")
 | 
			
		||||
@@ -102,15 +94,13 @@ func (router *AdminRouter) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func badMethod(w http.ResponseWriter) {
 | 
			
		||||
	writeJSON(w,
 | 
			
		||||
		struct{ Error string }{Error: "method not supported"},
 | 
			
		||||
		http.StatusMethodNotAllowed)
 | 
			
		||||
	writeJSONerror(w, "method not supported", http.StatusMethodNotAllowed)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getBooks(l Library, w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	books, err := l.GetAllBooks(r.Context())
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		http.Error(w, err.Error(), http.StatusInternalServerError)
 | 
			
		||||
		writeJSONerror(w, err.Error(), http.StatusInternalServerError)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	writeJSON(w, books, http.StatusOK)
 | 
			
		||||
@@ -118,77 +108,70 @@ func getBooks(l Library, w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
 | 
			
		||||
func addBook(l Library, w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	if r.Body == nil {
 | 
			
		||||
		http.Error(w, "no body provided", http.StatusBadRequest)
 | 
			
		||||
		writeJSONerror(w, "no body provided", http.StatusBadRequest)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	defer r.Body.Close()
 | 
			
		||||
	b, err := io.ReadAll(r.Body)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		http.Error(w, "error reading body", http.StatusBadRequest)
 | 
			
		||||
		writeJSONerror(w, "error reading body", http.StatusBadRequest)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	book := &media.Book{}
 | 
			
		||||
	err = json.Unmarshal(b, book)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		http.Error(w, "error parsing body", http.StatusBadRequest)
 | 
			
		||||
		writeJSONerror(w, "error parsing body", http.StatusBadRequest)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	err = l.AddBook(r.Context(), book)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		http.Error(w, "error parsing body", http.StatusBadRequest)
 | 
			
		||||
		writeJSONerror(w, "error parsing body", http.StatusBadRequest)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	writeNoBody(w, http.StatusAccepted)
 | 
			
		||||
	w.WriteHeader(http.StatusAccepted)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func deleteBook(l Library, w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	if r.Body == nil {
 | 
			
		||||
		http.Error(w, "no body provided", http.StatusBadRequest)
 | 
			
		||||
		writeJSONerror(w, "no body provided", http.StatusBadRequest)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	defer r.Body.Close()
 | 
			
		||||
	b, err := io.ReadAll(r.Body)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		http.Error(w, "error reading body", http.StatusBadRequest)
 | 
			
		||||
		writeJSONerror(w, "error reading body", http.StatusBadRequest)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	book := &media.Book{}
 | 
			
		||||
	err = json.Unmarshal(b, book)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		http.Error(w, "error parsing body", http.StatusBadRequest)
 | 
			
		||||
		writeJSONerror(w, "error parsing body", http.StatusBadRequest)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	err = l.DeleteBook(r.Context(), book)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		http.Error(w, "error parsing body", http.StatusBadRequest)
 | 
			
		||||
		writeJSONerror(w, "error deleting book", http.StatusInternalServerError)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	writeNoBody(w, http.StatusAccepted)
 | 
			
		||||
	w.WriteHeader(http.StatusAccepted)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getRecords(l RecordCollection, w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	records, err := l.GetAllRecords(r.Context())
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		http.Error(w, err.Error(), http.StatusInternalServerError)
 | 
			
		||||
		writeJSONerror(w, err.Error(), http.StatusInternalServerError)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	writeJSON(w, records, http.StatusOK)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getWhoAmI(ts *tailscale.LocalClient, w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	whois, ok := writeError(ts.WhoIs(r.Context(), r.RemoteAddr))(w)
 | 
			
		||||
	if !ok {
 | 
			
		||||
	whois, err := ts.WhoIs(r.Context(), r.RemoteAddr)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		writeJSONerror(w, err.Error(), http.StatusInternalServerError)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	writeJSON(w, struct {
 | 
			
		||||
		Username      string `json:"Username"`
 | 
			
		||||
		DisplayName   string `json:"DisplayName"`
 | 
			
		||||
		ProfilePicURL string `json:"ProfilePicURL"`
 | 
			
		||||
	}{
 | 
			
		||||
		Username:      whois.UserProfile.LoginName,
 | 
			
		||||
		DisplayName:   whois.UserProfile.DisplayName,
 | 
			
		||||
		ProfilePicURL: whois.UserProfile.ProfilePicURL,
 | 
			
		||||
	}, http.StatusOK)
 | 
			
		||||
	writeJSON(w, whois.UserProfile, http.StatusOK)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func static(f fs.FS) http.Handler {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user