Untitled
unknown
plain_text
7 months ago
4.6 kB
0
Indexable
Never
func (a *CmsController) UpdateAgentPointBulkV2(c *gin.Context) { var ( request domain.PointInput response domain.PointResponse responseHttp domain.PointResponsehttp message string totalPointReward float64 totalPointTrip float64 totalAgent int ) if err := c.ShouldBindJSON(&request); err != nil { util.HandleError(c, http.StatusBadRequest, 400, util.ERR_BAD_REQUEST, err, util.ERR_BAD_REQUEST) return } if len(request.PointObjectList) == 0 { util.HandleError(c, http.StatusBadRequest, 400, "Data is empty", nil, "Data is empty") return } user := util.GetPayload(c) poolSize := 300 jobs := make(chan domain.PointObject, len(request.PointObjectList)) results := make(chan error, len(request.PointObjectList)) ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() //Inititlize Pusher client pusherClient := pusher.Client{ AppID: "1568693", Key: "01f135328afa9718336f", Secret: "71683f9c79925a0f4207", Cluster: "ap1", Secure: true, } pusherChanel := user.UserID + "pointreward" bacth := user.UserID resultBacth, errBacth := a.CmsService.GenerateBacthData(bacth) if errBacth.Message != nil { util.HandleError(c, http.StatusInternalServerError, 500, "internal server error", errBacth.Message, "internal server error") return } for w := 1; w <= poolSize; w++ { go func(id int, jobs <-chan domain.PointObject, results chan<- error) { for point := range jobs { data, errorResponse := a.CmsService.InsertUpdateAgentRewardTemporary(resultBacth.BacthData, point.AgentID, point.PointReward, point.PointTrip, point.Incentive) if errorResponse.Message != nil { message += fmt.Sprintf("AgentID : %v failed to materi point, %v \n", point.AgentID.String, errorResponse.Message.Error()) results <- errorResponse.Message continue } _, errorResponse2 := a.CmsService.SaveAgentRewardTemporary(resultBacth.BacthData, user.UserID) if errorResponse2.Message != nil { message += fmt.Sprintf("AgentID : %v failed to materi point, %v \n", point.AgentID.String, errorResponse.Message.Error()) results <- errorResponse2.Message continue } if data.Retval != "200" { response.Status = 207 fmt.Println(response.Status) continue } if data.Retval != "404" { totalAgent++ reward, _ := strconv.ParseFloat(point.PointReward.String, 64) trip, _ := strconv.ParseFloat(point.PointTrip.String, 64) totalPointReward += reward totalPointTrip += trip results <- nil continue } } }(w, jobs, results) } for _, point := range request.PointObjectList { jobs <- point } close(jobs) for i := 0; i < len(request.PointObjectList); i++ { select { case err := <-results: if err != nil { continue } case <-ctx.Done(): //util.HandleError(c, response.Status, response.Status, "Worker timeout", nil, "Worker timeout") // //Triger event to Pusher chanel continue } } response.TotalAgent = strconv.Itoa(totalAgent) response.TotalPointReward = fmt.Sprintf("%.2f", totalPointReward) response.TotalPointTrip = fmt.Sprintf("%.2f", totalPointTrip) response.LastUploadedBy = util.GetPayload(c).UserID response.LastUploadedTime = time.Now().Format("01/02/06") responseHttp.Message = "Data is being processed" if response.Status != 207 { responseHttp.Message = "Data Succesfully Saved" response.Status = 200 } util.HandleSuccess(c, response.Status, response.Status, "Data is being processed", &responseHttp, nil, "Data is being processed") // response.Message = message //Triger event to Pusher chanel errorResp := a.CmsService.InsertPointLog(response.TotalAgent, response.TotalPointReward, response.TotalPointTrip, response.LastUploadedBy) if errorResp.Message != nil { util.HandleError(c, http.StatusInternalServerError, 500, "Error insert Point Log", errorResp.Message, "Error insert Point Log") return } listError, errResponse := a.CmsService.GetListPointRewardError(resultBacth.BacthData) if errResponse.Message != nil { fmt.Println("Bacth data = ", resultBacth.BacthData) fmt.Println("Erro = ", errResponse) } response.ErrorData = append(response.ErrorData, listError...) if errTrigerToPusherChanel := pusherClient.Trigger(pusherChanel, "point-updated", response); errTrigerToPusherChanel != nil { log.Printf("failed to triger chanel %v", errTrigerToPusherChanel) return } }