package repository import ( "context" "github.com/sjzar/chatlog/internal/errors" "github.com/sjzar/chatlog/internal/model" "github.com/sjzar/chatlog/internal/wechatdb/datasource" ) // Repository 实现了 repository.Repository 接口 type Repository struct { ds datasource.DataSource // Cache for contact contactCache 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 remarkList []string nickNameList []string // Cache for chat room chatRoomCache map[string]*model.ChatRoom remarkToChatRoom map[string]*model.ChatRoom nickNameToChatRoom map[string]*model.ChatRoom chatRoomList []string chatRoomRemark []string chatRoomNickName []string // 快速查找索引 chatRoomUserToInfo map[string]*model.Contact } // New 创建一个新的 Repository 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), 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), chatRoomList: make([]string, 0), chatRoomRemark: make([]string, 0), chatRoomNickName: make([]string, 0), } // 初始化缓存 if err := r.initCache(context.Background()); err != nil { return nil, errors.InitCacheFailed(err) } return r, nil } // initCache 初始化缓存 func (r *Repository) initCache(ctx context.Context) error { // 初始化联系人缓存 if err := r.initContactCache(ctx); err != nil { return err } // 初始化群聊缓存 if err := r.initChatRoomCache(ctx); err != nil { return err } return nil } // Close 实现 Repository 接口的 Close 方法 func (r *Repository) Close() error { return r.ds.Close() }