Add format column to post tables

main
Brian Picciano 1 year ago
parent 4878495914
commit e7b5b55f67
  1. 12
      src/post/draft_post.go
  2. 1
      src/post/draft_post_test.go
  3. 44
      src/post/format.go
  4. 15
      src/post/post.go
  5. 10
      src/post/post_test.go
  6. 7
      src/post/sql.go

@ -49,22 +49,24 @@ func (s *draftStore) Set(post Post) error {
_, err = s.db.db.Exec(
`INSERT INTO post_drafts (
id, title, description, tags, series, body
id, title, description, tags, series, body, format
)
VALUES
(?, ?, ?, ?, ?, ?)
(?, ?, ?, ?, ?, ?, ?)
ON CONFLICT (id) DO UPDATE SET
title=excluded.title,
description=excluded.description,
tags=excluded.tags,
series=excluded.series,
body=excluded.body`,
body=excluded.body,
format=excluded.format`,
post.ID,
post.Title,
&sql.NullString{String: post.Description, Valid: len(post.Description) > 0},
&sql.NullString{String: string(tagsJSON), Valid: len(post.Tags) > 0},
&sql.NullString{String: post.Series, Valid: post.Series != ""},
post.Body,
post.Format,
)
if err != nil {
@ -86,7 +88,7 @@ func (s *draftStore) get(
query := `
SELECT
p.id, p.title, p.description, p.tags, p.series, p.body
p.id, p.title, p.description, p.tags, p.series, p.body, p.format
FROM post_drafts p
` + where + `
ORDER BY p.id ASC`
@ -118,7 +120,7 @@ func (s *draftStore) get(
err := rows.Scan(
&post.ID, &post.Title, &description, &tags, &series,
&post.Body,
&post.Body, &post.Format,
)
if err != nil {

@ -72,6 +72,7 @@ func TestDraftStore(t *testing.T) {
post.Series = "whatever"
post.Body = "anything"
post.Tags = []string{"bar", "baz"}
post.Format = FormatGemtext
err = h.store.Set(post)
assert.NoError(t, err)

@ -0,0 +1,44 @@
package post
import "errors"
// ErrFormatStringMalformed indicates that a string could not be converted to a
// Format.
var ErrFormatStringMalformed = errors.New("format string malformed")
// Format describes the format of the body of a Post.
type Format string
// Enumeration of possible formats.
const (
FormatMarkdown Format = "md"
FormatGemtext Format = "gmi"
)
// Formats slice of all possible Formats.
var Formats = []Format{
FormatMarkdown,
FormatGemtext,
}
var strsToFormats = func() map[string]Format {
m := map[string]Format{}
for _, f := range Formats {
m[string(f)] = f
}
return m
}()
// FormatFromString parses a string into a Format, or returns
// ErrFormatStringMalformed.
func FormatFromString(str string) (Format, error) {
if f, ok := strsToFormats[str]; ok {
return f, nil
}
return "", ErrFormatStringMalformed
}

@ -34,6 +34,7 @@ type Post struct {
Tags []string // only alphanumeric supported
Series string
Body string
Format Format
}
// StoredPost is a Post which has been stored in a Store, and has been given
@ -103,22 +104,24 @@ func (s *store) Set(post Post, now time.Time) (bool, error) {
_, err := tx.Exec(
`INSERT INTO posts (
id, title, description, series, published_at, body
id, title, description, series, published_at, body, format
)
VALUES
(?, ?, ?, ?, ?, ?)
(?, ?, ?, ?, ?, ?, ?)
ON CONFLICT (id) DO UPDATE SET
title=excluded.title,
description=excluded.description,
series=excluded.series,
last_updated_at=?,
body=excluded.body`,
body=excluded.body,
format=excluded.format`,
post.ID,
post.Title,
&sql.NullString{String: post.Description, Valid: len(post.Description) > 0},
&sql.NullString{String: post.Series, Valid: post.Series != ""},
nowSQL,
post.Body,
post.Format,
nowSQL,
)
@ -174,8 +177,7 @@ func (s *store) get(
query := `
SELECT
p.id, p.title, p.description, p.series, GROUP_CONCAT(pt.tag),
p.published_at, p.last_updated_at,
p.body
p.published_at, p.last_updated_at, p.body, p.format
FROM posts p
LEFT JOIN post_tags pt ON (p.id = pt.post_id)
` + where + `
@ -208,8 +210,7 @@ func (s *store) get(
err := rows.Scan(
&post.ID, &post.Title, &description, &series, &tag,
&publishedAt, &lastUpdatedAt,
&post.Body,
&publishedAt, &lastUpdatedAt, &post.Body, &post.Format,
)
if err != nil {

@ -37,9 +37,10 @@ func TestNewID(t *testing.T) {
func testPost(i int) Post {
istr := strconv.Itoa(i)
return Post{
ID: istr,
Title: istr,
Body: istr,
ID: istr,
Title: istr,
Body: istr,
Format: FormatMarkdown,
}
}
@ -108,7 +109,7 @@ func TestStore(t *testing.T) {
post.Tags = []string{"foo", "bar"}
first, err := h.store.Set(post, now)
assert.NoError(t, err)
assert.NoError(t, err, "post:%+v", post)
assert.True(t, first)
gotPost, err := h.store.GetByID(post.ID)
@ -130,6 +131,7 @@ func TestStore(t *testing.T) {
post.Series = "whatever"
post.Body = "anything"
post.Tags = []string{"bar", "baz"}
post.Format = FormatGemtext
first, err = h.store.Set(post, newNow)
assert.NoError(t, err)

@ -66,6 +66,13 @@ var migrations = &migrate.MemoryMigrationSource{Migrations: []*migrate.Migration
`ALTER TABLE posts DROP COLUMN description_old`,
},
},
{
Id: "4",
Up: []string{
`ALTER TABLE post_drafts ADD COLUMN format TEXT DEFAULT 'md'`,
`ALTER TABLE posts ADD COLUMN format TEXT DEFAULT 'md'`,
},
},
}}
// SQLDB is a sqlite3 database which can be used by storage interfaces within

Loading…
Cancel
Save