package model import ( "context" "errors" "time" mysqldriver "github.com/go-sql-driver/mysql" "gorm.io/gorm" "spark-server/internal/module/message/entity" "spark-server/internal/pkg/errs" ) // Repo is MySQL persistence for messages. type Repo struct { gdb *gorm.DB } func NewRepo(gdb *gorm.DB) *Repo { return &Repo{gdb: gdb} } func (m *Repo) session(ctx context.Context) (*gorm.DB, error) { if m == nil || m.gdb == nil { return nil, errs.ErrAvailable } return m.gdb.WithContext(ctx), nil } func mapDBErr(err error) error { if err == nil { return nil } if errors.Is(err, gorm.ErrRecordNotFound) { return errs.ErrNotFound } var me *mysqldriver.MySQLError if errors.As(err, &me) && me.Number == 1062 { return errs.ErrDuplicate } return errs.ErrInner.WithError("message-mysql", err) } func (m *Repo) GetByID(ctx context.Context, id int64) (*entity.Message, error) { if id <= 0 { return nil, errs.ErrInvalidArgument } db, err := m.session(ctx) if err != nil { return nil, err } var row Message if err := db.Where("id = ?", id).Take(&row).Error; err != nil { return nil, mapDBErr(err) } return row.Entity(), nil } func (m *Repo) Create(ctx context.Context, message *entity.Message) error { if message == nil || message.ID <= 0 { return errs.ErrInvalidArgument } db, err := m.session(ctx) if err != nil { return err } row := FromEntity(message) if message.CreatedAtMS > 0 { row.CreatedAt = time.UnixMilli(message.CreatedAtMS) } else { row.CreatedAt = time.Now() } return mapDBErr(db.Create(row).Error) }