Files
worker/app/models/group.go
Gleb Tv 2c884c5612
Некоторые проверки не удались
CI / test (push) Successful in 2m5s
Docker / Build and publish worker image (push) Failing after 31s
refactor: adopt worker module path
2026-07-13 17:56:12 +03:00

77 строки
2.5 KiB
Go

package models
import "rocketgit.ru/rsmon/worker/app/models/concerns"
// Group represents a monitor group.
type Group struct {
concerns.Model
AccountID int64 `gorm:"type:bigint REFERENCES accounts(id)" json:"account_id"`
Account *Account `json:"-"`
Name string `json:"name" gorm:"not null"`
IsSystem *bool `json:"is_system" gorm:"default:false"`
MonitorsCount int `gorm:"-:all" json:"monitors_count"`
Monitors []Monitor `json:"-"`
Notifications []Notification `gorm:"many2many:notification_groups;" json:"-"`
concerns.Timestamped `json:"-"`
Audited
}
// SystemGroups returns all groups marked as system/internal (is_system=true).
// These groups are converted to distributed monitors (system checks running
// on the distributed worker pool).
func SystemGroups() ([]Group, error) {
var groups []Group
err := DB().Where("is_system = ?", true).Find(&groups).Error
return groups, err
}
// GroupIdsForAccountId returns all group IDs for the given account.
func GroupIdsForAccountId(accountID int64) []int64 { //nolint:revive // accepted lint exception
rows, err := DB().Raw("SELECT id FROM groups WHERE account_id = ?", accountID).Rows()
if err != nil {
panic(err)
}
defer rows.Close() //nolint:errcheck // accepted lint exception
var cid int64
groupIDs := make([]int64, 0)
for rows.Next() {
rows.Scan(&cid) //nolint:errcheck // accepted lint exception
groupIDs = append(groupIDs, cid)
}
return groupIDs
}
// CountGroups counts monitors per group.
func CountGroups(groupIDs []int64, groupCount *map[int64]int) { //nolint:gocritic // ptrToRefParam: accepted pattern
rows, err := DB().Raw("select group_id, count(id) from monitors where group_id IN (?) group by group_id ", groupIDs).Rows()
if err != nil {
panic(err)
}
defer rows.Close() //nolint:errcheck // accepted lint exception
var gid int64
var count int
for rows.Next() {
rows.Scan(&gid, &count) //nolint:errcheck // accepted lint exception
(*groupCount)[gid] = count
}
}
// GroupsCounts fills MonitorsCount for each group.
func GroupsCounts(groups *[]Group) {
groupIDs := make([]int64, len(*groups))
groupCount := make(map[int64]int, len(*groups))
for i, g := range *groups { //nolint:gocritic // range copy is acceptable here
groupIDs[i] = g.ID
groupCount[g.ID] = 0
}
CountGroups(groupIDs, &groupCount)
for i, g := range *groups { //nolint:gocritic // range copy is acceptable here
(*groups)[i].MonitorsCount = groupCount[g.ID]
}
}