From 68608a995b7a993e87488160c291158f079d0104 Mon Sep 17 00:00:00 2001 From: tom Date: Fri, 6 Sep 2024 08:50:24 +0200 Subject: [PATCH] CHANGE: changed API endpoints --- Backend/main.go | 63 +++++++++++++++++++++++++++++------ Docker/.env | 2 +- Docker/dev-docker-compose.yml | 35 +++++++++++++++++++ Docker/docker-compose.yml | 7 ++-- db.sql | 3 +- 5 files changed, 94 insertions(+), 16 deletions(-) create mode 100644 Docker/dev-docker-compose.yml diff --git a/Backend/main.go b/Backend/main.go index 1312497..9d0ac1f 100644 --- a/Backend/main.go +++ b/Backend/main.go @@ -2,39 +2,47 @@ package main import ( "arbeitszeitmessung/models" - "database/sql" "encoding/json" "errors" "fmt" "log" "net/http" "os" + "strconv" _ "github.com/lib/pq" ) -var DB *sql.DB - func main() { var err error - DB, err = OpenDatabase() + models.DB, err = OpenDatabase() if err != nil { log.Fatal(err) } - defer DB.Close() + defer models.DB.Close() + http.HandleFunc("/time/new", timeCreateHandler) http.HandleFunc("/time", timeHandler) - fmt.Println("Server is running at http://localhost:8080") + 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 "PUT": - createBooking(w, r) case "GET": getBookings(w, r) + case "PUT": + updateBooking(w, r) default: http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) } @@ -43,7 +51,7 @@ func timeHandler(w http.ResponseWriter, r *http.Request) { func createBooking(w http.ResponseWriter, r *http.Request) { booking := (*models.Booking).FromUrlParams(nil, r.URL.Query()) if booking.Verify() { - err := booking.Insert(DB) + err := booking.Insert() if errors.Is(models.SameBookingError{}, err) { http.Error(w, "Booking already exists", http.StatusConflict) return @@ -61,7 +69,7 @@ func createBooking(w http.ResponseWriter, r *http.Request) { func getBookings(w http.ResponseWriter, r *http.Request) { card_id := r.URL.Query().Get("cardID") - bookings, err := GetBookingsByCardID(DB, card_id) + 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) @@ -69,7 +77,42 @@ func getBookings(w http.ResponseWriter, r *http.Request) { } 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) diff --git a/Docker/.env b/Docker/.env index efca89d..9118751 100644 --- a/Docker/.env +++ b/Docker/.env @@ -2,4 +2,4 @@ POSTGRES_USER=arbeit_zeit POSTGRES_PASSWORD=password POSTGRES_PATH=./database POSTGRES_DB=arbeitszeitmessung -# EXPOSED_PORT=8080 +EXPOSED_PORT=8000 diff --git a/Docker/dev-docker-compose.yml b/Docker/dev-docker-compose.yml new file mode 100644 index 0000000..70e2c7e --- /dev/null +++ b/Docker/dev-docker-compose.yml @@ -0,0 +1,35 @@ +name: arbeitszeitmessung-dev +services: + db: + image: postgres:16 + restart: unless-stopped + env_file: + - .env + environment: + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB} + PGDATA: /var/lib/postgresql/data/pg_data + volumes: + - ${POSTGRES_PATH}:/var/lib/postgresql/data + ports: + - 5432:5432 + + adminer: + image: adminer + restart: unless-stopped + ports: + - 8001:8080 + backend: + build: ../Backend + image: git.letsstein.de/tom/arbeitszeit-backend + env_file: + - .env + environment: + POSTGRES_HOST: db + POSTGRES_DB: ${POSTGRES_DB} + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASS: ${POSTGRES_PASSWORD} + EXPOSED_PORT: ${EXPOSED_PORT} + ports: + - 8000:8080 diff --git a/Docker/docker-compose.yml b/Docker/docker-compose.yml index e1322a4..a9403e4 100644 --- a/Docker/docker-compose.yml +++ b/Docker/docker-compose.yml @@ -12,16 +12,14 @@ services: PGDATA: /var/lib/postgresql/data/pg_data volumes: - ${POSTGRES_PATH}:/var/lib/postgresql/data - ports: - - 5432:5432 adminer: image: adminer restart: unless-stopped ports: - 8000:8080 + backend: - build: ../Backend image: git.letsstein.de/tom/arbeitszeit-backend env_file: - .env @@ -30,5 +28,6 @@ services: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASS: ${POSTGRES_PASSWORD} + EXPOSED_PORT: ${EXPOSED_PORT} ports: - - 8001:8080 + - ${EXPOSED_PORT}:8080 diff --git a/db.sql b/db.sql index 30b67f1..ca3e9cc 100644 --- a/db.sql +++ b/db.sql @@ -8,7 +8,8 @@ CREATE TABLE zeiten ( ); -- @block insert data INSERT INTO zeiten (card_id, reader_id, booking_type) -VALUES ('test_card', 'test_reader', '2'); +VALUES ('test_card', 'test_reader', '2') +RETURNING id, logged_time; -- @block select SELECT * FROM zeiten;