133 lines
2.8 KiB
Go
133 lines
2.8 KiB
Go
package main
|
|
|
|
import (
|
|
"database/sql"
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/spf13/cobra"
|
|
"hg.lukegb.com/lukegb/depot/web/barf/frontend/barfdb"
|
|
|
|
_ "github.com/mattn/go-sqlite3"
|
|
)
|
|
|
|
var (
|
|
db *barfdb.DB
|
|
flagDBPath string
|
|
)
|
|
|
|
var rootCmd = &cobra.Command{
|
|
Use: "barfcli",
|
|
Short: "BARF is the Birthday Activities Registration Form",
|
|
Long: `Manage your Birthday Activities`,
|
|
}
|
|
|
|
var initializeCmd = &cobra.Command{
|
|
Use: "initialize",
|
|
Short: "Initialize a new database",
|
|
Args: cobra.ExactArgs(0),
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
return db.Initialize(cmd.Context())
|
|
},
|
|
}
|
|
|
|
var addCmd = &cobra.Command{
|
|
Use: "add keyprefix name",
|
|
Short: "Add a new key",
|
|
Args: cobra.ExactArgs(2),
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
ctx := cmd.Context()
|
|
key, err := db.GetOrCreateKey(ctx, args[0], &barfdb.Dataset{Name: args[1]})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
fmt.Println(key)
|
|
return nil
|
|
},
|
|
}
|
|
|
|
var lsCmd = &cobra.Command{
|
|
Use: "ls",
|
|
Short: "List keys and respondents",
|
|
Args: cobra.ExactArgs(0),
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
ctx := cmd.Context()
|
|
entries, err := db.List(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
maxLengths := []int{
|
|
len("basekey"),
|
|
len("key"),
|
|
len("name"),
|
|
}
|
|
for _, entry := range entries {
|
|
for n, l := range []int{
|
|
len(entry.BaseKey()),
|
|
len(entry.FullKey),
|
|
len(entry.Dataset.Name),
|
|
} {
|
|
if maxLengths[n] < l {
|
|
maxLengths[n] = l
|
|
}
|
|
}
|
|
}
|
|
fmtFmt := fmt.Sprintf("%%-%ds\t%%-%ds\t%%-%ds\t%%v\n", maxLengths[0], maxLengths[1], maxLengths[2])
|
|
fmt.Printf(fmtFmt, "basekey", "key", "name", "completed")
|
|
fmt.Printf(fmtFmt, strings.Repeat("-", maxLengths[0]), strings.Repeat("-", maxLengths[1]), strings.Repeat("-", maxLengths[2]), "---------")
|
|
for _, entry := range entries {
|
|
fmt.Printf(fmtFmt, entry.BaseKey(), entry.FullKey, entry.Dataset.Name, entry.Completed())
|
|
}
|
|
return nil
|
|
},
|
|
}
|
|
|
|
var getCmd = &cobra.Command{
|
|
Use: "get short",
|
|
Short: "Get responses for a user",
|
|
Args: cobra.ExactArgs(1),
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
ctx := cmd.Context()
|
|
resp, err := db.GetResponseForShortKey(ctx, args[0])
|
|
if err != nil {
|
|
return err
|
|
}
|
|
hs, err := resp.HumanString()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
fmt.Println(hs)
|
|
return nil
|
|
},
|
|
}
|
|
|
|
func openDB() {
|
|
sdb, err := sql.Open("sqlite3", flagDBPath)
|
|
if err != nil {
|
|
fmt.Fprintf(os.Stderr, "Opening database %v: %v\n", flagDBPath, err)
|
|
os.Exit(1)
|
|
return
|
|
}
|
|
db = barfdb.New(sdb)
|
|
}
|
|
|
|
func closeDB() {
|
|
db.Close()
|
|
}
|
|
|
|
func init() {
|
|
cobra.OnInitialize(openDB)
|
|
cobra.OnFinalize(closeDB)
|
|
|
|
rootCmd.PersistentFlags().StringVar(&flagDBPath, "db", "/var/lib/barf-fe/db.db", "BARF database.")
|
|
|
|
rootCmd.AddCommand(initializeCmd, addCmd, lsCmd, getCmd)
|
|
}
|
|
|
|
func main() {
|
|
if err := rootCmd.Execute(); err != nil {
|
|
fmt.Fprintln(os.Stderr, err)
|
|
os.Exit(1)
|
|
}
|
|
}
|