Add delete method :)

pull/8/head
isthisnagee 3 years ago
parent 7a86bee9fa
commit c822f8ec91

@ -0,0 +1,45 @@
/*
Copyright © 2021 NAME HERE <EMAIL ADDRESS>
*/
package cmd
import (
"fmt"
"github.com/spf13/cobra"
)
// addCmd represents the add command
var addCmd = &cobra.Command{
Use: "add [entry title]",
Args: cobra.ExactArgs(1),
Short: "Add a new diary entry with the given title",
Long: `Add a new diary entry, for example
and usage of using your command. For example:
$ diary add "Issue when fixing bad data in prod"
1134
The returned number is the ID of the added entry.
This ID can be used in other commands.
`,
Run: func(cmd *cobra.Command, args []string) {
var entry = App.NewDiaryEntry(args[0])
fmt.Println(entry.Id)
},
}
func init() {
rootCmd.AddCommand(addCmd)
// Here you will define your flags and configuration settings.
// Cobra supports Persistent Flags which will work for this command
// and all subcommands, e.g.:
// addCmd.PersistentFlags().String("foo", "", "A help for foo")
// Cobra supports local flags which will only run when this command
// is called directly, e.g.:
// addCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}

@ -0,0 +1,67 @@
/*
Copyright © 2021 NAME HERE <EMAIL ADDRESS>
*/
package cmd
import (
"fmt"
"strconv"
"github.com/spf13/cobra"
"os"
)
// deleteCmd represents the delete command
var deleteCmd = &cobra.Command{
Use: "delete [Id]",
Args: cobra.ExactArgs(1),
Short: "Delete the given entry. Will ask for confirmation",
Long: `We do not recommend using delete, unless something was truly added by mistake.
Delete is a hard delete. There is no recovery.`,
PreRunE: func(cmd *cobra.Command, args []string) error {
id, err := strconv.Atoi(args[0])
if err != nil {
return err
}
entry, err := App.GetDiaryEntry(id)
if err != nil {
return err
}
fmt.Println("Are you sure you want to delete the following entry? (y/n)")
fmt.Println(entry.Title)
var response string
fmt.Scanln(&response)
if response == "y" {
return nil
} else {
fmt.Println("Will not delete entry " + args[0])
os.Exit(0)
}
return nil
},
Run: func(cmd *cobra.Command, args []string) {
id, err := strconv.Atoi(args[0])
if err != nil {
panic(err)
}
_, err = App.DeleteDiaryEntry(id)
if err != nil {
panic(err)
}
},
}
func init() {
rootCmd.AddCommand(deleteCmd)
// Here you will define your flags and configuration settings.
// Cobra supports Persistent Flags which will work for this command
// and all subcommands, e.g.:
// deleteCmd.PersistentFlags().String("foo", "", "A help for foo")
// Cobra supports local flags which will only run when this command
// is called directly, e.g.:
// deleteCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}

@ -43,6 +43,7 @@ func Execute() {
}
func init() {
cobra.OnInitialize(InitApp)
// Here you will define your flags and configuration settings.
// Cobra supports persistent flags, which, if defined here,
// will be global for your application.

@ -1,14 +1,16 @@
package main
package cmd
import (
"errors"
"isthisnagee.com/tools/diary/db"
"isthisnagee.com/tools/diary/model"
"log"
"os"
"path"
)
func main() {
var App *model.App
func InitApp() {
home_dir, err := os.UserHomeDir()
if err != nil {
@ -24,8 +26,9 @@ func main() {
}
}
_, err = db.Init(db_path)
if err != nil {
log.Fatal(err.Error())
}
var app = model.NewApp(db_path)
App = &app
}

@ -0,0 +1,11 @@
package model
import "fmt"
type NotFoundError struct {
given_id int
}
func (e *NotFoundError) Error() string {
return fmt.Sprintf("Could not find id %d", e.given_id)
}

@ -3,7 +3,9 @@
package model
import (
"database/sql"
"isthisnagee.com/tools/diary/db"
"log"
)
type DiaryEntry struct {
@ -17,6 +19,15 @@ type App struct {
*db.DbCtx
}
func NewApp(db_path string) App {
app, err := db.Init(db_path)
if err != nil {
log.Fatal(err.Error())
}
return App{app}
}
func (app *App) NewDiaryEntry(title string) *DiaryEntry {
var diary_entry DiaryEntry
@ -39,3 +50,34 @@ func (app *App) NewDiaryEntry(title string) *DiaryEntry {
return &diary_entry
}
func (app *App) GetDiaryEntry(id int) (*DiaryEntry, error) {
var diary_entry DiaryEntry
if err := app.Db.QueryRow(
"SELECT id, title, created_at, version FROM diary_log where id=?",
id,
).Scan(&diary_entry.Id, &diary_entry.Title, &diary_entry.CreatedAt, &diary_entry.Version); err != nil {
if err == sql.ErrNoRows {
return nil, &NotFoundError{given_id: id}
}
return nil, err
}
return &diary_entry, nil
}
func (app *App) DeleteDiaryEntry(id int) (bool, error) {
result, err := app.Db.Exec("DELETE FROM diary_log where id=?", id)
if err != nil {
return false, err
}
num_rows_affected, err := result.RowsAffected()
if err != nil {
return false, err
}
if num_rows_affected == 0 {
return false, &NotFoundError{given_id: id}
}
return true, nil
}

@ -7,7 +7,19 @@ import (
func assert_string(t *testing.T, expected string, actual string) {
if actual != expected {
t.Fatalf("(%s, %s)", expected, actual)
t.Fatalf("(%v, %v)", expected, actual)
}
}
func assert_int(t *testing.T, expected int, actual int) {
if actual != expected {
t.Fatalf("(%v, %v)", expected, actual)
}
}
func assert_bool(t *testing.T, expected bool, actual bool) {
if actual != expected {
t.Fatalf("(%v, %v)", expected, actual)
}
}
@ -41,3 +53,50 @@ func TestNewDiaryEntry(t *testing.T) {
teardown(app)
}
func TestGetDiaryEntry(t *testing.T) {
var app = setup()
var inserted_result = app.NewDiaryEntry("Met with Nagee @ 1PM")
queried_result, _ := app.GetDiaryEntry(inserted_result.Id)
assert_int(t, inserted_result.Id, queried_result.Id)
assert_int(t, inserted_result.CreatedAt, queried_result.CreatedAt)
assert_int(t, inserted_result.Version, queried_result.Version)
assert_string(t, inserted_result.Title, queried_result.Title)
teardown(app)
}
func DeleteDiaryEntry(t *testing.T) {
var app = setup()
var inserted_result = app.NewDiaryEntry("Met with Nagee @ 1PM")
is_deleted, _ := app.DeleteDiaryEntry(inserted_result.Id)
assert_bool(t, true, is_deleted)
_, err := app.GetDiaryEntry(inserted_result.Id)
switch err_type := err.(type) {
case *NotFoundError:
// Do nothing
break
default:
t.Fatalf("Expected NotFoundError, got %s", err_type)
}
teardown(app)
}
func DeleteDiaryEntryNotFound(t *testing.T) {
var app = setup()
_, err := app.DeleteDiaryEntry(-1)
switch err_type := err.(type) {
case *NotFoundError:
// Do nothing
break
default:
t.Fatalf("Expected NotFoundError, got %s", err_type)
}
teardown(app)
}

Loading…
Cancel
Save