60 lines
1.4 KiB
Go
60 lines
1.4 KiB
Go
package mysql
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"strings"
|
|
|
|
_ "github.com/go-sql-driver/mysql"
|
|
"hyapp/pkg/xerr"
|
|
"hyapp/services/wallet-service/internal/domain/ledger"
|
|
)
|
|
|
|
// Repository 是 wallet-service 的 MySQL 账本入口。
|
|
// 首版只建立连接生命周期,具体扣费事务后续在该类型内实现。
|
|
type Repository struct {
|
|
db *sql.DB
|
|
}
|
|
|
|
// Open 创建 MySQL 连接池并做启动 ping。
|
|
func Open(ctx context.Context, dsn string) (*Repository, error) {
|
|
if strings.TrimSpace(dsn) == "" {
|
|
return nil, xerr.New(xerr.InvalidArgument, "mysql_dsn is required")
|
|
}
|
|
|
|
db, err := sql.Open("mysql", dsn)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if err := db.PingContext(ctx); err != nil {
|
|
_ = db.Close()
|
|
return nil, err
|
|
}
|
|
|
|
return &Repository{db: db}, nil
|
|
}
|
|
|
|
// Close 释放 MySQL 连接池。
|
|
func (r *Repository) Close() error {
|
|
if r == nil || r.db == nil {
|
|
return nil
|
|
}
|
|
|
|
return r.db.Close()
|
|
}
|
|
|
|
// Ping 验证 MySQL 当前可用。
|
|
func (r *Repository) Ping(ctx context.Context) error {
|
|
if r == nil || r.db == nil {
|
|
return xerr.New(xerr.Unavailable, "mysql repository is not configured")
|
|
}
|
|
|
|
return r.db.PingContext(ctx)
|
|
}
|
|
|
|
// DebitGift 后续承载余额扣减、ledger 写入和幂等回放。
|
|
func (r *Repository) DebitGift(context.Context, ledger.DebitGiftCommand) (ledger.Receipt, error) {
|
|
return ledger.Receipt{}, xerr.New(xerr.Unavailable, "mysql debit repository is not implemented")
|
|
}
|