mirror of https://github.com/statping/statping
143 lines
3.6 KiB
Go
143 lines
3.6 KiB
Go
package downtimes
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/statping/statping/database"
|
|
"github.com/statping/statping/utils"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
var (
|
|
zeroInt64 int64
|
|
)
|
|
var db database.Database
|
|
var dbHits database.Database
|
|
|
|
func SetDB(database database.Database) {
|
|
db = database.Model(&Downtime{})
|
|
}
|
|
|
|
func Find(id int64) (*Downtime, error) {
|
|
var downtime Downtime
|
|
q := db.Where("id = ?", id).Find(&downtime)
|
|
if q.Error() != nil {
|
|
return nil, q.Error()
|
|
}
|
|
if q.RecordNotFound() {
|
|
return nil, fmt.Errorf(" Downtime record not found : %s", id)
|
|
}
|
|
return &downtime, q.Error()
|
|
}
|
|
|
|
func (c *Downtime) Validate() error {
|
|
if c.Type == "manual" {
|
|
if c.End != nil && c.End.After(time.Now()) || c.Start.After(time.Now()) {
|
|
return fmt.Errorf("Downtime cannot be in future")
|
|
}
|
|
if c.ServiceId == zeroInt64 {
|
|
return fmt.Errorf("Service ID cannot be null")
|
|
}
|
|
if c.SubStatus != "down" && c.SubStatus != "degraded" {
|
|
return fmt.Errorf("SubStatus can only be 'down' or 'degraded'")
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (c *Downtime) BeforeCreate() error {
|
|
return c.Validate()
|
|
}
|
|
|
|
func (c *Downtime) BeforeUpdate() error {
|
|
return c.Validate()
|
|
}
|
|
|
|
func FindByService(service int64, start time.Time, end time.Time) (*[]Downtime, error) {
|
|
var downtime []Downtime
|
|
q := db.Where("service = ? and start BETWEEN ? AND ? ", service, start, end)
|
|
q = q.Order("id ASC ").Find(&downtime)
|
|
return &downtime, q.Error()
|
|
}
|
|
|
|
func FindDowntime(timeVar time.Time) []Downtime {
|
|
var downtime []Downtime
|
|
q := db.Where("start <= ? and \"end\" >= ?", timeVar, timeVar)
|
|
q = q.Order("id ASC").Find(&downtime)
|
|
return downtime
|
|
}
|
|
|
|
func FindDowntime2() []Downtime {
|
|
var downtime []Downtime
|
|
db.Raw("select d1.* from downtimes d1 left join downtimes d2 on d1.service = d2.service and d2.start > d1.start where d2.service is NULL;").Scan(&downtime)
|
|
//db.Select("downtimes.*").Joins("left join downtimes as d2 on d2.service = downtimes.service AND downtimes.start < d2.start").Where("d2.end = ?",nil).Find(&downtime)
|
|
return downtime
|
|
}
|
|
|
|
func FindAll(vars map[string]string) (*[]Downtime, error) {
|
|
var downtime []Downtime
|
|
var start time.Time
|
|
var end time.Time
|
|
st, err1 := vars["start"]
|
|
en, err2 := vars["end"]
|
|
startInt, err := strconv.ParseInt(st, 10, 64)
|
|
endInt, err := strconv.ParseInt(en, 10, 64)
|
|
if err1 && err2 && (endInt > startInt) {
|
|
start, err = utils.ConvertToUnixTime(vars["start"])
|
|
if err != nil {
|
|
return &downtime, err
|
|
}
|
|
end, err = utils.ConvertToUnixTime(vars["end"])
|
|
if err != nil {
|
|
return &downtime, err
|
|
}
|
|
} else {
|
|
ninetyDaysAgo := time.Now().Add(time.Duration(-90*24) * time.Hour)
|
|
start = ninetyDaysAgo
|
|
end = time.Now()
|
|
}
|
|
q := db.Where("start BETWEEN ? AND ?", start, end)
|
|
if subStatusVar, subStatusErr := vars["sub_status"]; subStatusErr {
|
|
q = q.Where("sub_status = ?", subStatusVar)
|
|
}
|
|
if serviceIdVar, serviceIdErr := vars["service_id"]; serviceIdErr {
|
|
q = q.Where("service = ?", serviceIdVar)
|
|
}
|
|
if typeVar, typeErr := vars["type"]; typeErr {
|
|
q = q.Where("type = ?", typeVar)
|
|
}
|
|
var count int64
|
|
if countVar, countErr := vars["count"]; countErr {
|
|
count, err = strconv.ParseInt(countVar, 10, 64)
|
|
if count > 100 {
|
|
count = 100
|
|
}
|
|
} else {
|
|
count = 20
|
|
}
|
|
var skip int64
|
|
if skipVar, err6 := vars["skip"]; err6 {
|
|
skip, err = strconv.ParseInt(skipVar, 10, 64)
|
|
} else {
|
|
skip = 0
|
|
}
|
|
q = q.Order("start DESC")
|
|
q = q.Limit((int)(count)).Offset((int)(skip)).Find(&downtime)
|
|
return &downtime, q.Error()
|
|
}
|
|
|
|
func (c *Downtime) Create() error {
|
|
q := db.Create(c)
|
|
return q.Error()
|
|
}
|
|
|
|
func (c *Downtime) Update() error {
|
|
q := db.Where(" id = ? ", c.Id).Updates(c)
|
|
return q.Error()
|
|
}
|
|
|
|
func (c *Downtime) Delete() error {
|
|
q := db.Model(&Downtime{}).Delete(c)
|
|
return q.Error()
|
|
}
|