Spaces:
Running
Running
restructure repo into production layout; add whatsapp-service, tests, ddl, docs, scripts; scrub hardcoded secrets
83d6851 | package chat_handler | |
| import ( | |
| "net/http" | |
| chat_service "agentdeck-whatsapp-service/pkg/chat/service" | |
| instance_model "agentdeck-whatsapp-service/pkg/instance/model" | |
| "github.com/gin-gonic/gin" | |
| ) | |
| type ChatHandler interface { | |
| ChatPin(ctx *gin.Context) | |
| ChatUnpin(ctx *gin.Context) | |
| ChatArchive(ctx *gin.Context) | |
| ChatUnarchive(ctx *gin.Context) | |
| ChatMute(ctx *gin.Context) | |
| ChatUnmute(ctx *gin.Context) | |
| HistorySyncRequest(ctx *gin.Context) | |
| } | |
| type chatHandler struct { | |
| chatService chat_service.ChatService | |
| } | |
| // Pin a chat | |
| // @Summary Pin a chat | |
| // @Description Pin a chat | |
| // @Tags Chat | |
| // @Accept json | |
| // @Produce json | |
| // @Param message body chat_service.BodyStruct true "Chat" | |
| // @Success 200 {object} gin.H "success" | |
| // @Failure 400 {object} gin.H "Error on validation" | |
| // @Failure 500 {object} gin.H "Internal server error" | |
| // @Router /chat/pin [post] | |
| func (c *chatHandler) ChatPin(ctx *gin.Context) { | |
| getInstance := ctx.MustGet("instance") | |
| instance, ok := getInstance.(*instance_model.Instance) | |
| if !ok { | |
| ctx.JSON(http.StatusInternalServerError, gin.H{"error": "instance not found"}) | |
| return | |
| } | |
| var data *chat_service.BodyStruct | |
| err := ctx.ShouldBindBodyWithJSON(&data) | |
| if err != nil { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| if data.Chat == "" { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": "chat is required"}) | |
| return | |
| } | |
| ts, err := c.chatService.ChatPin(data, instance) | |
| if err != nil { | |
| ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| responseData := gin.H{ | |
| "timestamp": ts, | |
| } | |
| ctx.JSON(http.StatusOK, gin.H{"message": "success", "data": responseData}) | |
| } | |
| // Unpin a chat | |
| // @Summary Unpin a chat | |
| // @Description Unpin a chat | |
| // @Tags Chat | |
| // @Accept json | |
| // @Produce json | |
| // @Param message body chat_service.BodyStruct true "Chat" | |
| // @Success 200 {object} gin.H "success" | |
| // @Failure 400 {object} gin.H "Error on validation" | |
| // @Failure 500 {object} gin.H "Internal server error" | |
| // @Router /chat/unpin [post] | |
| func (c *chatHandler) ChatUnpin(ctx *gin.Context) { | |
| getInstance := ctx.MustGet("instance") | |
| instance, ok := getInstance.(*instance_model.Instance) | |
| if !ok { | |
| ctx.JSON(http.StatusInternalServerError, gin.H{"error": "instance not found"}) | |
| return | |
| } | |
| var data *chat_service.BodyStruct | |
| err := ctx.ShouldBindBodyWithJSON(&data) | |
| if err != nil { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| if data.Chat == "" { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": "chat is required"}) | |
| return | |
| } | |
| ts, err := c.chatService.ChatUnpin(data, instance) | |
| if err != nil { | |
| ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| responseData := gin.H{ | |
| "timestamp": ts, | |
| } | |
| ctx.JSON(http.StatusOK, gin.H{"message": "success", "data": responseData}) | |
| } | |
| // Archive a chat | |
| // @Summary Archive a chat | |
| // @Description Archive a chat | |
| // @Tags Chat | |
| // @Accept json | |
| // @Produce json | |
| // @Param message body chat_service.BodyStruct true "Chat" | |
| // @Success 200 {object} gin.H "success" | |
| // @Failure 400 {object} gin.H "Error on validation" | |
| // @Failure 500 {object} gin.H "Internal server error" | |
| // @Router /chat/archive [post] | |
| func (c *chatHandler) ChatArchive(ctx *gin.Context) { | |
| getInstance := ctx.MustGet("instance") | |
| instance, ok := getInstance.(*instance_model.Instance) | |
| if !ok { | |
| ctx.JSON(http.StatusInternalServerError, gin.H{"error": "instance not found"}) | |
| return | |
| } | |
| var data *chat_service.BodyStruct | |
| err := ctx.ShouldBindBodyWithJSON(&data) | |
| if err != nil { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| if data.Chat == "" { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": "chat is required"}) | |
| return | |
| } | |
| ts, err := c.chatService.ChatArchive(data, instance) | |
| if err != nil { | |
| ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| responseData := gin.H{ | |
| "timestamp": ts, | |
| } | |
| ctx.JSON(http.StatusOK, gin.H{"message": "success", "data": responseData}) | |
| } | |
| // Unarchive a chat | |
| // @Summary Unarchive a chat | |
| // @Description Unarchive a chat | |
| // @Tags Chat | |
| // @Accept json | |
| // @Produce json | |
| // @Param message body chat_service.BodyStruct true "Chat" | |
| // @Success 200 {object} gin.H "success" | |
| // @Failure 400 {object} gin.H "Error on validation" | |
| // @Failure 500 {object} gin.H "Internal server error" | |
| // @Router /chat/unarchive [post] | |
| func (c *chatHandler) ChatUnarchive(ctx *gin.Context) { | |
| getInstance := ctx.MustGet("instance") | |
| instance, ok := getInstance.(*instance_model.Instance) | |
| if !ok { | |
| ctx.JSON(http.StatusInternalServerError, gin.H{"error": "instance not found"}) | |
| return | |
| } | |
| var data *chat_service.BodyStruct | |
| err := ctx.ShouldBindBodyWithJSON(&data) | |
| if err != nil { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| if data.Chat == "" { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": "chat is required"}) | |
| return | |
| } | |
| ts, err := c.chatService.ChatUnarchive(data, instance) | |
| if err != nil { | |
| ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| responseData := gin.H{ | |
| "timestamp": ts, | |
| } | |
| ctx.JSON(http.StatusOK, gin.H{"message": "success", "data": responseData}) | |
| } | |
| // Mute a chat | |
| // @Summary Mute a chat | |
| // @Description Mute a chat | |
| // @Tags Chat | |
| // @Accept json | |
| // @Produce json | |
| // @Param message body chat_service.BodyStruct true "Chat" | |
| // @Success 200 {object} gin.H "success" | |
| // @Failure 400 {object} gin.H "Error on validation" | |
| // @Failure 500 {object} gin.H "Internal server error" | |
| // @Router /chat/mute [post] | |
| func (c *chatHandler) ChatMute(ctx *gin.Context) { | |
| getInstance := ctx.MustGet("instance") | |
| instance, ok := getInstance.(*instance_model.Instance) | |
| if !ok { | |
| ctx.JSON(http.StatusInternalServerError, gin.H{"error": "instance not found"}) | |
| return | |
| } | |
| var data *chat_service.BodyStruct | |
| err := ctx.ShouldBindBodyWithJSON(&data) | |
| if err != nil { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| if data.Chat == "" { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": "chat is required"}) | |
| return | |
| } | |
| ts, err := c.chatService.ChatMute(data, instance) | |
| if err != nil { | |
| ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| responseData := gin.H{ | |
| "timestamp": ts, | |
| } | |
| ctx.JSON(http.StatusOK, gin.H{"message": "success", "data": responseData}) | |
| } | |
| // Unmute a chat | |
| // @Summary Unmute a chat | |
| // @Description Unmute a chat | |
| // @Tags Chat | |
| // @Accept json | |
| // @Produce json | |
| // @Param message body chat_service.BodyStruct true "Chat" | |
| // @Success 200 {object} gin.H "success" | |
| // @Failure 400 {object} gin.H "Error on validation" | |
| // @Failure 500 {object} gin.H "Internal server error" | |
| // @Router /chat/unmute [post] | |
| func (c *chatHandler) ChatUnmute(ctx *gin.Context) { | |
| getInstance := ctx.MustGet("instance") | |
| instance, ok := getInstance.(*instance_model.Instance) | |
| if !ok { | |
| ctx.JSON(http.StatusInternalServerError, gin.H{"error": "instance not found"}) | |
| return | |
| } | |
| var data *chat_service.BodyStruct | |
| err := ctx.ShouldBindBodyWithJSON(&data) | |
| if err != nil { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| if data.Chat == "" { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": "chat is required"}) | |
| return | |
| } | |
| ts, err := c.chatService.ChatUnmute(data, instance) | |
| if err != nil { | |
| ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| responseData := gin.H{ | |
| "timestamp": ts, | |
| } | |
| ctx.JSON(http.StatusOK, gin.H{"message": "success", "data": responseData}) | |
| } | |
| // HistorySyncRequest a chat | |
| // @Summary HistorySyncRequest a chat | |
| // @Description HistorySyncRequest a chat | |
| // @Tags Chat | |
| // @Accept json | |
| // @Produce json | |
| // @Param message body chat_service.HistorySyncRequestStruct true "Chat" | |
| // @Success 200 {object} gin.H "success" | |
| // @Failure 400 {object} gin.H "Error on validation" | |
| // @Failure 500 {object} gin.H "Internal server error" | |
| // @Router /chat/history-sync [post] | |
| func (c *chatHandler) HistorySyncRequest(ctx *gin.Context) { | |
| getInstance := ctx.MustGet("instance") | |
| instance, ok := getInstance.(*instance_model.Instance) | |
| if !ok { | |
| ctx.JSON(http.StatusInternalServerError, gin.H{"error": "instance not found"}) | |
| return | |
| } | |
| var data *chat_service.HistorySyncRequestStruct | |
| err := ctx.ShouldBindBodyWithJSON(&data) | |
| if err != nil { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| resp, err := c.chatService.HistorySyncRequest(data, instance) | |
| if err != nil { | |
| ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| ctx.JSON(http.StatusOK, gin.H{"message": "success", "data": resp}) | |
| } | |
| func NewChatHandler( | |
| chatService chat_service.ChatService, | |
| ) ChatHandler { | |
| return &chatHandler{ | |
| chatService: chatService, | |
| } | |
| } | |