go-common/app/admin/ep/melloi/service/apply.go
2019-04-22 18:49:16 +08:00

176 lines
5.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
}