package main import ( "arbeitszeitmessung/models" "encoding/json" "errors" "fmt" "log" "net/http" "os" "strconv" _ "github.com/lib/pq" ) func main() { var err error models.DB, err = OpenDatabase() if err != nil { log.Fatal(err) } defer models.DB.Close() http.HandleFunc("/time/new", timeCreateHandler) http.HandleFunc("/time", timeHandler) fmt.Printf("Server is running at http://localhost:8080 exposed to port %s\n", getEnv("EXPOSED_PORT", "8000")) log.Fatal(http.ListenAndServe(":8080", nil)) } func timeCreateHandler(w http.ResponseWriter, r *http.Request) { switch r.Method { case "PUT": createBooking(w, r) default: http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) } } func timeHandler(w http.ResponseWriter, r *http.Request) { switch r.Method { case "GET": getBookings(w, r) case "PUT": updateBooking(w, r) default: http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) } } func createBooking(w http.ResponseWriter, r *http.Request) { booking := (*models.Booking).FromUrlParams(nil, r.URL.Query()) if booking.Verify() { err := booking.Insert() if errors.Is(models.SameBookingError{}, err) { http.Error(w, "Booking already exists", http.StatusConflict) return } if err != nil { log.Println("Error inserting booking: ", err) http.Error(w, "Internal Server Error", http.StatusInternalServerError) return } w.WriteHeader(http.StatusAccepted) json.NewEncoder(w).Encode(booking) } w.WriteHeader(http.StatusBadRequest) } func getBookings(w http.ResponseWriter, r *http.Request) { card_id := r.URL.Query().Get("cardID") bookings, err := (*models.Booking).GetBookingsByCardID(nil, card_id) if err != nil { log.Println("Error getting bookings: ", err) http.Error(w, "Internal Server Error", http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(bookings) } func updateBooking(w http.ResponseWriter, r *http.Request) { _booking_id := r.URL.Query().Get("bookingID") if _booking_id == "" { http.Error(w, "Missing bookingID query parameter", http.StatusBadRequest) return } booking_id, err := strconv.Atoi(_booking_id) if err != nil { http.Error(w, "Invalid bookingID query parameter", http.StatusBadRequest) return } booking, err := (*models.Booking).GetBookingById(nil, booking_id) if err != nil { log.Println("Error getting booking: ", err) http.Error(w, "Internal Server Error", http.StatusInternalServerError) return } if card_id := r.URL.Query().Get("cardID"); card_id != "" { booking.CardID = card_id } if reader_id := r.URL.Query().Get("readerID"); reader_id != "" { booking.ReaderID = reader_id } if _booking_type := r.URL.Query().Get("bookingType"); _booking_type != "" { booking_type, err := strconv.Atoi(_booking_type) if err != nil { http.Error(w, "Invalid booking_type query parameter", http.StatusInternalServerError) return } booking.BookingType = booking_type } booking.Save() w.WriteHeader(http.StatusOK) json.NewEncoder(w).Encode(booking) } // func getBooking(w http.ResponseWriter, r *http.Request) func getEnv(key, fallback string) string { if value, ok := os.LookupEnv(key); ok { return value } return fallback }