Spaces:
Running
Running
restructure repo into production layout; add whatsapp-service, tests, ddl, docs, scripts; scrub hardcoded secrets
83d6851 | package user_handler | |
| import ( | |
| "net/http" | |
| instance_model "agentdeck-whatsapp-service/pkg/instance/model" | |
| user_service "agentdeck-whatsapp-service/pkg/user/service" | |
| "github.com/gin-gonic/gin" | |
| ) | |
| type UserHandler interface { | |
| GetUser(ctx *gin.Context) | |
| CheckUser(ctx *gin.Context) | |
| GetAvatar(ctx *gin.Context) | |
| GetContacts(ctx *gin.Context) | |
| GetPrivacy(ctx *gin.Context) | |
| SetPrivacy(ctx *gin.Context) | |
| BlockContact(ctx *gin.Context) | |
| UnblockContact(ctx *gin.Context) | |
| GetBlockList(ctx *gin.Context) | |
| SetProfilePicture(ctx *gin.Context) | |
| SetProfileName(ctx *gin.Context) | |
| SetProfileStatus(ctx *gin.Context) | |
| } | |
| type userHandler struct { | |
| userService user_service.UserService | |
| } | |
| // Get a user | |
| // @Summary Get a user | |
| // @Description Get a user | |
| // @Tags User | |
| // @Accept json | |
| // @Produce json | |
| // @Param message body user_service.CheckUserStruct true "User data" | |
| // @Success 200 {object} gin.H "success" | |
| // @Failure 400 {object} gin.H "Error on validation" | |
| // @Failure 500 {object} gin.H "Internal server error" | |
| // @Router /user/info [post] | |
| func (u *userHandler) GetUser(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 *user_service.CheckUserStruct | |
| err := ctx.ShouldBindBodyWithJSON(&data) | |
| if err != nil { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| if len(data.Number) < 1 { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": "phone number is required"}) | |
| return | |
| } | |
| uc, err := u.userService.GetUser(data, instance) | |
| if err != nil { | |
| ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| ctx.JSON(http.StatusOK, gin.H{"message": "success", "data": uc}) | |
| } | |
| // Check a user | |
| // @Summary Check a user | |
| // @Description Check a user | |
| // @Tags User | |
| // @Accept json | |
| // @Produce json | |
| // @Param message body user_service.CheckUserStruct true "User data" | |
| // @Success 200 {object} gin.H "success" | |
| // @Failure 400 {object} gin.H "Error on validation" | |
| // @Failure 500 {object} gin.H "Internal server error" | |
| // @Router /user/check [post] | |
| func (u *userHandler) CheckUser(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 *user_service.CheckUserStruct | |
| err := ctx.ShouldBindBodyWithJSON(&data) | |
| if err != nil { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| if len(data.Number) < 1 { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": "phone number is required"}) | |
| return | |
| } | |
| uc, err := u.userService.CheckUser(data, instance) | |
| if err != nil { | |
| ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| ctx.JSON(http.StatusOK, gin.H{"message": "success", "data": uc}) | |
| } | |
| // Get a user's avatar | |
| // @Summary Get a user's avatar | |
| // @Description Get a user's avatar | |
| // @Tags User | |
| // @Accept json | |
| // @Produce json | |
| // @Param message body user_service.GetAvatarStruct true "Avatar data" | |
| // @Success 200 {object} gin.H "success" | |
| // @Failure 400 {object} gin.H "Error on validation" | |
| // @Failure 500 {object} gin.H "Internal server error" | |
| // @Router /user/avatar [post] | |
| func (u *userHandler) GetAvatar(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 *user_service.GetAvatarStruct | |
| err := ctx.ShouldBindBodyWithJSON(&data) | |
| if err != nil { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| if len(data.Number) < 1 { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": "phone number is required"}) | |
| return | |
| } | |
| if data.Number == "" { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": "phone number is required"}) | |
| return | |
| } | |
| pic, err := u.userService.GetAvatar(data, instance) | |
| if err != nil { | |
| ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| ctx.JSON(http.StatusOK, gin.H{"message": "success", "data": pic}) | |
| } | |
| // Get a user's contacts | |
| // @Summary Get a user's contacts | |
| // @Description Get a user's contacts | |
| // @Tags User | |
| // @Accept json | |
| // @Produce json | |
| // @Success 200 {object} gin.H "success" | |
| // @Failure 500 {object} gin.H "Internal server error" | |
| // @Router /user/contacts [get] | |
| func (u *userHandler) GetContacts(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 | |
| } | |
| contacts, err := u.userService.GetContacts(instance) | |
| if err != nil { | |
| ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| ctx.JSON(http.StatusOK, gin.H{"message": "success", "data": contacts}) | |
| } | |
| // Get a user's privacy settings | |
| // @Summary Get a user's privacy settings | |
| // @Description Get a user's privacy settings | |
| // @Tags User | |
| // @Accept json | |
| // @Produce json | |
| // @Success 200 {object} gin.H "success" | |
| // @Failure 500 {object} gin.H "Internal server error" | |
| // @Router /user/privacy [get] | |
| func (u *userHandler) GetPrivacy(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 | |
| } | |
| privacy, err := u.userService.GetPrivacy(instance) | |
| if err != nil { | |
| ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| ctx.JSON(http.StatusOK, gin.H{"message": "success", "data": privacy}) | |
| } | |
| // Set a user's privacy settings | |
| // @Summary Set a user's privacy settings | |
| // @Description Set a user's privacy settings | |
| // @Tags User | |
| // @Accept json | |
| // @Produce json | |
| // @Param message body user_service.PrivacyStruct true "Privacy data" | |
| // @Success 200 {object} gin.H "success" | |
| // @Failure 500 {object} gin.H "Internal server error" | |
| // @Router /user/privacy [post] | |
| func (u *userHandler) SetPrivacy(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 *user_service.PrivacyStruct | |
| err := ctx.ShouldBindBodyWithJSON(&data) | |
| if err != nil { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| if data.CallAdd == "" { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": "call add is required"}) | |
| return | |
| } | |
| if data.GroupAdd == "" { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": "group add is required"}) | |
| return | |
| } | |
| if data.LastSeen == "" { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": "last seen is required"}) | |
| return | |
| } | |
| if data.Online == "" { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": "online is required"}) | |
| return | |
| } | |
| if data.Profile == "" { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": "profile is required"}) | |
| return | |
| } | |
| if data.ReadReceipts == "" { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": "read receipts is required"}) | |
| return | |
| } | |
| if data.Status == "" { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": "status is required"}) | |
| return | |
| } | |
| privacy, err := u.userService.SetPrivacy(data, instance) | |
| if err != nil { | |
| ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| ctx.JSON(http.StatusOK, gin.H{"message": "success", "data": privacy}) | |
| } | |
| // Block a contact | |
| // @Summary Block a contact | |
| // @Description Block a contact | |
| // @Tags User | |
| // @Accept json | |
| // @Produce json | |
| // @Param message body user_service.BlockStruct true "Block data" | |
| // @Success 200 {object} gin.H "success" | |
| // @Failure 400 {object} gin.H "Error on validation" | |
| // @Failure 500 {object} gin.H "Internal server error" | |
| // @Router /user/block [post] | |
| func (u *userHandler) BlockContact(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 *user_service.BlockStruct | |
| err := ctx.ShouldBindBodyWithJSON(&data) | |
| if err != nil { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| if len(data.Number) < 1 { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": "phone number is required"}) | |
| return | |
| } | |
| if data.Number == "" { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": "phone number is required"}) | |
| return | |
| } | |
| resp, err := u.userService.BlockContact(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}) | |
| } | |
| // Unblock a contact | |
| // @Summary Unblock a contact | |
| // @Description Unblock a contact | |
| // @Tags User | |
| // @Accept json | |
| // @Produce json | |
| // @Param message body user_service.BlockStruct true "Block data" | |
| // @Success 200 {object} gin.H "success" | |
| // @Failure 400 {object} gin.H "Error on validation" | |
| // @Failure 500 {object} gin.H "Internal server error" | |
| // @Router /user/unblock [post] | |
| func (u *userHandler) UnblockContact(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 *user_service.BlockStruct | |
| err := ctx.ShouldBindBodyWithJSON(&data) | |
| if err != nil { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| if len(data.Number) < 1 { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": "phone number is required"}) | |
| return | |
| } | |
| if data.Number == "" { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": "phone number is required"}) | |
| return | |
| } | |
| resp, err := u.userService.UnlockContact(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}) | |
| } | |
| // Get a user's block list | |
| // @Summary Get a user's block list | |
| // @Description Get a user's block list | |
| // @Tags User | |
| // @Accept json | |
| // @Produce json | |
| // @Success 200 {object} gin.H "success" | |
| // @Failure 500 {object} gin.H "Internal server error" | |
| // @Router /user/blocklist [get] | |
| func (u *userHandler) GetBlockList(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 | |
| } | |
| resp, err := u.userService.GetBlockList(instance) | |
| if err != nil { | |
| ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| ctx.JSON(http.StatusOK, gin.H{"message": "success", "data": resp}) | |
| } | |
| // Set a user's profile picture | |
| // @Summary Set a user's profile picture | |
| // @Description Set a user's profile picture | |
| // @Tags User | |
| // @Accept json | |
| // @Produce json | |
| // @Param message body user_service.SetProfilePictureStruct true "Profile picture data" | |
| // @Success 200 {object} gin.H "success" | |
| // @Failure 400 {object} gin.H "Error on validation" | |
| // @Failure 500 {object} gin.H "Internal server error" | |
| // @Router /user/profilePicture [post] | |
| func (u *userHandler) SetProfilePicture(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 *user_service.SetProfilePictureStruct | |
| err := ctx.ShouldBindBodyWithJSON(&data) | |
| if err != nil { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| if data.Image == "" { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": "image is required"}) | |
| return | |
| } | |
| resp, err := u.userService.SetProfilePicture(data, instance) | |
| if err != nil { | |
| ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| if !resp { | |
| ctx.JSON(http.StatusInternalServerError, gin.H{"error": "failed to set profile picture"}) | |
| return | |
| } | |
| responseData := gin.H{"image": data.Image} | |
| ctx.JSON(http.StatusOK, gin.H{"message": "success", "data": responseData}) | |
| } | |
| // Set a user's profile name | |
| // @Summary Set a user's profile name | |
| // @Description Set a user's profile name | |
| // @Tags User | |
| // @Accept json | |
| // @Produce json | |
| // @Param message body user_service.SetProfilePictureStruct true "Profile name data" | |
| // @Success 200 {object} gin.H "success" | |
| // @Failure 400 {object} gin.H "Error on validation" | |
| // @Failure 500 {object} gin.H "Internal server error" | |
| // @Router /user/profileName [post] | |
| func (u *userHandler) SetProfileName(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 *user_service.SetProfileNameStruct | |
| err := ctx.ShouldBindBodyWithJSON(&data) | |
| if err != nil { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| if data.Name == "" { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": "name is required"}) | |
| return | |
| } | |
| resp, err := u.userService.SetProfileName(data, instance) | |
| if err != nil { | |
| ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| if !resp { | |
| ctx.JSON(http.StatusInternalServerError, gin.H{"error": "failed to set profile picture"}) | |
| return | |
| } | |
| responseData := gin.H{"name": data.Name} | |
| ctx.JSON(http.StatusOK, gin.H{"message": "success", "data": responseData}) | |
| } | |
| // Set a user's profile status | |
| // @Summary Set a user's profile status | |
| // @Description Set a user's profile status | |
| // @Tags User | |
| // @Accept json | |
| // @Produce json | |
| // @Param message body user_service.SetProfilePictureStruct true "Profile status data" | |
| // @Success 200 {object} gin.H "success" | |
| // @Failure 400 {object} gin.H "Error on validation" | |
| // @Failure 500 {object} gin.H "Internal server error" | |
| // @Router /user/profileStatus [post] | |
| func (u *userHandler) SetProfileStatus(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 *user_service.SetProfileStatusStruct | |
| err := ctx.ShouldBindBodyWithJSON(&data) | |
| if err != nil { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| if data.Status == "" { | |
| ctx.JSON(http.StatusBadRequest, gin.H{"error": "name is required"}) | |
| return | |
| } | |
| resp, err := u.userService.SetProfileStatus(data, instance) | |
| if err != nil { | |
| ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| if !resp { | |
| ctx.JSON(http.StatusInternalServerError, gin.H{"error": "failed to set profile picture"}) | |
| return | |
| } | |
| responseData := gin.H{"status": data.Status} | |
| ctx.JSON(http.StatusOK, gin.H{"message": "success", "data": responseData}) | |
| } | |
| func NewUserHandler( | |
| userService user_service.UserService, | |
| ) UserHandler { | |
| return &userHandler{ | |
| userService: userService, | |
| } | |
| } | |