From 64342af5c867087273207d470613c2d2aa30ca33 Mon Sep 17 00:00:00 2001 From: alex Date: Sun, 26 May 2024 23:15:35 +0200 Subject: [PATCH] customerfeedback --- modules/database/database.go | 1 + modules/structs/customerfeedback.go | 23 ++++ modules/utils/globals.go | 7 ++ .../v1/customerfeedback/customerfeedback.go | 107 ++++++++++++++++++ routers/router/router.go | 6 + 5 files changed, 144 insertions(+) create mode 100644 modules/structs/customerfeedback.go create mode 100644 routers/router/api/v1/customerfeedback/customerfeedback.go diff --git a/modules/database/database.go b/modules/database/database.go index 9ccec7f..f61b0bb 100644 --- a/modules/database/database.go +++ b/modules/database/database.go @@ -49,4 +49,5 @@ func InitDatabase() { db.AutoMigrate(&structs.CrmCallProtocol{}) db.AutoMigrate(&structs.CrmLink{}) db.AutoMigrate(&structs.CrmLinkHistory{}) + db.AutoMigrate(&structs.CustomerFeedback{}) } diff --git a/modules/structs/customerfeedback.go b/modules/structs/customerfeedback.go new file mode 100644 index 0000000..1226278 --- /dev/null +++ b/modules/structs/customerfeedback.go @@ -0,0 +1,23 @@ +package structs + +import "time" + +type CustomerFeedback struct { + Id string + Origin string + Data map[string]interface{} `gorm:"serializer:json"` + CreatedAt time.Time +} + +type CustomerFeedbackQuery struct { + Origin string +} + +// swagger:model CustomerFeedbackRequest +type CustomerFeedbackRequest struct { + Data map[string]interface{} +} + +type CustomerOriginFeedbacksParam struct { + Origin string +} diff --git a/modules/utils/globals.go b/modules/utils/globals.go index 4374015..d7bd08e 100644 --- a/modules/utils/globals.go +++ b/modules/utils/globals.go @@ -107,6 +107,7 @@ const ( SentCmdCrmLinkCreated = 51 SentCmdCrmLinkUsed = 52 SentCmdCrmLinkDeleted = 53 + SendCmdCustomerFeedbackAddFeedback = 54 ) // commands received from web clients @@ -233,6 +234,9 @@ const ( PermissionCrmLinkCreate = _crm + "link.create" PermissionCrmLinkView = _crm + "link.view" PermissionCrmLinkDelete = _crm + "link.delete" + + _customerFeedback = "customerfeedback." + PermissionCustomerFeedbackView = _customerFeedback + "view" ) var SystemPermissions = []string{ @@ -275,6 +279,7 @@ var SystemPermissions = []string{ PermissionCrmLinkCreate, PermissionCrmLinkView, PermissionCrmLinkDelete, + PermissionCustomerFeedbackView, } var DynamicGroupTasksPermissions = []string{ @@ -301,4 +306,6 @@ const ( SubscribedTopicAdminAreaManage = "/admin-area/manage" SubscribedTopicCrm = "/crm/" + + SubscribedTopicCustomerFeedback = "/customer-feedback/" ) diff --git a/routers/router/api/v1/customerfeedback/customerfeedback.go b/routers/router/api/v1/customerfeedback/customerfeedback.go new file mode 100644 index 0000000..068e4ab --- /dev/null +++ b/routers/router/api/v1/customerfeedback/customerfeedback.go @@ -0,0 +1,107 @@ +package customerfeedback + +import ( + "jannex/admin-dashboard-backend/modules/database" + "jannex/admin-dashboard-backend/modules/logger" + "jannex/admin-dashboard-backend/modules/structs" + "jannex/admin-dashboard-backend/modules/utils" + "jannex/admin-dashboard-backend/socketclients" + "sort" + "time" + + "git.ex.umbach.dev/Alex/roese-utils/rslogger" + "git.ex.umbach.dev/Alex/roese-utils/rsutils" + "github.com/gofiber/fiber/v2" + "github.com/google/uuid" +) + +func CreateCustomerFeedback(c *fiber.Ctx) error { + var query structs.CustomerFeedbackQuery + + if err := rsutils.QueryParserHelper(c, &query); err != nil { + return c.SendStatus(fiber.StatusBadRequest) + } + + // validation of origin length + if len(query.Origin) < 1 || len(query.Origin) > 32 { + return c.SendStatus(fiber.StatusBadRequest) + } + + var body structs.CustomerFeedbackRequest + + if err := rsutils.BodyParserHelper(c, &body); err != nil { + return c.SendStatus(fiber.StatusBadRequest) + } + + customerFeedback := structs.CustomerFeedback{ + Id: uuid.New().String(), + Origin: query.Origin, + Data: body.Data, + CreatedAt: time.Now(), + } + + database.DB.Create(&customerFeedback) + + socketclients.BroadcastMessageToTopicStartsWith(utils.SubscribedTopicCustomerFeedback+query.Origin, + structs.SendSocketMessage{ + Cmd: utils.SendCmdCustomerFeedbackAddFeedback, + Body: struct { + Id string + Data map[string]interface{} + CreatedAt time.Time + }{ + Id: customerFeedback.Id, + Data: customerFeedback.Data, + CreatedAt: customerFeedback.CreatedAt, + }}, + ) + + logger.AddSystemLog(rslogger.LogTypeInfo, "Received customer feedback origin: %s data: %s", query.Origin, body.Data) + + return c.SendStatus(fiber.StatusOK) +} + +func GetCustomerFeedbackOrigins(c *fiber.Ctx) error { + var origins []string + + if err := database.DB.Model(&structs.CustomerFeedback{}).Pluck("origin", &origins).Error; err != nil { + logger.AddSystemLog(rslogger.LogTypeError, "Failed to fetch customer feedback origins, err: %s", err.Error()) + return c.SendStatus(fiber.StatusInternalServerError) + } + + return c.JSON(removeDuplicates(origins)) +} + +func removeDuplicates(origins []string) []string { + keys := make(map[string]bool) + uniqueOrigins := []string{} + + for _, origin := range origins { + if _, value := keys[origin]; !value { + keys[origin] = true + uniqueOrigins = append(uniqueOrigins, origin) + } + } + + return uniqueOrigins +} + +func GetCustomerOriginFeedbacks(c *fiber.Ctx) error { + var customerOriginFeedbacksParam structs.CustomerOriginFeedbacksParam + + if err := rsutils.ParamsParserHelper(c, &customerOriginFeedbacksParam); err != nil { + return c.SendStatus(fiber.StatusBadRequest) + } + + logger.AddSystemLog(rslogger.LogTypeInfo, "test %s", customerOriginFeedbacksParam.Origin) + + var customerFeedbacks []structs.CustomerFeedback + + database.DB.Where("origin = ?", customerOriginFeedbacksParam.Origin).Find(&customerFeedbacks) + + sort.Slice(customerFeedbacks, func(i, j int) bool { + return customerFeedbacks[i].CreatedAt.After(customerFeedbacks[j].CreatedAt) + }) + + return c.JSON(customerFeedbacks) +} diff --git a/routers/router/router.go b/routers/router/router.go index 11e4eb1..2b8995d 100644 --- a/routers/router/router.go +++ b/routers/router/router.go @@ -8,6 +8,7 @@ import ( "jannex/admin-dashboard-backend/modules/utils" adminarea "jannex/admin-dashboard-backend/routers/router/api/v1/adminArea" "jannex/admin-dashboard-backend/routers/router/api/v1/crm" + "jannex/admin-dashboard-backend/routers/router/api/v1/customerfeedback" "jannex/admin-dashboard-backend/routers/router/api/v1/equipment" "jannex/admin-dashboard-backend/routers/router/api/v1/grouptasks" "jannex/admin-dashboard-backend/routers/router/api/v1/logmanagerserverconnections" @@ -86,6 +87,11 @@ func SetupRoutes(app *fiber.App) { c.Get("/link", crm.CrmNoLinkProvidedRedirect) c.Delete("/links/:id", requestAccessValidation, crm.DeleteCrmLink) + cf := v1.Group("/customerfeedback") + cf.Post("/", requestAccessValidation, customerfeedback.CreateCustomerFeedback) + cf.Get("/origin/:origin", requestAccessValidation, customerfeedback.GetCustomerOriginFeedbacks) + cf.Get("/origins", requestAccessValidation, customerfeedback.GetCustomerFeedbackOrigins) + app.Static("/", config.Cfg.FolderPaths.PublicStatic) }