三处小修 + 两个格式清理,均来自全盘复查: 1. ask-status domain 枚举:ErrUserNotExists 分支原返回空数组、正常分支返回带元素 数组,凭空/非空可枚举 domain 是否存在(含被 L1 隐藏或设了页面密码的半公开箱)。 改为箱主不存在时也回显 ok:false,四种失败响应完全同形。 2. 私聊 SendMessage 写路径用 FeatureStateOf(fail-open 变体):读配置失败会回退默认值, 与「写路径必须 FeatureStateOfStrict(失败即拒)」的约定不符。此前靠 chat 默认关闭 的巧合侥幸安全,现统一改 Strict。 3. 图片压缩 submit 兜底可重复提交:capture 监听器里 tbBeginSubmit 从 Promise 回调提前 到 preventDefault 同步栈,物理阻止压缩窗口内双击重复提交。 顺带:box_views.go / message_image.go / insights 两个文件补末尾换行与 struct 字段对齐 (gofmt 干净)。
64 lines
1.6 KiB
Go
64 lines
1.6 KiB
Go
package db
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/pkg/errors"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
var MessageImages MessageImageStore
|
|
|
|
type MessageImageStore interface {
|
|
Create(ctx context.Context, opts CreateMessageImageOptions) (*MessageImage, error)
|
|
GetByMessageIDs(ctx context.Context, messageIDs []uint) (map[uint][]*MessageImage, error)
|
|
}
|
|
|
|
func NewMessageImageStore(db *gorm.DB) MessageImageStore {
|
|
return &messageImages{db}
|
|
}
|
|
|
|
type messageImages struct {
|
|
*gorm.DB
|
|
}
|
|
|
|
type MessageImage struct {
|
|
gorm.Model
|
|
MessageID uint `gorm:"index" json:"message_id"`
|
|
URL string `gorm:"size:500" json:"url"`
|
|
FileName string `gorm:"size:200" json:"file_name"`
|
|
FileSize int64 `json:"file_size"`
|
|
}
|
|
|
|
type CreateMessageImageOptions struct {
|
|
MessageID uint
|
|
URL string
|
|
FileName string
|
|
FileSize int64
|
|
}
|
|
|
|
func (db *messageImages) Create(ctx context.Context, opts CreateMessageImageOptions) (*MessageImage, error) {
|
|
img := &MessageImage{
|
|
MessageID: opts.MessageID,
|
|
URL: opts.URL,
|
|
FileName: opts.FileName,
|
|
FileSize: opts.FileSize,
|
|
}
|
|
if err := db.WithContext(ctx).Create(img).Error; err != nil {
|
|
return nil, errors.Wrap(err, "create message image")
|
|
}
|
|
return img, nil
|
|
}
|
|
|
|
func (db *messageImages) GetByMessageIDs(ctx context.Context, messageIDs []uint) (map[uint][]*MessageImage, error) {
|
|
var images []*MessageImage
|
|
if err := db.WithContext(ctx).Where("message_id IN ?", messageIDs).Find(&images).Error; err != nil {
|
|
return nil, errors.Wrap(err, "get message images")
|
|
}
|
|
result := make(map[uint][]*MessageImage)
|
|
for _, img := range images {
|
|
result[img.MessageID] = append(result[img.MessageID], img)
|
|
}
|
|
return result, nil
|
|
}
|