customerfeedback
parent
81d27587b7
commit
64342af5c8
|
@ -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{})
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
|
@ -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/"
|
||||||
)
|
)
|
||||||
|
|
|
@ -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)
|
||||||
|
}
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue