UNCLASSIFIED - NO CUI

Skip to content
Snippets Groups Projects
collectTickets.go 1.85 KiB
package collector

import (
	"sync"
	"time"

	"holocron/collector-jira-workflow/pkg/database"
	"holocron/collector-jira-workflow/pkg/httpClient"
	"holocron/collector-jira-workflow/pkg/utils"
)

func saveTickets(tickets []database.TicketJSON, db database.DB) {
	for _, ticket := range tickets {
		db.UpsertTicket(ticket)
	}
}

func pruneTickets(
	collectedTickets *[]database.TicketJSON,
	board database.CollectorTarget,
	db database.DB,
) (delCount int) {

	savedTickets := db.GetTickets(board)
	var collectedHashTable map[string]bool = make(map[string]bool, len(*collectedTickets))
	for _, ticket := range *collectedTickets {
		collectedHashTable[ticket.ID] = true
	}
	for _, ticket := range savedTickets {
		if _, ticketInAPIResp := collectedHashTable[ticket.TicketID]; !ticketInAPIResp {
			db.DeleteTicket(ticket)
			delCount++
		}
	}

	return delCount
}

func collectTickets(activeBoards []database.CollectorTarget, db database.DB) {
	utils.Logger.Info("Collecting workflow data...")
	var (
		mtx       sync.Mutex
		wg        sync.WaitGroup
		delCount  = 0
		saveCount = 0
		startTime = time.Now()
	)
	wg.Add(len(activeBoards))
	for _, board := range activeBoards {
		go func(board database.CollectorTarget) {
			// let the fetching happen concurrently
			defer wg.Done()
			ticketsForBoard := httpClient.GetTickets(board)
			// but only one go routine can write to db, and count variables
			// at a time
			mtx.Lock()
			defer mtx.Unlock()
			deleted := pruneTickets(ticketsForBoard, board, db)
			saveTickets(*ticketsForBoard, db)
			saveCount += len(*ticketsForBoard)
			delCount += deleted
		}(board)
	}
	wg.Wait()

	statsFormattedStr := "\n---Finished collecting tickets---\n" +
		"---Time Elapsed - %.0f seconds---\n" +
		"%d\t-\tTickets Collected\n" +
		"%d\t-\tTickets Removed\n"
	utils.Logger.Infof(statsFormattedStr,
		time.Since(startTime).Seconds(),
		saveCount, delCount)
}