Skip to content

Commit

Permalink
添加获取转账记录详情和测试用例
Browse files Browse the repository at this point in the history
  • Loading branch information
axetroy committed May 20, 2019
1 parent a084c85 commit 72a7550
Show file tree
Hide file tree
Showing 8 changed files with 189 additions and 68 deletions.
4 changes: 2 additions & 2 deletions docs/user_api.md
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,7 @@

</details>

<details><summary>获取转账记录<code>[GET] /v1/transfer/history</code></summary>
<details><summary>获取转账记录<code>[GET] /v1/transfer</code></summary>
<p>

获取我的转账记录
Expand All @@ -307,7 +307,7 @@

</details>

<details><summary>获取转账记录详情<code>[GET] /v1/transfer/detail/:transfer_id</code></summary>
<details><summary>获取转账记录详情<code>[GET] /v1/transfer/t/:transfer_id</code></summary>
<p>

获取某一条转账记录的详情
Expand Down
63 changes: 25 additions & 38 deletions src/controller/transfer/detail.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,24 @@ package transfer

import (
"errors"
"fmt"
"github.com/axetroy/go-server/src/controller"
"github.com/axetroy/go-server/src/exception"
"github.com/axetroy/go-server/src/middleware"
"github.com/axetroy/go-server/src/model"
"github.com/axetroy/go-server/src/schema"
"github.com/axetroy/go-server/src/service"
"github.com/axetroy/go-server/src/util"
"github.com/gin-gonic/gin"
"github.com/jinzhu/gorm"
"github.com/mitchellh/mapstructure"
"net/http"
"time"
)

func GetDetail(context controller.Context, transferId string) (res schema.Response) {
var (
err error
tx *gorm.DB
data = Log{}
data = schema.TransferLog{}
)

defer func() {
Expand Down Expand Up @@ -51,56 +51,43 @@ func GetDetail(context controller.Context, transferId string) (res schema.Respon
}
}()

uid := context.Uid

if util.IsValidIdStr(transferId) != true {
err = exception.InvalidId
return
}

tx = service.Db.Begin()

userInfo := model.User{Id: uid}
userInfo := model.User{Id: context.Uid}

if err = tx.Where(&userInfo).Last(&userInfo).Error; err != nil {
if err = tx.Last(&userInfo).Error; err != nil {
if err == gorm.ErrRecordNotFound {
err = exception.UserNotExist
}
return
}

// 联表查询
sql := GenerateSql(uid, "*") + " LIMIT 1"
log := model.TransferLog{}

r := tx.Exec(sql)
// 联表查询
// 只能获取自己转给别人的
sql := GenerateTransferLogSQL(QueryParams{
Id: &transferId,
}, 1)

if r.Error != nil {
if err = tx.Raw(sql).Scan(&log).Error; err != nil {
return
}

// TODO: 解析row

fmt.Println(r.Row())

//if res, er := session.QueryInterface(sql + " LIMIT 1"); er != nil {
// err = er
// return
//} else {
// if len(res) == 0 {
// err = exception.NoData
// return
// }
// var v = res[0]
// if err = mapstructure.Decode(v, &data); err != nil {
// return
// }
// createdAt := v["created_at"].(time.Time)
// updatedAt := v["updated_at"].(time.Time)
//
// data.CreatedAt = createdAt.Format(time.RFC3339Nano)
// data.UpdatedAt = updatedAt.Format(time.RFC3339Nano)
//}
if log.From != context.Uid {
if log.To != context.Uid {
// 既不是转账人,也不是收款人, 没有权限获取这条记录
err = exception.NoPermission
return
}
}

if err = mapstructure.Decode(log, &data.TransferLogPure); err != nil {
return
}

data.CreatedAt = log.CreatedAt.Format(time.RFC3339Nano)
data.UpdatedAt = log.UpdatedAt.Format(time.RFC3339Nano)
return
}

Expand Down
65 changes: 65 additions & 0 deletions src/controller/transfer/detail_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package transfer_test

import (
"github.com/axetroy/go-server/src/controller"
"github.com/axetroy/go-server/src/controller/auth"
"github.com/axetroy/go-server/src/controller/transfer"
"github.com/axetroy/go-server/src/controller/wallet"
"github.com/axetroy/go-server/src/model"
"github.com/axetroy/go-server/src/schema"
"github.com/axetroy/go-server/src/service"
"github.com/axetroy/go-server/tester"
"github.com/stretchr/testify/assert"
"testing"
)

func TestGetDetail(t *testing.T) {
var log schema.TransferLog
userFrom, _ := tester.CreateUser()
userTo, _ := tester.CreateUser()

defer auth.DeleteUserByUserName(userFrom.Username)
defer auth.DeleteUserByUserName(userTo.Username)

// 给账户充钱
{
assert.Nil(t, service.Db.Table(wallet.GetTableName("CNY")).Where("id = ?", userFrom.Id).Update(model.Wallet{
Balance: 100,
Currency: model.WalletCNY,
}).Error)
}

// 转账一次
{
res2 := transfer.To(controller.Context{
Uid: userFrom.Id,
}, transfer.ToParams{
Currency: "CNY",
To: userTo.Id,
Amount: "20", // 转账 20
})

assert.Equal(t, "", res2.Message)
assert.Equal(t, schema.StatusSuccess, res2.Status)
assert.Nil(t, tester.Decode(res2.Data, &log))
}

{
r := transfer.GetDetail(controller.Context{
Uid: userFrom.Id,
}, log.Id)

detail := schema.TransferLog{}

assert.Equal(t, schema.StatusSuccess, r.Status)
assert.Equal(t, "", r.Message)

assert.Nil(t, tester.Decode(r.Data, &detail))

assert.Equal(t, log.Id, detail.Id)
assert.Equal(t, log.From, detail.From)
assert.Equal(t, log.To, detail.To)
assert.Equal(t, log.Amount, detail.Amount)
assert.Equal(t, log.Status, detail.Status)
}
}
22 changes: 0 additions & 22 deletions src/controller/transfer/history.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package transfer

import (
"fmt"
"github.com/gin-gonic/gin"
"strings"
)

func GetHistory(context *gin.Context) {
Expand Down Expand Up @@ -126,23 +124,3 @@ func GetHistory(context *gin.Context) {
// }
//}
}

func GenerateSql(FromField string, selected string) string {
cnyTableName := GetTransferTableName("cny")
usdTableName := GetTransferTableName("usd")
coinTableName := GetTransferTableName("coin")

suffix := `("deleted_at" IS NULL OR "deleted_at"='0001-01-01 00:00:00')`

tables := []string{cnyTableName, usdTableName, coinTableName}

sqlList := make([]string, 0)

for _, tableName := range tables {
sql := fmt.Sprintf(`SELECT %v FROM "%v" WHERE "from"='%v' AND %v`, selected, tableName, FromField, suffix)
sqlList = append(sqlList, sql)
}

sql := strings.Join(sqlList[:], " UNION ")
return sql
}
2 changes: 1 addition & 1 deletion src/controller/transfer/to_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ func TestToRouter(t *testing.T) {
Amount: "20",
})

r := tester.HttpUser.Post("/v1/wallet/transfer", body, &header)
r := tester.HttpUser.Post("/v1/transfer", body, &header)

res := schema.Response{}

Expand Down
79 changes: 79 additions & 0 deletions src/controller/transfer/util.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,89 @@
package transfer

import (
"fmt"
"github.com/axetroy/go-server/src/model"
"reflect"
"strings"
)

// 获取转账表名
func GetTransferTableName(currency string) string {
return "transfer_log_" + strings.ToLower(currency)
}

func IsNil(i interface{}) bool {
vi := reflect.ValueOf(i)
if vi.Kind() == reflect.Ptr {
return vi.IsNil()
}
return false
}

func IsPoint(i interface{}) bool {
vi := reflect.ValueOf(i)
return vi.Kind() == reflect.Ptr
}

type QueryParams struct {
Id *string `json:"id"` // 转账ID
Currency *string `json:"currency"` // 转账币种
From *string `json:"from"` // 汇款人
To *string `json:"to"` // 收款人
Amount *string `json:"amount"` // 转账数量
Status *model.TransferStatus `json:"status"` // 转账状态
}

func GenerateTransferLogSQL(filter QueryParams, limit int) string {
suffix := `("deleted_at" IS NULL OR "deleted_at"='0001-01-01 00:00:00')`

filterArray := make([]string, 0)

{
t := reflect.TypeOf(filter)
v := reflect.ValueOf(filter)

for k := 0; k < t.NumField(); k++ {
key := t.Field(k).Tag.Get("json")
value := v.Field(k).Interface()

if key == "" {
continue
}

if !v.Field(k).IsValid() {
continue
}

if IsNil(value) {
continue
}

// 如果是指针的话
if IsPoint(value) {
// 获取指针对应的值
value = reflect.ValueOf(value).Elem()
} else {
continue
}

filterArray = append(filterArray, fmt.Sprintf(`"%s"='%v'`, key, value))
}
}

filterStr := strings.Join(filterArray[:], " AND ")

if len(filterArray) != 0 {
filterStr = "WHERE " + filterStr + " AND"
}

SQLs := make([]string, 0)

for _, tableName := range model.TransferTableNames {
sql := fmt.Sprintf(`SELECT * FROM "%s" %s %s`, tableName, filterStr, suffix)
SQLs = append(SQLs, sql)
}

sql := fmt.Sprintf("%s LIMIT %d", strings.Join(SQLs[:], " UNION "), limit)
return sql
}
6 changes: 6 additions & 0 deletions src/model/transfer_log.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,12 @@ var (
TransferStatusWaitForConfirm TransferStatus = 0 // 等待收款方确认
TransferStatusConfirmed TransferStatus = 1 // 收款方已确认

TransferTableNames = []string{
"transfer_log_cny",
"transfer_log_usd",
"transfer_log_coin",
}

TransferLogMap = map[string]interface{}{
"cny": TransferLogCny{},
"usd": TransferLogUsd{},
Expand Down
16 changes: 11 additions & 5 deletions src/router_user.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,11 +101,17 @@ func init() {
walletRouter := v1.Group("/wallet")
{
walletRouter.Use(userAuthMiddleware)
walletRouter.GET("/map", wallet.GetWalletsRouter) // 获取我的钱包map对象
walletRouter.GET("/w/:currency", wallet.GetWalletRouter) // 获取单个钱包的详细信息
walletRouter.GET("/transfer/history", transfer.GetHistory) // 获取转账记录
walletRouter.GET("/transfer/detail/:transfer_id", transfer.GetDetailRouter) // 获取单条转账详情
walletRouter.POST("/transfer", middleware.AuthPayPassword, transfer.ToRouter) // 转账给某人
walletRouter.GET("/map", wallet.GetWalletsRouter) // 获取我的钱包map对象
walletRouter.GET("/w/:currency", wallet.GetWalletRouter) // 获取单个钱包的详细信息

}

transferRouter := v1.Group("/transfer")
{
transferRouter.Use(userAuthMiddleware)
transferRouter.GET("", transfer.GetHistory) // 获取我的转账记录
transferRouter.POST("", middleware.AuthPayPassword, transfer.ToRouter) // 转账给某人
transferRouter.GET("/t/:transfer_id", transfer.GetDetailRouter) // 获取单条转账详情
}

// 财务日志
Expand Down

0 comments on commit 72a7550

Please sign in to comment.