Loading Makefile 0 → 100644 +7 −0 Original line number Diff line number Diff line .PHONY: all all: go generate ./... # vim:ft=make # ask/ask.go +13 −0 Original line number Diff line number Diff line Loading @@ -3,3 +3,16 @@ Package ask provides routines to ask questions of users. It handles getting a line of text, getting a choice from a liat and other things. */ package ask import "github.com/chzyer/readline" // GetLine gets a line. func GetLine(prompt string) (string, error) { rl, err := readline.New(prompt) if err != nil { return "", err } defer rl.Close() line, err := rl.Readline() return line, err } storage/connection.go +3 −47 Original line number Diff line number Diff line package storage import ( "embed" "errors" "os" "path" "github.com/adrg/xdg" "github.com/golang-migrate/migrate/v4" "github.com/golang-migrate/migrate/v4/source/iofs" "github.com/jmoiron/sqlx" // Included to connect to sqlite. Loading @@ -16,49 +10,11 @@ import ( _ "modernc.org/sqlite" ) //go:embed migrations/*.sql var migrationsFS embed.FS // Store is the store for bulletin. type Store struct { user string db *sqlx.DB } // Open opens the bulletin database. func Open(user string) (*Store, error) { fdir := path.Join(xdg.DataHome, "BULLETIN") err := os.MkdirAll(fdir, 0700) if err != nil { return nil, errors.New("bulletin directory problem") } fdb := path.Join(fdir, "bulletin.db") // Run db migrations if needed. migrations, err := iofs.New(migrationsFS, "migrations") if err != nil { return nil, err } m, err := migrate.NewWithSourceInstance("iofs", migrations, "sqlite://"+fdb+"?_pragma=foreign_keys(1)") if err != nil { return nil, err } err = m.Up() if err != nil && err != migrate.ErrNoChange { return nil, err } m.Close() store := &Store{user: user} store.db, err = sqlx.Connect("sqlite", "file://"+fdb+"?_pragma=foreign_keys(1)") func Open(dbfile string) (*sqlx.DB, error) { db, err := sqlx.Connect("sqlite", "file://"+dbfile+"?_pragma=foreign_keys(1)") if err != nil { return nil, errors.New("bulletin database problem") } return store, nil } // Close closes the db backing the store. func (fstore *Store) Close() { fstore.db.Close() return db, nil } storage/display.go 0 → 100644 +35 −0 Original line number Diff line number Diff line package storage import ( "fmt" "strings" "time" ) // Full renders a message. func (m *Message) Full() string { buf := &strings.Builder{} changed := "*" if m.CreateAt.Compare(m.UpdateAt) == 0 { changed = "" } fmt.Fprintf(buf, "From: \"%s\" %s%s\n", m.Author, m.CreateAt.Format("02-JAN-2006 15:04:05"), changed) fmt.Fprintf(buf, "To: %s\n", m.Folder) fmt.Fprintf(buf, "Subj: %s\n\n", m.Subject) fmt.Fprintf(buf, "%s\n", m.Message) return buf.String() } // Short renders a message. func (m *Message) Short(expire bool) string { var t time.Time if expire { t = m.Expiration } else { t = m.CreateAt } ts := t.Format("2006-05-04 15:02:01") return fmt.Sprintf("%4d %-43s %-12s %-10s\n", m.ID, m.Subject, m.Author, ts) } storage/folders.sql.go +2 −3 Original line number Diff line number Diff line Loading @@ -7,7 +7,6 @@ package storage import ( "context" "database/sql" ) const createFolder = `-- name: CreateFolder :exec Loading Loading @@ -97,7 +96,7 @@ SELECT 1 FROM folders AS f LEFT JOIN owners AS c ON f.name = c.folder type IsFolderAccessParams struct { Name string Owner sql.NullString Owner string } func (q *Queries) IsFolderAccess(ctx context.Context, arg IsFolderAccessParams) (int64, error) { Loading @@ -114,7 +113,7 @@ SELECT 1 FROM folders AS f LEFT JOIN owners AS c ON f.name = c.folder type IsFolderOwnerParams struct { Name string Owner sql.NullString Owner string } func (q *Queries) IsFolderOwner(ctx context.Context, arg IsFolderOwnerParams) (int64, error) { Loading Loading
Makefile 0 → 100644 +7 −0 Original line number Diff line number Diff line .PHONY: all all: go generate ./... # vim:ft=make #
ask/ask.go +13 −0 Original line number Diff line number Diff line Loading @@ -3,3 +3,16 @@ Package ask provides routines to ask questions of users. It handles getting a line of text, getting a choice from a liat and other things. */ package ask import "github.com/chzyer/readline" // GetLine gets a line. func GetLine(prompt string) (string, error) { rl, err := readline.New(prompt) if err != nil { return "", err } defer rl.Close() line, err := rl.Readline() return line, err }
storage/connection.go +3 −47 Original line number Diff line number Diff line package storage import ( "embed" "errors" "os" "path" "github.com/adrg/xdg" "github.com/golang-migrate/migrate/v4" "github.com/golang-migrate/migrate/v4/source/iofs" "github.com/jmoiron/sqlx" // Included to connect to sqlite. Loading @@ -16,49 +10,11 @@ import ( _ "modernc.org/sqlite" ) //go:embed migrations/*.sql var migrationsFS embed.FS // Store is the store for bulletin. type Store struct { user string db *sqlx.DB } // Open opens the bulletin database. func Open(user string) (*Store, error) { fdir := path.Join(xdg.DataHome, "BULLETIN") err := os.MkdirAll(fdir, 0700) if err != nil { return nil, errors.New("bulletin directory problem") } fdb := path.Join(fdir, "bulletin.db") // Run db migrations if needed. migrations, err := iofs.New(migrationsFS, "migrations") if err != nil { return nil, err } m, err := migrate.NewWithSourceInstance("iofs", migrations, "sqlite://"+fdb+"?_pragma=foreign_keys(1)") if err != nil { return nil, err } err = m.Up() if err != nil && err != migrate.ErrNoChange { return nil, err } m.Close() store := &Store{user: user} store.db, err = sqlx.Connect("sqlite", "file://"+fdb+"?_pragma=foreign_keys(1)") func Open(dbfile string) (*sqlx.DB, error) { db, err := sqlx.Connect("sqlite", "file://"+dbfile+"?_pragma=foreign_keys(1)") if err != nil { return nil, errors.New("bulletin database problem") } return store, nil } // Close closes the db backing the store. func (fstore *Store) Close() { fstore.db.Close() return db, nil }
storage/display.go 0 → 100644 +35 −0 Original line number Diff line number Diff line package storage import ( "fmt" "strings" "time" ) // Full renders a message. func (m *Message) Full() string { buf := &strings.Builder{} changed := "*" if m.CreateAt.Compare(m.UpdateAt) == 0 { changed = "" } fmt.Fprintf(buf, "From: \"%s\" %s%s\n", m.Author, m.CreateAt.Format("02-JAN-2006 15:04:05"), changed) fmt.Fprintf(buf, "To: %s\n", m.Folder) fmt.Fprintf(buf, "Subj: %s\n\n", m.Subject) fmt.Fprintf(buf, "%s\n", m.Message) return buf.String() } // Short renders a message. func (m *Message) Short(expire bool) string { var t time.Time if expire { t = m.Expiration } else { t = m.CreateAt } ts := t.Format("2006-05-04 15:02:01") return fmt.Sprintf("%4d %-43s %-12s %-10s\n", m.ID, m.Subject, m.Author, ts) }
storage/folders.sql.go +2 −3 Original line number Diff line number Diff line Loading @@ -7,7 +7,6 @@ package storage import ( "context" "database/sql" ) const createFolder = `-- name: CreateFolder :exec Loading Loading @@ -97,7 +96,7 @@ SELECT 1 FROM folders AS f LEFT JOIN owners AS c ON f.name = c.folder type IsFolderAccessParams struct { Name string Owner sql.NullString Owner string } func (q *Queries) IsFolderAccess(ctx context.Context, arg IsFolderAccessParams) (int64, error) { Loading @@ -114,7 +113,7 @@ SELECT 1 FROM folders AS f LEFT JOIN owners AS c ON f.name = c.folder type IsFolderOwnerParams struct { Name string Owner sql.NullString Owner string } func (q *Queries) IsFolderOwner(ctx context.Context, arg IsFolderOwnerParams) (int64, error) { Loading