From b582e5d1c2a1da67360044268a28a91029e357db Mon Sep 17 00:00:00 2001 From: tom Date: Fri, 6 Sep 2024 11:55:15 +0200 Subject: [PATCH] CHANGE: adde OpenAPI Docs + swagger UI --- .vscode/launch.json | 5 +- API.apib | 27 ----- Backend/main.go | 10 +- Docker/arbeitszeitmessung.json | 210 +++++++++++++++++++++++++++++++++ Docker/arbeitszeitmessung.yaml | 138 ++++++++++++++++++++++ Docker/dev-docker-compose.yml | 12 ++ 6 files changed, 373 insertions(+), 29 deletions(-) delete mode 100644 API.apib create mode 100644 Docker/arbeitszeitmessung.json create mode 100644 Docker/arbeitszeitmessung.yaml diff --git a/.vscode/launch.json b/.vscode/launch.json index 40bd062..b3cd30f 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -12,7 +12,10 @@ "request": "launch", "mode": "auto", "program": "${workspaceFolder}/Backend", - "dlvFlags": ["--check-go-version=false"] + "dlvFlags": ["--check-go-version=false"], + "env": { + "DEBUG": "true" + } }, ] } diff --git a/API.apib b/API.apib deleted file mode 100644 index 695366a..0000000 --- a/API.apib +++ /dev/null @@ -1,27 +0,0 @@ -#Group Bookings - -## Bookings Collection [/time{?cardID}] - -### List all bookings for specific card_id [GET] - -+ Parameters - + cardID:test_card (string) - the id of the rfid card - -+ Response 200 (application/json) - - [ - { - "cradID": "test_card", - "readerID": "test_reader", - "bookingTyp": 2, - "loggedTime": "2024-09-05T08:37:53.117641Z", - "id": 5 - }, - { - "cradID": "test_card", - "readerID": "mytest", - "bookingTyp": 1, - "loggedTime": "2024-09-05T08:51:12.670827Z", - "id": 6 - }, - ] diff --git a/Backend/main.go b/Backend/main.go index 9d0ac1f..cd43be3 100644 --- a/Backend/main.go +++ b/Backend/main.go @@ -25,7 +25,7 @@ func main() { 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)) + log.Fatal(http.ListenAndServe(":8000", nil)) } func timeCreateHandler(w http.ResponseWriter, r *http.Request) { @@ -38,6 +38,9 @@ func timeCreateHandler(w http.ResponseWriter, r *http.Request) { } func timeHandler(w http.ResponseWriter, r *http.Request) { + if os.Getenv("DEBUG") == "true" { + w.Header().Set("Access-Control-Allow-Origin", "*") + } switch r.Method { case "GET": getBookings(w, r) @@ -46,6 +49,7 @@ func timeHandler(w http.ResponseWriter, r *http.Request) { default: http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) } + } func createBooking(w http.ResponseWriter, r *http.Request) { @@ -69,6 +73,10 @@ func createBooking(w http.ResponseWriter, r *http.Request) { func getBookings(w http.ResponseWriter, r *http.Request) { card_id := r.URL.Query().Get("cardID") + if card_id == "" { + http.Error(w, "Missing cardID query parameter", http.StatusBadRequest) + return + } bookings, err := (*models.Booking).GetBookingsByCardID(nil, card_id) if err != nil { log.Println("Error getting bookings: ", err) diff --git a/Docker/arbeitszeitmessung.json b/Docker/arbeitszeitmessung.json new file mode 100644 index 0000000..267fa24 --- /dev/null +++ b/Docker/arbeitszeitmessung.json @@ -0,0 +1,210 @@ +{ + "openapi": "3.0.3", + "info": { + "title": "Arbeitszeitmessung - OpenAPI 3.0", + "description": "This demos the API for the Arbeitszeitmessung Project ", + "version": "0.1.0" + }, + "externalDocs": { + "description": "Git-Repository", + "url": "https://git.letsstein.de/tom/arbeitszeitmessung" + }, + "servers": [ + { + "url": "http://localhost:8000" + } + ], + "tags": [ + { + "name": "booking", + "description": "all Bookings" + } + ], + "paths": { + "/time": { + "put": { + "tags": [ + "booking" + ], + "summary": "Update a existing booking", + "description": "Update an existing booking by Id", + "operationId": "updateBooking", + "parameters": [ + { + "name": "bookingID", + "in": "query", + "description": "Booking ID to update", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "description": "Update an existent booking in the db. Not all values have to be updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Booking" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Booking Updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Booking" + } + } + } + }, + "400": { + "description": "Invalid ID supplied" + }, + "500": { + "description": "Server Error" + } + } + }, + "get": { + "tags": [ + "booking" + ], + "summary": "Gets all the bookings limited", + "description": "Returns all the bookings optionally filtered with cardID", + "parameters": [ + { + "name": "cardID", + "in": "query", + "description": "CardID to filter for", + "required": false, + "schema": { + "type": "string" + } + } + ], + "operationId": "addPet", + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Booking" + } + } + } + } + }, + "400": { + "description": "Invalid cardID" + } + } + } + }, + "/time/new": { + "put": { + "tags": [ + "booking" + ], + "summary": "Create new Booking", + "description": "Creates a new booking with the supplied parameters", + "operationId": "createBooking", + "parameters": [ + { + "name": "cardID", + "in": "query", + "description": "id of the RFID card scanned", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "readerID", + "in": "query", + "description": "id of the RFID reader scanning the card", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "bookingType", + "in": "query", + "description": "booking Type", + "required": true, + "schema": { + "type": "integer", + "enum": [ + 1, + 2, + 255 + ] + } + } + ], + "responses": { + "200": { + "description": "successfully created booking", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Booking" + } + } + } + }, + "409": { + "description": "Same booking type as last booking" + } + } + } + } + }, + "components": { + "schemas": { + "Booking": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64", + "example": 100 + }, + "cardID": { + "type": "string", + "example": "test_card" + }, + "readerID": { + "type": "string", + "example": "test_reader" + }, + "bookingType": { + "type": "integer", + "example": 1, + "enum": [ + 1, + 2, + 255 + ] + }, + "loggedTime": { + "type": "string", + "format": "date-time", + "example": "2024-09-05T08:51:12.670Z" + } + }, + "xml": { + "name": "booking" + } + } + } + } +} \ No newline at end of file diff --git a/Docker/arbeitszeitmessung.yaml b/Docker/arbeitszeitmessung.yaml new file mode 100644 index 0000000..8f72d49 --- /dev/null +++ b/Docker/arbeitszeitmessung.yaml @@ -0,0 +1,138 @@ +openapi: 3.0.3 +info: + title: Arbeitszeitmessung - OpenAPI 3.0 + description: |- + This demos the API for the Arbeitszeitmessung Project + version: 0.1.0 +externalDocs: + description: Git-Repository + url: https://git.letsstein.de/tom/arbeitszeitmessung +servers: + - url: http://localhost:8000 +tags: + - name: booking + description: all Bookings +paths: + /time: + put: + tags: + - booking + summary: Update a existing booking + description: Update an existing booking by Id + operationId: updateBooking + parameters: + - name: bookingID + in: query + description: Booking ID to update + required: true + schema: + type: string + requestBody: + description: Update an existent booking in the db. Not all values have to be updated + content: + application/json: + schema: + $ref: '#/components/schemas/Booking' + required: true + responses: + '200': + description: Booking Updated + content: + application/json: + schema: + $ref: '#/components/schemas/Booking' + '400': + description: Invalid ID supplied + '500': + description: Server Error + get: + tags: + - booking + summary: Gets all the bookings limited + description: Returns all the bookings optionally filtered with cardID + parameters: + - name: cardID + in: query + description: CardID to filter for + required: false + schema: + type: string + operationId: addPet + responses: + '200': + description: Successful operation + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Booking' + '400': + description: Invalid cardID + /time/new: + put: + tags: + - booking + summary: Create new Booking + description: Creates a new booking with the supplied parameters + operationId: createBooking + parameters: + - name: cardID + in: query + description: id of the RFID card scanned + required: true + schema: + type: string + - name: readerID + in: query + description: id of the RFID reader scanning the card + required: true + schema: + type: string + - name: bookingType + in: query + description: booking Type + required: true + schema: + type: integer + enum: + - 1 + - 2 + - 255 + responses: + '200': + description: successfully created booking + content: + application/json: + schema: + $ref: '#/components/schemas/Booking' + '409': + description: Same booking type as last booking +components: + schemas: + Booking: + type: object + properties: + id: + type: integer + format: int64 + example: 100 + cardID: + type: string + example: test_card + readerID: + type: string + example: test_reader + bookingType: + type: integer + example: 1 + enum: + - 1 + - 2 + - 255 + loggedTime: + type: string + format: date-time + example: 2024-09-05T08:51:12.670827Z + xml: + name: booking \ No newline at end of file diff --git a/Docker/dev-docker-compose.yml b/Docker/dev-docker-compose.yml index 70e2c7e..361b2ea 100644 --- a/Docker/dev-docker-compose.yml +++ b/Docker/dev-docker-compose.yml @@ -31,5 +31,17 @@ services: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASS: ${POSTGRES_PASSWORD} EXPOSED_PORT: ${EXPOSED_PORT} + DEBUG: true ports: - 8000:8080 + depends_on: + - db + swagger: + image: swaggerapi/swagger-ui + restart: unless-stopped + environment: + SWAGGER_JSON: /api/swagger.json + ports: + - 8002:8080 + volumes: + - ./arbeitszeitmessung.json:/api/swagger.json