From d3011d77ff3a6491e88d0ee20d58ff9e8ac4d46c Mon Sep 17 00:00:00 2001 From: Senad Uka Date: Tue, 10 Oct 2023 08:39:50 +0200 Subject: [PATCH] upstream sync --- controllers/buyers_controller.go | 2 +- controllers/contracts_controller.go | 172 ++++++++++++++------ controllers/product_templates_controller.go | 2 +- database/contract/contract.go | 17 +- routes/public_routes.go | 4 +- 5 files changed, 139 insertions(+), 58 deletions(-) diff --git a/controllers/buyers_controller.go b/controllers/buyers_controller.go index dc636c8..d4d8bb3 100644 --- a/controllers/buyers_controller.go +++ b/controllers/buyers_controller.go @@ -56,5 +56,5 @@ func ListBuyers(c *gin.Context) { } // Respond with the buyers and the total count - c.JSON(http.StatusOK, gin.H{"total": total, "buyers": buyers}) + c.JSON(http.StatusOK, gin.H{"total": total, "data": buyers}) } diff --git a/controllers/contracts_controller.go b/controllers/contracts_controller.go index 8d56c97..d32bafa 100644 --- a/controllers/contracts_controller.go +++ b/controllers/contracts_controller.go @@ -1,6 +1,7 @@ package controllers import ( + "encoding/json" "log" "net/http" "strconv" @@ -19,61 +20,61 @@ func GetLatestContracts(c *gin.Context) { offsetStr := c.DefaultQuery("offset", "0") status := strings.Split(c.DefaultQuery("status", models.ContractStatusActive), ",") - // New/Updated optional parameters - companyName := c.Query("company_name") - companyAddress := c.Query("company_address") - companyEmail := c.Query("company_email") - companyPhone := c.Query("company_phone") - contractName := c.Query("contract_name") - startTimeStr := c.Query("start_time") - endTimeStr := c.Query("end_time") - deviceIDsStr := c.QueryArray("deviceIDs[]") + // New/Updated optional parameters + companyName := c.Query("company_name") + companyAddress := c.Query("company_address") + companyEmail := c.Query("company_email") + companyPhone := c.Query("company_phone") + contractName := c.Query("contract_name") + startTimeStr := c.Query("start_time") + endTimeStr := c.Query("end_time") + deviceIDsStr := c.QueryArray("deviceIDs[]") - // Convert limit and offset to int - limit, err := strconv.Atoi(limitStr) - if err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid limit value"}) - return - } + // Convert limit and offset to int + limit, err := strconv.Atoi(limitStr) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid limit value"}) + return + } - offset, err := strconv.Atoi(offsetStr) - if err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid offset value"}) - return - } + offset, err := strconv.Atoi(offsetStr) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid offset value"}) + return + } - // Convert startTime to time.Time - var startTime time.Time - if startTimeStr != "" { - startTimeUnix, err := strconv.ParseInt(startTimeStr, 10, 64) - if err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid start_time value"}) - return - } - startTime = time.Unix(startTimeUnix, 0) - } + // Convert startTime to time.Time + var startTime time.Time + if startTimeStr != "" { + startTimeUnix, err := strconv.ParseInt(startTimeStr, 10, 64) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid start_time value"}) + return + } + startTime = time.Unix(startTimeUnix, 0) + } - // Convert endTime to time.Time - var endTime time.Time - if endTimeStr != "" { - endTimeUnix, err := strconv.ParseInt(endTimeStr, 10, 64) - if err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid end_time value"}) - return - } - endTime = time.Unix(endTimeUnix, 0) - } + // Convert endTime to time.Time + var endTime time.Time + if endTimeStr != "" { + endTimeUnix, err := strconv.ParseInt(endTimeStr, 10, 64) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid end_time value"}) + return + } + endTime = time.Unix(endTimeUnix, 0) + } - // Convert deviceIDs to []int64 - var deviceIDs []int64 - for _, idStr := range deviceIDsStr { - id, err := strconv.ParseInt(idStr, 10, 64) - if err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid deviceID value"}) - return - } - deviceIDs = append(deviceIDs, id) - } + // Convert deviceIDs to []int64 + var deviceIDs []int64 + for _, idStr := range deviceIDsStr { + id, err := strconv.ParseInt(idStr, 10, 64) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid deviceID value"}) + return + } + deviceIDs = append(deviceIDs, id) + } // Fetch contracts contracts, total, st, err := contract.GetContracts(status, companyName, companyAddress, companyEmail, companyPhone, &startTime, &endTime, contractName, deviceIDs, 0, nil, limit, offset) @@ -139,7 +140,7 @@ func GetBuyerContracts(c *gin.Context) { return } - // Respond with the contracts and the total count + // Respond with the contracts and the total count c.JSON(http.StatusOK, gin.H{"total": total, "data": models.ConvertContractToResponseModel(contracts)}) } @@ -187,4 +188,73 @@ func CreateContract(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "Successfully received and saved contract", "id": newContract.ID}) } +func GetContractByID(c *gin.Context) { + // Get the contract ID from url parameters + contractIDStr := c.Param("contract_id") + + if contractIDStr == "" { + log.Printf("GetContractByID Error: ID is required") + c.JSON(http.StatusBadRequest, gin.H{"error": "ID is required"}) + return + } + + contractID, err := strconv.ParseUint(contractIDStr, 10, 32) + if err != nil { + log.Printf("GetContractByID Error: Invalid ID: %v", err) + c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid ID"}) + return + } + + // Fetch contract + contract, st, err := contract.GetContractByID(contractID) + if err != nil { + c.JSON(st, gin.H{"error": err.Error()}) + return + } + + // Respond with the contracts and the total count + c.JSON(http.StatusOK, gin.H{"data": contract}) +} + +func UpdateContract(c *gin.Context) { + + var contractModel models.Contract + rawData, _ := c.GetRawData() + + // Unmarshal to the important info structure + err := json.Unmarshal(rawData, &contractModel) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid JSON payload"}) + log.Printf("Invalid json pyload : %v", err) + return + } + + // Get the contract ID from url parameters + contractIDStr := c.Param("contract_id") + + if contractIDStr == "" { + log.Printf("UpdateContract Error: ID is required") + c.JSON(http.StatusBadRequest, gin.H{"error": "ID is required"}) + return + } + + contractID, err := strconv.ParseUint(contractIDStr, 10, 32) + if err != nil { + log.Printf("UpdateContract Error: Invalid ID: %v", err) + c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid ID"}) + return + } + + contractModel.ID = uint(contractID) + + // update contract + contractModel, st, err := contract.UpdateContract(contractModel) + if err != nil { + c.JSON(st, gin.H{"error": err.Error()}) + return + } + + // Respond with the contracts and the total count + c.JSON(http.StatusOK, gin.H{"data": contractModel}) +} diff --git a/controllers/product_templates_controller.go b/controllers/product_templates_controller.go index 299fdb1..eb3e16c 100644 --- a/controllers/product_templates_controller.go +++ b/controllers/product_templates_controller.go @@ -57,7 +57,7 @@ func ListProductTemplates(c *gin.Context) { } // Respond with the product templates and the total count - c.JSON(http.StatusOK, gin.H{"total": total, "product_templates": productTemplates}) + c.JSON(http.StatusOK, gin.H{"total": total, "data": productTemplates}) } func GetProductTemplate(c *gin.Context) { diff --git a/database/contract/contract.go b/database/contract/contract.go index 294f7ac..e2de180 100644 --- a/database/contract/contract.go +++ b/database/contract/contract.go @@ -111,18 +111,27 @@ func GetContracts(status []string, companyName string, companyAddress string, return contracts, total, http.StatusOK, nil } +func UpdateContract(contract models.Contract) (models.Contract, int, error) { + // Update contract + if err := shared.GetDb().Update(contract).Error; err != nil { + log.Printf("UpdateContractByID Error: Could not update contract: %v", err) + return contract, http.StatusInternalServerError, err + } + return GetContractByID(uint64(contract.ID)) -func GetContractByID(contractID uint64) (models.Contract, int ,error) { +} + +func GetContractByID(contractID uint64) (models.Contract, int, error) { // Fetch the contract creation date based on contractID var contract models.Contract if err := shared.GetDb().Where("id = ?", contractID).First(&contract).Error; err != nil { - log.Printf("GetDeviceData Error: Could not fetch contract: %v", err) + log.Printf("GetContractByID Error: Could not fetch contract: %v", err) return contract, http.StatusInternalServerError, err } - - return contract , http.StatusOK, nil + + return contract, http.StatusOK, nil } \ No newline at end of file diff --git a/routes/public_routes.go b/routes/public_routes.go index 82822bc..70a526b 100644 --- a/routes/public_routes.go +++ b/routes/public_routes.go @@ -15,7 +15,7 @@ func RegisterPublicRoutes(r *gin.Engine) { // Invoices r.GET("/invoices", controllers.GetInvoices) - r.GET("/invoice/:id", controllers.GetInvoiceByID) + r.GET("/invoice/:id", controllers.GetInvoiceByID) r.POST("/device_data/save", controllers.SaveDeviceInfo) r.GET("/buyers/", controllers.ListBuyers) @@ -29,4 +29,6 @@ func RegisterPublicRoutes(r *gin.Engine) { r.GET("/contracts", controllers.GetBuyerContracts) r.POST("/contracts/create", controllers.CreateContract) + r.GET("/contracts/:contract_id", controllers.GetContractByID) + r.PATCH("/contracts/:contract_id", controllers.UpdateContract) }