mirror of
				https://github.com/TeaOSLab/EdgeAdmin.git
				synced 2025-11-04 05:00:25 +08:00 
			
		
		
		
	实现基础的通知媒介管理
This commit is contained in:
		@@ -18,6 +18,7 @@ func init() {
 | 
			
		||||
			Post("/delete", new(DeleteAction)).
 | 
			
		||||
			Get("/admin", new(AdminAction)).
 | 
			
		||||
			Get("/otpQrcode", new(OtpQrcodeAction)).
 | 
			
		||||
			Post("/options", new(OptionsAction)).
 | 
			
		||||
			EndAll()
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										40
									
								
								internal/web/actions/default/admins/options.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								internal/web/actions/default/admins/options.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,40 @@
 | 
			
		||||
package admins
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/iwind/TeaGo/maps"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// 系统用户选项
 | 
			
		||||
// 组件中需要用到的系统用户选项
 | 
			
		||||
type OptionsAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *OptionsAction) Init() {
 | 
			
		||||
	this.Nav("", "", "")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *OptionsAction) RunPost(params struct{}) {
 | 
			
		||||
	// TODO 实现关键词搜索
 | 
			
		||||
	adminsResp, err := this.RPC().AdminRPC().ListEnabledAdmins(this.AdminContext(), &pb.ListEnabledAdminsRequest{
 | 
			
		||||
		Offset: 0,
 | 
			
		||||
		Size:   1000,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	adminMaps := []maps.Map{}
 | 
			
		||||
	for _, admin := range adminsResp.Admins {
 | 
			
		||||
		adminMaps = append(adminMaps, maps.Map{
 | 
			
		||||
			"id":       admin.Id,
 | 
			
		||||
			"name":     admin.Fullname,
 | 
			
		||||
			"username": admin.Username,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	this.Data["admins"] = adminMaps
 | 
			
		||||
 | 
			
		||||
	this.Success()
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,58 @@
 | 
			
		||||
package recipients
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/utils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/iwind/TeaGo/actions"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type CreatePopupAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *CreatePopupAction) Init() {
 | 
			
		||||
	this.Nav("", "", "")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *CreatePopupAction) RunGet(params struct{}) {
 | 
			
		||||
	this.Show()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *CreatePopupAction) RunPost(params struct {
 | 
			
		||||
	AdminId    int64
 | 
			
		||||
	InstanceId int64
 | 
			
		||||
	User       string
 | 
			
		||||
 | 
			
		||||
	TelegramToken string
 | 
			
		||||
 | 
			
		||||
	GroupIds    string
 | 
			
		||||
	Description string
 | 
			
		||||
 | 
			
		||||
	Must *actions.Must
 | 
			
		||||
	CSRF *actionutils.CSRF
 | 
			
		||||
}) {
 | 
			
		||||
	params.Must.
 | 
			
		||||
		Field("adminId", params.AdminId).
 | 
			
		||||
		Gt(0, "请选择系统用户").
 | 
			
		||||
		Field("instanceId", params.InstanceId).
 | 
			
		||||
		Gt(0, "请选择媒介")
 | 
			
		||||
 | 
			
		||||
	groupIds := utils.SplitNumbers(params.GroupIds)
 | 
			
		||||
 | 
			
		||||
	resp, err := this.RPC().MessageRecipientRPC().CreateMessageRecipient(this.AdminContext(), &pb.CreateMessageRecipientRequest{
 | 
			
		||||
		AdminId:     params.AdminId,
 | 
			
		||||
		InstanceId:  params.InstanceId,
 | 
			
		||||
		User:        params.User,
 | 
			
		||||
		GroupIds:    groupIds,
 | 
			
		||||
		Description: params.Description,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	defer this.CreateLogInfo("创建媒介接收人 %d", resp.MessageRecipientId)
 | 
			
		||||
 | 
			
		||||
	this.Success()
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										24
									
								
								internal/web/actions/default/admins/recipients/delete.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								internal/web/actions/default/admins/recipients/delete.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
package recipients
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type DeleteAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *DeleteAction) RunPost(params struct {
 | 
			
		||||
	RecipientId int64
 | 
			
		||||
}) {
 | 
			
		||||
	defer this.CreateLogInfo("删除媒介接收人 %d", params.RecipientId)
 | 
			
		||||
 | 
			
		||||
	_, err := this.RPC().MessageRecipientRPC().DeleteMessageRecipient(this.AdminContext(), &pb.DeleteMessageRecipientRequest{MessageRecipientId: params.RecipientId})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Success()
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,38 @@
 | 
			
		||||
package groups
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/iwind/TeaGo/actions"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type CreatePopupAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *CreatePopupAction) Init() {
 | 
			
		||||
	this.Nav("", "", "")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *CreatePopupAction) RunGet(params struct{}) {
 | 
			
		||||
	this.Show()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *CreatePopupAction) RunPost(params struct {
 | 
			
		||||
	Name string
 | 
			
		||||
 | 
			
		||||
	Must *actions.Must
 | 
			
		||||
	CSRF *actionutils.CSRF
 | 
			
		||||
}) {
 | 
			
		||||
	params.Must.
 | 
			
		||||
		Field("name", params.Name).
 | 
			
		||||
		Require("请输入分组名称")
 | 
			
		||||
 | 
			
		||||
	_, err := this.RPC().MessageRecipientGroupRPC().CreateMessageRecipientGroup(this.AdminContext(), &pb.CreateMessageRecipientGroupRequest{Name: params.Name})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Success()
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,22 @@
 | 
			
		||||
package groups
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type DeleteAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *DeleteAction) RunPost(params struct {
 | 
			
		||||
	GroupId int64
 | 
			
		||||
}) {
 | 
			
		||||
	_, err := this.RPC().MessageRecipientGroupRPC().DeleteMessageRecipientGroup(this.AdminContext(), &pb.DeleteMessageRecipientGroupRequest{MessageRecipientGroupId: params.GroupId})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Success()
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,34 @@
 | 
			
		||||
package groups
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/iwind/TeaGo/maps"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type IndexAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *IndexAction) Init() {
 | 
			
		||||
	this.Nav("", "", "group")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *IndexAction) RunGet(params struct{}) {
 | 
			
		||||
	groupsResp, err := this.RPC().MessageRecipientGroupRPC().FindAllEnabledMessageRecipientGroups(this.AdminContext(), &pb.FindAllEnabledMessageRecipientGroupsRequest{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	groupMaps := []maps.Map{}
 | 
			
		||||
	for _, group := range groupsResp.MessageRecipientGroups {
 | 
			
		||||
		groupMaps = append(groupMaps, maps.Map{
 | 
			
		||||
			"id":   group.Id,
 | 
			
		||||
			"name": group.Name,
 | 
			
		||||
			"isOn": group.IsOn,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	this.Data["groups"] = groupMaps
 | 
			
		||||
 | 
			
		||||
	this.Show()
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,23 @@
 | 
			
		||||
package groups
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/helpers"
 | 
			
		||||
	"github.com/iwind/TeaGo"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	TeaGo.BeforeStart(func(server *TeaGo.Server) {
 | 
			
		||||
		server.
 | 
			
		||||
			Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeAdmin)).
 | 
			
		||||
			Data("teaMenu", "admins").
 | 
			
		||||
			Data("teaSubMenu", "recipients").
 | 
			
		||||
			Prefix("/admins/recipients/groups").
 | 
			
		||||
			Get("", new(IndexAction)).
 | 
			
		||||
			GetPost("/createPopup", new(CreatePopupAction)).
 | 
			
		||||
			GetPost("/updatePopup", new(UpdatePopupAction)).
 | 
			
		||||
			Post("/delete", new(DeleteAction)).
 | 
			
		||||
			Get("/selectPopup", new(SelectPopupAction)).
 | 
			
		||||
			EndAll()
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,39 @@
 | 
			
		||||
package groups
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/utils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/iwind/TeaGo/lists"
 | 
			
		||||
	"github.com/iwind/TeaGo/maps"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type SelectPopupAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *SelectPopupAction) RunGet(params struct {
 | 
			
		||||
	GroupIds string
 | 
			
		||||
}) {
 | 
			
		||||
	selectedGroupIds := utils.SplitNumbers(params.GroupIds)
 | 
			
		||||
 | 
			
		||||
	groupsResp, err := this.RPC().MessageRecipientGroupRPC().FindAllEnabledMessageRecipientGroups(this.AdminContext(), &pb.FindAllEnabledMessageRecipientGroupsRequest{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	groupMaps := []maps.Map{}
 | 
			
		||||
	for _, group := range groupsResp.MessageRecipientGroups {
 | 
			
		||||
		if lists.ContainsInt64(selectedGroupIds, group.Id) {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		groupMaps = append(groupMaps, maps.Map{
 | 
			
		||||
			"id":   group.Id,
 | 
			
		||||
			"name": group.Name,
 | 
			
		||||
			"isOn": group.IsOn,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	this.Data["groups"] = groupMaps
 | 
			
		||||
 | 
			
		||||
	this.Show()
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,64 @@
 | 
			
		||||
package groups
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/iwind/TeaGo/actions"
 | 
			
		||||
	"github.com/iwind/TeaGo/maps"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type UpdatePopupAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *UpdatePopupAction) Init() {
 | 
			
		||||
	this.Nav("", "", "")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *UpdatePopupAction) RunGet(params struct {
 | 
			
		||||
	GroupId int64
 | 
			
		||||
}) {
 | 
			
		||||
	groupResp, err := this.RPC().MessageRecipientGroupRPC().FindEnabledMessageRecipientGroup(this.AdminContext(), &pb.FindEnabledMessageRecipientGroupRequest{MessageRecipientGroupId: params.GroupId})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	group := groupResp.MessageRecipientGroup
 | 
			
		||||
	if group == nil {
 | 
			
		||||
		this.NotFound("messageRecipientGroup", params.GroupId)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Data["group"] = maps.Map{
 | 
			
		||||
		"id":   group.Id,
 | 
			
		||||
		"name": group.Name,
 | 
			
		||||
		"isOn": group.IsOn,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Show()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *UpdatePopupAction) RunPost(params struct {
 | 
			
		||||
	GroupId int64
 | 
			
		||||
	Name    string
 | 
			
		||||
	IsOn    bool
 | 
			
		||||
 | 
			
		||||
	Must *actions.Must
 | 
			
		||||
	CSRF *actionutils.CSRF
 | 
			
		||||
}) {
 | 
			
		||||
	params.Must.
 | 
			
		||||
		Field("name", params.Name).
 | 
			
		||||
		Require("请输入分组名称")
 | 
			
		||||
 | 
			
		||||
	_, err := this.RPC().MessageRecipientGroupRPC().UpdateMessageRecipientGroup(this.AdminContext(), &pb.UpdateMessageRecipientGroupRequest{
 | 
			
		||||
		MessageRecipientGroupId: params.GroupId,
 | 
			
		||||
		Name:                    params.Name,
 | 
			
		||||
		IsOn:                    params.IsOn,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Success()
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										70
									
								
								internal/web/actions/default/admins/recipients/index.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								internal/web/actions/default/admins/recipients/index.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,70 @@
 | 
			
		||||
package recipients
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/iwind/TeaGo/maps"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type IndexAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *IndexAction) Init() {
 | 
			
		||||
	this.Nav("", "", "recipient")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *IndexAction) RunGet(params struct {
 | 
			
		||||
}) {
 | 
			
		||||
	// TODO 增加系统用户、媒介类型等条件搜索
 | 
			
		||||
	countResp, err := this.RPC().MessageRecipientRPC().CountAllEnabledMessageRecipients(this.AdminContext(), &pb.CountAllEnabledMessageRecipientsRequest{
 | 
			
		||||
		AdminId:   0,
 | 
			
		||||
		MediaType: "",
 | 
			
		||||
		GroupId:   0,
 | 
			
		||||
		Keyword:   "",
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	count := countResp.Count
 | 
			
		||||
	page := this.NewPage(count)
 | 
			
		||||
	this.Data["page"] = page.AsHTML()
 | 
			
		||||
 | 
			
		||||
	recipientsResp, err := this.RPC().MessageRecipientRPC().ListEnabledMessageRecipients(this.AdminContext(), &pb.ListEnabledMessageRecipientsRequest{
 | 
			
		||||
		AdminId:   0,
 | 
			
		||||
		MediaType: "",
 | 
			
		||||
		GroupId:   0,
 | 
			
		||||
		Keyword:   "",
 | 
			
		||||
		Offset:    page.Offset,
 | 
			
		||||
		Size:      page.Size,
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	recipientMaps := []maps.Map{}
 | 
			
		||||
	for _, recipient := range recipientsResp.MessageRecipients {
 | 
			
		||||
		if recipient.Admin == nil {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		if recipient.MessageMediaInstance == nil {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		recipientMaps = append(recipientMaps, maps.Map{
 | 
			
		||||
			"id": recipient.Id,
 | 
			
		||||
			"admin": maps.Map{
 | 
			
		||||
				"id":       recipient.Admin.Id,
 | 
			
		||||
				"fullname": recipient.Admin.Fullname,
 | 
			
		||||
				"username": recipient.Admin.Username,
 | 
			
		||||
			},
 | 
			
		||||
			"groups": recipient.MessageRecipientGroups,
 | 
			
		||||
			"isOn":   recipient.IsOn,
 | 
			
		||||
			"instance": maps.Map{
 | 
			
		||||
				"name": recipient.MessageMediaInstance.Name,
 | 
			
		||||
			},
 | 
			
		||||
			"user":        recipient.User,
 | 
			
		||||
			"description": recipient.Description,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	this.Data["recipients"] = recipientMaps
 | 
			
		||||
 | 
			
		||||
	this.Show()
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										25
									
								
								internal/web/actions/default/admins/recipients/init.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								internal/web/actions/default/admins/recipients/init.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
			
		||||
package recipients
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/helpers"
 | 
			
		||||
	"github.com/iwind/TeaGo"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	TeaGo.BeforeStart(func(server *TeaGo.Server) {
 | 
			
		||||
		server.
 | 
			
		||||
			Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeAdmin)).
 | 
			
		||||
			Data("teaMenu", "admins").
 | 
			
		||||
			Data("teaSubMenu", "recipients").
 | 
			
		||||
			Prefix("/admins/recipients").
 | 
			
		||||
			Get("", new(IndexAction)).
 | 
			
		||||
			GetPost("/createPopup", new(CreatePopupAction)).
 | 
			
		||||
			GetPost("/update", new(UpdateAction)).
 | 
			
		||||
			Post("/delete", new(DeleteAction)).
 | 
			
		||||
			Post("/mediaOptions", new(MediaOptionsAction)).
 | 
			
		||||
			Get("/recipient", new(RecipientAction)).
 | 
			
		||||
			GetPost("/test", new(TestAction)).
 | 
			
		||||
			EndAll()
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,248 @@
 | 
			
		||||
package instances
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/iwind/TeaGo/actions"
 | 
			
		||||
	"github.com/iwind/TeaGo/maps"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type CreatePopupAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *CreatePopupAction) Init() {
 | 
			
		||||
	this.Nav("", "", "")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *CreatePopupAction) RunGet(params struct{}) {
 | 
			
		||||
	this.Show()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *CreatePopupAction) RunPost(params struct {
 | 
			
		||||
	Name      string
 | 
			
		||||
	MediaType string
 | 
			
		||||
 | 
			
		||||
	EmailSmtp     string
 | 
			
		||||
	EmailUsername string
 | 
			
		||||
	EmailPassword string
 | 
			
		||||
	EmailFrom     string
 | 
			
		||||
 | 
			
		||||
	WebHookURL          string
 | 
			
		||||
	WebHookMethod       string
 | 
			
		||||
	WebHookHeaderNames  []string
 | 
			
		||||
	WebHookHeaderValues []string
 | 
			
		||||
	WebHookContentType  string
 | 
			
		||||
	WebHookParamNames   []string
 | 
			
		||||
	WebHookParamValues  []string
 | 
			
		||||
	WebHookBody         string
 | 
			
		||||
 | 
			
		||||
	ScriptType      string
 | 
			
		||||
	ScriptPath      string
 | 
			
		||||
	ScriptLang      string
 | 
			
		||||
	ScriptCode      string
 | 
			
		||||
	ScriptCwd       string
 | 
			
		||||
	ScriptEnvNames  []string
 | 
			
		||||
	ScriptEnvValues []string
 | 
			
		||||
 | 
			
		||||
	DingTalkWebHookURL string
 | 
			
		||||
 | 
			
		||||
	QyWeixinCorporateId string
 | 
			
		||||
	QyWeixinAgentId     string
 | 
			
		||||
	QyWeixinAppSecret   string
 | 
			
		||||
	QyWeixinTextFormat  string
 | 
			
		||||
 | 
			
		||||
	QyWeixinRobotWebHookURL string
 | 
			
		||||
	QyWeixinRobotTextFormat string
 | 
			
		||||
 | 
			
		||||
	AliyunSmsSign              string
 | 
			
		||||
	AliyunSmsTemplateCode      string
 | 
			
		||||
	AliyunSmsTemplateVarNames  []string
 | 
			
		||||
	AliyunSmsTemplateVarValues []string
 | 
			
		||||
	AliyunSmsAccessKeyId       string
 | 
			
		||||
	AliyunSmsAccessKeySecret   string
 | 
			
		||||
 | 
			
		||||
	TelegramToken string
 | 
			
		||||
 | 
			
		||||
	Description string
 | 
			
		||||
 | 
			
		||||
	Must *actions.Must
 | 
			
		||||
	CSRF *actionutils.CSRF
 | 
			
		||||
}) {
 | 
			
		||||
	params.Must.
 | 
			
		||||
		Field("name", params.Name).
 | 
			
		||||
		Require("请输入媒介名称").
 | 
			
		||||
		Field("mediaType", params.MediaType).
 | 
			
		||||
		Require("请选择媒介类型")
 | 
			
		||||
 | 
			
		||||
	options := maps.Map{}
 | 
			
		||||
 | 
			
		||||
	switch params.MediaType {
 | 
			
		||||
	case "email":
 | 
			
		||||
		params.Must.
 | 
			
		||||
			Field("emailSmtp", params.EmailSmtp).
 | 
			
		||||
			Require("请输入SMTP地址").
 | 
			
		||||
			Field("emailUsername", params.EmailUsername).
 | 
			
		||||
			Require("请输入邮箱账号").
 | 
			
		||||
			Field("emailPassword", params.EmailPassword).
 | 
			
		||||
			Require("请输入密码或授权码")
 | 
			
		||||
 | 
			
		||||
		options["smtp"] = params.EmailSmtp
 | 
			
		||||
		options["username"] = params.EmailUsername
 | 
			
		||||
		options["password"] = params.EmailPassword
 | 
			
		||||
		options["from"] = params.EmailFrom
 | 
			
		||||
	case "webHook":
 | 
			
		||||
		params.Must.
 | 
			
		||||
			Field("webHookURL", params.WebHookURL).
 | 
			
		||||
			Require("请输入URL地址").
 | 
			
		||||
			Match("(?i)^(http|https)://", "URL地址必须以http或https开头").
 | 
			
		||||
			Field("webHookMethod", params.WebHookMethod).
 | 
			
		||||
			Require("请选择请求方法")
 | 
			
		||||
 | 
			
		||||
		options["url"] = params.WebHookURL
 | 
			
		||||
		options["method"] = params.WebHookMethod
 | 
			
		||||
		options["contentType"] = params.WebHookContentType
 | 
			
		||||
 | 
			
		||||
		headers := []maps.Map{}
 | 
			
		||||
		if len(params.WebHookHeaderNames) > 0 {
 | 
			
		||||
			for index, name := range params.WebHookHeaderNames {
 | 
			
		||||
				if index < len(params.WebHookHeaderValues) {
 | 
			
		||||
					headers = append(headers, maps.Map{
 | 
			
		||||
						"name":  name,
 | 
			
		||||
						"value": params.WebHookHeaderValues[index],
 | 
			
		||||
					})
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		options["headers"] = headers
 | 
			
		||||
 | 
			
		||||
		if params.WebHookContentType == "params" {
 | 
			
		||||
			webHookParams := []maps.Map{}
 | 
			
		||||
			for index, name := range params.WebHookParamNames {
 | 
			
		||||
				if index < len(params.WebHookParamValues) {
 | 
			
		||||
					webHookParams = append(webHookParams, maps.Map{
 | 
			
		||||
						"name":  name,
 | 
			
		||||
						"value": params.WebHookParamValues[index],
 | 
			
		||||
					})
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			options["params"] = webHookParams
 | 
			
		||||
		} else if params.WebHookContentType == "body" {
 | 
			
		||||
			options["body"] = params.WebHookBody
 | 
			
		||||
		}
 | 
			
		||||
	case "script":
 | 
			
		||||
		if params.ScriptType == "path" {
 | 
			
		||||
			params.Must.
 | 
			
		||||
				Field("scriptPath", params.ScriptPath).
 | 
			
		||||
				Require("请输入脚本路径")
 | 
			
		||||
		} else if params.ScriptType == "code" {
 | 
			
		||||
			params.Must.
 | 
			
		||||
				Field("scriptCode", params.ScriptCode).
 | 
			
		||||
				Require("请输入脚本代码")
 | 
			
		||||
		} else {
 | 
			
		||||
			params.Must.
 | 
			
		||||
				Field("scriptPath", params.ScriptPath).
 | 
			
		||||
				Require("请输入脚本路径")
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		options["scriptType"] = params.ScriptType
 | 
			
		||||
		options["path"] = params.ScriptPath
 | 
			
		||||
		options["scriptLang"] = params.ScriptLang
 | 
			
		||||
		options["script"] = params.ScriptCode
 | 
			
		||||
		options["cwd"] = params.ScriptCwd
 | 
			
		||||
 | 
			
		||||
		env := []maps.Map{}
 | 
			
		||||
		for index, envName := range params.ScriptEnvNames {
 | 
			
		||||
			if index < len(params.ScriptEnvValues) {
 | 
			
		||||
				env = append(env, maps.Map{
 | 
			
		||||
					"name":  envName,
 | 
			
		||||
					"value": params.ScriptEnvValues[index],
 | 
			
		||||
				})
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		options["env"] = env
 | 
			
		||||
	case "dingTalk":
 | 
			
		||||
		params.Must.
 | 
			
		||||
			Field("dingTalkWebHookURL", params.DingTalkWebHookURL).
 | 
			
		||||
			Require("请输入Hook地址").
 | 
			
		||||
			Match("^https:", "Hook地址必须以https://开头")
 | 
			
		||||
 | 
			
		||||
		options["webHookURL"] = params.DingTalkWebHookURL
 | 
			
		||||
	case "qyWeixin":
 | 
			
		||||
		params.Must.
 | 
			
		||||
			Field("qyWeixinCorporateId", params.QyWeixinCorporateId).
 | 
			
		||||
			Require("请输入企业ID").
 | 
			
		||||
			Field("qyWeixinAgentId", params.QyWeixinAgentId).
 | 
			
		||||
			Require("请输入应用AgentId").
 | 
			
		||||
			Field("qyWeixinSecret", params.QyWeixinAppSecret).
 | 
			
		||||
			Require("请输入应用Secret")
 | 
			
		||||
 | 
			
		||||
		options["corporateId"] = params.QyWeixinCorporateId
 | 
			
		||||
		options["agentId"] = params.QyWeixinAgentId
 | 
			
		||||
		options["appSecret"] = params.QyWeixinAppSecret
 | 
			
		||||
		options["textFormat"] = params.QyWeixinTextFormat
 | 
			
		||||
	case "qyWeixinRobot":
 | 
			
		||||
		params.Must.
 | 
			
		||||
			Field("qyWeixinRobotWebHookURL", params.QyWeixinRobotWebHookURL).
 | 
			
		||||
			Require("请输入WebHook地址").
 | 
			
		||||
			Match("^https:", "WebHook地址必须以https://开头")
 | 
			
		||||
 | 
			
		||||
		options["webHookURL"] = params.QyWeixinRobotWebHookURL
 | 
			
		||||
		options["textFormat"] = params.QyWeixinRobotTextFormat
 | 
			
		||||
	case "aliyunSms":
 | 
			
		||||
		params.Must.
 | 
			
		||||
			Field("aliyunSmsSign", params.AliyunSmsSign).
 | 
			
		||||
			Require("请输入签名名称").
 | 
			
		||||
			Field("aliyunSmsTemplateCode", params.AliyunSmsTemplateCode).
 | 
			
		||||
			Require("请输入模板CODE").
 | 
			
		||||
			Field("aliyunSmsAccessKeyId", params.AliyunSmsAccessKeyId).
 | 
			
		||||
			Require("请输入AccessKey ID").
 | 
			
		||||
			Field("aliyunSmsAccessKeySecret", params.AliyunSmsAccessKeySecret).
 | 
			
		||||
			Require("请输入AccessKey Secret")
 | 
			
		||||
 | 
			
		||||
		options["sign"] = params.AliyunSmsSign
 | 
			
		||||
		options["templateCode"] = params.AliyunSmsTemplateCode
 | 
			
		||||
		options["accessKeyId"] = params.AliyunSmsAccessKeyId
 | 
			
		||||
		options["accessKeySecret"] = params.AliyunSmsAccessKeySecret
 | 
			
		||||
 | 
			
		||||
		variables := []maps.Map{}
 | 
			
		||||
		for index, name := range params.AliyunSmsTemplateVarNames {
 | 
			
		||||
			if index < len(params.AliyunSmsTemplateVarValues) {
 | 
			
		||||
				variables = append(variables, maps.Map{
 | 
			
		||||
					"name":  name,
 | 
			
		||||
					"value": params.AliyunSmsTemplateVarValues[index],
 | 
			
		||||
				})
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		options["variables"] = variables
 | 
			
		||||
	case "telegram":
 | 
			
		||||
		params.Must.
 | 
			
		||||
			Field("telegramToken", params.TelegramToken).
 | 
			
		||||
			Require("请输入机器人Token")
 | 
			
		||||
		options["token"] = params.TelegramToken
 | 
			
		||||
	default:
 | 
			
		||||
		this.Fail("错误的媒介类型")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	optionsJSON, err := json.Marshal(options)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	resp, err := this.RPC().MessageMediaInstanceRPC().CreateMessageMediaInstance(this.AdminContext(), &pb.CreateMessageMediaInstanceRequest{
 | 
			
		||||
		Name:        params.Name,
 | 
			
		||||
		MediaType:   params.MediaType,
 | 
			
		||||
		ParamsJSON:  optionsJSON,
 | 
			
		||||
		Description: params.Description,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	defer this.CreateLogInfo("创建消息媒介 %d", resp.MessageMediaInstanceId)
 | 
			
		||||
 | 
			
		||||
	this.Success()
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,24 @@
 | 
			
		||||
package instances
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type DeleteAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *DeleteAction) RunPost(params struct {
 | 
			
		||||
	InstanceId int64
 | 
			
		||||
}) {
 | 
			
		||||
	defer this.CreateLogInfo("删除消息媒介 %d", params.InstanceId)
 | 
			
		||||
 | 
			
		||||
	_, err := this.RPC().MessageMediaInstanceRPC().DeleteMessageMediaInstance(this.AdminContext(), &pb.DeleteMessageMediaInstanceRequest{MessageMediaInstanceId: params.InstanceId})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Success()
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,56 @@
 | 
			
		||||
package instances
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/iwind/TeaGo/maps"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type IndexAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *IndexAction) Init() {
 | 
			
		||||
	this.Nav("", "", "instance")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *IndexAction) RunGet(params struct {
 | 
			
		||||
}) {
 | 
			
		||||
	// TODO 增加系统用户、媒介类型等条件搜索
 | 
			
		||||
	countResp, err := this.RPC().MessageMediaInstanceRPC().CountAllEnabledMessageMediaInstances(this.AdminContext(), &pb.CountAllEnabledMessageMediaInstancesRequest{
 | 
			
		||||
		MediaType: "",
 | 
			
		||||
		Keyword:   "",
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	count := countResp.Count
 | 
			
		||||
	page := this.NewPage(count)
 | 
			
		||||
	this.Data["page"] = page.AsHTML()
 | 
			
		||||
 | 
			
		||||
	instancesResp, err := this.RPC().MessageMediaInstanceRPC().ListEnabledMessageMediaInstances(this.AdminContext(), &pb.ListEnabledMessageMediaInstancesRequest{
 | 
			
		||||
		MediaType: "",
 | 
			
		||||
		Keyword:   "",
 | 
			
		||||
		Offset:    page.Offset,
 | 
			
		||||
		Size:      page.Size,
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	instanceMaps := []maps.Map{}
 | 
			
		||||
	for _, instance := range instancesResp.MessageMediaInstances {
 | 
			
		||||
		if instance.MessageMedia == nil {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		instanceMaps = append(instanceMaps, maps.Map{
 | 
			
		||||
			"id":   instance.Id,
 | 
			
		||||
			"isOn": instance.IsOn,
 | 
			
		||||
			"media": maps.Map{
 | 
			
		||||
				"name": instance.MessageMedia.Name,
 | 
			
		||||
			},
 | 
			
		||||
			"description": instance.Description,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	this.Data["instances"] = instanceMaps
 | 
			
		||||
 | 
			
		||||
	this.Show()
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,25 @@
 | 
			
		||||
package instances
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/helpers"
 | 
			
		||||
	"github.com/iwind/TeaGo"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	TeaGo.BeforeStart(func(server *TeaGo.Server) {
 | 
			
		||||
		server.
 | 
			
		||||
			Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeAdmin)).
 | 
			
		||||
			Data("teaMenu", "admins").
 | 
			
		||||
			Data("teaSubMenu", "instances").
 | 
			
		||||
			Prefix("/admins/recipients/instances").
 | 
			
		||||
			Get("", new(IndexAction)).
 | 
			
		||||
			GetPost("/createPopup", new(CreatePopupAction)).
 | 
			
		||||
			GetPost("/update", new(UpdateAction)).
 | 
			
		||||
			Post("/delete", new(DeleteAction)).
 | 
			
		||||
			Get("/instance", new(InstanceAction)).
 | 
			
		||||
			GetPost("/test", new(TestAction)).
 | 
			
		||||
			Post("/options", new(OptionsAction)).
 | 
			
		||||
			EndAll()
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,54 @@
 | 
			
		||||
package instances
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/iwind/TeaGo/maps"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type InstanceAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *InstanceAction) Init() {
 | 
			
		||||
	this.Nav("", "", "instance")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *InstanceAction) RunGet(params struct {
 | 
			
		||||
	InstanceId int64
 | 
			
		||||
}) {
 | 
			
		||||
	instanceResp, err := this.RPC().MessageMediaInstanceRPC().FindEnabledMessageMediaInstance(this.AdminContext(), &pb.FindEnabledMessageMediaInstanceRequest{MessageMediaInstanceId: params.InstanceId})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	instance := instanceResp.MessageMediaInstance
 | 
			
		||||
	if instance == nil || instance.MessageMedia == nil {
 | 
			
		||||
		this.NotFound("messageMediaInstance", params.InstanceId)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mediaParams := maps.Map{}
 | 
			
		||||
	if len(instance.ParamsJSON) > 0 {
 | 
			
		||||
		err = json.Unmarshal(instance.ParamsJSON, &mediaParams)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			this.ErrorPage(err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Data["instance"] = maps.Map{
 | 
			
		||||
		"id":   instance.Id,
 | 
			
		||||
		"name": instance.Name,
 | 
			
		||||
		"isOn": instance.IsOn,
 | 
			
		||||
		"media": maps.Map{
 | 
			
		||||
			"type": instance.MessageMedia.Type,
 | 
			
		||||
			"name": instance.MessageMedia.Name,
 | 
			
		||||
		},
 | 
			
		||||
		"description": instance.Description,
 | 
			
		||||
		"params":      mediaParams,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Show()
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,39 @@
 | 
			
		||||
package instances
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/iwind/TeaGo/maps"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// 媒介类型选项
 | 
			
		||||
type OptionsAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *OptionsAction) RunPost(params struct{}) {
 | 
			
		||||
	resp, err := this.RPC().MessageMediaInstanceRPC().ListEnabledMessageMediaInstances(this.AdminContext(), &pb.ListEnabledMessageMediaInstancesRequest{
 | 
			
		||||
		Offset: 0,
 | 
			
		||||
		Size:   1000,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	instanceMaps := []maps.Map{}
 | 
			
		||||
	for _, instance := range resp.MessageMediaInstances {
 | 
			
		||||
		instanceMaps = append(instanceMaps, maps.Map{
 | 
			
		||||
			"id":          instance.Id,
 | 
			
		||||
			"name":        instance.Name,
 | 
			
		||||
			"description": instance.Description,
 | 
			
		||||
			"media": maps.Map{
 | 
			
		||||
				"type":            instance.MessageMedia.Type,
 | 
			
		||||
				"name":            instance.MessageMedia.Name,
 | 
			
		||||
				"userDescription": instance.MessageMedia.UserDescription,
 | 
			
		||||
			},
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	this.Data["instances"] = instanceMaps
 | 
			
		||||
 | 
			
		||||
	this.Success()
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,87 @@
 | 
			
		||||
package instances
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/iwind/TeaGo/actions"
 | 
			
		||||
	"github.com/iwind/TeaGo/maps"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type TestAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *TestAction) Init() {
 | 
			
		||||
	this.Nav("", "", "test")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *TestAction) RunGet(params struct {
 | 
			
		||||
	InstanceId int64
 | 
			
		||||
}) {
 | 
			
		||||
	instanceResp, err := this.RPC().MessageMediaInstanceRPC().FindEnabledMessageMediaInstance(this.AdminContext(), &pb.FindEnabledMessageMediaInstanceRequest{MessageMediaInstanceId: params.InstanceId})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	instance := instanceResp.MessageMediaInstance
 | 
			
		||||
	if instance == nil || instance.MessageMedia == nil {
 | 
			
		||||
		this.NotFound("messageMediaInstance", params.InstanceId)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mediaParams := maps.Map{}
 | 
			
		||||
	if len(instance.ParamsJSON) > 0 {
 | 
			
		||||
		err = json.Unmarshal(instance.ParamsJSON, &mediaParams)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			this.ErrorPage(err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Data["instance"] = maps.Map{
 | 
			
		||||
		"id":   instance.Id,
 | 
			
		||||
		"isOn": instance.IsOn,
 | 
			
		||||
		"media": maps.Map{
 | 
			
		||||
			"type":            instance.MessageMedia.Type,
 | 
			
		||||
			"name":            instance.MessageMedia.Name,
 | 
			
		||||
			"userDescription": instance.MessageMedia.UserDescription,
 | 
			
		||||
		},
 | 
			
		||||
		"description": instance.Description,
 | 
			
		||||
		"params":      mediaParams,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Show()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *TestAction) RunPost(params struct {
 | 
			
		||||
	InstanceId int64
 | 
			
		||||
	Subject    string
 | 
			
		||||
	Body       string
 | 
			
		||||
	User       string
 | 
			
		||||
 | 
			
		||||
	Must *actions.Must
 | 
			
		||||
	CSRF *actionutils.CSRF
 | 
			
		||||
}) {
 | 
			
		||||
	params.Must.
 | 
			
		||||
		Field("instanceId", params.InstanceId).
 | 
			
		||||
		Gt(0, "请选择正确的媒介")
 | 
			
		||||
 | 
			
		||||
	resp, err := this.RPC().MessageTaskRPC().CreateMessageTask(this.AdminContext(), &pb.CreateMessageTaskRequest{
 | 
			
		||||
		RecipientId: 0,
 | 
			
		||||
		InstanceId:  params.InstanceId,
 | 
			
		||||
		User:        params.User,
 | 
			
		||||
		Subject:     params.Subject,
 | 
			
		||||
		Body:        params.Body,
 | 
			
		||||
		IsPrimary:   true,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	this.Data["taskId"] = resp.MessageTaskId
 | 
			
		||||
 | 
			
		||||
	defer this.CreateLogInfo("创建媒介测试任务 %d", resp.MessageTaskId)
 | 
			
		||||
 | 
			
		||||
	this.Success()
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,287 @@
 | 
			
		||||
package instances
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/iwind/TeaGo/actions"
 | 
			
		||||
	"github.com/iwind/TeaGo/maps"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type UpdateAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *UpdateAction) Init() {
 | 
			
		||||
	this.Nav("", "", "update")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *UpdateAction) RunGet(params struct {
 | 
			
		||||
	InstanceId int64
 | 
			
		||||
}) {
 | 
			
		||||
	instanceResp, err := this.RPC().MessageMediaInstanceRPC().FindEnabledMessageMediaInstance(this.AdminContext(), &pb.FindEnabledMessageMediaInstanceRequest{MessageMediaInstanceId: params.InstanceId})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	instance := instanceResp.MessageMediaInstance
 | 
			
		||||
	if instance == nil || instance.MessageMedia == nil {
 | 
			
		||||
		this.NotFound("messageMediaInstance", params.InstanceId)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mediaParams := maps.Map{}
 | 
			
		||||
	if len(instance.ParamsJSON) > 0 {
 | 
			
		||||
		err = json.Unmarshal(instance.ParamsJSON, &mediaParams)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			this.ErrorPage(err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Data["instance"] = maps.Map{
 | 
			
		||||
		"id":   instance.Id,
 | 
			
		||||
		"name": instance.Name,
 | 
			
		||||
		"isOn": instance.IsOn,
 | 
			
		||||
		"media": maps.Map{
 | 
			
		||||
			"type": instance.MessageMedia.Type,
 | 
			
		||||
			"name": instance.MessageMedia.Name,
 | 
			
		||||
		},
 | 
			
		||||
		"description": instance.Description,
 | 
			
		||||
		"params":      mediaParams,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Show()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *UpdateAction) RunPost(params struct {
 | 
			
		||||
	InstanceId int64
 | 
			
		||||
	Name       string
 | 
			
		||||
	MediaType  string
 | 
			
		||||
 | 
			
		||||
	EmailSmtp     string
 | 
			
		||||
	EmailUsername string
 | 
			
		||||
	EmailPassword string
 | 
			
		||||
	EmailFrom     string
 | 
			
		||||
 | 
			
		||||
	WebHookURL          string
 | 
			
		||||
	WebHookMethod       string
 | 
			
		||||
	WebHookHeaderNames  []string
 | 
			
		||||
	WebHookHeaderValues []string
 | 
			
		||||
	WebHookContentType  string
 | 
			
		||||
	WebHookParamNames   []string
 | 
			
		||||
	WebHookParamValues  []string
 | 
			
		||||
	WebHookBody         string
 | 
			
		||||
 | 
			
		||||
	ScriptType      string
 | 
			
		||||
	ScriptPath      string
 | 
			
		||||
	ScriptLang      string
 | 
			
		||||
	ScriptCode      string
 | 
			
		||||
	ScriptCwd       string
 | 
			
		||||
	ScriptEnvNames  []string
 | 
			
		||||
	ScriptEnvValues []string
 | 
			
		||||
 | 
			
		||||
	DingTalkWebHookURL string
 | 
			
		||||
 | 
			
		||||
	QyWeixinCorporateId string
 | 
			
		||||
	QyWeixinAgentId     string
 | 
			
		||||
	QyWeixinAppSecret   string
 | 
			
		||||
	QyWeixinTextFormat  string
 | 
			
		||||
 | 
			
		||||
	QyWeixinRobotWebHookURL string
 | 
			
		||||
	QyWeixinRobotTextFormat string
 | 
			
		||||
 | 
			
		||||
	AliyunSmsSign              string
 | 
			
		||||
	AliyunSmsTemplateCode      string
 | 
			
		||||
	AliyunSmsTemplateVarNames  []string
 | 
			
		||||
	AliyunSmsTemplateVarValues []string
 | 
			
		||||
	AliyunSmsAccessKeyId       string
 | 
			
		||||
	AliyunSmsAccessKeySecret   string
 | 
			
		||||
 | 
			
		||||
	TelegramToken string
 | 
			
		||||
 | 
			
		||||
	GroupIds    string
 | 
			
		||||
	Description string
 | 
			
		||||
	IsOn        bool
 | 
			
		||||
 | 
			
		||||
	Must *actions.Must
 | 
			
		||||
	CSRF *actionutils.CSRF
 | 
			
		||||
}) {
 | 
			
		||||
	defer this.CreateLogInfo("修改消息媒介 %d", params.InstanceId)
 | 
			
		||||
 | 
			
		||||
	params.Must.
 | 
			
		||||
		Field("name", params.Name).
 | 
			
		||||
		Require("请输入媒介名称").
 | 
			
		||||
		Field("mediaType", params.MediaType).
 | 
			
		||||
		Require("请选择媒介类型")
 | 
			
		||||
 | 
			
		||||
	options := maps.Map{}
 | 
			
		||||
 | 
			
		||||
	switch params.MediaType {
 | 
			
		||||
	case "email":
 | 
			
		||||
		params.Must.
 | 
			
		||||
			Field("emailSmtp", params.EmailSmtp).
 | 
			
		||||
			Require("请输入SMTP地址").
 | 
			
		||||
			Field("emailUsername", params.EmailUsername).
 | 
			
		||||
			Require("请输入邮箱账号").
 | 
			
		||||
			Field("emailPassword", params.EmailPassword).
 | 
			
		||||
			Require("请输入密码或授权码")
 | 
			
		||||
 | 
			
		||||
		options["smtp"] = params.EmailSmtp
 | 
			
		||||
		options["username"] = params.EmailUsername
 | 
			
		||||
		options["password"] = params.EmailPassword
 | 
			
		||||
		options["from"] = params.EmailFrom
 | 
			
		||||
	case "webHook":
 | 
			
		||||
		params.Must.
 | 
			
		||||
			Field("webHookURL", params.WebHookURL).
 | 
			
		||||
			Require("请输入URL地址").
 | 
			
		||||
			Match("(?i)^(http|https)://", "URL地址必须以http或https开头").
 | 
			
		||||
			Field("webHookMethod", params.WebHookMethod).
 | 
			
		||||
			Require("请选择请求方法")
 | 
			
		||||
 | 
			
		||||
		options["url"] = params.WebHookURL
 | 
			
		||||
		options["method"] = params.WebHookMethod
 | 
			
		||||
		options["contentType"] = params.WebHookContentType
 | 
			
		||||
 | 
			
		||||
		headers := []maps.Map{}
 | 
			
		||||
		if len(params.WebHookHeaderNames) > 0 {
 | 
			
		||||
			for index, name := range params.WebHookHeaderNames {
 | 
			
		||||
				if index < len(params.WebHookHeaderValues) {
 | 
			
		||||
					headers = append(headers, maps.Map{
 | 
			
		||||
						"name":  name,
 | 
			
		||||
						"value": params.WebHookHeaderValues[index],
 | 
			
		||||
					})
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		options["headers"] = headers
 | 
			
		||||
 | 
			
		||||
		if params.WebHookContentType == "params" {
 | 
			
		||||
			webHookParams := []maps.Map{}
 | 
			
		||||
			for index, name := range params.WebHookParamNames {
 | 
			
		||||
				if index < len(params.WebHookParamValues) {
 | 
			
		||||
					webHookParams = append(webHookParams, maps.Map{
 | 
			
		||||
						"name":  name,
 | 
			
		||||
						"value": params.WebHookParamValues[index],
 | 
			
		||||
					})
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			options["params"] = webHookParams
 | 
			
		||||
		} else if params.WebHookContentType == "body" {
 | 
			
		||||
			options["body"] = params.WebHookBody
 | 
			
		||||
		}
 | 
			
		||||
	case "script":
 | 
			
		||||
		if params.ScriptType == "path" {
 | 
			
		||||
			params.Must.
 | 
			
		||||
				Field("scriptPath", params.ScriptPath).
 | 
			
		||||
				Require("请输入脚本路径")
 | 
			
		||||
		} else if params.ScriptType == "code" {
 | 
			
		||||
			params.Must.
 | 
			
		||||
				Field("scriptCode", params.ScriptCode).
 | 
			
		||||
				Require("请输入脚本代码")
 | 
			
		||||
		} else {
 | 
			
		||||
			params.Must.
 | 
			
		||||
				Field("scriptPath", params.ScriptPath).
 | 
			
		||||
				Require("请输入脚本路径")
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		options["scriptType"] = params.ScriptType
 | 
			
		||||
		options["path"] = params.ScriptPath
 | 
			
		||||
		options["scriptLang"] = params.ScriptLang
 | 
			
		||||
		options["script"] = params.ScriptCode
 | 
			
		||||
		options["cwd"] = params.ScriptCwd
 | 
			
		||||
 | 
			
		||||
		env := []maps.Map{}
 | 
			
		||||
		for index, envName := range params.ScriptEnvNames {
 | 
			
		||||
			if index < len(params.ScriptEnvValues) {
 | 
			
		||||
				env = append(env, maps.Map{
 | 
			
		||||
					"name":  envName,
 | 
			
		||||
					"value": params.ScriptEnvValues[index],
 | 
			
		||||
				})
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		options["env"] = env
 | 
			
		||||
	case "dingTalk":
 | 
			
		||||
		params.Must.
 | 
			
		||||
			Field("dingTalkWebHookURL", params.DingTalkWebHookURL).
 | 
			
		||||
			Require("请输入Hook地址").
 | 
			
		||||
			Match("^https:", "Hook地址必须以https://开头")
 | 
			
		||||
 | 
			
		||||
		options["webHookURL"] = params.DingTalkWebHookURL
 | 
			
		||||
	case "qyWeixin":
 | 
			
		||||
		params.Must.
 | 
			
		||||
			Field("qyWeixinCorporateId", params.QyWeixinCorporateId).
 | 
			
		||||
			Require("请输入企业ID").
 | 
			
		||||
			Field("qyWeixinAgentId", params.QyWeixinAgentId).
 | 
			
		||||
			Require("请输入应用AgentId").
 | 
			
		||||
			Field("qyWeixinSecret", params.QyWeixinAppSecret).
 | 
			
		||||
			Require("请输入应用Secret")
 | 
			
		||||
 | 
			
		||||
		options["corporateId"] = params.QyWeixinCorporateId
 | 
			
		||||
		options["agentId"] = params.QyWeixinAgentId
 | 
			
		||||
		options["appSecret"] = params.QyWeixinAppSecret
 | 
			
		||||
		options["textFormat"] = params.QyWeixinTextFormat
 | 
			
		||||
	case "qyWeixinRobot":
 | 
			
		||||
		params.Must.
 | 
			
		||||
			Field("qyWeixinRobotWebHookURL", params.QyWeixinRobotWebHookURL).
 | 
			
		||||
			Require("请输入WebHook地址").
 | 
			
		||||
			Match("^https:", "WebHook地址必须以https://开头")
 | 
			
		||||
 | 
			
		||||
		options["webHookURL"] = params.QyWeixinRobotWebHookURL
 | 
			
		||||
		options["textFormat"] = params.QyWeixinRobotTextFormat
 | 
			
		||||
	case "aliyunSms":
 | 
			
		||||
		params.Must.
 | 
			
		||||
			Field("aliyunSmsSign", params.AliyunSmsSign).
 | 
			
		||||
			Require("请输入签名名称").
 | 
			
		||||
			Field("aliyunSmsTemplateCode", params.AliyunSmsTemplateCode).
 | 
			
		||||
			Require("请输入模板CODE").
 | 
			
		||||
			Field("aliyunSmsAccessKeyId", params.AliyunSmsAccessKeyId).
 | 
			
		||||
			Require("请输入AccessKey ID").
 | 
			
		||||
			Field("aliyunSmsAccessKeySecret", params.AliyunSmsAccessKeySecret).
 | 
			
		||||
			Require("请输入AccessKey Secret")
 | 
			
		||||
 | 
			
		||||
		options["sign"] = params.AliyunSmsSign
 | 
			
		||||
		options["templateCode"] = params.AliyunSmsTemplateCode
 | 
			
		||||
		options["accessKeyId"] = params.AliyunSmsAccessKeyId
 | 
			
		||||
		options["accessKeySecret"] = params.AliyunSmsAccessKeySecret
 | 
			
		||||
 | 
			
		||||
		variables := []maps.Map{}
 | 
			
		||||
		for index, name := range params.AliyunSmsTemplateVarNames {
 | 
			
		||||
			if index < len(params.AliyunSmsTemplateVarValues) {
 | 
			
		||||
				variables = append(variables, maps.Map{
 | 
			
		||||
					"name":  name,
 | 
			
		||||
					"value": params.AliyunSmsTemplateVarValues[index],
 | 
			
		||||
				})
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		options["variables"] = variables
 | 
			
		||||
	case "telegram":
 | 
			
		||||
		params.Must.
 | 
			
		||||
			Field("telegramToken", params.TelegramToken).
 | 
			
		||||
			Require("请输入机器人Token")
 | 
			
		||||
		options["token"] = params.TelegramToken
 | 
			
		||||
	default:
 | 
			
		||||
		this.Fail("错误的媒介类型")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	optionsJSON, err := json.Marshal(options)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_, err = this.RPC().MessageMediaInstanceRPC().UpdateMessageMediaInstance(this.AdminContext(), &pb.UpdateMessageMediaInstanceRequest{
 | 
			
		||||
		MessageMediaInstanceId: params.InstanceId,
 | 
			
		||||
		Name:                   params.Name,
 | 
			
		||||
		MediaType:              params.MediaType,
 | 
			
		||||
		ParamsJSON:             optionsJSON,
 | 
			
		||||
		Description:            params.Description,
 | 
			
		||||
		IsOn:                   params.IsOn,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Success()
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										61
									
								
								internal/web/actions/default/admins/recipients/logs/index.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								internal/web/actions/default/admins/recipients/logs/index.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,61 @@
 | 
			
		||||
package logs
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/iwind/TeaGo/maps"
 | 
			
		||||
	timeutil "github.com/iwind/TeaGo/utils/time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type IndexAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *IndexAction) Init() {
 | 
			
		||||
	this.Nav("", "", "log")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *IndexAction) RunGet(params struct{}) {
 | 
			
		||||
	countResp, err := this.RPC().MessageTaskLogRPC().CountMessageTaskLogs(this.AdminContext(), &pb.CountMessageTaskLogsRequest{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	page := this.NewPage(countResp.Count)
 | 
			
		||||
	this.Data["page"] = page.AsHTML()
 | 
			
		||||
 | 
			
		||||
	logsResp, err := this.RPC().MessageTaskLogRPC().ListMessageTaskLogs(this.AdminContext(), &pb.ListMessageTaskLogsRequest{
 | 
			
		||||
		Offset: page.Offset,
 | 
			
		||||
		Size:   page.Size,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	logMaps := []maps.Map{}
 | 
			
		||||
	for _, log := range logsResp.MessageTaskLogs {
 | 
			
		||||
		if log.MessageTask.MessageRecipient != nil {
 | 
			
		||||
			log.MessageTask.User = log.MessageTask.MessageRecipient.User
 | 
			
		||||
		}
 | 
			
		||||
		logMaps = append(logMaps, maps.Map{
 | 
			
		||||
			"task": maps.Map{
 | 
			
		||||
				"id":      log.MessageTask.Id,
 | 
			
		||||
				"user":    log.MessageTask.User,
 | 
			
		||||
				"subject": log.MessageTask.Subject,
 | 
			
		||||
				"body":    log.MessageTask.Body,
 | 
			
		||||
				"instance": maps.Map{
 | 
			
		||||
					"id":   log.MessageTask.MessageMediaInstance.Id,
 | 
			
		||||
					"name": log.MessageTask.MessageMediaInstance.Name,
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			"isOk":        log.IsOk,
 | 
			
		||||
			"error":       log.Error,
 | 
			
		||||
			"response":    log.Response,
 | 
			
		||||
			"createdTime": timeutil.FormatTime("Y-m-d H:i:s", log.CreatedAt),
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	this.Data["logs"] = logMaps
 | 
			
		||||
 | 
			
		||||
	this.Show()
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										19
									
								
								internal/web/actions/default/admins/recipients/logs/init.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								internal/web/actions/default/admins/recipients/logs/init.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
package logs
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/helpers"
 | 
			
		||||
	"github.com/iwind/TeaGo"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	TeaGo.BeforeStart(func(server *TeaGo.Server) {
 | 
			
		||||
		server.
 | 
			
		||||
			Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeAdmin)).
 | 
			
		||||
			Data("teaMenu", "admins").
 | 
			
		||||
			Data("teaSubMenu", "recipients").
 | 
			
		||||
			Prefix("/admins/recipients/logs").
 | 
			
		||||
			Get("", new(IndexAction)).
 | 
			
		||||
			EndAll()
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,32 @@
 | 
			
		||||
package recipients
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/iwind/TeaGo/maps"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// 媒介类型选项
 | 
			
		||||
type MediaOptionsAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *MediaOptionsAction) RunPost(params struct{}) {
 | 
			
		||||
	resp, err := this.RPC().MessageMediaRPC().FindAllMessageMedias(this.AdminContext(), &pb.FindAllMessageMediasRequest{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	mediaMaps := []maps.Map{}
 | 
			
		||||
	for _, media := range resp.MessageMedias {
 | 
			
		||||
		mediaMaps = append(mediaMaps, maps.Map{
 | 
			
		||||
			"id":          media.Id,
 | 
			
		||||
			"type":        media.Type,
 | 
			
		||||
			"name":        media.Name,
 | 
			
		||||
			"description": media.Description,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	this.Data["medias"] = mediaMaps
 | 
			
		||||
 | 
			
		||||
	this.Success()
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										50
									
								
								internal/web/actions/default/admins/recipients/recipient.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								internal/web/actions/default/admins/recipients/recipient.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,50 @@
 | 
			
		||||
package recipients
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/iwind/TeaGo/maps"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type RecipientAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *RecipientAction) Init() {
 | 
			
		||||
	this.Nav("", "", "recipient")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *RecipientAction) RunGet(params struct {
 | 
			
		||||
	RecipientId int64
 | 
			
		||||
}) {
 | 
			
		||||
	recipientResp, err := this.RPC().MessageRecipientRPC().FindEnabledMessageRecipient(this.AdminContext(), &pb.FindEnabledMessageRecipientRequest{MessageRecipientId: params.RecipientId})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	recipient := recipientResp.MessageRecipient
 | 
			
		||||
	if recipient == nil || recipient.Admin == nil || recipient.MessageMediaInstance == nil {
 | 
			
		||||
		this.NotFound("messageRecipient", params.RecipientId)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Data["recipient"] = maps.Map{
 | 
			
		||||
		"id": recipient.Id,
 | 
			
		||||
		"admin": maps.Map{
 | 
			
		||||
			"id":       recipient.Admin.Id,
 | 
			
		||||
			"fullname": recipient.Admin.Fullname,
 | 
			
		||||
			"username": recipient.Admin.Username,
 | 
			
		||||
		},
 | 
			
		||||
		"groups": recipient.MessageRecipientGroups,
 | 
			
		||||
		"isOn":   recipient.IsOn,
 | 
			
		||||
		"instance": maps.Map{
 | 
			
		||||
			"id":          recipient.MessageMediaInstance.Id,
 | 
			
		||||
			"name":        recipient.MessageMediaInstance.Name,
 | 
			
		||||
			"description": recipient.MessageMediaInstance.Description,
 | 
			
		||||
		},
 | 
			
		||||
		"user":        recipient.User,
 | 
			
		||||
		"description": recipient.Description,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Show()
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										19
									
								
								internal/web/actions/default/admins/recipients/tasks/init.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								internal/web/actions/default/admins/recipients/tasks/init.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
package tasks
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/helpers"
 | 
			
		||||
	"github.com/iwind/TeaGo"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	TeaGo.BeforeStart(func(server *TeaGo.Server) {
 | 
			
		||||
		server.
 | 
			
		||||
			Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeAdmin)).
 | 
			
		||||
			Data("teaMenu", "admins").
 | 
			
		||||
			Data("teaSubMenu", "recipients").
 | 
			
		||||
			Prefix("/admins/recipients/tasks").
 | 
			
		||||
			Post("/taskInfo", new(TaskInfoAction)).
 | 
			
		||||
			EndAll()
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,40 @@
 | 
			
		||||
package tasks
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/iwind/TeaGo/maps"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type TaskInfoAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *TaskInfoAction) Init() {
 | 
			
		||||
	this.Nav("", "", "")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *TaskInfoAction) RunPost(params struct {
 | 
			
		||||
	TaskId int64
 | 
			
		||||
}) {
 | 
			
		||||
	resp, err := this.RPC().MessageTaskRPC().FindEnabledMessageTask(this.AdminContext(), &pb.FindEnabledMessageTaskRequest{MessageTaskId: params.TaskId})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if resp.MessageTask == nil {
 | 
			
		||||
		this.NotFound("messageTask", params.TaskId)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	result := resp.MessageTask.Result
 | 
			
		||||
	this.Data["status"] = resp.MessageTask.Status
 | 
			
		||||
	this.Data["result"] = maps.Map{
 | 
			
		||||
		"isOk":     result.IsOk,
 | 
			
		||||
		"response": result.Response,
 | 
			
		||||
		"error":    result.Error,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Success()
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										113
									
								
								internal/web/actions/default/admins/recipients/test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								internal/web/actions/default/admins/recipients/test.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,113 @@
 | 
			
		||||
package recipients
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/iwind/TeaGo/actions"
 | 
			
		||||
	"github.com/iwind/TeaGo/maps"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type TestAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *TestAction) Init() {
 | 
			
		||||
	this.Nav("", "", "test")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *TestAction) RunGet(params struct {
 | 
			
		||||
	RecipientId int64
 | 
			
		||||
}) {
 | 
			
		||||
	recipientResp, err := this.RPC().MessageRecipientRPC().FindEnabledMessageRecipient(this.AdminContext(), &pb.FindEnabledMessageRecipientRequest{MessageRecipientId: params.RecipientId})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	recipient := recipientResp.MessageRecipient
 | 
			
		||||
	if recipient == nil || recipient.Admin == nil || recipient.MessageMediaInstance == nil {
 | 
			
		||||
		this.NotFound("messageRecipient", params.RecipientId)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Data["recipient"] = maps.Map{
 | 
			
		||||
		"id": recipient.Id,
 | 
			
		||||
		"admin": maps.Map{
 | 
			
		||||
			"id":       recipient.Admin.Id,
 | 
			
		||||
			"fullname": recipient.Admin.Fullname,
 | 
			
		||||
			"username": recipient.Admin.Username,
 | 
			
		||||
		},
 | 
			
		||||
		"instance": maps.Map{
 | 
			
		||||
			"id":          recipient.MessageMediaInstance.Id,
 | 
			
		||||
			"name":        recipient.MessageMediaInstance.Name,
 | 
			
		||||
			"description": recipient.MessageMediaInstance.Description,
 | 
			
		||||
		},
 | 
			
		||||
		"user": recipient.User,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	instanceResp, err := this.RPC().MessageMediaInstanceRPC().FindEnabledMessageMediaInstance(this.AdminContext(), &pb.FindEnabledMessageMediaInstanceRequest{MessageMediaInstanceId: recipient.MessageMediaInstance.Id})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	instance := instanceResp.MessageMediaInstance
 | 
			
		||||
	if instance == nil || instance.MessageMedia == nil {
 | 
			
		||||
		this.NotFound("messageMediaInstance", recipient.MessageMediaInstance.Id)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mediaParams := maps.Map{}
 | 
			
		||||
	if len(instance.ParamsJSON) > 0 {
 | 
			
		||||
		err = json.Unmarshal(instance.ParamsJSON, &mediaParams)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			this.ErrorPage(err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Data["instance"] = maps.Map{
 | 
			
		||||
		"id":   instance.Id,
 | 
			
		||||
		"isOn": instance.IsOn,
 | 
			
		||||
		"media": maps.Map{
 | 
			
		||||
			"type":            instance.MessageMedia.Type,
 | 
			
		||||
			"name":            instance.MessageMedia.Name,
 | 
			
		||||
			"userDescription": instance.MessageMedia.UserDescription,
 | 
			
		||||
		},
 | 
			
		||||
		"description": instance.Description,
 | 
			
		||||
		"params":      mediaParams,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Show()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *TestAction) RunPost(params struct {
 | 
			
		||||
	InstanceId int64
 | 
			
		||||
	Subject    string
 | 
			
		||||
	Body       string
 | 
			
		||||
	User       string
 | 
			
		||||
 | 
			
		||||
	Must *actions.Must
 | 
			
		||||
	CSRF *actionutils.CSRF
 | 
			
		||||
}) {
 | 
			
		||||
	params.Must.
 | 
			
		||||
		Field("instanceId", params.InstanceId).
 | 
			
		||||
		Gt(0, "请选择正确的媒介")
 | 
			
		||||
 | 
			
		||||
	resp, err := this.RPC().MessageTaskRPC().CreateMessageTask(this.AdminContext(), &pb.CreateMessageTaskRequest{
 | 
			
		||||
		RecipientId: 0,
 | 
			
		||||
		InstanceId:  params.InstanceId,
 | 
			
		||||
		User:        params.User,
 | 
			
		||||
		Subject:     params.Subject,
 | 
			
		||||
		Body:        params.Body,
 | 
			
		||||
		IsPrimary:   true,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	this.Data["taskId"] = resp.MessageTaskId
 | 
			
		||||
 | 
			
		||||
	defer this.CreateLogInfo("创建媒介测试任务 %d", resp.MessageTaskId)
 | 
			
		||||
 | 
			
		||||
	this.Success()
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										92
									
								
								internal/web/actions/default/admins/recipients/update.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								internal/web/actions/default/admins/recipients/update.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,92 @@
 | 
			
		||||
package recipients
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/utils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/iwind/TeaGo/actions"
 | 
			
		||||
	"github.com/iwind/TeaGo/maps"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type UpdateAction struct {
 | 
			
		||||
	actionutils.ParentAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *UpdateAction) Init() {
 | 
			
		||||
	this.Nav("", "", "update")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *UpdateAction) RunGet(params struct {
 | 
			
		||||
	RecipientId int64
 | 
			
		||||
}) {
 | 
			
		||||
	recipientResp, err := this.RPC().MessageRecipientRPC().FindEnabledMessageRecipient(this.AdminContext(), &pb.FindEnabledMessageRecipientRequest{MessageRecipientId: params.RecipientId})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	recipient := recipientResp.MessageRecipient
 | 
			
		||||
	if recipient == nil || recipient.Admin == nil || recipient.MessageMediaInstance == nil {
 | 
			
		||||
		this.NotFound("messageRecipient", params.RecipientId)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Data["recipient"] = maps.Map{
 | 
			
		||||
		"id": recipient.Id,
 | 
			
		||||
		"admin": maps.Map{
 | 
			
		||||
			"id":       recipient.Admin.Id,
 | 
			
		||||
			"fullname": recipient.Admin.Fullname,
 | 
			
		||||
			"username": recipient.Admin.Username,
 | 
			
		||||
		},
 | 
			
		||||
		"groups": recipient.MessageRecipientGroups,
 | 
			
		||||
		"isOn":   recipient.IsOn,
 | 
			
		||||
		"instance": maps.Map{
 | 
			
		||||
			"id":   recipient.MessageMediaInstance.Id,
 | 
			
		||||
			"name": recipient.MessageMediaInstance.Name,
 | 
			
		||||
		},
 | 
			
		||||
		"user":        recipient.User,
 | 
			
		||||
		"description": recipient.Description,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Show()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *UpdateAction) RunPost(params struct {
 | 
			
		||||
	RecipientId int64
 | 
			
		||||
 | 
			
		||||
	AdminId    int64
 | 
			
		||||
	User       string
 | 
			
		||||
	InstanceId int64
 | 
			
		||||
 | 
			
		||||
	GroupIds    string
 | 
			
		||||
	Description string
 | 
			
		||||
	IsOn        bool
 | 
			
		||||
 | 
			
		||||
	Must *actions.Must
 | 
			
		||||
	CSRF *actionutils.CSRF
 | 
			
		||||
}) {
 | 
			
		||||
	defer this.CreateLogInfo("修改媒介接收人 %d", params.RecipientId)
 | 
			
		||||
 | 
			
		||||
	params.Must.
 | 
			
		||||
		Field("adminId", params.AdminId).
 | 
			
		||||
		Gt(0, "请选择系统用户").
 | 
			
		||||
		Field("instanceId", params.InstanceId).
 | 
			
		||||
		Gt(0, "请选择媒介")
 | 
			
		||||
 | 
			
		||||
	groupIds := utils.SplitNumbers(params.GroupIds)
 | 
			
		||||
 | 
			
		||||
	_, err := this.RPC().MessageRecipientRPC().UpdateMessageRecipient(this.AdminContext(), &pb.UpdateMessageRecipientRequest{
 | 
			
		||||
		MessageRecipientId: params.RecipientId,
 | 
			
		||||
		AdminId:            params.AdminId,
 | 
			
		||||
		InstanceId:         params.InstanceId,
 | 
			
		||||
		User:               params.User,
 | 
			
		||||
		GroupIds:           groupIds,
 | 
			
		||||
		Description:        params.Description,
 | 
			
		||||
		IsOn:               params.IsOn,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Success()
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user