Skip to content

Commit

Permalink
feat(category): put rule management inside category
Browse files Browse the repository at this point in the history
  • Loading branch information
ncarlier committed Mar 19, 2020
1 parent db2eff8 commit 9436cbf
Show file tree
Hide file tree
Showing 36 changed files with 341 additions and 1,449 deletions.
5 changes: 5 additions & 0 deletions autogen/db/postgres/db_sql_migration.go
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,10 @@ create table properties (
)
`,
"db_migration_3": `alter table users add column plan varchar not null default 'default';
`,
"db_migration_4": `alter table categories add column rule text;
update categories set rule=rules.rule from rules where rules.category_id = categories.id;
`,
}

Expand All @@ -133,4 +137,5 @@ var DatabaseSQLMigrationChecksums = map[string]string{
"db_migration_1": "6b7ac5c1474bc400c1bbb642fcf3c161f51de7252350eaa261cb1ed796e72b67",
"db_migration_2": "0be0d1ef1e9481d61db425a7d54378f3667c091949525b9c285b18660b6e8a1d",
"db_migration_3": "5cd0d3628d990556c0b85739fd376c42244da7e98b66852b6411d27eda20c3fc",
"db_migration_4": "d5fb83c15b523f15291310ff27d36c099c4ba68de2fd901c5ef5b70a18fedf65",
}
2 changes: 1 addition & 1 deletion pkg/db/category.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import "github.com/ncarlier/readflow/pkg/model"
type CategoryRepository interface {
GetCategoryByID(id uint) (*model.Category, error)
GetCategoryByUserIDAndTitle(uid uint, title string) (*model.Category, error)
GetCategoriesByUserID(uid uint) ([]*model.Category, error)
GetCategoriesByUserID(uid uint) ([]model.Category, error)
CountCategoriesByUserID(uid uint) (uint, error)
CreateOrUpdateCategory(category model.Category) (*model.Category, error)
DeleteCategory(category model.Category) error
Expand Down
1 change: 0 additions & 1 deletion pkg/db/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ type DB interface {
ArticleRepository
APIKeyRepository
ArchiverRepository
RuleRepository
DeviceRepository
PropertiesRepository
}
Expand Down
217 changes: 94 additions & 123 deletions pkg/db/postgres/category.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,59 +3,73 @@ package postgres
import (
"database/sql"
"errors"
"strings"

sq "github.com/Masterminds/squirrel"
"github.com/ncarlier/readflow/pkg/model"
)

func (pg *DB) createCategory(category model.Category) (*model.Category, error) {
row := pg.db.QueryRow(`
INSERT INTO categories
(user_id, title)
VALUES
($1, $2)
RETURNING id, user_id, title, created_at
`,
category.UserID, category.Title,
)
result := model.Category{}
var categoryColumns = []string{
"id",
"user_id",
"title",
"rule",
"created_at",
"updated_at",
}

func mapRowToCategory(row *sql.Row) (*model.Category, error) {
cat := &model.Category{}

err := row.Scan(
&result.ID,
&result.UserID,
&result.Title,
&result.CreatedAt,
&cat.ID,
&cat.UserID,
&cat.Title,
&cat.Rule,
&cat.CreatedAt,
&cat.UpdatedAt,
)
if err != nil {
if err == sql.ErrNoRows {
return nil, nil
} else if err != nil {
return nil, err
}
return &result, nil
return cat, nil
}
func (pg *DB) createCategory(category model.Category) (*model.Category, error) {
query, args, _ := pg.psql.Insert(
"categories",
).Columns(
"user_id", "title", "rule",
).Values(
category.UserID,
category.Title,
category.Rule,
).Suffix(
"RETURNING " + strings.Join(categoryColumns, ","),
).ToSql()
row := pg.db.QueryRow(query, args...)
return mapRowToCategory(row)
}

func (pg *DB) updateCategory(category model.Category) (*model.Category, error) {
row := pg.db.QueryRow(`
UPDATE categories SET
title=$3,
updated_at=NOW()
WHERE id=$1 AND user_id=$2
RETURNING id, user_id, title, created_at, updated_at
`,
category.ID, category.UserID, category.Title,
)

result := model.Category{}

err := row.Scan(
&result.ID,
&result.UserID,
&result.Title,
&result.CreatedAt,
&result.UpdatedAt,
)
if err != nil {
return nil, err
update := map[string]interface{}{
"title": category.Title,
"rule": category.Rule,
"updated_at": "NOW()",
}
return &result, nil
query, args, _ := pg.psql.Update(
"categories",
).SetMap(update).Where(
sq.Eq{"id": category.ID},
).Where(
sq.Eq{"user_id": category.UserID},
).Suffix(
"RETURNING " + strings.Join(categoryColumns, ","),
).ToSql()

row := pg.db.QueryRow(query, args...)
return mapRowToCategory(row)
}

// CreateOrUpdateCategory creates or updates a category into the DB
Expand All @@ -68,101 +82,58 @@ func (pg *DB) CreateOrUpdateCategory(category model.Category) (*model.Category,

// GetCategoryByID returns a category from the DB
func (pg *DB) GetCategoryByID(id uint) (*model.Category, error) {
row := pg.db.QueryRow(`
SELECT
id,
user_id,
title,
created_at,
updated_at
FROM categories
WHERE id = $1`,
id,
)

result := model.Category{}

err := row.Scan(
&result.ID,
&result.UserID,
&result.Title,
&result.CreatedAt,
&result.UpdatedAt,
)

if err == sql.ErrNoRows {
return nil, nil
} else if err != nil {
return nil, err
}
return &result, nil
query, args, _ := pg.psql.Select(categoryColumns...).From(
"categories",
).Where(
sq.Eq{"id": id},
).ToSql()
row := pg.db.QueryRow(query, args...)
return mapRowToCategory(row)
}

// GetCategoryByUserIDAndTitle returns a category of an user form the DB
func (pg *DB) GetCategoryByUserIDAndTitle(userID uint, title string) (*model.Category, error) {
row := pg.db.QueryRow(`
SELECT
id,
user_id,
title,
created_at,
updated_at
FROM categories
WHERE user_id = $1 AND title = $2`,
userID, title,
)

result := model.Category{}

err := row.Scan(
&result.ID,
&result.UserID,
&result.Title,
&result.CreatedAt,
&result.UpdatedAt,
)
func (pg *DB) GetCategoryByUserIDAndTitle(uid uint, title string) (*model.Category, error) {
query, args, _ := pg.psql.Select(categoryColumns...).From(
"categories",
).Where(
sq.Eq{"user_id": uid},
).Where(
sq.Eq{"title": title},
).ToSql()

if err == sql.ErrNoRows {
return nil, nil
} else if err != nil {
return nil, err
}
return &result, nil
row := pg.db.QueryRow(query, args...)
return mapRowToCategory(row)
}

// GetCategoriesByUserID returns categories of an user from DB
func (pg *DB) GetCategoriesByUserID(userID uint) ([]*model.Category, error) {
var result []*model.Category
rows, err := pg.db.Query(`
SELECT
id,
user_id,
title,
created_at,
updated_at
FROM categories
WHERE user_id=$1
ORDER BY title ASC`,
userID,
)
func (pg *DB) GetCategoriesByUserID(uid uint) ([]model.Category, error) {
query, args, _ := pg.psql.Select(categoryColumns...).From(
"categories",
).Where(
sq.Eq{"user_id": uid},
).OrderBy("title ASC").ToSql()
rows, err := pg.db.Query(query, args...)
if err != nil {
return result, err
return nil, err
}
defer rows.Close()

var result []model.Category

for rows.Next() {
category := model.Category{}
cat := model.Category{}
err = rows.Scan(
&category.ID,
&category.UserID,
&category.Title,
&category.CreatedAt,
&category.UpdatedAt,
&cat.ID,
&cat.UserID,
&cat.Title,
&cat.Rule,
&cat.CreatedAt,
&cat.UpdatedAt,
)
if err != nil {
return nil, err
}
result = append(result, &category)
result = append(result, cat)
}
err = rows.Err()
if err != nil {
Expand All @@ -187,12 +158,12 @@ func (pg *DB) CountCategoriesByUserID(uid uint) (uint, error) {

// DeleteCategory removes an category from the DB
func (pg *DB) DeleteCategory(category model.Category) error {
result, err := pg.db.Exec(`
DELETE FROM categories
WHERE id=$1 AND user_id=$2
`,
category.ID, category.UserID,
)
query, args, _ := pg.psql.Delete("categories").Where(
sq.Eq{"id": category.ID},
).Where(
sq.Eq{"user_id": category.UserID},
).ToSql()
result, err := pg.db.Exec(query, args...)
if err != nil {
return err
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/db/postgres/migration.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (
"github.com/rs/zerolog/log"
)

const schemaVersion = 3
const schemaVersion = 4

// Migrate executes database migrations.
func Migrate(db *sql.DB) {
Expand Down
Loading

0 comments on commit 9436cbf

Please sign in to comment.