审查视图

pkg/infrastructure/repository/pg_role_user_repository.go 5.7 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
package repository

import (
	"errors"
	"fmt"
	"github.com/go-pg/pg/v10"
	"github.com/linmadan/egglib-go/persistent/pg/sqlbuilder"
	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"
	"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/utils"
	"time"
)

type RoleUserRepository struct {
	transactionContext *pgTransaction.TransactionContext
}

func NewRoleUserRepository(transactionContext *pgTransaction.TransactionContext) *RoleUserRepository {
	return &RoleUserRepository{transactionContext: transactionContext}
}

func (repo *RoleUserRepository) TransformToDomain(m *models.RoleUser) domain.RoleUser {
	return domain.RoleUser{
		Id:        m.Id,
		RoleId:    m.RoleId,
		UserId:    m.UserId,
		CompanyId: m.CompanyId,
29 30
		CreatedAt: m.CreatedAt.Local(),
		UpdatedAt: m.UpdatedAt.Local(),
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
		DeletedAt: m.DeletedAt,
	}
}

func (repo *RoleUserRepository) TransformToModel(d *domain.RoleUser) models.RoleUser {
	return models.RoleUser{
		Id:        d.Id,
		RoleId:    d.RoleId,
		UserId:    d.UserId,
		CompanyId: d.CompanyId,
		CreatedAt: d.CreatedAt,
		UpdatedAt: d.UpdatedAt,
		DeletedAt: d.DeletedAt,
	}
}

func (repo *RoleUserRepository) nextIdentify() (int64, error) {
	return utils.NewSnowflakeId()
}

func (repo *RoleUserRepository) Insert(d *domain.RoleUser) (*domain.RoleUser, error) {
	var isCreate = d.Id == 0
	if isCreate {
		id, err := repo.nextIdentify()
		if err != nil {
			return d, err
		}
		d.Id = id
		d.CreatedAt = time.Now()
		d.UpdatedAt = d.CreatedAt
	} else {
		d.UpdatedAt = time.Now()
	}
	m := repo.TransformToModel(d)
	tx := repo.transactionContext.PgTx
	var err error
	if isCreate {
		_, err = tx.Model(&m).Returning("id").Insert()
	} else {
		_, err = tx.Model(&m).Returning("id").WherePK().Update() // 更新和删除必须增加条件
	}
	if err != nil {
		return nil, err
	}
	d.Id = m.Id
	return d, nil
}

func (repo *RoleUserRepository) Remove(d *domain.RoleUser) (*domain.RoleUser, error) {
	tx := repo.transactionContext.PgTx
	nowTime := time.Now()
	m := repo.TransformToModel(d)
	m.DeletedAt = &nowTime
	// 真删
	if _, err := tx.Model(&m).WherePK().Delete(); err != nil {
		return d, err
	}
	return d, nil
}

func (repo *RoleUserRepository) FindOne(queryOptions map[string]interface{}) (*domain.RoleUser, error) {
	tx := repo.transactionContext.PgTx
	m := new(models.RoleUser)
	query := tx.Model(m)
	query.Where("deleted_at isnull")
	if id, ok := queryOptions["id"]; ok {
		query.Where("id=?", id)
	}
	if err := query.First(); err != nil {
		if errors.Is(err, pg.ErrNoRows) {
			return nil, fmt.Errorf("没有此资源")
		} else {
			return nil, err
		}
	}
	u := repo.TransformToDomain(m)
	return &u, nil
}

func (repo *RoleUserRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.RoleUser, error) {
	tx := repo.transactionContext.PgTx
	var m []*models.RoleUser
	query := tx.Model(&m).Where("deleted_at isnull").Limit(20)

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

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

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

	if userIds, ok := queryOptions["userIds"]; ok {
郑周 authored
128
		query.Where("user_id in (?)", pg.In(userIds))
129 130
	}
郑周 authored
131 132
	if v, ok := queryOptions["limit"].(int64); ok {
		query.Limit(int(v))
133
	}
郑周 authored
134 135
	if v, ok := queryOptions["offset"].(int64); ok {
		query.Offset(int(v))
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
	}

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

func (repo *RoleUserRepository) Count(queryOptions map[string]interface{}) (int64, error) {
	tx := repo.transactionContext.PgTx
	m := new(models.RoleUser)
	query := sqlbuilder.BuildQuery(tx.Model(m), queryOptions)
	query.Where("deleted_at isnull")

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

	if notId, ok := queryOptions["notId"]; ok {
		query.Where("id != ?", notId)
	}
郑周 authored
164 165
	if v, ok := queryOptions["name"].(string); ok && len(v) > 0 {
		query.Where("name = ?", v)
166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
	}

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

	count, err := query.Count()
	if err != nil {
		return 0, err
	}
	return int64(count), nil
}

func (repo *RoleUserRepository) BatchDeleteById(ids []int64) error {
	tx := repo.transactionContext.PgTx
	_, err := tx.Model(&models.RoleUser{}).Where("id IN (?)", pg.In(ids)).Delete()
	return err
}
185
func (repo *RoleUserRepository) FindAllContainUser(pageNumber int, pageSize int, companyId int64, roleId int64) (int64, []*domain.RoleContainUser, error) {
186 187 188 189 190 191 192 193 194
	limit := pageSize
	offset := limit * (pageNumber - 1)
	if offset < 0 {
		offset = 0
	}
	dataSql := ` SELECT
    "role_user".role_id,
	"role_user".user_id,
	"user".name as user_name,
郑周 authored
195
	"user".email as user_email
196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212
`
	whereFrom := `
    FROM "role_user"
	LEFT JOIN "user" ON "user".id = "role_user".user_id
	WHERE 1=1 AND "role_user".deleted_at ISNULL `

	var param []interface{}
	if companyId > 0 {
		param = append(param, companyId)
		whereFrom += ` AND role_user.company_id=? `
	}
	if roleId >= 0 {
		param = append(param, roleId)
		whereFrom += ` AND role_user.role_id =? `
	}
	dataSql += whereFrom
	dataSql = fmt.Sprintf("%s limit %d offset %d", dataSql, limit, offset)
213
	countSql := ` SELECT COUNT(*) ` + whereFrom
214 215

	tx := repo.transactionContext.PgTx
216 217

	var total int64
郑周 authored
218
	var dataList = make([]*domain.RoleContainUser, 0)
219
	_, err := tx.Query(&dataList, dataSql, param...)
220 221 222 223

	// 获取总数量
	_, _ = tx.QueryOne(pg.Scan(&total), countSql, param...)
	return total, dataList, err
224
}