diff --git a/controller/controller.go b/controller/controller.go index 040d1a2..a101362 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -12,7 +12,6 @@ type Controller struct { openaiClient *openai.Client unraidAPIKey string unraidURI string - jwtToken string config *configStruct } @@ -30,7 +29,6 @@ func NewController() *Controller { openaiClient := openai.NewClient(openaiApiKey) unraidAPIKey := os.Getenv("UNRAID_API_KEY") unraidURI := os.Getenv("UNRAID_URI") - jwtToken := os.Getenv("jwtToken") if err != nil { fmt.Println(err.Error()) @@ -40,7 +38,6 @@ func NewController() *Controller { openaiClient: openaiClient, unraidAPIKey: unraidAPIKey, unraidURI: unraidURI, - jwtToken: jwtToken, } } diff --git a/controller/health.go b/controller/health.go new file mode 100644 index 0000000..fb9bf49 --- /dev/null +++ b/controller/health.go @@ -0,0 +1,21 @@ +package controller + +import ( + "net/http" + + "github.com/gin-gonic/gin" +) + +// getHealth godoc +// +// @Summary Generate Health status +// @Description Get the health of the API +// @Tags health +// @Accept json +// @Produce json +// @Success 200 {string} json "response" +// @Router /health/getHealth [get] +func (c *Controller) GetHealth(ctx *gin.Context) { + // Return the health in the response body + ctx.JSON(http.StatusOK, gin.H{"health": "OK"}) +} diff --git a/controller/token.go b/controller/token.go deleted file mode 100644 index d0d4df8..0000000 --- a/controller/token.go +++ /dev/null @@ -1,42 +0,0 @@ -package controller - -import ( - "net/http" - "time" - - "github.com/dgrijalva/jwt-go" - "github.com/gin-gonic/gin" -) - -// generateTokenHandler godoc -// -// @Summary Generate JWT Token -// @Description Gets the PSU Data from unraid -// @Tags token -// @Accept json -// @Produce plain -// @Param token query string true "Secret Token" -// @Success 200 {string} string "response" -// @Router /token/generateTokenHandler [get] -func (c *Controller) GenerateTokenHandler(ctx *gin.Context) { - // Define the token claims - claims := jwt.MapClaims{ - "exp": time.Now().Add(time.Hour * 24).Unix(), - "iat": time.Now().Unix(), - // Add any additional claims here... - } - - // Generate a new token with the claims - token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) - - // Sign the token with your secret key - // TODO: Replace "my-secret-key" with your own secret key - tokenString, err := token.SignedString([]byte(ctx.Query("token"))) - if err != nil { - ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "Failed to generate token"}) - return - } - - // Return the token in the response body - ctx.JSON(http.StatusOK, gin.H{"token": tokenString}) -} diff --git a/docs/docs.go b/docs/docs.go index faab688..6444223 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -25,6 +25,29 @@ const docTemplate = `{ "host": "{{.Host}}", "basePath": "{{.BasePath}}", "paths": { + "/health/getHealth": { + "get": { + "description": "Get the health of the API", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "health" + ], + "summary": "Generate Health status", + "responses": { + "200": { + "description": "response", + "schema": { + "type": "string" + } + } + } + } + }, "/openai/general": { "get": { "description": "Ask ChatGPT a general question", @@ -89,38 +112,6 @@ const docTemplate = `{ } } }, - "/token/generateTokenHandler": { - "get": { - "description": "Gets the PSU Data from unraid", - "consumes": [ - "application/json" - ], - "produces": [ - "text/plain" - ], - "tags": [ - "token" - ], - "summary": "Generate JWT Token", - "parameters": [ - { - "type": "string", - "description": "Secret Token", - "name": "token", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "response", - "schema": { - "type": "string" - } - } - } - } - }, "/unraid/powerusage": { "get": { "description": "Gets the PSU Data from unraid", @@ -157,11 +148,11 @@ const docTemplate = `{ // SwaggerInfo holds exported Swagger Info so clients can modify it var SwaggerInfo = &swag.Spec{ Version: "1.0", - Host: "localhost:8080", + Host: "durpapi.durp.info", BasePath: "/api/v1", Schemes: []string{}, Title: "DurpAPI", - Description: "This is a sample server celler server.", + Description: "API for Durp's needs", InfoInstanceName: "swagger", SwaggerTemplate: docTemplate, } diff --git a/docs/swagger.json b/docs/swagger.json index b142468..130c72f 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -1,7 +1,7 @@ { "swagger": "2.0", "info": { - "description": "This is a sample server celler server.", + "description": "API for Durp's needs", "title": "DurpAPI", "termsOfService": "http://swagger.io/terms/", "contact": { @@ -15,9 +15,32 @@ }, "version": "1.0" }, - "host": "localhost:8080", + "host": "durpapi.durp.info", "basePath": "/api/v1", "paths": { + "/health/getHealth": { + "get": { + "description": "Get the health of the API", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "health" + ], + "summary": "Generate Health status", + "responses": { + "200": { + "description": "response", + "schema": { + "type": "string" + } + } + } + } + }, "/openai/general": { "get": { "description": "Ask ChatGPT a general question", @@ -82,38 +105,6 @@ } } }, - "/token/generateTokenHandler": { - "get": { - "description": "Gets the PSU Data from unraid", - "consumes": [ - "application/json" - ], - "produces": [ - "text/plain" - ], - "tags": [ - "token" - ], - "summary": "Generate JWT Token", - "parameters": [ - { - "type": "string", - "description": "Secret Token", - "name": "token", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "response", - "schema": { - "type": "string" - } - } - } - } - }, "/unraid/powerusage": { "get": { "description": "Gets the PSU Data from unraid", diff --git a/docs/swagger.yaml b/docs/swagger.yaml index f444074..c2815ab 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -1,11 +1,11 @@ basePath: /api/v1 -host: localhost:8080 +host: durpapi.durp.info info: contact: email: support@swagger.io name: API Support url: http://www.swagger.io/support - description: This is a sample server celler server. + description: API for Durp's needs license: name: Apache 2.0 url: http://www.apache.org/licenses/LICENSE-2.0.html @@ -13,6 +13,21 @@ info: title: DurpAPI version: "1.0" paths: + /health/getHealth: + get: + consumes: + - application/json + description: Get the health of the API + produces: + - application/json + responses: + "200": + description: response + schema: + type: string + summary: Generate Health status + tags: + - health /openai/general: get: consumes: @@ -55,27 +70,6 @@ paths: summary: Travel Agent ChatGPT tags: - openai - /token/generateTokenHandler: - get: - consumes: - - application/json - description: Gets the PSU Data from unraid - parameters: - - description: Secret Token - in: query - name: token - required: true - type: string - produces: - - text/plain - responses: - "200": - description: response - schema: - type: string - summary: Generate JWT Token - tags: - - token /unraid/powerusage: get: consumes: diff --git a/main.go b/main.go index ba45a9c..0b2f16b 100644 --- a/main.go +++ b/main.go @@ -34,21 +34,24 @@ func main() { r := gin.Default() c := controller.NewController() + var groups []string v1 := r.Group("/api/v1") { - token := v1.Group("/token") + health := v1.Group("/health") { - token.GET("generateTokenHandler", c.GenerateTokenHandler) + health.GET("getHealth", c.GetHealth) } openai := v1.Group("/openai") { + groups = []string{"durpapi"} + openai.Use(authMiddleware(groups)) openai.GET("general", c.GeneralOpenAI) openai.GET("travelagent", c.TravelAgentOpenAI) } unraid := v1.Group("/unraid") { - groups := []string{"grafana"} + groups = []string{"durpapi"} unraid.Use(authMiddleware(groups)) unraid.GET("powerusage", c.UnraidPowerUsage) } @@ -60,12 +63,12 @@ func main() { func authMiddleware(allowedGroups []string) gin.HandlerFunc { return func(c *gin.Context) { // Get the user groups from the request headers - groupsHeader := c.GetHeader("X-authentik-groups") + groupsHeader := c.GetHeader("X-Forwarded-Groups") // Split the groups header value into individual groups - groups := strings.Split(groupsHeader, "|") + groups := strings.Split(groupsHeader, ",") - // Check if the user belongs to any of the allowed groups + // Check if the user belongs to any of the allowed grouzps isAllowed := false for _, allowedGroup := range allowedGroups { for _, group := range groups { diff --git a/model/account.go b/model/account.go deleted file mode 100644 index d921ef1..0000000 --- a/model/account.go +++ /dev/null @@ -1,112 +0,0 @@ -package model - -import ( - "errors" - "fmt" - - uuid "github.com/gofrs/uuid" -) - -// Account example -type Account struct { - ID int `json:"id" example:"1" format:"int64"` - Name string `json:"name" example:"account name"` - UUID uuid.UUID `json:"uuid" example:"550e8400-e29b-41d4-a716-446655440000" format:"uuid"` -} - -// example -var ( - ErrNameInvalid = errors.New("name is empty") -) - -// AddAccount example -type AddAccount struct { - Name string `json:"name" example:"account name"` -} - -// Validation example -func (a AddAccount) Validation() error { - switch { - case len(a.Name) == 0: - return ErrNameInvalid - default: - return nil - } -} - -// UpdateAccount example -type UpdateAccount struct { - Name string `json:"name" example:"account name"` -} - -// Validation example -func (a UpdateAccount) Validation() error { - switch { - case len(a.Name) == 0: - return ErrNameInvalid - default: - return nil - } -} - -// AccountsAll example -func AccountsAll(q string) ([]Account, error) { - if q == "" { - return accounts, nil - } - as := []Account{} - for k, v := range accounts { - if q == v.Name { - as = append(as, accounts[k]) - } - } - return as, nil -} - -// AccountOne example -func AccountOne(id int) (Account, error) { - for _, v := range accounts { - if id == v.ID { - return v, nil - } - } - return Account{}, ErrNoRow -} - -// Insert example -func (a Account) Insert() (int, error) { - accountMaxID++ - a.ID = accountMaxID - a.Name = fmt.Sprintf("account_%d", accountMaxID) - accounts = append(accounts, a) - return accountMaxID, nil -} - -// Delete example -func Delete(id int) error { - for k, v := range accounts { - if id == v.ID { - accounts = append(accounts[:k], accounts[k+1:]...) - return nil - } - } - return fmt.Errorf("account id=%d is not found", id) -} - -// Update example -func (a Account) Update() error { - for k, v := range accounts { - if a.ID == v.ID { - accounts[k].Name = a.Name - return nil - } - } - return fmt.Errorf("account id=%d is not found", a.ID) -} - -var accountMaxID = 3 -var accounts = []Account{ - {ID: 1, Name: "account_1"}, - {ID: 2, Name: "account_2"}, - {ID: 3, Name: "account_3"}, -} diff --git a/model/bottle.go b/model/bottle.go deleted file mode 100644 index 43b4405..0000000 --- a/model/bottle.go +++ /dev/null @@ -1,29 +0,0 @@ -package model - -// Bottle example -type Bottle struct { - ID int `json:"id" example:"1"` - Name string `json:"name" example:"bottle_name"` - Account Account `json:"account"` -} - -// BottlesAll example -func BottlesAll() ([]Bottle, error) { - return bottles, nil -} - -// BottleOne example -func BottleOne(id int) (*Bottle, error) { - for _, v := range bottles { - if id == v.ID { - return &v, nil - } - } - return nil, ErrNoRow -} - -var bottles = []Bottle{ - {ID: 1, Name: "bottle_1", Account: Account{ID: 1, Name: "accout_1"}}, - {ID: 2, Name: "bottle_2", Account: Account{ID: 2, Name: "accout_2"}}, - {ID: 3, Name: "bottle_3", Account: Account{ID: 3, Name: "accout_3"}}, -}