pg_department_repository.go 3.6 KB
package repository

import (
	"time"

	"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"
)

type DepartmentRepository struct {
	transactionContext *pgTransaction.TransactionContext
}

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

func NewDepartmentRepository(tx *pgTransaction.TransactionContext) *DepartmentRepository {
	return &DepartmentRepository{
		transactionContext: tx,
	}
}

func (repo *DepartmentRepository) Insert(u *domain.Department) (*domain.Department, error) {
	departmentModel := models.Department{
		Id:            u.Id,
		CompanyId:     u.CompanyId,
		Level:         u.Level,
		Name:          u.Name,
		ParentId:      u.ParentId,
		ChargeUserIds: u.ChargeUserIds,
		Path:          u.Path,
		CreateAt:      u.CreateAt,
		UpdateAt:      u.UpdateAt,
		DeleteAt:      nil,
	}
	tx := repo.transactionContext.PgTx
	_, err := tx.Model(&departmentModel).Insert()
	if err != nil {
		return nil, err
	}
	u.Id = departmentModel.Id
	return u, nil
}

func (repo *DepartmentRepository) Update(u *domain.Department) (*domain.Department, error) {
	departmentModel := models.Department{
		Id:            u.Id,
		CompanyId:     u.CompanyId,
		Level:         u.Level,
		Name:          u.Name,
		ParentId:      u.ParentId,
		ChargeUserIds: u.ChargeUserIds,
		Path:          u.Path,
		CreateAt:      u.CreateAt,
		UpdateAt:      u.UpdateAt,
		DeleteAt:      u.DeleteAt,
	}
	tx := repo.transactionContext.PgTx
	_, err := tx.Model(&departmentModel).WherePK().Update()
	if err != nil {
		return nil, err
	}
	return u, nil
}

func (repo *DepartmentRepository) Remove(ids []int64) error {
	nowTime := time.Now()
	tx := repo.transactionContext.PgTx
	uModel := models.Department{}
	_, err := tx.Model(&uModel).
		Set("delete_at", nowTime).
		Where("id in (?)", pg.In(ids)).
		Update()
	return err
}

func (repo *DepartmentRepository) FindOne(queryOptions map[string]interface{}) (*domain.Department, error) {
	tx := repo.transactionContext.PgTx
	departmentModel := models.Department{}
	query := tx.Model(&departmentModel)
	if v, ok := queryOptions["id"]; ok {
		query.Where("id=?", v)
	}
	err := query.First()
	if err == pg.ErrNoRows {
		return nil, ErrNoRows
	}
	if err != nil {
		return nil, err
	}
	result := repo.TransformToCompanyDomain(&departmentModel)
	return result, nil
}

func (repo *DepartmentRepository) Find(queryOptions map[string]interface{}) (int, []*domain.Department, error) {
	tx := repo.transactionContext.PgTx
	dparmentModel := []models.Department{}
	query := tx.Model(&dparmentModel).
		Limit(20)
	if v, ok := queryOptions["id"]; ok {
		query.Where("id=?", v)
	}
	if v, ok := queryOptions["ids"]; ok {
		query.Where("id in(?)", pg.In(v))
	}
	if v, ok := queryOptions["limit"]; ok {
		query.Limit(v.(int))
	}
	if v, ok := queryOptions["offset"]; ok {
		query.Offset(v.(int))
	}
	cnt, err := query.SelectAndCount()
	if err != nil {
		return 0, nil, err
	}
	var resultList []*domain.Department
	for i := range dparmentModel {
		result := repo.TransformToCompanyDomain(&dparmentModel[i])
		resultList = append(resultList, result)
	}
	return cnt, resultList, nil
}

func (repo *DepartmentRepository) TransformToCompanyDomain(u *models.Department) *domain.Department {
	return &domain.Department{
		Id:            u.Id,
		CompanyId:     u.CompanyId,
		Level:         u.Level,
		Name:          u.Name,
		ParentId:      u.ParentId,
		ChargeUserIds: u.ChargeUserIds,
		Path:          u.Path,
		CreateAt:      u.CreateAt,
		UpdateAt:      u.UpdateAt,
		DeleteAt:      u.DeleteAt,
	}
}