Skip to content

Commit 3a21656

Browse files
committed
实现基础的通知媒介管理
1 parent 219f361 commit 3a21656

41 files changed

Lines changed: 2467 additions & 3 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
package models
2+
3+
import (
4+
_ "github.com/go-sql-driver/mysql"
5+
"github.com/iwind/TeaGo/Tea"
6+
"github.com/iwind/TeaGo/dbs"
7+
"github.com/iwind/TeaGo/lists"
8+
"github.com/iwind/TeaGo/maps"
9+
)
10+
11+
const (
12+
MessageMediaStateEnabled = 1 // 已启用
13+
MessageMediaStateDisabled = 0 // 已禁用
14+
)
15+
16+
type MessageMediaDAO dbs.DAO
17+
18+
func NewMessageMediaDAO() *MessageMediaDAO {
19+
return dbs.NewDAO(&MessageMediaDAO{
20+
DAOObject: dbs.DAOObject{
21+
DB: Tea.Env,
22+
Table: "edgeMessageMedias",
23+
Model: new(MessageMedia),
24+
PkName: "id",
25+
},
26+
}).(*MessageMediaDAO)
27+
}
28+
29+
var SharedMessageMediaDAO *MessageMediaDAO
30+
31+
func init() {
32+
dbs.OnReady(func() {
33+
SharedMessageMediaDAO = NewMessageMediaDAO()
34+
})
35+
}
36+
37+
// 启用条目
38+
func (this *MessageMediaDAO) EnableMessageMedia(tx *dbs.Tx, id int64) error {
39+
_, err := this.Query(tx).
40+
Pk(id).
41+
Set("state", MessageMediaStateEnabled).
42+
Update()
43+
return err
44+
}
45+
46+
// 禁用条目
47+
func (this *MessageMediaDAO) DisableMessageMedia(tx *dbs.Tx, id int64) error {
48+
_, err := this.Query(tx).
49+
Pk(id).
50+
Set("state", MessageMediaStateDisabled).
51+
Update()
52+
return err
53+
}
54+
55+
// 查找启用中的条目
56+
func (this *MessageMediaDAO) FindEnabledMessageMedia(tx *dbs.Tx, id int64) (*MessageMedia, error) {
57+
result, err := this.Query(tx).
58+
Pk(id).
59+
Attr("state", MessageMediaStateEnabled).
60+
Find()
61+
if result == nil {
62+
return nil, err
63+
}
64+
return result.(*MessageMedia), err
65+
}
66+
67+
// 根据主键查找名称
68+
func (this *MessageMediaDAO) FindMessageMediaName(tx *dbs.Tx, id int64) (string, error) {
69+
return this.Query(tx).
70+
Pk(id).
71+
Result("name").
72+
FindStringCol("")
73+
}
74+
75+
// 查询所有可用媒介
76+
func (this *MessageMediaDAO) FindAllEnabledMessageMedias(tx *dbs.Tx) (result []*MessageMedia, err error) {
77+
_, err = this.Query(tx).
78+
State(MessageMediaStateEnabled).
79+
Desc("order").
80+
AscPk().
81+
Slice(&result).
82+
FindAll()
83+
return
84+
}
85+
86+
// 设置当前所有可用的媒介
87+
func (this *MessageMediaDAO) UpdateMessageMedias(tx *dbs.Tx, mediaMaps []maps.Map) error {
88+
// 新的媒介信息
89+
mediaTypes := []string{}
90+
for index, m := range mediaMaps {
91+
order := len(mediaMaps) - index
92+
mediaType := m.GetString("type")
93+
mediaTypes = append(mediaTypes, mediaType)
94+
95+
name := m.GetString("name")
96+
description := m.GetString("description")
97+
userDescription := m.GetString("userDescription")
98+
isOn := m.GetBool("isOn")
99+
100+
mediaId, err := this.Query(tx).
101+
ResultPk().
102+
Attr("type", mediaType).
103+
FindInt64Col(0)
104+
if err != nil {
105+
return err
106+
}
107+
op := NewMessageMediaOperator()
108+
if mediaId > 0 {
109+
op.Id = mediaId
110+
}
111+
op.Name = name
112+
op.Type = mediaType
113+
op.Description = description
114+
op.UserDescription = userDescription
115+
op.IsOn = isOn
116+
op.Order = order
117+
op.State = MessageMediaStateEnabled
118+
err = this.Save(tx, op)
119+
if err != nil {
120+
return err
121+
}
122+
}
123+
124+
// 老的媒介信息
125+
ones, err := this.Query(tx).
126+
FindAll()
127+
if err != nil {
128+
return err
129+
}
130+
for _, one := range ones {
131+
mediaType := one.(*MessageMedia).Type
132+
if !lists.ContainsString(mediaTypes, mediaType) {
133+
err := this.Query(tx).
134+
Pk(one.(*MessageMedia).Id).
135+
Set("state", MessageMediaStateDisabled).
136+
UpdateQuickly()
137+
if err != nil {
138+
return err
139+
}
140+
}
141+
}
142+
return nil
143+
}
144+
145+
// 根据类型查找媒介
146+
func (this *MessageMediaDAO) FindEnabledMediaWithType(tx *dbs.Tx, mediaType string) (*MessageMedia, error) {
147+
one, err := this.Query(tx).
148+
Attr("type", mediaType).
149+
State(MessageMediaStateEnabled).
150+
Find()
151+
if one == nil || err != nil {
152+
return nil, err
153+
}
154+
return one.(*MessageMedia), nil
155+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package models
2+
3+
import (
4+
_ "github.com/go-sql-driver/mysql"
5+
_ "github.com/iwind/TeaGo/bootstrap"
6+
)
Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
package models
2+
3+
import (
4+
"encoding/json"
5+
"github.com/TeaOSLab/EdgeAPI/internal/errors"
6+
_ "github.com/go-sql-driver/mysql"
7+
"github.com/iwind/TeaGo/Tea"
8+
"github.com/iwind/TeaGo/dbs"
9+
"github.com/iwind/TeaGo/maps"
10+
)
11+
12+
const (
13+
MessageMediaInstanceStateEnabled = 1 // 已启用
14+
MessageMediaInstanceStateDisabled = 0 // 已禁用
15+
)
16+
17+
type MessageMediaInstanceDAO dbs.DAO
18+
19+
func NewMessageMediaInstanceDAO() *MessageMediaInstanceDAO {
20+
return dbs.NewDAO(&MessageMediaInstanceDAO{
21+
DAOObject: dbs.DAOObject{
22+
DB: Tea.Env,
23+
Table: "edgeMessageMediaInstances",
24+
Model: new(MessageMediaInstance),
25+
PkName: "id",
26+
},
27+
}).(*MessageMediaInstanceDAO)
28+
}
29+
30+
var SharedMessageMediaInstanceDAO *MessageMediaInstanceDAO
31+
32+
func init() {
33+
dbs.OnReady(func() {
34+
SharedMessageMediaInstanceDAO = NewMessageMediaInstanceDAO()
35+
})
36+
}
37+
38+
// 启用条目
39+
func (this *MessageMediaInstanceDAO) EnableMessageMediaInstance(tx *dbs.Tx, id int64) error {
40+
_, err := this.Query(tx).
41+
Pk(id).
42+
Set("state", MessageMediaInstanceStateEnabled).
43+
Update()
44+
return err
45+
}
46+
47+
// 禁用条目
48+
func (this *MessageMediaInstanceDAO) DisableMessageMediaInstance(tx *dbs.Tx, id int64) error {
49+
_, err := this.Query(tx).
50+
Pk(id).
51+
Set("state", MessageMediaInstanceStateDisabled).
52+
Update()
53+
return err
54+
}
55+
56+
// 查找启用中的条目
57+
func (this *MessageMediaInstanceDAO) FindEnabledMessageMediaInstance(tx *dbs.Tx, id int64) (*MessageMediaInstance, error) {
58+
result, err := this.Query(tx).
59+
Pk(id).
60+
Attr("state", MessageMediaInstanceStateEnabled).
61+
Find()
62+
if result == nil {
63+
return nil, err
64+
}
65+
return result.(*MessageMediaInstance), err
66+
}
67+
68+
// 创建媒介实例
69+
func (this *MessageMediaInstanceDAO) CreateMediaInstance(tx *dbs.Tx, name string, mediaType string, params maps.Map, description string) (int64, error) {
70+
op := NewMessageMediaInstanceOperator()
71+
op.Name = name
72+
op.MediaType = mediaType
73+
74+
// 参数
75+
if params == nil {
76+
params = maps.Map{}
77+
}
78+
paramsJSON, err := json.Marshal(params)
79+
if err != nil {
80+
return 0, err
81+
}
82+
op.Params = paramsJSON
83+
84+
op.Description = description
85+
86+
op.IsOn = true
87+
op.State = MessageMediaInstanceStateEnabled
88+
return this.SaveInt64(tx, op)
89+
}
90+
91+
// 修改媒介实例
92+
func (this *MessageMediaInstanceDAO) UpdateMediaInstance(tx *dbs.Tx, instanceId int64, name string, mediaType string, params maps.Map, description string, isOn bool) error {
93+
if instanceId <= 0 {
94+
return errors.New("invalid instanceId")
95+
}
96+
97+
op := NewMessageMediaInstanceOperator()
98+
op.Id = instanceId
99+
op.Name = name
100+
op.MediaType = mediaType
101+
102+
// 参数
103+
if params == nil {
104+
params = maps.Map{}
105+
}
106+
paramsJSON, err := json.Marshal(params)
107+
if err != nil {
108+
return err
109+
}
110+
op.Params = paramsJSON
111+
112+
op.Description = description
113+
op.IsOn = isOn
114+
return this.Save(tx, op)
115+
}
116+
117+
// 计算接收人数量
118+
func (this *MessageMediaInstanceDAO) CountAllEnabledMediaInstances(tx *dbs.Tx, mediaType string, keyword string) (int64, error) {
119+
query := this.Query(tx)
120+
if len(mediaType) > 0 {
121+
query.Attr("mediaType", mediaType)
122+
}
123+
if len(keyword) > 0 {
124+
query.Where("(name LIKE :keyword OR description LIKE :keyword)").
125+
Param("keyword", "%"+keyword+"%")
126+
}
127+
return query.
128+
State(MessageMediaInstanceStateEnabled).
129+
Where("mediaType IN (SELECT `type` FROM " + SharedMessageMediaDAO.Table + " WHERE state=1)").
130+
Count()
131+
}
132+
133+
// 列出单页接收人
134+
func (this *MessageMediaInstanceDAO) ListAllEnabledMediaInstances(tx *dbs.Tx, mediaType string, keyword string, offset int64, size int64) (result []*MessageMediaInstance, err error) {
135+
query := this.Query(tx)
136+
if len(mediaType) > 0 {
137+
query.Attr("mediaType", mediaType)
138+
}
139+
if len(keyword) > 0 {
140+
query.Where("(name LIKE :keyword OR description LIKE :keyword)").
141+
Param("keyword", "%"+keyword+"%")
142+
}
143+
_, err = query.
144+
State(MessageMediaInstanceStateEnabled).
145+
Where("mediaType IN (SELECT `type` FROM " + SharedMessageMediaDAO.Table + " WHERE state=1)").
146+
DescPk().
147+
Offset(offset).
148+
Limit(size).
149+
Slice(&result).
150+
FindAll()
151+
return
152+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package models
2+
3+
import (
4+
_ "github.com/go-sql-driver/mysql"
5+
_ "github.com/iwind/TeaGo/bootstrap"
6+
)
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package models
2+
3+
// 消息媒介接收人
4+
type MessageMediaInstance struct {
5+
Id uint32 `field:"id"` // ID
6+
Name string `field:"name"` // 名称
7+
IsOn uint8 `field:"isOn"` // 是否启用
8+
MediaType string `field:"mediaType"` // 媒介类型
9+
Params string `field:"params"` // 媒介参数
10+
Description string `field:"description"` // 备注
11+
State uint8 `field:"state"` // 状态
12+
}
13+
14+
type MessageMediaInstanceOperator struct {
15+
Id interface{} // ID
16+
Name interface{} // 名称
17+
IsOn interface{} // 是否启用
18+
MediaType interface{} // 媒介类型
19+
Params interface{} // 媒介参数
20+
Description interface{} // 备注
21+
State interface{} // 状态
22+
}
23+
24+
func NewMessageMediaInstanceOperator() *MessageMediaInstanceOperator {
25+
return &MessageMediaInstanceOperator{}
26+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
package models
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package models
2+
3+
// 消息媒介
4+
type MessageMedia struct {
5+
Id uint32 `field:"id"` // ID
6+
Name string `field:"name"` // 名称
7+
Type string `field:"type"` // 类型
8+
Description string `field:"description"` // 描述
9+
UserDescription string `field:"userDescription"` // 用户描述
10+
IsOn uint8 `field:"isOn"` // 是否启用
11+
Order uint32 `field:"order"` // 排序
12+
State uint8 `field:"state"` // 状态
13+
}
14+
15+
type MessageMediaOperator struct {
16+
Id interface{} // ID
17+
Name interface{} // 名称
18+
Type interface{} // 类型
19+
Description interface{} // 描述
20+
UserDescription interface{} // 用户描述
21+
IsOn interface{} // 是否启用
22+
Order interface{} // 排序
23+
State interface{} // 状态
24+
}
25+
26+
func NewMessageMediaOperator() *MessageMediaOperator {
27+
return &MessageMediaOperator{}
28+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
package models

0 commit comments

Comments
 (0)