added swagger doc

main
alex 2023-08-26 18:58:45 +02:00
parent eb3f565cec
commit 8db4741338
10 changed files with 341 additions and 79 deletions

View File

@ -61,7 +61,7 @@ func getImageType(data string) string {
} }
} }
func CreateEquipmentDocumentation(c *fiber.Ctx, body structs.ApiCreateEquipmentDocumentationRequest) error { func CreateEquipmentDocumentation(c *fiber.Ctx, body structs.CreateEquipmentDocumentationRequest) error {
var bodyNotes []map[string]string var bodyNotes []map[string]string
err := json.Unmarshal(body.Notes, &bodyNotes) err := json.Unmarshal(body.Notes, &bodyNotes)
@ -154,7 +154,7 @@ func GetEquipmentDocumentations(stockItemId string, c *fiber.Ctx) error {
} }
} }
return c.JSON(structs.ApiEquipmentDocumentationResponse{ return c.JSON(structs.EquipmentDocumentationResponse{
Status: statusCode, Status: statusCode,
Documentations: documentations}) Documentations: documentations})
} }
@ -167,7 +167,7 @@ func GetEquipmentDocumentation(stockItemId string, documentationId string, c *fi
return c.JSON(documentation) return c.JSON(documentation)
} }
func EditEquipmentDocumentation(c *fiber.Ctx, body structs.ApiEditEquipmentDocumentationRequest) error { func EditEquipmentDocumentation(c *fiber.Ctx, body structs.EditEquipmentDocumentationRequest) error {
var bodyNotes []map[string]string var bodyNotes []map[string]string
err := json.Unmarshal(body.Notes, &bodyNotes) err := json.Unmarshal(body.Notes, &bodyNotes)

View File

@ -5,15 +5,6 @@ import (
"time" "time"
) )
/*
type Equipment struct {
Id string // stock item id of invex system
Name string
Thumbnail string // url provided by invex system
CreatedAt time.Time
UpdatedAt time.Time
} */
// swagger:model EquipmentDocumentation // swagger:model EquipmentDocumentation
type EquipmentDocumentation struct { type EquipmentDocumentation struct {
Id string Id string
@ -26,31 +17,31 @@ type EquipmentDocumentation struct {
UpdatedAt time.Time UpdatedAt time.Time
} }
type ApiEquipmentRequest struct { type EquipmentRequest struct {
StockItemId string `json:"stockItemId"` StockItemId string `json:"stockItemId"`
} }
type ApiGetDocumentationEquipmentRequest struct { type GetDocumentationEquipmentRequest struct {
StockItemId string `json:"stockItemId"` StockItemId string `json:"stockItemId"`
DocumentationId string `json:"documentationId"` DocumentationId string `json:"documentationId"`
} }
// swagger:model ApiCreateEquipmentDocumentationRequest // swagger:model CreateEquipmentDocumentationRequest
type ApiCreateEquipmentDocumentationRequest struct { type CreateEquipmentDocumentationRequest struct {
StockItemId string `json:"stockItemId"` StockItemId string `json:"stockItemId"`
Type uint8 `json:"type"` Type uint8 `json:"type"`
Title string `json:"title"` Title string `json:"title"`
Notes json.RawMessage `json:"notes"` Notes json.RawMessage `json:"notes"`
} }
// swagger:model ApiEquipmentDocumentationResponse // swagger:model EquipmentDocumentationResponse
type ApiEquipmentDocumentationResponse struct { type EquipmentDocumentationResponse struct {
Status int Status int
Documentations []EquipmentDocumentation Documentations []EquipmentDocumentation
} }
// swagger:model ApiEditEquipmentDocumentationRequest // swagger:model EditEquipmentDocumentationRequest
type ApiEditEquipmentDocumentationRequest struct { type EditEquipmentDocumentationRequest struct {
DocumentationId string `json:"documentationId"` DocumentationId string `json:"documentationId"`
Type uint8 `json:"type"` Type uint8 `json:"type"`
Title string `json:"title"` Title string `json:"title"`

View File

@ -26,11 +26,13 @@ type UserSession struct {
ExpiresAt time.Time ExpiresAt time.Time
} }
// swagger:model UserLoginRequest
type UserLoginRequest struct { type UserLoginRequest struct {
Username string Username string
Password string Password string
} }
// swagger:model UserLoginResponse
type UserLoginResponse struct { type UserLoginResponse struct {
Session string Session string
} }

View File

@ -48,8 +48,8 @@ func ValidatorInit() {
structs.ApiGroupTaskRequest{}) structs.ApiGroupTaskRequest{})
Validate.RegisterStructValidationMapRules(equipmentRules, Validate.RegisterStructValidationMapRules(equipmentRules,
structs.ApiEquipmentRequest{}, structs.EquipmentRequest{},
structs.ApiGetDocumentationEquipmentRequest{}, structs.GetDocumentationEquipmentRequest{},
structs.ApiCreateEquipmentDocumentationRequest{}, structs.CreateEquipmentDocumentationRequest{},
structs.ApiEditEquipmentDocumentationRequest{}) structs.EditEquipmentDocumentationRequest{})
} }

View File

@ -39,7 +39,7 @@
"name": "body", "name": "body",
"in": "body", "in": "body",
"schema": { "schema": {
"$ref": "#/definitions/ApiCreateEquipmentDocumentationRequest" "$ref": "#/definitions/CreateEquipmentDocumentationRequest"
} }
} }
], ],
@ -82,7 +82,7 @@
"name": "body", "name": "body",
"in": "body", "in": "body",
"schema": { "schema": {
"$ref": "#/definitions/ApiEditEquipmentDocumentationRequest" "$ref": "#/definitions/EditEquipmentDocumentationRequest"
} }
} }
], ],
@ -186,7 +186,7 @@
"200": { "200": {
"description": "Equipment documentations. Status 200 if equipment documentations found, status 404 if stock item not found on invex, status 401 if backend has no permissions to access invex", "description": "Equipment documentations. Status 200 if equipment documentations found, status 404 if stock item not found on invex, status 401 if backend has no permissions to access invex",
"schema": { "schema": {
"$ref": "#/definitions/ApiEquipmentDocumentationResponse" "$ref": "#/definitions/EquipmentDocumentationResponse"
} }
}, },
"400": { "400": {
@ -284,10 +284,188 @@
} }
} }
} }
},
"/user/auth/login": {
"post": {
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"user"
],
"summary": "Login user",
"operationId": "userLogin",
"parameters": [
{
"name": "body",
"in": "body",
"schema": {
"$ref": "#/definitions/UserLoginRequest"
}
}
],
"responses": {
"200": {
"description": "User logged in successfully",
"schema": {
"$ref": "#/definitions/UserLoginResponse"
}
},
"400": {
"description": "Invalid request body"
},
"401": {
"description": "Incorrect password or user deactivated"
},
"500": {
"description": "Failed to login user"
}
}
}
},
"/user/auth/logout": {
"delete": {
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"user"
],
"summary": "Logout user",
"operationId": "userLogout",
"parameters": [
{
"description": "User session id",
"name": "X-Authorization",
"in": "header"
}
],
"responses": {
"201": {
"description": "User logged out successfully"
},
"500": {
"description": "Failed to logout user"
}
}
}
},
"/user/avatar": {
"post": {
"consumes": [
"multipart/form-data"
],
"produces": [
"application/json"
],
"tags": [
"user"
],
"summary": "Update user avatar",
"operationId": "userAvatar",
"parameters": [
{
"description": "You can create a new api key in your user profile",
"name": "X-Api-Key",
"in": "header"
},
{
"type": "file",
"description": "Avatar file",
"name": "file",
"in": "formData"
}
],
"responses": {
"200": {
"description": "User avatar updated successfully"
},
"400": {
"description": "Invalid request body"
},
"401": {
"description": "No permissions"
},
"413": {
"description": "File too large"
},
"422": {
"description": "Invalid file type"
},
"500": {
"description": "Failed to update user avatar"
}
}
}
},
"/user/session/{idForDeletion}": {
"delete": {
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"user"
],
"summary": "Sign out user session",
"operationId": "userSignOutSession",
"parameters": [
{
"description": "You can create a new api key in your user profile",
"name": "X-Api-Key",
"in": "header"
},
{
"description": "Id for deletion",
"name": "idForDeletion",
"in": "path"
}
],
"responses": {
"200": {
"description": "User session signed out successfully"
},
"400": {
"description": "Invalid request body"
},
"401": {
"description": "No permissions"
},
"500": {
"description": "Failed to sign out user session"
}
}
}
} }
}, },
"definitions": { "definitions": {
"ApiCreateEquipmentDocumentationRequest": { "ApiGroupTaskRequest": {
"type": "object",
"properties": {
"Category": {
"type": "string"
},
"Description": {
"type": "string"
},
"GlobalInputs": {
"type": "object"
},
"GroupId": {
"type": "string"
}
},
"x-go-package": "jannex/admin-dashboard-backend/modules/structs"
},
"CreateEquipmentDocumentationRequest": {
"type": "object", "type": "object",
"properties": { "properties": {
"notes": { "notes": {
@ -310,7 +488,7 @@
}, },
"x-go-package": "jannex/admin-dashboard-backend/modules/structs" "x-go-package": "jannex/admin-dashboard-backend/modules/structs"
}, },
"ApiEditEquipmentDocumentationRequest": { "EditEquipmentDocumentationRequest": {
"type": "object", "type": "object",
"properties": { "properties": {
"documentationId": { "documentationId": {
@ -333,40 +511,6 @@
}, },
"x-go-package": "jannex/admin-dashboard-backend/modules/structs" "x-go-package": "jannex/admin-dashboard-backend/modules/structs"
}, },
"ApiEquipmentDocumentationResponse": {
"type": "object",
"properties": {
"Documentations": {
"type": "array",
"items": {
"$ref": "#/definitions/EquipmentDocumentation"
}
},
"Status": {
"type": "integer",
"format": "int64"
}
},
"x-go-package": "jannex/admin-dashboard-backend/modules/structs"
},
"ApiGroupTaskRequest": {
"type": "object",
"properties": {
"Category": {
"type": "string"
},
"Description": {
"type": "string"
},
"GlobalInputs": {
"type": "object"
},
"GroupId": {
"type": "string"
}
},
"x-go-package": "jannex/admin-dashboard-backend/modules/structs"
},
"EquipmentDocumentation": { "EquipmentDocumentation": {
"type": "object", "type": "object",
"properties": { "properties": {
@ -399,6 +543,43 @@
} }
}, },
"x-go-package": "jannex/admin-dashboard-backend/modules/structs" "x-go-package": "jannex/admin-dashboard-backend/modules/structs"
},
"EquipmentDocumentationResponse": {
"type": "object",
"properties": {
"Documentations": {
"type": "array",
"items": {
"$ref": "#/definitions/EquipmentDocumentation"
}
},
"Status": {
"type": "integer",
"format": "int64"
}
},
"x-go-package": "jannex/admin-dashboard-backend/modules/structs"
},
"UserLoginRequest": {
"type": "object",
"properties": {
"Password": {
"type": "string"
},
"Username": {
"type": "string"
}
},
"x-go-package": "jannex/admin-dashboard-backend/modules/structs"
},
"UserLoginResponse": {
"type": "object",
"properties": {
"Session": {
"type": "string"
}
},
"x-go-package": "jannex/admin-dashboard-backend/modules/structs"
} }
} }
} }

View File

@ -23,7 +23,7 @@ func CreateEquipmentDocumentation(c *fiber.Ctx) error {
// - name: body // - name: body
// in: body // in: body
// schema: // schema:
// "$ref": "#/definitions/ApiCreateEquipmentDocumentationRequest" // "$ref": "#/definitions/CreateEquipmentDocumentationRequest"
// responses: // responses:
// '200': // '200':
// description: New equipment documentation created successfully // description: New equipment documentation created successfully
@ -34,7 +34,7 @@ func CreateEquipmentDocumentation(c *fiber.Ctx) error {
// '500': // '500':
// description: Failed to create equipment documentation // description: Failed to create equipment documentation
var body structs.ApiCreateEquipmentDocumentationRequest var body structs.CreateEquipmentDocumentationRequest
if err := utils.BodyParserHelper(c, &body); err != nil { if err := utils.BodyParserHelper(c, &body); err != nil {
return c.SendStatus(fiber.StatusBadRequest) return c.SendStatus(fiber.StatusBadRequest)
@ -64,7 +64,7 @@ func GetEquipmentDocumentations(c *fiber.Ctx) error {
// '200': // '200':
// description: Equipment documentations. Status 200 if equipment documentations found, status 404 if stock item not found on invex, status 401 if backend has no permissions to access invex // description: Equipment documentations. Status 200 if equipment documentations found, status 404 if stock item not found on invex, status 401 if backend has no permissions to access invex
// schema: // schema:
// "$ref": "#/definitions/ApiEquipmentDocumentationResponse" // "$ref": "#/definitions/EquipmentDocumentationResponse"
// '400': // '400':
// description: Invalid request body // description: Invalid request body
// '401': // '401':
@ -72,7 +72,7 @@ func GetEquipmentDocumentations(c *fiber.Ctx) error {
// '500': // '500':
// description: Failed to get equipment documentations // description: Failed to get equipment documentations
var params structs.ApiEquipmentRequest var params structs.EquipmentRequest
if err := utils.ParamsParserHelper(c, &params); err != nil { if err := utils.ParamsParserHelper(c, &params); err != nil {
return c.SendStatus(fiber.StatusBadRequest) return c.SendStatus(fiber.StatusBadRequest)
@ -115,7 +115,7 @@ func GetEquipmentDocumentation(c *fiber.Ctx) error {
// '500': // '500':
// description: Failed to get equipment documentation // description: Failed to get equipment documentation
var params structs.ApiGetDocumentationEquipmentRequest var params structs.GetDocumentationEquipmentRequest
if err := utils.ParamsParserHelper(c, &params); err != nil { if err := utils.ParamsParserHelper(c, &params); err != nil {
return c.SendStatus(fiber.StatusBadRequest) return c.SendStatus(fiber.StatusBadRequest)
@ -139,7 +139,7 @@ func EditEquipmentDocumentation(c *fiber.Ctx) error {
// - name: body // - name: body
// in: body // in: body
// schema: // schema:
// "$ref": "#/definitions/ApiEditEquipmentDocumentationRequest" // "$ref": "#/definitions/EditEquipmentDocumentationRequest"
// responses: // responses:
// '200': // '200':
// description: Equipment documentation edited successfully // description: Equipment documentation edited successfully
@ -150,7 +150,7 @@ func EditEquipmentDocumentation(c *fiber.Ctx) error {
// '500': // '500':
// description: Failed to edit equipment documentation // description: Failed to edit equipment documentation
var body structs.ApiEditEquipmentDocumentationRequest var body structs.EditEquipmentDocumentationRequest
if err := utils.BodyParserHelper(c, &body); err != nil { if err := utils.BodyParserHelper(c, &body); err != nil {
return c.SendStatus(fiber.StatusBadRequest) return c.SendStatus(fiber.StatusBadRequest)
@ -183,7 +183,7 @@ func GetEquipmentThumbnail(c *fiber.Ctx) error {
// '500': // '500':
// description: Failed to get equipment thumbnail // description: Failed to get equipment thumbnail
var params structs.ApiEquipmentRequest var params structs.EquipmentRequest
if err := utils.ParamsParserHelper(c, &params); err != nil { if err := utils.ParamsParserHelper(c, &params); err != nil {
return c.SendStatus(fiber.StatusBadRequest) return c.SendStatus(fiber.StatusBadRequest)

View File

@ -15,15 +15,33 @@ import (
) )
func UserLogin(c *fiber.Ctx) error { func UserLogin(c *fiber.Ctx) error {
// swagger:operation POST /user/auth/login user userLogin
// ---
// summary: Login user
// consumes:
// - application/json
// produces:
// - application/json
// parameters:
// - name: body
// in: body
// schema:
// "$ref": "#/definitions/UserLoginRequest"
// responses:
// '200':
// description: User logged in successfully
// schema:
// "$ref": "#/definitions/UserLoginResponse"
// '400':
// description: Invalid request body
// '401':
// description: Incorrect password or user deactivated
// '500':
// description: Failed to login user
var body structs.UserLoginRequest var body structs.UserLoginRequest
if err := c.BodyParser(&body); err != nil { if err := utils.BodyParserHelper(c, &body); err != nil {
log.Error().Msg("Failed to parse body, err: " + err.Error())
return c.Status(fiber.StatusBadRequest).JSON(err)
}
if err := utils.ValidateStruct(body); err != nil {
log.Error().Msgf("Failed to validate body, err: %v", err)
return c.SendStatus(fiber.StatusBadRequest) return c.SendStatus(fiber.StatusBadRequest)
} }
@ -31,7 +49,7 @@ func UserLogin(c *fiber.Ctx) error {
if err != nil { if err != nil {
log.Error().Msg("Failed to decode base64 password, err: " + err.Error()) log.Error().Msg("Failed to decode base64 password, err: " + err.Error())
return c.Status(fiber.StatusBadRequest).JSON(err.Error()) return c.SendStatus(fiber.StatusBadRequest)
} }
if passwordValid := utils.IsPasswordLengthValid(string(decodedPassword)); !passwordValid { if passwordValid := utils.IsPasswordLengthValid(string(decodedPassword)); !passwordValid {
@ -84,6 +102,23 @@ func UserLogin(c *fiber.Ctx) error {
} }
func UserLogout(c *fiber.Ctx) error { func UserLogout(c *fiber.Ctx) error {
// swagger:operation DELETE /user/auth/logout user userLogout
// ---
// summary: Logout user
// consumes:
// - application/json
// produces:
// - application/json
// parameters:
// - name: X-Authorization
// in: header
// description: User session id
// responses:
// '201':
// description: User logged out successfully
// '500':
// description: Failed to logout user
session := utils.GetXAuhorizationHeader(c) session := utils.GetXAuhorizationHeader(c)
database.DB.Delete(&structs.UserSession{}, "id = ?", session) database.DB.Delete(&structs.UserSession{}, "id = ?", session)

View File

@ -17,6 +17,35 @@ import (
) )
func UpdateAvatar(c *fiber.Ctx) error { func UpdateAvatar(c *fiber.Ctx) error {
// swagger:operation POST /user/avatar user userAvatar
// ---
// summary: Update user avatar
// consumes:
// - multipart/form-data
// produces:
// - application/json
// parameters:
// - name: X-Api-Key
// in: header
// description: You can create a new api key in your user profile
// - name: file
// in: formData
// type: file
// description: Avatar file
// responses:
// '200':
// description: User avatar updated successfully
// '400':
// description: Invalid request body
// '401':
// description: No permissions
// '413':
// description: File too large
// '422':
// description: Invalid file type
// '500':
// description: Failed to update user avatar
fileHeader, err := c.FormFile("file") fileHeader, err := c.FormFile("file")
if err != nil { if err != nil {

View File

@ -12,6 +12,30 @@ import (
) )
func SignOutSession(c *fiber.Ctx) error { func SignOutSession(c *fiber.Ctx) error {
// swagger:operation DELETE /user/session/{idForDeletion} user userSignOutSession
// ---
// summary: Sign out user session
// consumes:
// - application/json
// produces:
// - application/json
// parameters:
// - name: X-Api-Key
// in: header
// description: You can create a new api key in your user profile
// - name: idForDeletion
// in: path
// description: Id for deletion
// responses:
// '200':
// description: User session signed out successfully
// '400':
// description: Invalid request body
// '401':
// description: No permissions
// '500':
// description: Failed to sign out user session
var params structs.UserSignOutSessionRequest var params structs.UserSignOutSessionRequest
if err := c.ParamsParser(&params); err != nil { if err := c.ParamsParser(&params); err != nil {