Smail/server/services/group/group.go
jinnrry cc4aa851bc v2.4.4 (#6)
pop3收件箱出现已删除邮件bug
从sqlx切换到xorm
第三方客户端发信出现在草稿箱bug
2024-04-13 09:26:34 +08:00

116 lines
2.9 KiB
Go

package group
import (
"fmt"
log "github.com/sirupsen/logrus"
"pmail/db"
"pmail/dto"
"pmail/models"
"pmail/utils/array"
"pmail/utils/context"
"pmail/utils/errors"
)
type GroupItem struct {
Id int `json:"id"`
Label string `json:"label"`
Tag string `json:"tag"`
Children []*GroupItem `json:"children"`
}
func DelGroup(ctx *context.Context, groupId int) (bool, error) {
allGroupIds := getAllChildId(ctx, groupId)
allGroupIds = append(allGroupIds, groupId)
// 开启一个事务
trans := db.Instance.NewSession()
res, err := trans.Exec(db.WithContext(ctx, fmt.Sprintf("delete from `group` where id in (%s) and user_id =?", array.Join(allGroupIds, ","))), ctx.UserID)
if err != nil {
trans.Rollback()
return false, errors.Wrap(err)
}
num, err := res.RowsAffected()
if err != nil {
trans.Rollback()
return false, errors.Wrap(err)
}
_, err = trans.Exec(db.WithContext(ctx, fmt.Sprintf("update email set group_id=0 where group_id in (%s)", array.Join(allGroupIds, ","))))
if err != nil {
trans.Rollback()
return false, errors.Wrap(err)
}
trans.Commit()
return num > 0, nil
}
type id struct {
Id int `db:"id"`
}
func getAllChildId(ctx *context.Context, rootId int) []int {
var ids []id
var ret []int
err := db.Instance.Table("group").Where("parent_id=? and user_id=?", rootId, ctx.UserID).Find(&ids)
if err != nil {
log.WithContext(ctx).Errorf("getAllChildId err: %v", err)
}
for _, item := range ids {
ret = array.Merge(ret, getAllChildId(ctx, item.Id))
ret = append(ret, item.Id)
}
return ret
}
// GetGroupInfoList 获取全部的分组
func GetGroupInfoList(ctx *context.Context) []*GroupItem {
return buildChildren(ctx, 0)
}
// MoveMailToGroup 将某封邮件移动到某个分组中
func MoveMailToGroup(ctx *context.Context, mailId []int, groupId int) bool {
res, err := db.Instance.Exec(db.WithContext(ctx, fmt.Sprintf("update email set group_id=? where id in (%s)", array.Join(mailId, ","))), groupId)
if err != nil {
log.WithContext(ctx).Errorf("SQL Error:%+v", err)
return false
}
rowNum, err := res.RowsAffected()
if err != nil {
log.WithContext(ctx).Errorf("SQL Error:%+v", err)
return false
}
return rowNum > 0
}
func buildChildren(ctx *context.Context, parentId int) []*GroupItem {
var ret []*GroupItem
var rootGroup []*models.Group
err := db.Instance.Table("group").Where("parent_id=? and user_id=?", parentId, ctx.UserID).Find(&rootGroup)
if err != nil {
log.WithContext(ctx).Errorf("SQL Error:%v", err)
}
for _, group := range rootGroup {
ret = append(ret, &GroupItem{
Id: group.ID,
Label: group.Name,
Tag: dto.SearchTag{GroupId: group.ID, Status: -1, Type: -1}.ToString(),
Children: buildChildren(ctx, group.ID),
})
}
return ret
}
func GetGroupList(ctx *context.Context) []*models.Group {
var ret []*models.Group
db.Instance.Table("group").Where("user_id=?", ctx.UserID).Find(&ret)
return ret
}