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 }