- Apply automated linter fixes - Manually reformat fields in model/service.go - Resolve code complexity issues
68 lines
1.3 KiB
Go
68 lines
1.3 KiB
Go
package transform
|
|
|
|
import (
|
|
"slices"
|
|
"sync"
|
|
|
|
"git.ostiwe.com/ostiwe-com/status/dto"
|
|
"git.ostiwe.com/ostiwe-com/status/model"
|
|
"github.com/samber/lo"
|
|
)
|
|
|
|
const maxStatuses = 60
|
|
|
|
func PublicServices(items ...model.Service) []dto.PublicService {
|
|
result := make([]dto.PublicService, 0, len(items))
|
|
mu := new(sync.Mutex)
|
|
|
|
chunked := slices.Chunk(items, 40)
|
|
|
|
for services := range chunked {
|
|
wg := new(sync.WaitGroup)
|
|
wg.Add(len(services))
|
|
|
|
for i := range services {
|
|
go func(_wg *sync.WaitGroup, item model.Service) {
|
|
defer _wg.Done()
|
|
|
|
transformed := PublicService(item)
|
|
mu.Lock()
|
|
result = append(result, transformed)
|
|
mu.Unlock()
|
|
}(wg, services[i])
|
|
}
|
|
|
|
wg.Wait()
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
func PublicService(item model.Service) dto.PublicService {
|
|
statuses := make([]model.Status, maxStatuses)
|
|
itemStatusLen := len(item.Statuses)
|
|
|
|
for i := range statuses {
|
|
if i > itemStatusLen-1 {
|
|
break
|
|
}
|
|
statuses[i] = item.Statuses[i]
|
|
}
|
|
|
|
for i := range statuses {
|
|
if statuses[i].Status == "" {
|
|
statuses[i].Status = model.StatusUncheck
|
|
}
|
|
}
|
|
|
|
slices.Reverse(statuses)
|
|
|
|
return dto.PublicService{
|
|
ID: int(item.ID),
|
|
Name: item.Name,
|
|
Description: lo.ToPtr(item.PublicDescription),
|
|
Statuses: statuses,
|
|
Uptime: item.CalculateUptimePercent(),
|
|
}
|
|
}
|