pg_position_repository.go 2.2 KB
package repository

import (
	"github.com/go-pg/pg/v10"
	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"
	"time"
)

type PositionRepository struct {
	transactionContext *pgTransaction.TransactionContext
}

func NewPositionRepository(tx *pgTransaction.TransactionContext) *PositionRepository {
	return &PositionRepository{
		transactionContext: tx,
	}
}

// Insert 新增职位
func (repository *PositionRepository) Insert(position *domain.Position) (*domain.Position, error) {
	model := &models.Position{
		Id:        position.Id,
		CompanyId: position.CompanyId,
		Name:      position.Name,
		ParentId:  position.ParentId,
		Path:      position.Path,
		Level:     position.Level,
	}
	_, err := repository.transactionContext.PgTx.Model(model).Insert()
	return position, err
}

// Update 更新
func (repository *PositionRepository) Update(position *domain.Position) (*domain.Position, error) {
	model := &models.Position{
		Id:        position.Id,
		CompanyId: position.CompanyId,
		Name:      position.Name,
		ParentId:  position.ParentId,
		Path:      position.Path,
		Level:     position.Level,
		UpdatedAt: time.Now(),
	}
	_, err := repository.transactionContext.PgTx.Model(model).WherePK().Update()
	return position, err
}

// Remove 删除
func (repository *PositionRepository) Remove(ids []int64) error {
	_, err := repository.transactionContext.PgTx.Model(&models.Position{}).Where("id in (?)", pg.In(ids)).Delete()
	return err
}

func (repository *PositionRepository) FindOne(queryOption map[string]interface{}) (*domain.Position, error) {
	position := &models.Position{}
	query := repository.transactionContext.PgTx.Model(position)
	if id, ok := queryOption["id"]; ok {
		query.Where("id = ?", id)
	}
	err := query.First()
	if err != nil {
		return nil, err
	}
	return repository.transferToDomain(position), nil
}

func (repository *PositionRepository) transferToDomain(model *models.Position) *domain.Position {
	return &domain.Position{
		Id:        model.Id,
		CompanyId: model.CompanyId,
		Name:      model.Name,
		ParentId:  model.ParentId,
		Path:      model.Path,
		Level:     model.Level,
	}
}