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