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