Files
houston-be/pkg/postgres/query/incident.go
2023-03-31 03:22:48 +05:30

144 lines
4.5 KiB
Go

package query
import (
"fmt"
"houston/entity"
"houston/model"
"strconv"
"time"
"gorm.io/gorm"
)
func CreateIncident(db *gorm.DB, request *model.CreateIncident) (*entity.IncidentEntity, error) {
severityId, err := strconv.Atoi(request.IncidentSeverity)
if err != nil {
return nil, fmt.Errorf("fetch channel conversationInfo failed. err: %v", err)
}
severity, err := FindSeverityById(db, severityId)
if err != nil {
return nil, fmt.Errorf("fetch FindSeverityById failed. err: %v", err)
}
incidentEntity := &entity.IncidentEntity{
Title: request.IncidentTitle,
Description: request.IncidentDescription,
Status: request.Status,
SeverityId: severityId,
IncidentName: request.IncidentName,
SlackChannel: request.SlackChannel,
DetectionTime: request.DetectionTime,
CustomerImpactStartTime: request.CustomerImpactStartTime,
CustomerImpactEndTime: request.CustomerImpactEndTime,
TeamsId: request.TeamsId,
JiraId: request.JiraId,
ConfluenceId: request.ConfluenceId,
RemindMeAt: request.RemindMeAt,
EnableReminder: request.EnableReminder,
SeverityTat: time.Now().AddDate(0, 0, severity.Sla),
CreatedBy: request.CreatedBy,
UpdatedBy: request.UpdatedBy,
Version: request.Version,
}
result := db.Create(incidentEntity)
if result.Error != nil {
return nil, result.Error
}
return incidentEntity, nil
}
func UpdateIncident(db *gorm.DB, incidentEntity *entity.IncidentEntity) error {
result := db.Updates(incidentEntity)
if result.Error != nil {
return result.Error
}
return nil
}
func FindIncidentById(db *gorm.DB, incidentId string) (*entity.IncidentEntity, error) {
var incidentEntity entity.IncidentEntity
result := db.Find(&incidentEntity, "id = ?", incidentId)
if result.Error != nil {
return nil, result.Error
}
return &incidentEntity, nil
}
func FindNotResolvedLatestIncidents(db *gorm.DB, limit int) ([]entity.IncidentSeverityTeamJoinEntity, error) {
var incidentSeverityTeamJoinEntity []entity.IncidentSeverityTeamJoinEntity
result := db.Limit(limit).
Where("status <> ? AND incidents.deleted_at IS NULL", entity.Resolved).
Order("incidents.created_at desc").
Joins("JOIN severity ON severity.id = incidents.severity_id").
Joins("JOIN teams ON teams.id = incidents.teams_id").
Select("incidents.title,incidents.status,incidents.slack_channel,severity.id as severity_id,severity.name as severity_name,teams.id as teams_id,teams.name as teams_name").
Find(&entity.IncidentEntity{}).
Scan(&incidentSeverityTeamJoinEntity)
if result.Error != nil {
return nil, result.Error
}
return incidentSeverityTeamJoinEntity, nil
}
func FindIncidentByChannelId(db *gorm.DB, channelId string) (*entity.IncidentEntity, error) {
var incidentEntity entity.IncidentEntity
result := db.Find(&incidentEntity, "slack_channel = ?", channelId)
if result.Error != nil {
return nil, result.Error
}
if result.RowsAffected == 0 {
return nil, nil
}
return &incidentEntity, nil
}
func FindIncidentSeverityTeamJoin(db *gorm.DB, slackChannelId string) (*entity.IncidentSeverityTeamJoinEntity, error) {
var incidentSeverityTeamJoinEntity entity.IncidentSeverityTeamJoinEntity
result := db.Where("incidents.slack_channel = ? and incidents.deleted_at IS NULL", slackChannelId).Joins("JOIN severity ON severity.id = incidents.severity_id").Joins("JOIN teams ON teams.id = incidents.teams_id").Select("incidents.id as incident_id,incidents.title,incidents.status,incidents.slack_channel,severity.id as severity_id,severity.name as severity_name,teams.id as teams_id,teams.name as teams_name").Find(&entity.IncidentEntity{}).Scan(&incidentSeverityTeamJoinEntity)
if result.Error != nil {
return nil, result.Error
}
if result.RowsAffected == 0 {
return nil, nil
}
return &incidentSeverityTeamJoinEntity, nil
}
func FindLatestIncidentId(db *gorm.DB) (int, error) {
var incidentEntity entity.IncidentEntity
result := db.Order("incidents.id desc").Limit(1).Find(&incidentEntity)
if result.Error != nil {
return -1, result.Error
}
return int(incidentEntity.ID), nil
}
func FindIncidentsBreachingSevTat(db *gorm.DB) ([]entity.IncidentEntity, error) {
var incidentEntity []entity.IncidentEntity
currentTime := time.Now()
result := db.Where("status <> ? AND severity_tat <= ?", entity.Resolved, currentTime).Find(&incidentEntity)
if result.Error != nil {
return nil, result.Error
}
return incidentEntity, nil
}