gomog/internal/engine/crud_handler.go

104 lines
2.3 KiB
Go

package engine
import (
"context"
"time"
"git.kingecg.top/kingecg/gomog/internal/database"
"git.kingecg.top/kingecg/gomog/pkg/types"
)
// CRUDHandler CRUD 操作处理器
type CRUDHandler struct {
store *MemoryStore
adapter database.DatabaseAdapter
}
// NewCRUDHandler 创建 CRUD 处理器
func NewCRUDHandler(store *MemoryStore, adapter database.DatabaseAdapter) *CRUDHandler {
return &CRUDHandler{
store: store,
adapter: adapter,
}
}
// Insert 插入文档
func (h *CRUDHandler) Insert(ctx context.Context, collection string, docs []map[string]interface{}) (*types.InsertResult, error) {
result := &types.InsertResult{
OK: 1,
InsertedIDs: make(map[int]string),
}
for i, data := range docs {
id := GenerateID()
doc := types.Document{
ID: id,
Data: data,
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
}
if err := h.store.Insert(collection, doc); err != nil {
return nil, err
}
result.InsertedIDs[i] = id
result.N++
}
// 异步持久化到数据库
go h.persistToDB(ctx, collection)
return result, nil
}
// Update 更新文档
func (h *CRUDHandler) Update(ctx context.Context, collection string, filter types.Filter, update types.Update) (*types.UpdateResult, error) {
matched, modified, _, err := h.store.Update(collection, filter, update, false, nil)
if err != nil {
return nil, err
}
// 异步持久化到数据库
go h.persistToDB(ctx, collection)
return &types.UpdateResult{
OK: 1,
N: matched,
NModified: modified,
}, nil
}
// Delete 删除文档
func (h *CRUDHandler) Delete(ctx context.Context, collection string, filter types.Filter) (*types.DeleteResult, error) {
deleted, err := h.store.Delete(collection, filter)
if err != nil {
return nil, err
}
// 异步持久化到数据库
go h.persistToDB(ctx, collection)
return &types.DeleteResult{
OK: 1,
N: deleted,
DeletedCount: deleted,
}, nil
}
// persistToDB 持久化集合到数据库
func (h *CRUDHandler) persistToDB(ctx context.Context, collection string) {
if err := h.store.SyncToDB(ctx, collection); err != nil {
// 记录错误但不返回
// TODO: 使用日志记录
}
}
// Now 返回当前时间(用于测试)
var Now = time.Now
// GenerateID 生成唯一 ID
func GenerateID() string {
return time.Now().Format("20060102150405.000000000")
}