176 lines
5.1 KiB
Go
176 lines
5.1 KiB
Go
|
package service
|
|||
|
|
|||
|
import (
|
|||
|
"context"
|
|||
|
"encoding/base64"
|
|||
|
"fmt"
|
|||
|
"strconv"
|
|||
|
"strings"
|
|||
|
"time"
|
|||
|
|
|||
|
"go-common/app/admin/ep/melloi/model"
|
|||
|
"go-common/library/ecode"
|
|||
|
"go-common/library/log"
|
|||
|
)
|
|||
|
|
|||
|
// QueryApply query apply by apply object
|
|||
|
func (s *Service) QueryApply(qar *model.QueryApplyRequest) (*model.QueryApplyResponse, error) {
|
|||
|
return s.dao.QueryApply(&qar.Apply, qar.PageNum, qar.PageSize)
|
|||
|
}
|
|||
|
|
|||
|
// QueryUserApplyList query user apply list
|
|||
|
func (s *Service) QueryUserApplyList(userName string) ([]*model.Apply, error) {
|
|||
|
return s.dao.QueryUserApplyList(userName)
|
|||
|
}
|
|||
|
|
|||
|
// CheckRunPermission check user run permission
|
|||
|
func (s *Service) CheckRunPermission(userName string) (ret bool) {
|
|||
|
var (
|
|||
|
startTime int64
|
|||
|
err error
|
|||
|
endTime int64
|
|||
|
applyList []*model.Apply
|
|||
|
)
|
|||
|
currentTime := time.Now().Unix()
|
|||
|
|
|||
|
//白名单的人,不需要做check,直接返回true
|
|||
|
if ExistsInSlice(userName, s.c.Melloi.Executor) {
|
|||
|
ret = true
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
if applyList, err = s.dao.QueryUserApplyList(userName); err != nil {
|
|||
|
log.Error("s.dao.QueryUserApplyList err :(%v)", err)
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
for _, apply := range applyList {
|
|||
|
if startTime, err = strconv.ParseInt(apply.StartTime, 10, 64); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
if endTime, err = strconv.ParseInt(apply.EndTime, 10, 64); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
if currentTime >= startTime && currentTime <= endTime {
|
|||
|
ret = true
|
|||
|
break
|
|||
|
}
|
|||
|
}
|
|||
|
return ret
|
|||
|
}
|
|||
|
|
|||
|
// CheckRunTime check perf time
|
|||
|
func (s *Service) CheckRunTime() (ret bool) {
|
|||
|
currentTime := time.Now()
|
|||
|
// 1:30 ~ 12:00
|
|||
|
if currentTime.Hour() >= 1 && currentTime.Hour() < 12 {
|
|||
|
ret = true
|
|||
|
}
|
|||
|
// 14:00 ~ 17:00
|
|||
|
if currentTime.Hour() >= 14 && currentTime.Hour() < 17 {
|
|||
|
ret = true
|
|||
|
}
|
|||
|
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// UpdateApply update apply info
|
|||
|
func (s *Service) UpdateApply(cookie string, apply *model.Apply) (err error) {
|
|||
|
var user *model.User
|
|||
|
if apply.ID == 0 {
|
|||
|
return ecode.MelloiApplyRequestErr
|
|||
|
}
|
|||
|
|
|||
|
if user, err = s.QueryUser(apply.From); err != nil {
|
|||
|
log.Error("update apply query user error:(%v)", err)
|
|||
|
return
|
|||
|
}
|
|||
|
if user.ID != 0 {
|
|||
|
user.Accept = apply.Status
|
|||
|
if err = s.dao.UpdateUser(user); err != nil {
|
|||
|
return err
|
|||
|
}
|
|||
|
// 判断是审批操作,发送微信通知
|
|||
|
if apply.Status == 1 {
|
|||
|
applyMsg, _ := s.dao.QueryApplyByID(apply.ID)
|
|||
|
startTime, _ := strconv.Atoi(applyMsg.StartTime)
|
|||
|
st := time.Unix(int64(startTime), 0)
|
|||
|
endTime, _ := strconv.Atoi(applyMsg.EndTime)
|
|||
|
et := time.Unix(int64(endTime), 0)
|
|||
|
|
|||
|
content := "[MELLOI]压测申请处理完成 通知 \n 压测服务: " + applyMsg.Path + "\n" + "压测时间:" + st.Format("2006-01-02 15:04:05") + "\n" + "压测结束时间:" + et.Format("2006-01-02 15:04:05") + "\n" + "申请人:" +
|
|||
|
applyMsg.From + "\n" + "审批人:" + applyMsg.To + "\n" + "审批时间:" + time.Now().Format("2006-01-02 15:04:05")
|
|||
|
log.Info("content:(%s)", content)
|
|||
|
// 发送申请通过到群
|
|||
|
go s.AddWechatSend(context.TODO(), cookie, content)
|
|||
|
// 给申请人发送邮件
|
|||
|
go s.SendMail(apply.From+"@bilibili.com", "[MELLOI]压测申请通知", content)
|
|||
|
}
|
|||
|
return s.dao.UpdateApply(apply)
|
|||
|
}
|
|||
|
return ecode.MelloiUpdateUserErr
|
|||
|
}
|
|||
|
|
|||
|
// AddApply add new apply
|
|||
|
func (s *Service) AddApply(c context.Context, cookie string, apply *model.Apply) (err error) {
|
|||
|
apply.Status = -1
|
|||
|
apply.Active = 1
|
|||
|
|
|||
|
// 添加apply到db
|
|||
|
if err = s.dao.AddApply(apply); err != nil {
|
|||
|
return ecode.MelloiApplyRequestErr
|
|||
|
}
|
|||
|
|
|||
|
// 发送微信消息 & 发送邮件通知
|
|||
|
//加密 apply.id|apply.from|apply.to
|
|||
|
applyID := strconv.FormatInt(apply.ID, 10)
|
|||
|
beStr := applyID + "|" + apply.From + "|" + apply.To
|
|||
|
base64Str := base64.StdEncoding.EncodeToString([]byte(beStr))
|
|||
|
// 将时间戳转成日期
|
|||
|
startTime, _ := strconv.Atoi(apply.StartTime)
|
|||
|
st := time.Unix(int64(startTime), 0)
|
|||
|
endTime, _ := strconv.Atoi(apply.EndTime)
|
|||
|
et := time.Unix(int64(endTime), 0)
|
|||
|
|
|||
|
// 增加依赖服务列表
|
|||
|
var (
|
|||
|
userService map[string][]string
|
|||
|
serviceList = make(map[string][]string)
|
|||
|
serviceDep string
|
|||
|
serviceName string
|
|||
|
)
|
|||
|
|
|||
|
serviceName = strings.Replace(apply.Path, "bilibili.", "", 1)
|
|||
|
if userService, err = s.QueryDependServiceAdmins(c, serviceName, s.getSessionInCookie(cookie)); err != nil {
|
|||
|
log.Error("query depend service admin error(%v)", err)
|
|||
|
return
|
|||
|
}
|
|||
|
for _, v := range userService {
|
|||
|
for _, service := range v {
|
|||
|
serviceList[service] = nil
|
|||
|
}
|
|||
|
}
|
|||
|
for k := range serviceList {
|
|||
|
serviceDep += "\n" + k
|
|||
|
}
|
|||
|
|
|||
|
// 拼接消息体,amd=base64Str
|
|||
|
content := fmt.Sprintf("[MELLOI]压测申请处理 通知 \n 压测服务:%s\n压测开始时间段:%s\n压测结束时间段:%s\n申请人:%s\n申请时间:%s\n依赖服务:%s\n审批地址:http://melloi.bilibili.co#/apply-m?platform=mb&amd=%s",
|
|||
|
apply.Path, st.Format("2006-01-02 15:04:05"), et.Format("2006-01-02 15:04:05"),
|
|||
|
apply.From, time.Now().Format("2006-01-02 15:04:05"), serviceDep, base64Str)
|
|||
|
// 消息接收人
|
|||
|
var touser []string
|
|||
|
touser = append(touser, apply.To)
|
|||
|
// 发送微信
|
|||
|
go s.dao.PushWechatMsgToPerson(context.TODO(), cookie, touser, content)
|
|||
|
// 发送邮件
|
|||
|
subject := "Melloi压测申请"
|
|||
|
go s.SendMail(apply.To+"@bilibili.com", subject, content)
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// DeleteApply delete apply
|
|||
|
func (s *Service) DeleteApply(id int64) error {
|
|||
|
return s.dao.DeleteApply(id)
|
|||
|
}
|