forked from free-lancers/electricity_bill_calc_service
enhance(user):完成可运行的程序基本结构以及用户基本查询功能。
This commit is contained in:
@@ -5,6 +5,8 @@ import (
|
||||
"electricity_bill_calc/global"
|
||||
"electricity_bill_calc/logger"
|
||||
"electricity_bill_calc/model"
|
||||
"electricity_bill_calc/tools"
|
||||
"electricity_bill_calc/tools/time"
|
||||
"fmt"
|
||||
|
||||
"github.com/doug-martin/goqu/v9"
|
||||
@@ -15,10 +17,12 @@ import (
|
||||
|
||||
type _UserRepository struct {
|
||||
log *zap.Logger
|
||||
ds goqu.DialectWrapper
|
||||
}
|
||||
|
||||
var UserRepository = _UserRepository{
|
||||
log: logger.Named("Repository", "User"),
|
||||
ds: goqu.Dialect("postgres"),
|
||||
}
|
||||
|
||||
// 使用用户名查询指定用户的基本信息
|
||||
@@ -32,7 +36,7 @@ func (ur _UserRepository) FindUserByUsername(username string) (*model.User, erro
|
||||
defer cancel()
|
||||
|
||||
var user = new(model.User)
|
||||
sql, params, _ := goqu.From("user").Where(goqu.C("username").Eq(username)).Prepared(true).ToSQL()
|
||||
sql, params, _ := ur.ds.From("user").Where(goqu.Ex{"username": username}).Prepared(true).ToSQL()
|
||||
if err := pgxscan.Get(ctx, global.DB, &user, sql, params...); err != nil {
|
||||
ur.log.Error("从数据库查询指定用户名的用户基本信息失败。", zap.String("username", username), zap.Error(err))
|
||||
return nil, err
|
||||
@@ -52,7 +56,7 @@ func (ur _UserRepository) FindUserById(uid string) (*model.User, error) {
|
||||
defer cancel()
|
||||
|
||||
var user = new(model.User)
|
||||
sql, params, _ := goqu.From("user").Where(goqu.C("id").Eq(uid)).Prepared(true).ToSQL()
|
||||
sql, params, _ := ur.ds.From("user").Where(goqu.Ex{"id": uid}).Prepared(true).ToSQL()
|
||||
if err := pgxscan.Get(ctx, global.DB, &user, sql, params...); err != nil {
|
||||
ur.log.Error("从数据库查询指定用户唯一编号的用户基本信息失败。", zap.String("user id", uid), zap.Error(err))
|
||||
return nil, err
|
||||
@@ -72,7 +76,7 @@ func (ur _UserRepository) FindUserDetailById(uid string) (*model.UserDetail, err
|
||||
defer cancel()
|
||||
|
||||
var user = new(model.UserDetail)
|
||||
sql, params, _ := goqu.From("user_detail").Where(goqu.C("id").Eq(uid)).Prepared(true).ToSQL()
|
||||
sql, params, _ := ur.ds.From("user_detail").Where(goqu.Ex{"id": uid}).Prepared(true).ToSQL()
|
||||
if err := pgxscan.Get(ctx, global.DB, &user, sql, params...); err != nil {
|
||||
ur.log.Error("从数据库查询指定用户唯一编号的用户详细信息失败。", zap.String("user id", uid), zap.Error(err))
|
||||
return nil, err
|
||||
@@ -92,7 +96,7 @@ func (ur _UserRepository) FindUserInformation(uid string) (*model.UserWithDetail
|
||||
defer cancel()
|
||||
|
||||
var user = new(model.UserWithDetail)
|
||||
sql, params, _ := goqu.
|
||||
sql, params, _ := ur.ds.
|
||||
From("user").As("u").
|
||||
Join(
|
||||
goqu.T("user_detail").As("ud"),
|
||||
@@ -104,7 +108,7 @@ func (ur _UserRepository) FindUserInformation(uid string) (*model.UserWithDetail
|
||||
"ud.name", "ud.abbr", "ud.region", "ud.address", "ud.contact", "ud.phone",
|
||||
"ud.unit_service_fee", "ud.service_expiration",
|
||||
"ud.created_at", "ud.created_by", "ud.last_modified_at", "ud.last_modified_by").
|
||||
Where(goqu.C("u.id").Eq(uid)).
|
||||
Where(goqu.Ex{"u.id": uid}).
|
||||
Prepared(true).ToSQL()
|
||||
if err := pgxscan.Get(
|
||||
ctx, global.DB, &user, sql, params...); err != nil {
|
||||
@@ -126,7 +130,7 @@ func (ur _UserRepository) IsUserExists(uid string) (bool, error) {
|
||||
defer cancel()
|
||||
|
||||
var userCount int
|
||||
sql, params, _ := goqu.From("user").Select(goqu.COUNT("*")).Where(goqu.C("id").Eq(uid)).Prepared(true).ToSQL()
|
||||
sql, params, _ := ur.ds.From("user").Select(goqu.COUNT("*")).Where(goqu.Ex{"id": uid}).Prepared(true).ToSQL()
|
||||
if err := pgxscan.Get(ctx, global.DB, &userCount, sql, params...); err != nil {
|
||||
ur.log.Error("从数据库查询指定用户唯一编号的用户基本信息失败。", zap.String("user id", uid), zap.Error(err))
|
||||
return false, err
|
||||
@@ -136,3 +140,60 @@ func (ur _UserRepository) IsUserExists(uid string) (bool, error) {
|
||||
}
|
||||
return userCount > 0, nil
|
||||
}
|
||||
|
||||
// 创建一个新用户
|
||||
func (ur _UserRepository) CreateUser(user model.User, detail model.UserDetail, operator *string) (bool, error) {
|
||||
ctx, cancel := global.TimeoutContext()
|
||||
defer cancel()
|
||||
tx, err := global.DB.Begin(ctx)
|
||||
if err != nil {
|
||||
ur.log.Error("启动数据库事务失败。", zap.Error(err))
|
||||
return false, err
|
||||
}
|
||||
|
||||
createdTime := time.Now()
|
||||
userSql, userParams, _ := ur.ds.
|
||||
Insert("user").
|
||||
Rows(
|
||||
goqu.Record{
|
||||
"id": user.Id, "username": user.Username, "password": user.Password,
|
||||
"reset_needed": user.ResetNeeded, "type": user.UserType, "enabled": user.Enabled,
|
||||
"created_at": createdTime,
|
||||
},
|
||||
).
|
||||
Prepared(true).ToSQL()
|
||||
userResult, err := tx.Exec(ctx, userSql, userParams...)
|
||||
if err != nil {
|
||||
ur.log.Error("向数据库插入新用户基本信息失败。", zap.Error(err))
|
||||
tx.Rollback(ctx)
|
||||
return false, err
|
||||
}
|
||||
userDetailSql, userDetailParams, _ := ur.ds.
|
||||
Insert("user_detail").
|
||||
Rows(
|
||||
goqu.Record{
|
||||
"id": user.Id, "name": detail.Name, "abbr": tools.PinyinAbbr(*detail.Name), "region": detail.Region,
|
||||
"address": detail.Address, "contact": detail.Contact, "phone": detail.Phone,
|
||||
"unit_service_fee": detail.UnitServiceFee, "service_expiration": detail.ServiceExpiration,
|
||||
"created_at": createdTime, "created_by": operator,
|
||||
"last_modified_at": createdTime, "last_modified_by": operator,
|
||||
},
|
||||
).
|
||||
Prepared(true).ToSQL()
|
||||
detailResult, err := tx.Exec(ctx, userDetailSql, userDetailParams...)
|
||||
if err != nil {
|
||||
ur.log.Error("向数据库插入新用户详细信息失败。", zap.Error(err))
|
||||
tx.Rollback(ctx)
|
||||
return false, err
|
||||
}
|
||||
|
||||
err = tx.Commit(ctx)
|
||||
if err != nil {
|
||||
ur.log.Error("提交数据库事务失败。", zap.Error(err))
|
||||
tx.Rollback(ctx)
|
||||
return false, err
|
||||
} else {
|
||||
cache.AbolishRelation("user")
|
||||
}
|
||||
return userResult.RowsAffected() > 0 && detailResult.RowsAffected() > 0, nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user