177 lines
4.0 KiB
Go
177 lines
4.0 KiB
Go
package model
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"regexp"
|
|
"time"
|
|
)
|
|
|
|
// Commands - struct
|
|
type Commands struct {
|
|
Cmd string `db:"cmd" cc:"cmd"`
|
|
Message string `db:"message" cc:"message"`
|
|
Group string `db:"group" cc:"group"`
|
|
Ctime time.Time `db:"ctime" cc:"ctime"`
|
|
Mtime time.Time `db:"mtime" cc:"mtime"`
|
|
}
|
|
|
|
// CommandsWithGroup -
|
|
type CommandsWithGroup struct {
|
|
Commands `cc:"-,<<"`
|
|
GroupName string `db:"group_name" cc:"group_name"`
|
|
}
|
|
|
|
// GetAllCommands -
|
|
func GetAllCommands() (cmds []*Commands, err error) {
|
|
err = x.Select(&cmds, `select * from "public"."commands"`)
|
|
return
|
|
}
|
|
|
|
// GetGroupCommand -
|
|
func GetGroupCommand(c, g string) (cmd *Commands, err error) {
|
|
if len(c) == 0 {
|
|
return nil, errors.New("command is empty")
|
|
}
|
|
query := `select c.* from "public"."commands" c
|
|
where c."cmd" = $1
|
|
and (c."group" = '' or c."group" = $2)
|
|
order by c."group" desc
|
|
limit 1`
|
|
row := x.QueryRowx(query, c, g)
|
|
// err = x.Get(&cmd, query, c, g)
|
|
cmd = &Commands{}
|
|
err = row.StructScan(cmd)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return
|
|
}
|
|
|
|
// GetCommandCount -
|
|
func GetCommandCount(where ...interface{}) (c int, err error) {
|
|
query := `select count(*) as c from "public"."commands"`
|
|
values := make([]interface{}, 0)
|
|
if len(where) > 0 {
|
|
if whereMap, ok := where[0].(map[string]string); ok {
|
|
str := ""
|
|
idx := 1
|
|
for k, v := range whereMap {
|
|
if len(str) > 0 {
|
|
str += " and "
|
|
}
|
|
str += fmt.Sprintf(` "%s" = $%d `, k, idx)
|
|
idx++
|
|
values = append(values, v)
|
|
}
|
|
if len(str) > 0 {
|
|
query += ` where ` + str
|
|
}
|
|
}
|
|
}
|
|
err = x.Get(&c, query, values...)
|
|
return
|
|
}
|
|
|
|
// GetCommands -
|
|
func GetCommands(where map[string]string, offset, limit int, order map[string]string) (cmds []*CommandsWithGroup, err error) {
|
|
query := `select c.*, (case when g.name is null then '' else g.name end) as group_name from "public"."commands" c
|
|
left join "public"."line_group" g
|
|
on g.id = c.group `
|
|
values := make([]interface{}, (len(where) + len(order)))
|
|
idx := 1
|
|
|
|
if len(where) > 0 {
|
|
str := ""
|
|
for k, v := range where {
|
|
if len(str) > 0 {
|
|
str += " and "
|
|
}
|
|
str += fmt.Sprintf(` "%s" = $%d `, k, idx)
|
|
idx++
|
|
values = append(values, v)
|
|
}
|
|
if len(str) > 0 {
|
|
query += ` where ` + str
|
|
}
|
|
}
|
|
if offset >= 0 {
|
|
query += fmt.Sprintf(" offset %d ", offset)
|
|
}
|
|
if limit > 0 {
|
|
query += fmt.Sprintf(" limit %d ", limit)
|
|
}
|
|
|
|
if len(order) > 0 {
|
|
regex, err := regexp.Compile("(?i)(desc|asc)")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
str := ""
|
|
for k, v := range order {
|
|
if !regex.Match([]byte(v)) {
|
|
continue
|
|
}
|
|
if len(str) > 0 {
|
|
str += " , "
|
|
}
|
|
str += fmt.Sprintf(` "%s" %s `, k, v)
|
|
}
|
|
}
|
|
|
|
err = x.Select(&cmds, query, values...)
|
|
|
|
return
|
|
}
|
|
|
|
// AddCommand -
|
|
func AddCommand(cmdkey, message, group string) (cmd *Commands, err error) {
|
|
if len(cmdkey) == 0 || len(message) == 0 {
|
|
return nil, errors.New("cmd or message is empty")
|
|
}
|
|
query := `insert into "public"."commands" ("cmd", "message", "group") values ($1, $2, $3) returning *`
|
|
cmd = &Commands{}
|
|
err = x.Get(cmd, query, cmdkey, message, group)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return
|
|
}
|
|
|
|
// CheckCommand -
|
|
func CheckCommand(cmd, group string) (exist bool, err error) {
|
|
if len(cmd) == 0 {
|
|
return false, errors.New("cmd is empty")
|
|
}
|
|
query := `select count(*) as c from "public"."commands" where "cmd" = $1 and "group" = $2`
|
|
c := 0
|
|
|
|
err = x.Get(&c, query, cmd, group)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
|
|
return c > 0, nil
|
|
}
|
|
|
|
// DeleteCommand -
|
|
func DeleteCommand(cmd, group string) (err error) {
|
|
if len(cmd) == 0 {
|
|
return errors.New("cmd is empty")
|
|
}
|
|
query := `delete from "public"."commands" where "cmd" = $1 and "group" = $2`
|
|
_, err = x.Exec(query, cmd, group)
|
|
return
|
|
}
|
|
|
|
// UpdateCommand -
|
|
func UpdateCommand(cmd, group, message string) (err error) {
|
|
if len(cmd) == 0 || len(message) == 0 {
|
|
return errors.New("cmd or message is empty")
|
|
}
|
|
|
|
query := `update "public"."commands" set "message" = $1, "mtime" = now() where "cmd" = $2 and "group" = $3`
|
|
_, err = x.Exec(query, message, cmd, group)
|
|
return
|
|
}
|