138 lines
4.9 KiB
Go
138 lines
4.9 KiB
Go
package dao
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"database/sql"
|
|
"encoding/json"
|
|
"time"
|
|
|
|
"go-common/app/admin/main/reply/model"
|
|
)
|
|
|
|
const (
|
|
_addConfigSQL = "INSERT IGNORE INTO reply_config (type, oid, adminid, operator, category, config, ctime, mtime) VALUES(?,?,?,?,?,?,?,?) ON DUPLICATE KEY UPDATE adminid = ?, operator = ?, config=?, mtime = ?"
|
|
_paginationConfigSQL = "SELECT id, type, oid, adminid, operator, category, config, ctime, mtime FROM reply_config"
|
|
_paginationConfigCountSQL = "SELECT count(id) FROM reply_config"
|
|
_loadConfigSQL = "SELECT id, type, oid, adminid, operator, category, config, ctime, mtime FROM reply_config WHERE type=? AND oid=? AND category = ?"
|
|
_loadConfigByIDSQL = "SELECT id, type, oid, adminid, operator, category, config, ctime, mtime FROM reply_config WHERE id = ?"
|
|
_deleteConfigSQL = "DELETE FROM reply_config where id = ?"
|
|
)
|
|
|
|
// AddConfig create a new config.
|
|
func (d *Dao) AddConfig(c context.Context, typ, category int32, oid, adminid int64, operator, config string, now time.Time) (id int64, err error) {
|
|
res, err := d.db.Exec(c, _addConfigSQL, typ, oid, adminid, operator, category, config, now, now, adminid, operator, config, now)
|
|
if err != nil {
|
|
return
|
|
}
|
|
return res.LastInsertId()
|
|
}
|
|
|
|
// LoadConfig load a config record.
|
|
func (d *Dao) LoadConfig(c context.Context, typ, category int32, oid int64) (m *model.Config, err error) {
|
|
m = new(model.Config)
|
|
row := d.db.QueryRow(c, _loadConfigSQL, typ, oid, category)
|
|
if err = row.Scan(&m.ID, &m.Type, &m.Oid, &m.AdminID, &m.Operator, &m.Category, &m.Config, &m.CTime, &m.MTime); err != nil {
|
|
if err == sql.ErrNoRows {
|
|
m = nil
|
|
err = nil
|
|
return
|
|
}
|
|
}
|
|
if m.ID > 0 && len(m.Config) > 0 {
|
|
dat := new(model.Config)
|
|
if err = json.Unmarshal([]byte(m.Config), dat); err == nil {
|
|
m.ShowEntry = dat.ShowEntry
|
|
m.ShowAdmin = dat.ShowAdmin
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
// LoadConfigByID load a config record by id.
|
|
func (d *Dao) LoadConfigByID(c context.Context, id int64) (m *model.Config, err error) {
|
|
m = new(model.Config)
|
|
row := d.db.QueryRow(c, _loadConfigByIDSQL, id)
|
|
if err = row.Scan(&m.ID, &m.Type, &m.Oid, &m.AdminID, &m.Operator, &m.Category, &m.Config, &m.CTime, &m.MTime); err != nil {
|
|
if err == sql.ErrNoRows {
|
|
return nil, nil
|
|
}
|
|
}
|
|
if m.ID > 0 {
|
|
dat := new(model.Config)
|
|
if err = json.Unmarshal([]byte(m.Config), dat); err == nil {
|
|
m.ShowEntry = dat.ShowEntry
|
|
m.ShowAdmin = dat.ShowAdmin
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
// PaginateConfig paginate config list of records indexing from start(offset) to end(offset+count) by conditions.
|
|
func (d *Dao) PaginateConfig(c context.Context, typ, category int32, oid int64, operator string, offset, count int) (configs []*model.Config, err error) {
|
|
var paginationSQLBuffer bytes.Buffer
|
|
paginationSQLBuffer.WriteString(_paginationConfigSQL)
|
|
sqlwhere, queryParams := d.constructPaginationSQLWhere(typ, category, oid, operator)
|
|
paginationSQLBuffer.WriteString(sqlwhere)
|
|
paginationSQLBuffer.WriteString(" limit ?, ?")
|
|
queryParams = append(queryParams, offset, count-1)
|
|
rows, err := d.db.Query(c, paginationSQLBuffer.String(), queryParams...)
|
|
if err != nil {
|
|
return
|
|
}
|
|
defer rows.Close()
|
|
for rows.Next() {
|
|
m := new(model.Config)
|
|
if err = rows.Scan(&m.ID, &m.Type, &m.Oid, &m.AdminID, &m.Operator, &m.Category, &m.Config, &m.CTime, &m.MTime); err != nil {
|
|
return
|
|
}
|
|
if m.ID > 0 {
|
|
dat := new(model.Config)
|
|
if err = json.Unmarshal([]byte(m.Config), dat); err == nil {
|
|
m.ShowEntry = dat.ShowEntry
|
|
m.ShowAdmin = dat.ShowAdmin
|
|
}
|
|
}
|
|
configs = append(configs, m)
|
|
}
|
|
return
|
|
}
|
|
|
|
// PaginateConfigCount returns a total count of records by conditions.
|
|
func (d *Dao) PaginateConfigCount(c context.Context, typ, category int32, oid int64, operator string) (totalCount int64, err error) {
|
|
var paginationCountSQLBuffer bytes.Buffer
|
|
paginationCountSQLBuffer.WriteString(_paginationConfigCountSQL)
|
|
sqlwhere, countParams := d.constructPaginationSQLWhere(typ, category, oid, operator)
|
|
paginationCountSQLBuffer.WriteString(sqlwhere)
|
|
row := d.db.QueryRow(c, paginationCountSQLBuffer.String(), countParams...)
|
|
if err = row.Scan(&totalCount); err != nil {
|
|
if err == sql.ErrNoRows {
|
|
err = nil
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func (d *Dao) constructPaginationSQLWhere(tp, category int32, oid int64, operator string) (sqlWhere string, queryParams []interface{}) {
|
|
var sqlBuffer bytes.Buffer
|
|
sqlBuffer.WriteString(" where 1 = 1 ")
|
|
if tp > 0 && oid > 0 && category > 0 {
|
|
sqlBuffer.WriteString(" and type = ? and oid = ? and category = ?")
|
|
queryParams = append(queryParams, tp, oid, category)
|
|
}
|
|
if len(operator) > 0 {
|
|
sqlBuffer.WriteString(" and operator = ?")
|
|
queryParams = append(queryParams, operator)
|
|
}
|
|
return sqlBuffer.String(), queryParams
|
|
}
|
|
|
|
// DeleteConfig delete a reply config record by id.
|
|
func (d *Dao) DeleteConfig(c context.Context, id int64) (rows int64, err error) {
|
|
res, err := d.db.Exec(c, _deleteConfigSQL, id)
|
|
if err != nil {
|
|
return
|
|
}
|
|
return res.RowsAffected()
|
|
}
|