package dao import ( "database/sql" "fmt" "dd_fiber_api/internal/document" "dd_fiber_api/pkg/database" "github.com/didi/gendry/builder" ) // FolderDAO 文件夹数据访问 type FolderDAO struct { client *database.MySQLClient } // NewFolderDAO 创建 FolderDAO func NewFolderDAO(client *database.MySQLClient) *FolderDAO { return &FolderDAO{client: client} } // Create 创建文件夹 func (d *FolderDAO) Create(f *document.DocFolder) error { if d.client == nil { return fmt.Errorf("mysql client is nil") } table := "doc_folders" data := []map[string]any{ {"id": f.ID, "name": f.Name, "sort_order": f.SortOrder}, } cond, vals, err := builder.BuildInsert(table, data) if err != nil { return err } _, err = d.client.DB.Exec(cond, vals...) return err } // GetByID 根据 ID 获取 func (d *FolderDAO) GetByID(id string) (*document.DocFolder, error) { if d.client == nil { return nil, fmt.Errorf("mysql client is nil") } table := "doc_folders" where := map[string]any{"id": id} cond, vals, err := builder.BuildSelect(table, where, []string{"id", "name", "sort_order", "created_at", "updated_at"}) if err != nil { return nil, err } var f document.DocFolder var createdAt, updatedAt sql.NullString err = d.client.DB.QueryRow(cond, vals...).Scan(&f.ID, &f.Name, &f.SortOrder, &createdAt, &updatedAt) if err == sql.ErrNoRows { return nil, nil } if err != nil { return nil, err } if createdAt.Valid { f.CreatedAt = createdAt.String } if updatedAt.Valid { f.UpdatedAt = updatedAt.String } return &f, nil } // Update 更新 func (d *FolderDAO) Update(f *document.DocFolder) error { if d.client == nil { return fmt.Errorf("mysql client is nil") } table := "doc_folders" where := map[string]any{"id": f.ID} data := map[string]any{"name": f.Name, "sort_order": f.SortOrder} cond, vals, err := builder.BuildUpdate(table, where, data) if err != nil { return err } _, err = d.client.DB.Exec(cond, vals...) return err } // Delete 删除 func (d *FolderDAO) Delete(id string) error { if d.client == nil { return fmt.Errorf("mysql client is nil") } table := "doc_folders" where := map[string]any{"id": id} cond, vals, err := builder.BuildDelete(table, where) if err != nil { return err } _, err = d.client.DB.Exec(cond, vals...) return err } // List 列出所有文件夹(按 sort_order 升序) func (d *FolderDAO) List() ([]*document.DocFolder, error) { if d.client == nil { return nil, fmt.Errorf("mysql client is nil") } table := "doc_folders" cond := "SELECT id, name, sort_order, created_at, updated_at FROM " + table + " ORDER BY sort_order ASC, id ASC" rows, err := d.client.DB.Query(cond) if err != nil { return nil, err } defer rows.Close() var list []*document.DocFolder for rows.Next() { var f document.DocFolder var createdAt, updatedAt sql.NullString if err := rows.Scan(&f.ID, &f.Name, &f.SortOrder, &createdAt, &updatedAt); err != nil { continue } if createdAt.Valid { f.CreatedAt = createdAt.String } if updatedAt.Valid { f.UpdatedAt = updatedAt.String } list = append(list, &f) } return list, rows.Err() }