duidui_fiber/internal/document/dao/folder_dao.go
2026-03-27 10:34:03 +08:00

129 lines
3.1 KiB
Go

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()
}