Untitled

mail@pastecode.io avatar
unknown
plain_text
2 years ago
4.6 kB
1
Indexable
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
	}

}