From 553192f767b13cb3bada4ee12787512362ff62f3 Mon Sep 17 00:00:00 2001 From: alex Date: Tue, 5 Mar 2024 21:35:35 +0100 Subject: [PATCH] handle duplicate company name --- modules/structs/crm.go | 2 +- routers/router/api/v1/crm/crm.go | 39 ++++++++++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/modules/structs/crm.go b/modules/structs/crm.go index d356a94..8302033 100644 --- a/modules/structs/crm.go +++ b/modules/structs/crm.go @@ -17,7 +17,7 @@ type CrmCustomer struct { LastContact time.Time CreatedBy string Notes string - Company string + Company string `gorm:"unique"` ZipCode string Address string City string diff --git a/routers/router/api/v1/crm/crm.go b/routers/router/api/v1/crm/crm.go index a8ced57..9daba9d 100644 --- a/routers/router/api/v1/crm/crm.go +++ b/routers/router/api/v1/crm/crm.go @@ -10,8 +10,10 @@ import ( "git.ex.umbach.dev/Alex/roese-utils/rslogger" "git.ex.umbach.dev/Alex/roese-utils/rspagination" + "github.com/go-sql-driver/mysql" "github.com/gofiber/fiber/v2" "github.com/google/uuid" + "gorm.io/gorm" ) func GetCrmTypeCustomers(c *fiber.Ctx) error { @@ -169,6 +171,8 @@ func UpdateCrmCustomer(c *fiber.Ctx) error { // description: No permissions // '404': // description: Crm customer not found + // '409': + // description: Crm customer with the company name already exists // '500': // description: Failed to update crm customer @@ -196,11 +200,15 @@ func UpdateCrmCustomer(c *fiber.Ctx) error { return c.SendStatus(fiber.StatusBadRequest) } - database.DB.Model(&structs.CrmCustomer{}). + result := database.DB.Model(&structs.CrmCustomer{}). Where("id = ?", params.Id). Select("*"). // update all fields (even if they are empty) Updates(crmCustomer) + if err := handleError(result, c); err != nil { + return err + } + crmCustomer["Id"] = params.Id socketclients.BroadcastMessageToTopicStartsWith(utils.SubscribedTopicCrm, structs.SendSocketMessage{ @@ -234,6 +242,8 @@ func CreateCrmCustomer(c *fiber.Ctx) error { // description: Invalid request query // '401': // description: No permissions + // '409': + // description: Crm customer with the company name already exists // '500': // description: Failed to create crm customer @@ -257,7 +267,11 @@ func CreateCrmCustomer(c *fiber.Ctx) error { crmCustomer["DealPhase"] = 1 } - database.DB.Model(&structs.CrmCustomer{}).Create(&crmCustomer) + result := database.DB.Model(&structs.CrmCustomer{}).Create(&crmCustomer) + + if err := handleError(result, c); err != nil { + return err + } socketclients.BroadcastMessageToTopicStartsWith(utils.SubscribedTopicCrm, structs.SendSocketMessage{ @@ -269,3 +283,24 @@ func CreateCrmCustomer(c *fiber.Ctx) error { return c.JSON(crmCustomer) } + +func handleError(result *gorm.DB, c *fiber.Ctx) error { + if result.Error != nil { + if mysqlErr, ok := result.Error.(*mysql.MySQLError); ok { + switch mysqlErr.Number { + case 1062: + logger.AddCrmLog(rslogger.LogTypeError, "Failed to create crm customer as company name already exists: %v", result.Error.Error()) + return c.SendStatus(fiber.StatusConflict) + + default: + logger.AddCrmLog(rslogger.LogTypeError, "Failed to create crm customer: %v", result.Error.Error()) + return c.SendStatus(fiber.StatusInternalServerError) + } + } + + logger.AddCrmLog(rslogger.LogTypeError, "Failed to create crm customer: %v", result.Error.Error()) + return c.SendStatus(fiber.StatusInternalServerError) + } + + return nil +}