customerfeedback

main
alex 2024-05-26 23:15:35 +02:00
parent 81d27587b7
commit 64342af5c8
5 changed files with 144 additions and 0 deletions

View File

@ -49,4 +49,5 @@ func InitDatabase() {
db.AutoMigrate(&structs.CrmCallProtocol{}) db.AutoMigrate(&structs.CrmCallProtocol{})
db.AutoMigrate(&structs.CrmLink{}) db.AutoMigrate(&structs.CrmLink{})
db.AutoMigrate(&structs.CrmLinkHistory{}) db.AutoMigrate(&structs.CrmLinkHistory{})
db.AutoMigrate(&structs.CustomerFeedback{})
} }

View File

@ -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
}

View File

@ -107,6 +107,7 @@ const (
SentCmdCrmLinkCreated = 51 SentCmdCrmLinkCreated = 51
SentCmdCrmLinkUsed = 52 SentCmdCrmLinkUsed = 52
SentCmdCrmLinkDeleted = 53 SentCmdCrmLinkDeleted = 53
SendCmdCustomerFeedbackAddFeedback = 54
) )
// commands received from web clients // commands received from web clients
@ -233,6 +234,9 @@ const (
PermissionCrmLinkCreate = _crm + "link.create" PermissionCrmLinkCreate = _crm + "link.create"
PermissionCrmLinkView = _crm + "link.view" PermissionCrmLinkView = _crm + "link.view"
PermissionCrmLinkDelete = _crm + "link.delete" PermissionCrmLinkDelete = _crm + "link.delete"
_customerFeedback = "customerfeedback."
PermissionCustomerFeedbackView = _customerFeedback + "view"
) )
var SystemPermissions = []string{ var SystemPermissions = []string{
@ -275,6 +279,7 @@ var SystemPermissions = []string{
PermissionCrmLinkCreate, PermissionCrmLinkCreate,
PermissionCrmLinkView, PermissionCrmLinkView,
PermissionCrmLinkDelete, PermissionCrmLinkDelete,
PermissionCustomerFeedbackView,
} }
var DynamicGroupTasksPermissions = []string{ var DynamicGroupTasksPermissions = []string{
@ -301,4 +306,6 @@ const (
SubscribedTopicAdminAreaManage = "/admin-area/manage" SubscribedTopicAdminAreaManage = "/admin-area/manage"
SubscribedTopicCrm = "/crm/" SubscribedTopicCrm = "/crm/"
SubscribedTopicCustomerFeedback = "/customer-feedback/"
) )

View File

@ -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)
}

View File

@ -8,6 +8,7 @@ import (
"jannex/admin-dashboard-backend/modules/utils" "jannex/admin-dashboard-backend/modules/utils"
adminarea "jannex/admin-dashboard-backend/routers/router/api/v1/adminArea" 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/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/equipment"
"jannex/admin-dashboard-backend/routers/router/api/v1/grouptasks" "jannex/admin-dashboard-backend/routers/router/api/v1/grouptasks"
"jannex/admin-dashboard-backend/routers/router/api/v1/logmanagerserverconnections" "jannex/admin-dashboard-backend/routers/router/api/v1/logmanagerserverconnections"
@ -86,6 +87,11 @@ func SetupRoutes(app *fiber.App) {
c.Get("/link", crm.CrmNoLinkProvidedRedirect) c.Get("/link", crm.CrmNoLinkProvidedRedirect)
c.Delete("/links/:id", requestAccessValidation, crm.DeleteCrmLink) 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) app.Static("/", config.Cfg.FolderPaths.PublicStatic)
} }