pg_log_sms_repository.go 2.2 KB
package repository

import (
	"time"

	pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
	"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/domain"
	"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/infrastructure/pg/models"
)

type LogSmsRepository struct {
	transactionContext *pgTransaction.TransactionContext
}

func NewLogSmsRepository(transactionContext *pgTransaction.TransactionContext) *LogSmsRepository {
	return &LogSmsRepository{transactionContext: transactionContext}
}

var _ domain.LogSmsRepository = (*LogSmsRepository)(nil)

func (repo *LogSmsRepository) Save(param *domain.LogSms) error {
	m := models.LogSms{
		Id:         param.Id,
		Phone:      param.Phone,
		TemplateId: param.TemplateId,
		Template:   param.Template,
		Value:      param.Value,
		CreatedAt:  param.CreatedAt,
		Result:     param.Result,
		Status:     string(param.Status),
		From:       param.From,
		Index:      param.Index,
		ExecuteAt:  time.Time{},
	}
	tx := repo.transactionContext.PgTx
	_, err := tx.Model(&m).Insert()
	if err != nil {
		return err
	}
	return nil
}

func (repo *LogSmsRepository) Find(queryOptions map[string]interface{}) (int, []*domain.LogSms, error) {
	tx := repo.transactionContext.PgTx
	var m []*models.LogSms
	query := tx.Model(&m)
	if v, ok := queryOptions["limit"].(int); ok {
		query.Limit(v)
	}
	if v, ok := queryOptions["offset"].(int); ok {
		query.Offset(v)
	}

	if v, ok := queryOptions["status"]; ok {
		query.Where("status=?", v)
	}

	if v, ok := queryOptions["executeAtBegin"]; ok {
		query.Where("execute_at>=?", v)
	}

	if v, ok := queryOptions["executeAtEnd"]; ok {
		query.Where("execute_at<=?", v)
	}

	count, err := query.SelectAndCount()
	if err != nil {
		return 0, nil, err
	}
	var datas []*domain.LogSms
	for _, v := range m {
		d := repo.TransformToDomain(v)
		datas = append(datas, d)
	}
	return count, datas, nil
}

func (repo *LogSmsRepository) TransformToDomain(d *models.LogSms) *domain.LogSms {
	return &domain.LogSms{
		Id:         d.Id,
		Phone:      d.Phone,
		TemplateId: d.TemplateId,
		Template:   d.Template,
		Value:      d.Value,
		Result:     d.Result,
		Status:     domain.SmsStatus(d.Status),
		From:       d.From,
		Index:      d.Index,
		ExecuteAt:  d.ExecuteAt,
		CreatedAt:  d.CreatedAt,
	}
}