message search (#60)
This commit is contained in:
@@ -18,8 +18,8 @@ func (r *Repository) initChatRoomCache(ctx context.Context) error {
|
||||
}
|
||||
|
||||
chatRoomMap := make(map[string]*model.ChatRoom)
|
||||
remarkToChatRoom := make(map[string]*model.ChatRoom)
|
||||
nickNameToChatRoom := make(map[string]*model.ChatRoom)
|
||||
remarkToChatRoom := make(map[string][]*model.ChatRoom)
|
||||
nickNameToChatRoom := make(map[string][]*model.ChatRoom)
|
||||
chatRoomList := make([]string, 0)
|
||||
chatRoomRemark := make([]string, 0)
|
||||
chatRoomNickName := make([]string, 0)
|
||||
@@ -30,11 +30,21 @@ func (r *Repository) initChatRoomCache(ctx context.Context) error {
|
||||
chatRoomMap[chatRoom.Name] = chatRoom
|
||||
chatRoomList = append(chatRoomList, chatRoom.Name)
|
||||
if chatRoom.Remark != "" {
|
||||
remarkToChatRoom[chatRoom.Remark] = chatRoom
|
||||
remark, ok := remarkToChatRoom[chatRoom.Remark]
|
||||
if !ok {
|
||||
remark = make([]*model.ChatRoom, 0)
|
||||
}
|
||||
remark = append(remark, chatRoom)
|
||||
remarkToChatRoom[chatRoom.Remark] = remark
|
||||
chatRoomRemark = append(chatRoomRemark, chatRoom.Remark)
|
||||
}
|
||||
if chatRoom.NickName != "" {
|
||||
nickNameToChatRoom[chatRoom.NickName] = chatRoom
|
||||
nickName, ok := nickNameToChatRoom[chatRoom.NickName]
|
||||
if !ok {
|
||||
nickName = make([]*model.ChatRoom, 0)
|
||||
}
|
||||
nickName = append(nickName, chatRoom)
|
||||
nickNameToChatRoom[chatRoom.NickName] = nickName
|
||||
chatRoomNickName = append(chatRoomNickName, chatRoom.NickName)
|
||||
}
|
||||
}
|
||||
@@ -49,11 +59,21 @@ func (r *Repository) initChatRoomCache(ctx context.Context) error {
|
||||
chatRoomMap[contact.UserName] = chatRoom
|
||||
chatRoomList = append(chatRoomList, contact.UserName)
|
||||
if contact.Remark != "" {
|
||||
remarkToChatRoom[contact.Remark] = chatRoom
|
||||
remark, ok := remarkToChatRoom[chatRoom.Remark]
|
||||
if !ok {
|
||||
remark = make([]*model.ChatRoom, 0)
|
||||
}
|
||||
remark = append(remark, chatRoom)
|
||||
remarkToChatRoom[chatRoom.Remark] = remark
|
||||
chatRoomRemark = append(chatRoomRemark, contact.Remark)
|
||||
}
|
||||
if contact.NickName != "" {
|
||||
nickNameToChatRoom[contact.NickName] = chatRoom
|
||||
nickName, ok := nickNameToChatRoom[chatRoom.NickName]
|
||||
if !ok {
|
||||
nickName = make([]*model.ChatRoom, 0)
|
||||
}
|
||||
nickName = append(nickName, chatRoom)
|
||||
nickNameToChatRoom[chatRoom.NickName] = nickName
|
||||
chatRoomNickName = append(chatRoomNickName, contact.NickName)
|
||||
}
|
||||
}
|
||||
@@ -63,9 +83,12 @@ func (r *Repository) initChatRoomCache(ctx context.Context) error {
|
||||
sort.Strings(chatRoomNickName)
|
||||
|
||||
r.chatRoomCache = chatRoomMap
|
||||
r.chatRoomList = chatRoomList
|
||||
r.remarkToChatRoom = remarkToChatRoom
|
||||
r.nickNameToChatRoom = nickNameToChatRoom
|
||||
r.chatRoomList = chatRoomList
|
||||
r.chatRoomRemark = chatRoomRemark
|
||||
r.chatRoomNickName = chatRoomNickName
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -75,7 +98,7 @@ func (r *Repository) GetChatRooms(ctx context.Context, key string, limit, offset
|
||||
if key != "" {
|
||||
ret = r.findChatRooms(key)
|
||||
if len(ret) == 0 {
|
||||
return nil, errors.ChatRoomNotFound(key)
|
||||
return []*model.ChatRoom{}, nil
|
||||
}
|
||||
|
||||
if limit > 0 {
|
||||
@@ -129,21 +152,21 @@ func (r *Repository) findChatRoom(key string) *model.ChatRoom {
|
||||
return chatRoom
|
||||
}
|
||||
if chatRoom, ok := r.remarkToChatRoom[key]; ok {
|
||||
return chatRoom
|
||||
return chatRoom[0]
|
||||
}
|
||||
if chatRoom, ok := r.nickNameToChatRoom[key]; ok {
|
||||
return chatRoom
|
||||
return chatRoom[0]
|
||||
}
|
||||
|
||||
// Contain
|
||||
for _, remark := range r.chatRoomRemark {
|
||||
if strings.Contains(remark, key) {
|
||||
return r.remarkToChatRoom[remark]
|
||||
return r.remarkToChatRoom[remark][0]
|
||||
}
|
||||
}
|
||||
for _, nickName := range r.chatRoomNickName {
|
||||
if strings.Contains(nickName, key) {
|
||||
return r.nickNameToChatRoom[nickName]
|
||||
return r.nickNameToChatRoom[nickName][0]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -157,26 +180,42 @@ func (r *Repository) findChatRooms(key string) []*model.ChatRoom {
|
||||
ret = append(ret, chatRoom)
|
||||
distinct[chatRoom.Name] = true
|
||||
}
|
||||
if chatRoom, ok := r.remarkToChatRoom[key]; ok && !distinct[chatRoom.Name] {
|
||||
ret = append(ret, chatRoom)
|
||||
distinct[chatRoom.Name] = true
|
||||
if chatRooms, ok := r.remarkToChatRoom[key]; ok {
|
||||
for _, chatRoom := range chatRooms {
|
||||
if !distinct[chatRoom.Name] {
|
||||
ret = append(ret, chatRoom)
|
||||
distinct[chatRoom.Name] = true
|
||||
}
|
||||
}
|
||||
}
|
||||
if chatRoom, ok := r.nickNameToChatRoom[key]; ok && !distinct[chatRoom.Name] {
|
||||
ret = append(ret, chatRoom)
|
||||
distinct[chatRoom.Name] = true
|
||||
if chatRooms, ok := r.nickNameToChatRoom[key]; ok {
|
||||
for _, chatRoom := range chatRooms {
|
||||
if !distinct[chatRoom.Name] {
|
||||
ret = append(ret, chatRoom)
|
||||
distinct[chatRoom.Name] = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Contain
|
||||
for _, remark := range r.chatRoomRemark {
|
||||
if strings.Contains(remark, key) && !distinct[r.remarkToChatRoom[remark].Name] {
|
||||
ret = append(ret, r.remarkToChatRoom[remark])
|
||||
distinct[r.remarkToChatRoom[remark].Name] = true
|
||||
if strings.Contains(remark, key) {
|
||||
for _, chatRoom := range r.remarkToChatRoom[remark] {
|
||||
if !distinct[chatRoom.Name] {
|
||||
ret = append(ret, chatRoom)
|
||||
distinct[chatRoom.Name] = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for _, nickName := range r.chatRoomNickName {
|
||||
if strings.Contains(nickName, key) && !distinct[r.nickNameToChatRoom[nickName].Name] {
|
||||
ret = append(ret, r.nickNameToChatRoom[nickName])
|
||||
distinct[r.nickNameToChatRoom[nickName].Name] = true
|
||||
if strings.Contains(nickName, key) {
|
||||
for _, chatRoom := range r.nickNameToChatRoom[nickName] {
|
||||
if !distinct[chatRoom.Name] {
|
||||
ret = append(ret, chatRoom)
|
||||
distinct[chatRoom.Name] = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -18,9 +18,9 @@ func (r *Repository) initContactCache(ctx context.Context) error {
|
||||
}
|
||||
|
||||
contactMap := make(map[string]*model.Contact)
|
||||
aliasMap := make(map[string]*model.Contact)
|
||||
remarkMap := make(map[string]*model.Contact)
|
||||
nickNameMap := make(map[string]*model.Contact)
|
||||
aliasMap := make(map[string][]*model.Contact)
|
||||
remarkMap := make(map[string][]*model.Contact)
|
||||
nickNameMap := make(map[string][]*model.Contact)
|
||||
chatRoomUserMap := make(map[string]*model.Contact)
|
||||
chatRoomInContactMap := make(map[string]*model.Contact)
|
||||
contactList := make([]string, 0)
|
||||
@@ -34,15 +34,30 @@ func (r *Repository) initContactCache(ctx context.Context) error {
|
||||
|
||||
// 建立快速查找索引
|
||||
if contact.Alias != "" {
|
||||
aliasMap[contact.Alias] = contact
|
||||
alias, ok := aliasMap[contact.Alias]
|
||||
if !ok {
|
||||
alias = make([]*model.Contact, 0)
|
||||
}
|
||||
alias = append(alias, contact)
|
||||
aliasMap[contact.Alias] = alias
|
||||
aliasList = append(aliasList, contact.Alias)
|
||||
}
|
||||
if contact.Remark != "" {
|
||||
remarkMap[contact.Remark] = contact
|
||||
remark, ok := remarkMap[contact.Remark]
|
||||
if !ok {
|
||||
remark = make([]*model.Contact, 0)
|
||||
}
|
||||
remark = append(remark, contact)
|
||||
remarkMap[contact.Remark] = remark
|
||||
remarkList = append(remarkList, contact.Remark)
|
||||
}
|
||||
if contact.NickName != "" {
|
||||
nickNameMap[contact.NickName] = contact
|
||||
nickName, ok := nickNameMap[contact.NickName]
|
||||
if !ok {
|
||||
nickName = make([]*model.Contact, 0)
|
||||
}
|
||||
nickName = append(nickName, contact)
|
||||
nickNameMap[contact.NickName] = nickName
|
||||
nickNameList = append(nickNameList, contact.NickName)
|
||||
}
|
||||
|
||||
@@ -88,7 +103,7 @@ func (r *Repository) GetContacts(ctx context.Context, key string, limit, offset
|
||||
if key != "" {
|
||||
ret = r.findContacts(key)
|
||||
if len(ret) == 0 {
|
||||
return nil, errors.ContactNotFound(key)
|
||||
return []*model.Contact{}, nil
|
||||
}
|
||||
if limit > 0 {
|
||||
end := offset + limit
|
||||
@@ -124,29 +139,29 @@ func (r *Repository) findContact(key string) *model.Contact {
|
||||
return contact
|
||||
}
|
||||
if contact, ok := r.aliasToContact[key]; ok {
|
||||
return contact
|
||||
return contact[0]
|
||||
}
|
||||
if contact, ok := r.remarkToContact[key]; ok {
|
||||
return contact
|
||||
return contact[0]
|
||||
}
|
||||
if contact, ok := r.nickNameToContact[key]; ok {
|
||||
return contact
|
||||
return contact[0]
|
||||
}
|
||||
|
||||
// Contain
|
||||
for _, alias := range r.aliasList {
|
||||
if strings.Contains(alias, key) {
|
||||
return r.aliasToContact[alias]
|
||||
return r.aliasToContact[alias][0]
|
||||
}
|
||||
}
|
||||
for _, remark := range r.remarkList {
|
||||
if strings.Contains(remark, key) {
|
||||
return r.remarkToContact[remark]
|
||||
return r.remarkToContact[remark][0]
|
||||
}
|
||||
}
|
||||
for _, nickName := range r.nickNameList {
|
||||
if strings.Contains(nickName, key) {
|
||||
return r.nickNameToContact[nickName]
|
||||
return r.nickNameToContact[nickName][0]
|
||||
}
|
||||
}
|
||||
return nil
|
||||
@@ -159,37 +174,62 @@ func (r *Repository) findContacts(key string) []*model.Contact {
|
||||
ret = append(ret, contact)
|
||||
distinct[contact.UserName] = true
|
||||
}
|
||||
if contact, ok := r.aliasToContact[key]; ok && !distinct[contact.UserName] {
|
||||
ret = append(ret, contact)
|
||||
distinct[contact.UserName] = true
|
||||
if contacts, ok := r.aliasToContact[key]; ok {
|
||||
for _, contact := range contacts {
|
||||
if !distinct[contact.UserName] {
|
||||
ret = append(ret, contact)
|
||||
distinct[contact.UserName] = true
|
||||
}
|
||||
}
|
||||
}
|
||||
if contact, ok := r.remarkToContact[key]; ok && !distinct[contact.UserName] {
|
||||
ret = append(ret, contact)
|
||||
distinct[contact.UserName] = true
|
||||
if contacts, ok := r.remarkToContact[key]; ok {
|
||||
for _, contact := range contacts {
|
||||
if !distinct[contact.UserName] {
|
||||
ret = append(ret, contact)
|
||||
distinct[contact.UserName] = true
|
||||
}
|
||||
}
|
||||
}
|
||||
if contact, ok := r.nickNameToContact[key]; ok && !distinct[contact.UserName] {
|
||||
ret = append(ret, contact)
|
||||
distinct[contact.UserName] = true
|
||||
if contacts, ok := r.nickNameToContact[key]; ok {
|
||||
for _, contact := range contacts {
|
||||
if !distinct[contact.UserName] {
|
||||
ret = append(ret, contact)
|
||||
distinct[contact.UserName] = true
|
||||
}
|
||||
}
|
||||
}
|
||||
// Contain
|
||||
for _, alias := range r.aliasList {
|
||||
if strings.Contains(alias, key) && !distinct[r.aliasToContact[alias].UserName] {
|
||||
ret = append(ret, r.aliasToContact[alias])
|
||||
distinct[r.aliasToContact[alias].UserName] = true
|
||||
if strings.Contains(alias, key) {
|
||||
for _, contact := range r.aliasToContact[alias] {
|
||||
if !distinct[contact.UserName] {
|
||||
ret = append(ret, contact)
|
||||
distinct[contact.UserName] = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for _, remark := range r.remarkList {
|
||||
if strings.Contains(remark, key) && !distinct[r.remarkToContact[remark].UserName] {
|
||||
ret = append(ret, r.remarkToContact[remark])
|
||||
distinct[r.remarkToContact[remark].UserName] = true
|
||||
if strings.Contains(remark, key) {
|
||||
for _, contact := range r.remarkToContact[remark] {
|
||||
if !distinct[contact.UserName] {
|
||||
ret = append(ret, contact)
|
||||
distinct[contact.UserName] = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for _, nickName := range r.nickNameList {
|
||||
if strings.Contains(nickName, key) && !distinct[r.nickNameToContact[nickName].UserName] {
|
||||
ret = append(ret, r.nickNameToContact[nickName])
|
||||
distinct[r.nickNameToContact[nickName].UserName] = true
|
||||
if strings.Contains(nickName, key) {
|
||||
for _, contact := range r.nickNameToContact[nickName] {
|
||||
if !distinct[contact.UserName] {
|
||||
ret = append(ret, contact)
|
||||
distinct[contact.UserName] = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
|
||||
@@ -2,23 +2,20 @@ package repository
|
||||
|
||||
import (
|
||||
"context"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/sjzar/chatlog/internal/model"
|
||||
"github.com/sjzar/chatlog/pkg/util"
|
||||
|
||||
"github.com/rs/zerolog/log"
|
||||
)
|
||||
|
||||
// GetMessages 实现 Repository 接口的 GetMessages 方法
|
||||
func (r *Repository) GetMessages(ctx context.Context, startTime, endTime time.Time, talker string, limit, offset int) ([]*model.Message, error) {
|
||||
func (r *Repository) GetMessages(ctx context.Context, startTime, endTime time.Time, talker string, sender string, keyword string, limit, offset int) ([]*model.Message, error) {
|
||||
|
||||
if contact, _ := r.GetContact(ctx, talker); contact != nil {
|
||||
talker = contact.UserName
|
||||
} else if chatRoom, _ := r.GetChatRoom(ctx, talker); chatRoom != nil {
|
||||
talker = chatRoom.Name
|
||||
}
|
||||
|
||||
messages, err := r.ds.GetMessages(ctx, startTime, endTime, talker, limit, offset)
|
||||
talker, sender = r.parseTalkerAndSender(ctx, talker, sender)
|
||||
messages, err := r.ds.GetMessages(ctx, startTime, endTime, talker, sender, keyword, limit, offset)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -62,3 +59,53 @@ func (r *Repository) enrichMessage(msg *model.Message) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (r *Repository) parseTalkerAndSender(ctx context.Context, talker, sender string) (string, string) {
|
||||
displayName2User := make(map[string]string)
|
||||
users := make(map[string]bool)
|
||||
|
||||
talkers := util.Str2List(talker, ",")
|
||||
if len(talkers) > 0 {
|
||||
for i := 0; i < len(talkers); i++ {
|
||||
if contact, _ := r.GetContact(ctx, talkers[i]); contact != nil {
|
||||
talkers[i] = contact.UserName
|
||||
} else if chatRoom, _ := r.GetChatRoom(ctx, talker); chatRoom != nil {
|
||||
talkers[i] = chatRoom.Name
|
||||
}
|
||||
}
|
||||
// 获取群聊的用户列表
|
||||
for i := 0; i < len(talkers); i++ {
|
||||
if chatRoom, _ := r.GetChatRoom(ctx, talkers[i]); chatRoom != nil {
|
||||
for user, displayName := range chatRoom.User2DisplayName {
|
||||
displayName2User[displayName] = user
|
||||
}
|
||||
for _, user := range chatRoom.Users {
|
||||
users[user.UserName] = true
|
||||
}
|
||||
}
|
||||
}
|
||||
talker = strings.Join(talkers, ",")
|
||||
}
|
||||
|
||||
senders := util.Str2List(sender, ",")
|
||||
if len(senders) > 0 {
|
||||
for i := 0; i < len(senders); i++ {
|
||||
if user, ok := displayName2User[senders[i]]; ok {
|
||||
senders[i] = user
|
||||
} else {
|
||||
// FIXME 大量群聊用户名称重复,无法直接通过 GetContact 获取 ID,后续再优化
|
||||
for user := range users {
|
||||
if contact := r.getFullContact(user); contact != nil {
|
||||
if contact.DisplayName() == senders[i] {
|
||||
senders[i] = user
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
sender = strings.Join(senders, ",")
|
||||
}
|
||||
|
||||
return talker, sender
|
||||
}
|
||||
|
||||
@@ -17,9 +17,9 @@ type Repository struct {
|
||||
|
||||
// Cache for contact
|
||||
contactCache map[string]*model.Contact
|
||||
aliasToContact map[string]*model.Contact
|
||||
remarkToContact map[string]*model.Contact
|
||||
nickNameToContact map[string]*model.Contact
|
||||
aliasToContact map[string][]*model.Contact
|
||||
remarkToContact map[string][]*model.Contact
|
||||
nickNameToContact map[string][]*model.Contact
|
||||
chatRoomInContact map[string]*model.Contact
|
||||
contactList []string
|
||||
aliasList []string
|
||||
@@ -28,8 +28,8 @@ type Repository struct {
|
||||
|
||||
// Cache for chat room
|
||||
chatRoomCache map[string]*model.ChatRoom
|
||||
remarkToChatRoom map[string]*model.ChatRoom
|
||||
nickNameToChatRoom map[string]*model.ChatRoom
|
||||
remarkToChatRoom map[string][]*model.ChatRoom
|
||||
nickNameToChatRoom map[string][]*model.ChatRoom
|
||||
chatRoomList []string
|
||||
chatRoomRemark []string
|
||||
chatRoomNickName []string
|
||||
@@ -43,17 +43,17 @@ func New(ds datasource.DataSource) (*Repository, error) {
|
||||
r := &Repository{
|
||||
ds: ds,
|
||||
contactCache: make(map[string]*model.Contact),
|
||||
aliasToContact: make(map[string]*model.Contact),
|
||||
remarkToContact: make(map[string]*model.Contact),
|
||||
nickNameToContact: make(map[string]*model.Contact),
|
||||
aliasToContact: make(map[string][]*model.Contact),
|
||||
remarkToContact: make(map[string][]*model.Contact),
|
||||
nickNameToContact: make(map[string][]*model.Contact),
|
||||
chatRoomUserToInfo: make(map[string]*model.Contact),
|
||||
contactList: make([]string, 0),
|
||||
aliasList: make([]string, 0),
|
||||
remarkList: make([]string, 0),
|
||||
nickNameList: make([]string, 0),
|
||||
chatRoomCache: make(map[string]*model.ChatRoom),
|
||||
remarkToChatRoom: make(map[string]*model.ChatRoom),
|
||||
nickNameToChatRoom: make(map[string]*model.ChatRoom),
|
||||
remarkToChatRoom: make(map[string][]*model.ChatRoom),
|
||||
nickNameToChatRoom: make(map[string][]*model.ChatRoom),
|
||||
chatRoomList: make([]string, 0),
|
||||
chatRoomRemark: make([]string, 0),
|
||||
chatRoomNickName: make([]string, 0),
|
||||
|
||||
Reference in New Issue
Block a user