From ccb273cc44dcbb05ce7563e6319dc03bfa13b834 Mon Sep 17 00:00:00 2001 From: SL Date: Tue, 5 Nov 2024 21:08:33 +0800 Subject: [PATCH] fix:add api test file --- README.md | 2 +- modules/group/api.go | 36 +++-- modules/group/api_test.go | 53 +++++++ modules/group/db.go | 5 +- modules/group/sql/group_20241101-01.sql | 1 + modules/message/api.go | 24 +-- modules/message/api_conversation.go | 36 ++++- modules/message/api_test.go | 145 ++++++++++++++++++ modules/message/db_message_extra.go | 22 +-- modules/message/db_message_user_extra.go | 6 +- modules/user/api.go | 9 +- modules/user/api_test.go | 53 +++++++ .../buckets/.bloomcycle.bin/xl.meta | Bin 0 -> 742 bytes .../.minio.sys/buckets/.usage.json/xl.meta | Bin 0 -> 634 bytes .../.minio.sys/config/config.json/xl.meta | Bin 0 -> 9735 bytes .../.minio.sys/config/iam/format.json/xl.meta | Bin 0 -> 434 bytes testenv/miniodata/.minio.sys/format.json | 1 + testenv/miniodata/.minio.sys/pool.bin/xl.meta | Bin 0 -> 479 bytes .../tmp/05f0f562-210a-4dd1-ba6c-299c4a001339 | Bin 0 -> 2049 bytes 19 files changed, 331 insertions(+), 62 deletions(-) create mode 100644 modules/group/api_test.go create mode 100644 modules/message/api_test.go create mode 100644 modules/user/api_test.go create mode 100644 testenv/miniodata/.minio.sys/buckets/.bloomcycle.bin/xl.meta create mode 100644 testenv/miniodata/.minio.sys/buckets/.usage.json/xl.meta create mode 100644 testenv/miniodata/.minio.sys/config/config.json/xl.meta create mode 100644 testenv/miniodata/.minio.sys/config/iam/format.json/xl.meta create mode 100644 testenv/miniodata/.minio.sys/format.json create mode 100644 testenv/miniodata/.minio.sys/pool.bin/xl.meta create mode 100644 testenv/miniodata/.minio.sys/tmp/05f0f562-210a-4dd1-ba6c-299c4a001339 diff --git a/README.md b/README.md index 24bbdd0..ab1e63a 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -## 扩展程序 \ No newline at end of file +## 业务扩展程序 \ No newline at end of file diff --git a/modules/group/api.go b/modules/group/api.go index 541a718..67a202f 100644 --- a/modules/group/api.go +++ b/modules/group/api.go @@ -5,10 +5,10 @@ import ( "fmt" "github.com/TangSengDaoDao/TangSengDaoDaoServer/modules/base" - "github.com/TangSengDaoDao/TangSengDaoDaoServer/pkg/network" - "github.com/TangSengDaoDao/TangSengDaoDaoServer/pkg/util" "github.com/TangSengDaoDao/TangSengDaoDaoServerLib/config" "github.com/TangSengDaoDao/TangSengDaoDaoServerLib/pkg/log" + "github.com/TangSengDaoDao/TangSengDaoDaoServerLib/pkg/network" + "github.com/TangSengDaoDao/TangSengDaoDaoServerLib/pkg/util" "github.com/TangSengDaoDao/TangSengDaoDaoServerLib/pkg/wkhttp" "go.uber.org/zap" ) @@ -34,22 +34,26 @@ func New(ctx *config.Context) *Group { // Route 路由配置 func (g *Group) Route(r *wkhttp.WKHttp) { - group := r.Group("/v1/group") + v := r.Group("/v1") { - group.POST("/create", g.create) // 创建群 - } - groups := r.Group("/v1/groups") - { - groups.GET("/:group_no", g.groupGet) // 群详情 + v.POST("/group/create", g.create) // 创建群 + v.GET("/groups/:group_no", g.groupGet) // 群详情 } } // create 创建群 func (g *Group) create(c *wkhttp.Context) { - var req CreateReq - if err := c.Bind(&req); err != nil { - g.Error("参数错误", zap.Error(err)) - c.ResponseError(errors.New("参数错误")) + var req createReq + if err := c.BindJSON(&req); err != nil { + c.ResponseError(errors.New("请求数据格式有误!")) + return + } + if req.GroupNo == "" { + c.ResponseError(errors.New("群号不能为空")) + return + } + if req.LoginUID == "" { + c.ResponseError(errors.New("登录用户ID不能为空")) return } model, err := g.db.query(req.GroupNo) @@ -60,7 +64,7 @@ func (g *Group) create(c *wkhttp.Context) { } if model == nil { name := fmt.Sprintf("群%s", req.GroupNo) - if err := g.db.insert(&GroupModel{GroupNo: req.GroupNo, Name: name}); err != nil { + if err := g.db.insert(&GroupModel{GroupNo: req.GroupNo, Name: name, Creator: req.LoginUID}); err != nil { g.Error("创建群失败", zap.Error(err)) c.ResponseError(errors.New("创建群失败")) return @@ -100,19 +104,19 @@ func (g *Group) groupGet(c *wkhttp.Context) { return } - c.Response(&GroupResp{ + c.Response(&groupResp{ GroupNo: model.GroupNo, Name: model.Name, }) } -type GroupResp struct { +type groupResp struct { GroupNo string `json:"group_no"` Name string `json:"name"` Avatar string `json:"avatar"` } -type CreateReq struct { +type createReq struct { GroupNo string `json:"group_no"` LoginUID string `json:"login_uid"` } diff --git a/modules/group/api_test.go b/modules/group/api_test.go new file mode 100644 index 0000000..51de759 --- /dev/null +++ b/modules/group/api_test.go @@ -0,0 +1,53 @@ +package group + +import ( + "bytes" + "fmt" + "net/http" + "net/http/httptest" + "strings" + "testing" + + "github.com/TangSengDaoDao/TangSengDaoDaoServerLib/pkg/util" + "github.com/TangSengDaoDao/TangSengDaoDaoServerLib/testutil" + "github.com/stretchr/testify/assert" +) + +func TestCreateGroup(t *testing.T) { + s, ctx := testutil.NewTestServer() + // u := New(ctx) + // u.Route(s.GetRoute()) + //清除数据 + err := testutil.CleanAllTables(ctx) + assert.NoError(t, err) + w := httptest.NewRecorder() + req, _ := http.NewRequest("POST", "/v1/group/create", bytes.NewReader([]byte(util.ToJson(map[string]interface{}{ + "group_no": "g1", + "login_uid": "1", + })))) + + s.GetRoute().ServeHTTP(w, req) + fmt.Println(w.Body.String()) + assert.Equal(t, http.StatusOK, w.Code) +} + +func TestGetGroup(t *testing.T) { + s, ctx := testutil.NewTestServer() + g := New(ctx) + // u.Route(s.GetRoute()) + //清除数据 + err := testutil.CleanAllTables(ctx) + assert.NoError(t, err) + err = g.db.insert(&GroupModel{ + GroupNo: "g1", + Name: "group1", + Creator: "1", + }) + assert.NoError(t, err) + w := httptest.NewRecorder() + req, _ := http.NewRequest("GET", "/v1/groups/g1", nil) + + s.GetRoute().ServeHTTP(w, req) + fmt.Println(w.Body.String()) + assert.Equal(t, true, strings.Contains(w.Body.String(), `"group_no":`)) +} diff --git a/modules/group/db.go b/modules/group/db.go index 44ceef9..5f2d9ff 100644 --- a/modules/group/db.go +++ b/modules/group/db.go @@ -26,12 +26,13 @@ func (db *DB) query(groupNo string) (*GroupModel, error) { return group, err } -func (db *DB) insert(group *GroupModel) error { - _, err := db.session.InsertInto("`group`").Columns(util.AttrToUnderscore(group)...).Record(group).Exec() +func (db *DB) insert(m *GroupModel) error { + _, err := db.session.InsertInto("group").Columns(util.AttrToUnderscore(m)...).Record(m).Exec() return err } type GroupModel struct { GroupNo string Name string + Creator string } diff --git a/modules/group/sql/group_20241101-01.sql b/modules/group/sql/group_20241101-01.sql index 9fa7b4c..1e8d4a0 100644 --- a/modules/group/sql/group_20241101-01.sql +++ b/modules/group/sql/group_20241101-01.sql @@ -7,6 +7,7 @@ create table `group` id integer not null primary key AUTO_INCREMENT, group_no VARCHAR(40) not null default '', -- 群唯一编号 name VARCHAR(40) not null default '', -- 群名字 + creator VARCHAR(40) not null default '', -- 创建者 created_at timeStamp not null DEFAULT CURRENT_TIMESTAMP, -- 创建时间 updated_at timeStamp not null DEFAULT CURRENT_TIMESTAMP -- 更新时间 ); diff --git a/modules/message/api.go b/modules/message/api.go index bb1b30d..9cc81f9 100644 --- a/modules/message/api.go +++ b/modules/message/api.go @@ -94,7 +94,7 @@ func (m *Message) syncMessageExtra(c *wkhttp.Context) { c.ResponseError(errors.New("频道ID不能为空!")) return } - extraModels, err := m.messageExtraDB.sync(extraVersion, fakeChannelID, req.ChannelType, uint64(limit), req.LoginUID) + extraModels, err := m.messageExtraDB.sync(extraVersion, fakeChannelID, req.ChannelType, uint64(limit)) if err != nil { c.ResponseErrorf("同步消息扩展数据失败!", err) return @@ -170,10 +170,6 @@ func (m *Message) delete(c *wkhttp.Context) { c.ResponseOK() } -func (m *Message) genMessageExtraSeq(channelID string) int64 { - return m.ctx.GenSeq(fmt.Sprintf("%s:%s", common.MessageExtraSeqKey, channelID)) -} - // 撤回消息 func (m *Message) revoke(c *wkhttp.Context) { var req *revokeReq @@ -205,7 +201,7 @@ func (m *Message) revoke(c *wkhttp.Context) { c.ResponseError(errors.New("查询消息扩展错误")) return } - version := m.genMessageExtraSeq(fakeChannelID) + version := time.Now().Unix() if messageExtr == nil { err = m.messageExtraDB.insert(&messageExtraModel{ MessageID: req.MessageID, @@ -236,7 +232,7 @@ func (m *Message) revoke(c *wkhttp.Context) { // 发给指定频道 err = m.ctx.SendRevoke(&config.MsgRevokeReq{ Operator: req.LoginUID, - OperatorName: c.GetLoginName(), + OperatorName: req.LoginUID, FromUID: req.LoginUID, ChannelID: req.ChannelID, ChannelType: req.ChannelType, @@ -291,11 +287,11 @@ func newSyncChannelMessageResp(resp *config.SyncChannelMessageResp, loginUID str } // 消息全局扩张 - messageExtras, err := messageExtraDB.queryWithMessageIDsAndUID(messageIDs, loginUID) + messageExtras, err := messageExtraDB.queryWithMessageIDs(messageIDs) if err != nil { log.Error("查询消息扩展字段失败!", zap.Error(err)) } - messageExtraMap := map[string]*messageExtraDetailModel{} + messageExtraMap := map[string]*messageExtraModel{} if len(messageExtras) > 0 { for _, messageExtra := range messageExtras { messageExtraMap[messageExtra.MessageID] = messageExtra @@ -375,7 +371,7 @@ type MsgSyncResp struct { } -func (m *MsgSyncResp) from(msgResp *config.MessageResp, loginUID string, messageExtraM *messageExtraDetailModel, messageUserExtraM *messageUserExtraModel) { +func (m *MsgSyncResp) from(msgResp *config.MessageResp, loginUID string, messageExtraM *messageExtraModel, messageUserExtraM *messageUserExtraModel) { m.Header.NoPersist = msgResp.Header.NoPersist m.Header.RedDot = msgResp.Header.RedDot m.Header.SyncOnce = msgResp.Header.SyncOnce @@ -397,7 +393,6 @@ func (m *MsgSyncResp) from(msgResp *config.MessageResp, loginUID string, message m.Revoke = messageExtraM.Revoke m.Revoker = messageExtraM.Revoker m.ReadedCount = messageExtraM.ReadedCount - m.Readed = messageExtraM.Readed m.ExtraVersion = messageExtraM.Version m.MessageExtra = newMessageExtraResp(messageExtraM) @@ -561,7 +556,7 @@ func (d *deleteReq) check() error { return nil } -func newMessageExtraResp(m *messageExtraDetailModel) *messageExtraResp { +func newMessageExtraResp(m *messageExtraModel) *messageExtraResp { messageID, _ := strconv.ParseInt(m.MessageID, 10, 64) @@ -574,22 +569,17 @@ func newMessageExtraResp(m *messageExtraDetailModel) *messageExtraResp { } var readedAt int64 = 0 - if m.ReadedAt.Valid { - readedAt = m.ReadedAt.Time.Unix() - } return &messageExtraResp{ MessageID: messageID, MessageIDStr: m.MessageID, Revoke: m.Revoke, Revoker: m.Revoker, - Readed: m.Readed, ReadedAt: readedAt, ReadedCount: m.ReadedCount, ContentEdit: contentEditMap, EditedAt: m.EditedAt, IsMutualDeleted: m.IsDeleted, - IsPinned: m.IsPinned, ExtraVersion: m.Version, } } diff --git a/modules/message/api_conversation.go b/modules/message/api_conversation.go index ef1eb48..e7db832 100644 --- a/modules/message/api_conversation.go +++ b/modules/message/api_conversation.go @@ -6,8 +6,11 @@ import ( "strconv" "sync" + "github.com/TangSengDaoDao/TangSengDaoDaoServer/modules/base" + "github.com/TangSengDaoDao/TangSengDaoDaoServer/pkg/network" "github.com/TangSengDaoDao/TangSengDaoDaoServerLib/config" "github.com/TangSengDaoDao/TangSengDaoDaoServerLib/pkg/log" + "github.com/TangSengDaoDao/TangSengDaoDaoServerLib/pkg/util" "github.com/TangSengDaoDao/TangSengDaoDaoServerLib/pkg/wkhttp" "go.uber.org/zap" ) @@ -99,12 +102,35 @@ func (co *Conversation) syncUserConversation(c *wkhttp.Context) { } } - conversations, err := co.ctx.IMSyncUserConversation(loginUID, version, req.MsgCount, lastMsgSeqs, nil) + resp, err := network.Post(base.APIURL+"/conversation/sync", []byte(util.ToJson(map[string]interface{}{ + "uid": req.LoginUID, + "version": version, + "last_msg_seqs": lastMsgSeqs, + "msg_count": req.MsgCount, + "larges": nil, + })), nil) if err != nil { - co.Error("同步离线后的最近会话失败!", zap.Error(err), zap.String("loginUID", loginUID)) - c.ResponseError(errors.New("同步离线后的最近会话失败!")) + co.Error("获取IM离线最近会话失败!", zap.Error(err)) + c.ResponseError(errors.New("获取IM离线最近会话失败!")) return } + err = base.HandlerIMError(resp) + if err != nil { + c.ResponseError(err) + } + var conversations []*config.SyncUserConversationResp + err = util.ReadJsonByByte([]byte(resp.Body), &conversations) + if err != nil { + c.ResponseError(errors.New("解析IM离线最近会话失败!")) + return + } + + // conversations, err := co.ctx.IMSyncUserConversation(loginUID, version, req.MsgCount, lastMsgSeqs, nil) + // if err != nil { + // co.Error("同步离线后的最近会话失败!", zap.Error(err), zap.String("loginUID", loginUID)) + // c.ResponseError(errors.New("同步离线后的最近会话失败!")) + // return + // } syncUserConversationResps := make([]*SyncUserConversationResp, 0, len(conversations)) userKey := loginUID @@ -277,11 +303,11 @@ func newSyncUserConversationResp(resp *config.SyncUserConversationResp, loginUID } // 消息扩充数据 - messageExtras, err := messageExtraDB.queryWithMessageIDsAndUID(messageIDs, loginUID) + messageExtras, err := messageExtraDB.queryWithMessageIDs(messageIDs) if err != nil { log.Error("查询消息扩展字段失败!", zap.Error(err)) } - messageExtraMap := map[string]*messageExtraDetailModel{} + messageExtraMap := map[string]*messageExtraModel{} if len(messageExtras) > 0 { for _, messageExtra := range messageExtras { messageExtraMap[messageExtra.MessageID] = messageExtra diff --git a/modules/message/api_test.go b/modules/message/api_test.go new file mode 100644 index 0000000..b82143e --- /dev/null +++ b/modules/message/api_test.go @@ -0,0 +1,145 @@ +package message + +import ( + "bytes" + "fmt" + "net/http" + "net/http/httptest" + "strings" + "testing" + + "github.com/TangSengDaoDao/TangSengDaoDaoServerLib/common" + "github.com/TangSengDaoDao/TangSengDaoDaoServerLib/pkg/util" + "github.com/TangSengDaoDao/TangSengDaoDaoServerLib/testutil" + "github.com/stretchr/testify/assert" +) + +func TestSyncConv(t *testing.T) { + s, ctx := testutil.NewTestServer() + //清除数据 + err := testutil.CleanAllTables(ctx) + assert.NoError(t, err) + w := httptest.NewRecorder() + req, _ := http.NewRequest("POST", "/v1/conversation/sync", bytes.NewReader([]byte(util.ToJson(map[string]interface{}{ + "version": 0, + "last_msg_seqs": "", + "msg_count": 1, + "login_uid": "1", + "device_uuid": "1", + })))) + + s.GetRoute().ServeHTTP(w, req) + fmt.Println(w.Body.String()) + assert.Equal(t, true, strings.Contains(w.Body.String(), `"uid":`)) +} +func TestChannelMsg(t *testing.T) { + s, ctx := testutil.NewTestServer() + m := New(ctx) + //清除数据 + err := testutil.CleanAllTables(ctx) + assert.NoError(t, err) + channelID := "sll" + channelType := 1 + loginUID := "sl" + err = m.messageUserExtraDB.insert(&messageUserExtraModel{ + MessageID: "1848341056756551680", + ChannelID: channelID, + ChannelType: uint8(channelType), + UID: loginUID, + MessageIsDeleted: 1, + MessageSeq: 1, + }) + assert.NoError(t, err) + w := httptest.NewRecorder() + req, _ := http.NewRequest("POST", "/v1/message/channel/sync", bytes.NewReader([]byte(util.ToJson(map[string]interface{}{ + "start_message_seq": 0, + "end_message_seq": 100, + "login_uid": loginUID, + "device_uuid": "1", + "pull_mode": 1, + "limit": 1, + "channel_type": channelType, + "channel_id": channelID, + })))) + + s.GetRoute().ServeHTTP(w, req) + fmt.Println(w.Body.String()) + assert.Equal(t, true, strings.Contains(w.Body.String(), `"messages":`)) +} + +func TestDeleteMsg(t *testing.T) { + s, ctx := testutil.NewTestServer() + //清除数据 + err := testutil.CleanAllTables(ctx) + assert.NoError(t, err) + w := httptest.NewRecorder() + req, _ := http.NewRequest("DELETE", "/v1/message", bytes.NewReader([]byte(util.ToJson(map[string]interface{}{ + "message_seq": 1, + "login_uid": "sl", + "channel_id": "sll", + "channel_type": 1, + "message_id": "1848341056756551680", + })))) + + s.GetRoute().ServeHTTP(w, req) + fmt.Println(w.Body.String()) + assert.Equal(t, http.StatusOK, w.Code) +} +func TestRevokeMsg(t *testing.T) { + s, ctx := testutil.NewTestServer() + //清除数据 + err := testutil.CleanAllTables(ctx) + assert.NoError(t, err) + w := httptest.NewRecorder() + req, _ := http.NewRequest("POST", "/v1/message/revoke", bytes.NewReader([]byte(util.ToJson(map[string]interface{}{ + "client_msg_no": "dssssdd", + "login_uid": "sl", + "channel_id": "sll", + "channel_type": 1, + "message_id": "1848341056756551680", + })))) + + s.GetRoute().ServeHTTP(w, req) + fmt.Println(w.Body.String()) + assert.Equal(t, http.StatusOK, w.Code) +} + +func TestSyncExtra(t *testing.T) { + s, ctx := testutil.NewTestServer() + //清除数据 + err := testutil.CleanAllTables(ctx) + assert.NoError(t, err) + w := httptest.NewRecorder() + m := New(ctx) + channelId := "sll" + channelType := common.ChannelTypePerson.Uint8() + loginUID := "sl" + + fakeChannelID := channelId + if channelType == common.ChannelTypePerson.Uint8() { + fakeChannelID = common.GetFakeChannelIDWith(loginUID, channelId) + } + err = m.messageExtraDB.insert(&messageExtraModel{ + MessageID: "1848341056756551680", + MessageSeq: 1, + ChannelID: fakeChannelID, + ChannelType: channelType, + FromUID: loginUID, + Revoke: 1, + Revoker: loginUID, + IsDeleted: 1, + }) + assert.NoError(t, err) + req, _ := http.NewRequest("POST", "/v1/message/extra/sync", bytes.NewReader([]byte(util.ToJson(map[string]interface{}{ + "login_uid": loginUID, + "channel_id": channelId, + "channel_type": channelType, + "extra_version": 0, + "limit": 10, + "source": "uuid", + })))) + + s.GetRoute().ServeHTTP(w, req) + fmt.Println(w.Body.String()) + assert.Equal(t, true, strings.Contains(w.Body.String(), `"uid":`)) +} diff --git a/modules/message/db_message_extra.go b/modules/message/db_message_extra.go index feb6b95..7b60c12 100644 --- a/modules/message/db_message_extra.go +++ b/modules/message/db_message_extra.go @@ -36,12 +36,12 @@ func (m *messageExtraDB) update(md *messageExtraModel) error { return err } -func (m *messageExtraDB) queryWithMessageIDsAndUID(messageIDs []string, loginUID string) ([]*messageExtraDetailModel, error) { +func (m *messageExtraDB) queryWithMessageIDs(messageIDs []string) ([]*messageExtraModel, error) { if len(messageIDs) <= 0 { return nil, nil } - var models []*messageExtraDetailModel - _, err := m.session.Select("message_extra.*,(select count(*) from member_readed where member_readed.message_id=message_extra.message_id and member_readed.uid='"+loginUID+"') readed,(select created_at from member_readed where member_readed.message_id=message_extra.message_id and member_readed.uid='"+loginUID+"') readed_at").From("message_extra").Where("message_id in ?", messageIDs).Load(&models) + var models []*messageExtraModel + _, err := m.session.Select("*").From("message_extra").Where("message_id in ?", messageIDs).Load(&models) return models, err } @@ -51,9 +51,9 @@ func (m *messageExtraDB) queryWithMessageID(messageID string) (*messageExtraMode return model, err } -func (m *messageExtraDB) sync(version int64, channelID string, channelType uint8, limit uint64, loginUID string) ([]*messageExtraDetailModel, error) { - var models []*messageExtraDetailModel - selectSql := "message_extra.*,(select count(*) from member_readed where member_readed.message_id=message_extra.message_id and member_readed.uid='" + loginUID + "') readed,(select created_at from member_readed where member_readed.message_id=message_extra.message_id and member_readed.uid='" + loginUID + "') readed_at" +func (m *messageExtraDB) sync(version int64, channelID string, channelType uint8, limit uint64) ([]*messageExtraModel, error) { + var models []*messageExtraModel + selectSql := "*" builder := m.session.Select(selectSql).From("message_extra") var err error if version == 0 { @@ -70,7 +70,7 @@ func (m *messageExtraDB) sync(version int64, channelID string, channelType uint8 return models, err } -type messageExtraDetailModelSlice []*messageExtraDetailModel +type messageExtraDetailModelSlice []*messageExtraModel func (m messageExtraDetailModelSlice) Len() int { return len(m) @@ -78,13 +78,6 @@ func (m messageExtraDetailModelSlice) Len() int { func (m messageExtraDetailModelSlice) Swap(i, j int) { m[i], m[j] = m[j], m[i] } func (m messageExtraDetailModelSlice) Less(i, j int) bool { return m[i].Version < m[j].Version } -type messageExtraDetailModel struct { - messageExtraModel - Readed int // 是否已读(针对于自己) - ReadedAt dbr.NullTime // 已读时间 - -} - type messageExtraModel struct { MessageID string MessageSeq uint32 @@ -100,6 +93,5 @@ type messageExtraModel struct { EditedAt int // 编辑时间 时间戳(秒) IsDeleted int Version int64 // 数据版本 - IsPinned int // 是否置顶 db.BaseModel } diff --git a/modules/message/db_message_user_extra.go b/modules/message/db_message_user_extra.go index 81f7f6d..7a3ddf9 100644 --- a/modules/message/db_message_user_extra.go +++ b/modules/message/db_message_user_extra.go @@ -6,6 +6,7 @@ import ( "github.com/TangSengDaoDao/TangSengDaoDaoServerLib/config" "github.com/TangSengDaoDao/TangSengDaoDaoServerLib/pkg/db" + "github.com/TangSengDaoDao/TangSengDaoDaoServerLib/pkg/util" "github.com/gocraft/dbr/v2" ) @@ -20,7 +21,10 @@ func newMessageUserExtraDB(ctx *config.Context) *messageUserExtraDB { session: ctx.DB(), } } - +func (m *messageUserExtraDB) insert(md *messageUserExtraModel) error { + _, err := m.session.InsertInto(m.getTable(md.UID)).Columns(util.AttrToUnderscore(md)...).Record(md).Exec() + return err +} func (m *messageUserExtraDB) insertOrUpdateDeleted(md *messageUserExtraModel) error { sq := fmt.Sprintf("INSERT INTO %s (uid,message_id,message_seq,channel_id,channel_type,message_is_deleted) VALUES (?,?,?,?,?,?) ON DUPLICATE KEY UPDATE message_is_deleted=VALUES(message_is_deleted)", m.getTable(md.UID)) _, err := m.session.InsertBySql(sq, md.UID, md.MessageID, md.MessageSeq, md.ChannelID, md.ChannelType, md.MessageIsDeleted).Exec() diff --git a/modules/user/api.go b/modules/user/api.go index a0f9c9d..f9d975f 100644 --- a/modules/user/api.go +++ b/modules/user/api.go @@ -4,14 +4,13 @@ import ( "math/rand" "github.com/TangSengDaoDao/TangSengDaoDaoServer/modules/base" - "github.com/TangSengDaoDao/TangSengDaoDaoServer/pkg/network" - "github.com/TangSengDaoDao/TangSengDaoDaoServer/pkg/util" "github.com/TangSengDaoDao/TangSengDaoDaoServerLib/config" - "go.uber.org/zap" - "github.com/TangSengDaoDao/TangSengDaoDaoServerLib/pkg/log" + "github.com/TangSengDaoDao/TangSengDaoDaoServerLib/pkg/network" + "github.com/TangSengDaoDao/TangSengDaoDaoServerLib/pkg/util" "github.com/TangSengDaoDao/TangSengDaoDaoServerLib/pkg/wkhttp" "github.com/pkg/errors" + "go.uber.org/zap" ) // User 用户相关API @@ -140,7 +139,7 @@ type loginReq struct { type userResp struct { UID string `json:"uid"` Name string `json:"name"` - Token string `json:"token"` + Token string `json:"token,omitempty"` } // Names 注册用户随机名字 diff --git a/modules/user/api_test.go b/modules/user/api_test.go new file mode 100644 index 0000000..8fe7470 --- /dev/null +++ b/modules/user/api_test.go @@ -0,0 +1,53 @@ +package user + +import ( + "bytes" + "fmt" + "net/http" + "net/http/httptest" + "strings" + "testing" + + "github.com/TangSengDaoDao/TangSengDaoDaoServerLib/pkg/util" + "github.com/TangSengDaoDao/TangSengDaoDaoServerLib/testutil" + "github.com/stretchr/testify/assert" +) + +func TestLogin(t *testing.T) { + s, ctx := testutil.NewTestServer() + // u := New(ctx) + // u.Route(s.GetRoute()) + //清除数据 + err := testutil.CleanAllTables(ctx) + assert.NoError(t, err) + w := httptest.NewRecorder() + req, _ := http.NewRequest("POST", "/v1/user/login", bytes.NewReader([]byte(util.ToJson(map[string]interface{}{ + "uid": "1", + "token": "1", + "device_level": 1, + "device_flag": 0, + })))) + + s.GetRoute().ServeHTTP(w, req) + fmt.Println(w.Body.String()) + assert.Equal(t, true, strings.Contains(w.Body.String(), `"token":`)) +} +func TestGetUser(t *testing.T) { + s, ctx := testutil.NewTestServer() + u := New(ctx) + // u.Route(s.GetRoute()) + //清除数据 + err := testutil.CleanAllTables(ctx) + assert.NoError(t, err) + u.db.insert(&userModel{ + UID: "1", + Name: "test", + }) + assert.NoError(t, err) + w := httptest.NewRecorder() + req, _ := http.NewRequest("GET", "/v1/users/1", nil) + req.Header.Set("Authorization", "Bearer 1") + s.GetRoute().ServeHTTP(w, req) + fmt.Println(w.Body.String()) + assert.Equal(t, true, strings.Contains(w.Body.String(), `"uid":`)) +} diff --git a/testenv/miniodata/.minio.sys/buckets/.bloomcycle.bin/xl.meta b/testenv/miniodata/.minio.sys/buckets/.bloomcycle.bin/xl.meta new file mode 100644 index 0000000000000000000000000000000000000000..18fd48fe06f85568896ec80edfcf8c6271344c3d GIT binary patch literal 742 zcma#>F;ZY;U}iYRz`$6+%*1#^ZTb-b1~hP4f>k8RXh&Dj5f;I=ZC4oC7#NQ-dNnTz zsVqokTpDKNpOkfvL2!|$3#Qg3E-slxM+81}{kwjs!?U!XV}a(Y+`kK!xh6a2q~|j( zc1`vL5q=EIU6Y-HGpkZBF#xRxay;`=QY#pN>Rd95OC~a|a1Jib1#4LmkXTgWSDITq zk#Qx6=^B!lUVH$|1nDoHc#+X)6-dGn&Rqgx0fm?PhGgcZ!hN&cH?<@&xU#r$Plax7 zW?p8#Zf0IdYEfQd4v>+PnU|`Yl30>>gr%gYG!?8iw795g2~bb^O@$=$6iW-!B;%yy z6eBaERFhN_17p*~RHM{HLt|4D6N5F$`9QPsN_0zrVYDN$pdcqRIk6-&KTkhDxg@nj zx45JzH8FQ#*|~H@wm0YaHnCn}Y+RC8nv-*sF-WBA)sZ*#i#LdKm(_oM8vZt+`uacN zhn%%dPxhQXFD~$BGBkQxmM51M6#*?_Sdy1oQF3PT^5PPpzf)6=^RR-Hq-#lZYwxet zUzc2&oRjLDpIeZV3Y5LWAOKe&%C39aE&;)H);a!_7s0L9N&n7>;O^Gh|Jez_{jSTu zv>MJ8GuG3($${YJ>wN2JM{rl`t`J>^;6B&A_W2N;E3T|pV>1K6jo0-k`-|Yt)?=N8 iaFzIV-Sv$#;j$9KdP_>35nO-$qQqYaZnxgF;ZY;U}iYRz`$6*%*1#^ZTb-b1~hP4f>k8R=6n64p->BR@YOpyNKi5D5puL4Op!nsR8ETHgG-;m7QRJd=J`=*v823Hn0?y1nt z&CJWp*Uii;NiE7t%mFfTGV@Y(QxZ!OkFb;!m8OE#h87n!EdlCDzo}qioMN10WNDme zVv%f;WMXMzlxl2fVQiLaY+_)LoRYjIIUi_NUWslAFpM@N78K-UCMT9;=I7~W73b$I zEIXI3$oA%3P|IIa#>ORir8zlA-X97-zK#8{%jcWhT=xI!4b)+4yplV|;8SPMoU2#1 z*Yka-R?0~%E(t9FIx1DkO3A>$z)%;ALJSP7z$i*dM=3ukD>b>K*g3y6uSChpKu4)8 zwWt_qFOo<~YEEiNs&8UZHc$$o5UMjIza%jS6kuT8P{E*7xCcD*((;w8Ku*?CN-9mx WPDQp1DiB(nn4XG7Avi`Lnri`uN9eBr literal 0 HcmV?d00001 diff --git a/testenv/miniodata/.minio.sys/config/config.json/xl.meta b/testenv/miniodata/.minio.sys/config/config.json/xl.meta new file mode 100644 index 0000000000000000000000000000000000000000..760f1cb7a90c2a21802c309f3b0d3d1f2dd0e827 GIT binary patch literal 9735 zcmeHNO^h5z72Y8s7jg(U4jh(Iz*02(HU=*C}`KK|o3FV?3XU%V*v!#%DdiT@=RN>D_QsT+8${Cey@!O!npx+)@Gp61>qZt0b| zdHca^B@(evDsq+_A5qz^BCrYe_r0&7_#x`Jp8+`&NeqM zZ1A1UV0)8qvrV=>+}ZqDpkS@ou2_)KFKCiT5l|~symrH=_(uni!cV>Mw?}t>@c!-I z+sAP#<$EvRy1n=9zyIsrwc))tzVXk`zj*nR-~aWu-u>Qpesh2CSKs|$=N}J#d8I2U1@GIuNlJHKu) zP-#P`lgr})hEoeAAIaGSewLufM*0C7y>JBe;*f8fjo|2tVIJGq*G1OQpIY|?#C^ICG zoW^NFGJ^u0piN!Cg7IhZSt2w(@o*D^8J8Ty-m&&pgyh47p(EInVnTC}^QmzlP<>Fv zXgItn5~4;oU_KVC8jlf3D`g1{0&YAEUdPPifbauw2oK^dlRw7UF*yJ|g3vMcv%}%W z#`bW14OK)Yu}*4Z#7x0nKzm}0_u%6S<)UYx!$L4iIWZ8g(fIjw_g6!K zT_X^-hC@D@C^bE!J@A+%3Ov?Zw2Y!oWW<75;HZf9RA^wKidxk(qBfY+j*g!2VPsPt z!?~B{)(bOOwAolw+}gmIVq$GVEF@EvVsUK&#`$D+l&bV`{4HWNIiv#5UytxZKvG)S zENh;G-|h)n{9KIBcBs`McyM)(fk{ZBAXj7aWqeFiX;+L6md_b3$LE&MrLm!7zQQ54 zpMJ|(!?{hD;yK8G{oJ_;jKt-=EF9Su0A+X|g>oBDMiA(c_!!(Ay5Nj`k zh!`?H120NPOhph(FxvOU44-K3vKBIXAEf!1YYhaVCYd~gujFK5<#58|l|U29&Ovm{#q~4pyZK2djZO7_2&eH(0e)4_0T99ITGKU>)mgiI0NJHK7nNK_z2>i75gE3U(M9;($ozYi2r!pD{2`S_?y~1CVNbb-SN% zpkSU1L?#+LCz8>mey|E}Kzo6p0SSyy#{A?{23VsHAi%=e7-{DRjy(_-gEvzRL4QOI zhp$Ko=!q5VSV$oA-B4|e+af)Wo>jkCNT zbP600WNl$>bY34PA-?usL{&N5y>|n*elzO#p2MY6_-W+yO#C0GVwH{zxUJ*l2!>N2!{K#?VGoUcu#Wj-|SiTm11@Rm&cK{G@A%Hs}Lf;|zLqu6u+N zj1PiwpoMx)BE_&caCwoWBWUGKz)P}(rlDLr%~$?%d9f-*>2vD?@76%Jomc2mw1xCnuG*whL0MCVGqtc|k}xj@^k=7QxqH~S}r zY;eI}Qr*9rK)Z(?nY-L*K6SVGbempBr?{(}ecUoSYjwB+qk2h(&i0`@(upHB4Odv$ zRc>%wbfVgrKtAl7md_PR1flMt2q~it=WGVZ2;4eN4eXGNr3fcji+GEt%b(nYR%)u! z6ra?Vk&DJ=|BUttGg#J7YBkc1`1dqy=_#B#QO1VgWoJD4W5uS^u<&ezDA)Y>j|ieO zkX75BrA>E-DHr09zoF>y6s+REQA+3AK6~9!%Iis^ri%f2*9@{*?JByp9%*S3q1B#p z*D24I#N9Lvk>;~V>z=B4*l>kXYh^pA2`FUj+9jGvxL0Qu_h-nq1cMf16^6#)RSM|j zL-h?IvFT-itkqO%%tMcrWVN?Iyvt)KbZJYk#HE$Wl_c6#0Nq4f8Rx{r2wS^MsY$Ec zYa!j!Tv;pv4FVdvcRS#nfg*?&*EqmXVrcqSI1gM=!c~;NoAM#>noxT`qTVXHesuJ2 DkpHJ! literal 0 HcmV?d00001 diff --git a/testenv/miniodata/.minio.sys/config/iam/format.json/xl.meta b/testenv/miniodata/.minio.sys/config/iam/format.json/xl.meta new file mode 100644 index 0000000000000000000000000000000000000000..c82644d45b3742f4cbd5e79c044192605841391c GIT binary patch literal 434 zcma#>F;ZY;U}iYRz`&Tr%*1#^ZTb-b1~hP4f|Vy`;>B+*M_9bShm|w3F)$uwv}s-v zQdyA7xHQbjKPl@TgWw`h7fh{7TwF4XjtHb3)mY*7%kj;WjNg?{!klB5xh6a2q~|j( zc1`vL5q=EIU6Y-HGpkZBF#xRxay;`=QY#pN>Rd95OC~a|a1Jib1#4LmkXTgWSDITq zk#Qx6=^B!lUVH$|1nDoH$h!(8>nVG4nX{yPZF;ZY;U}iYRz`$6<%*1#^ZTb-b1~hP4f|Vy`!u}QVM_39f%g!*eF)$uwbZK4^ zQdyA7xHQbjKPl@TgWw`h7fh{7TwF4XjtDeIZOPsiG_O{ zU6Xx5gdf9l*JP*Q%&OE&3_$CF9M8Oz)CxwRI+x7il8KBfoP$eq!CF=XBo>wUmF5;t zWLybix`rgC7assKLHdg)8m$5eJ3={2K(x_P-;m7QRJcEu`=*v823Hn0?y1nt&CJWp z*Uii;NiE7t%mFfTGV@Y(QxZ!OkFb;!m8OE#h87n!tx3)YD#|O-EdhFaM`A%iPG)jq zNoIbYetvREYKd-fNl|KI?h>HM={FTD3=J(zP0cI}lTD1w%uEuK%#D*%jg!)nl2Z-M z%*+iJmYqviWP5Y&ZzV$nW8;#%(wv+lL8Yffy=y*rw7$7IS9bZv9r;&H_fOY&GG&Uc z<+9Vy&b3@&WME`yT3E)oxFDx^V#}h;6oy5~IZO3HZe5g9dYp$96mRL8-^68i{d8WO IlA3$~0B(`4j{pDw literal 0 HcmV?d00001 diff --git a/testenv/miniodata/.minio.sys/tmp/05f0f562-210a-4dd1-ba6c-299c4a001339 b/testenv/miniodata/.minio.sys/tmp/05f0f562-210a-4dd1-ba6c-299c4a001339 new file mode 100644 index 0000000000000000000000000000000000000000..e36ee44665fb70c4cacbf2be6feee8abc1e3a467 GIT binary patch literal 2049 dcmZQz7zLvtFd71*Aut*OqaiRF0wXO1v;YVz04o3h literal 0 HcmV?d00001