104 lines
2.3 KiB
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")
|
|
}
|