pg_role_repository.go
3.8 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
29
30
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
package repository
import (
"fmt"
"github.com/go-pg/pg"
pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
"github.com/tiptok/godevp/pkg/domain/role"
domain "github.com/tiptok/godevp/pkg/domain/role"
"github.com/tiptok/godevp/pkg/infrastructure/pg/models"
)
type RoleRepository struct {
transactionContext *pgTransaction.TransactionContext
}
func (repository *RoleRepository) nextIdentify() (int64, error) {
return 0, nil
}
func (repository *RoleRepository) Save(role *role.Role) (*role.Role, error) {
tx := repository.transactionContext.PgTx
if role.Identify() == nil {
_, err := repository.nextIdentify()
if err != nil {
return role, err
}
if _, err := tx.QueryOne(
pg.Scan(&role.Id, &role.RoleName, &role.ParentId, &role.CreateTime, &role.UpdateTime),
"INSERT INTO roles (id, role_name, parent_id, create_time, update_time) VALUES (?, ?, ?, ?, ?) RETURNING id, role_name, parent_id, create_time, update_time",
role.Id, role.RoleName, role.ParentId, role.CreateTime, role.UpdateTime); err != nil {
return role, err
}
} else {
if _, err := tx.QueryOne(
pg.Scan(&role.Id, &role.RoleName, &role.ParentId, &role.CreateTime, &role.UpdateTime),
"UPDATE roles SET id=?, role_name=?, parent_id=?, create_time=?, update_time=? WHERE id=? RETURNING id, role_name, parent_id, create_time, update_time",
role.Id, role.RoleName, role.ParentId, role.CreateTime, role.UpdateTime, role.Identify()); err != nil {
return role, err
}
}
return role, nil
}
func (repository *RoleRepository) Remove(role *role.Role) (*role.Role, error) {
tx := repository.transactionContext.PgTx
roleModel := new(models.Role)
roleModel.Id = role.Identify().(int64)
if _, err := tx.Model(roleModel).WherePK().Delete(); err != nil {
return role, err
}
return role, nil
}
func (repository *RoleRepository) FindOne(queryOptions map[string]interface{}) (*role.Role, error) {
tx := repository.transactionContext.PgTx
roleModel := new(models.Role)
query := tx.Model(roleModel)
if roleId, ok := queryOptions["roleId"]; ok {
query = query.Where("role.id = ?", roleId)
}
if err := query.First(); err != nil {
if err.Error() == "pg: no rows in result set" {
return nil, fmt.Errorf("没有此资源")
} else {
return nil, err
}
}
if roleModel.Id == 0 {
return nil, nil
} else {
return repository.transformPgModelToDomainModel(roleModel)
}
}
func (repository *RoleRepository) Find(queryOptions map[string]interface{}) (int64, []*role.Role, error) {
tx := repository.transactionContext.PgTx
var roleModels []*models.Role
roles := make([]*role.Role, 0)
query := tx.Model(&roleModels)
if offset, ok := queryOptions["offset"]; ok {
offset := offset.(int)
if offset > -1 {
query = query.Offset(offset)
}
} else {
query = query.Offset(0)
}
if limit, ok := queryOptions["limit"]; ok {
limit := limit.(int)
if limit > -1 {
query = query.Limit(limit)
}
} else {
query = query.Limit(20)
}
if count, err := query.Order("id DESC").SelectAndCount(); err != nil {
return 0, roles, err
} else {
for _, roleModel := range roleModels {
if role, err := repository.transformPgModelToDomainModel(roleModel); err != nil {
return 0, roles, err
} else {
roles = append(roles, role)
}
}
return int64(count), roles, nil
}
}
func (repository *RoleRepository) transformPgModelToDomainModel(roleModel *models.Role) (*domain.Role, error) {
return &role.Role{
Id: roleModel.Id,
RoleName: roleModel.RoleName,
ParentId: roleModel.ParentId,
CreateTime: roleModel.CreateTime,
UpdateTime: roleModel.UpdateTime,
}, nil
}
func NewRoleRepository(transactionContext *pgTransaction.TransactionContext) (*RoleRepository, error) {
if transactionContext == nil {
return nil, fmt.Errorf("transactionContext参数不能为nil")
} else {
return &RoleRepository{
transactionContext: transactionContext,
}, nil
}
}