129 lines
3.1 KiB
Go
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()
|
|
}
|