Merge pull request #30 from christianselig/chore/validations

Add validations
This commit is contained in:
André Medeiros 2021-10-12 12:05:44 -04:00 committed by GitHub
commit 84c03669f1
10 changed files with 63 additions and 3 deletions

1
go.mod
View file

@ -10,6 +10,7 @@ require (
github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect
github.com/dustin/go-humanize v1.0.0 github.com/dustin/go-humanize v1.0.0
github.com/go-co-op/gocron v1.9.0 github.com/go-co-op/gocron v1.9.0
github.com/go-ozzo/ozzo-validation/v4 v4.3.0
github.com/go-redis/redis/v8 v8.11.4 github.com/go-redis/redis/v8 v8.11.4
github.com/gorilla/mux v1.8.0 github.com/gorilla/mux v1.8.0
github.com/heroku/x v0.0.32 github.com/heroku/x v0.0.32

4
go.sum
View file

@ -55,6 +55,8 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
github.com/armon/go-proxyproto v0.0.0-20190211145416-68259f75880e/go.mod h1:QmP9hvJ91BbJmGVGSbutW19IC0Q9phDCLGaomwTJbgU= github.com/armon/go-proxyproto v0.0.0-20190211145416-68259f75880e/go.mod h1:QmP9hvJ91BbJmGVGSbutW19IC0Q9phDCLGaomwTJbgU=
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496 h1:zV3ejI06GQ59hwDQAvmK1qxOQGB3WuVTRoY0okPTAv0=
github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg=
github.com/aws/aws-sdk-go v1.13.10/go.mod h1:ZRmQr0FajVIyZ4ZzBYKG5P3ZqPz9IHG41ZoMu1ADI3k= github.com/aws/aws-sdk-go v1.13.10/go.mod h1:ZRmQr0FajVIyZ4ZzBYKG5P3ZqPz9IHG41ZoMu1ADI3k=
github.com/axiomhq/hyperloglog v0.0.0-20180317131949-fe9507de0228/go.mod h1:IOXAcuKIFq/mDyuQ4wyJuJ79XLMsmLM+5RdQ+vWrL7o= github.com/axiomhq/hyperloglog v0.0.0-20180317131949-fe9507de0228/go.mod h1:IOXAcuKIFq/mDyuQ4wyJuJ79XLMsmLM+5RdQ+vWrL7o=
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
@ -120,6 +122,8 @@ github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vb
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
github.com/go-ozzo/ozzo-validation/v4 v4.3.0 h1:byhDUpfEwjsVQb1vBunvIjh2BHQ9ead57VkAEY4V+Es=
github.com/go-ozzo/ozzo-validation/v4 v4.3.0/go.mod h1:2NKgrcHl3z6cJs+3Oo940FPRiTzuqKbvfrL2RxCj6Ew=
github.com/go-redis/redis/v8 v8.3.2/go.mod h1:jszGxBCez8QA1HWSmQxJO9Y82kNibbUmeYhKWrBejTU= github.com/go-redis/redis/v8 v8.3.2/go.mod h1:jszGxBCez8QA1HWSmQxJO9Y82kNibbUmeYhKWrBejTU=
github.com/go-redis/redis/v8 v8.11.4 h1:kHoYkfZP6+pe04aFTnhDH6GDROa5yJdHJVNxV3F46Tg= github.com/go-redis/redis/v8 v8.11.4 h1:kHoYkfZP6+pe04aFTnhDH6GDROa5yJdHJVNxV3F46Tg=
github.com/go-redis/redis/v8 v8.11.4/go.mod h1:2Z2wHZXdQpCDXEGzqMockDpNyYvi2l4Pxt6RJr792+w= github.com/go-redis/redis/v8 v8.11.4/go.mod h1:2Z2wHZXdQpCDXEGzqMockDpNyYvi2l4Pxt6RJr792+w=

View file

@ -35,7 +35,8 @@ func WorkerCmd(ctx context.Context) *cobra.Command {
logger := cmdutil.NewLogrusLogger(false) logger := cmdutil.NewLogrusLogger(false)
statsd, err := cmdutil.NewStatsdClient() tag := fmt.Sprintf("worker:%s", queueID)
statsd, err := cmdutil.NewStatsdClient(tag)
if err != nil { if err != nil {
return err return err
} }

View file

@ -3,6 +3,8 @@ package domain
import ( import (
"context" "context"
"strings" "strings"
validation "github.com/go-ozzo/ozzo-validation/v4"
) )
// Account represents an account we need to periodically check in the notifications worker. // Account represents an account we need to periodically check in the notifications worker.
@ -25,6 +27,13 @@ func (acct *Account) NormalizedUsername() string {
return strings.ToLower(acct.Username) return strings.ToLower(acct.Username)
} }
func (acct *Account) Validate() error {
return validation.ValidateStruct(acct,
validation.Field(&acct.Username, validation.Required, validation.Length(3, 32)),
validation.Field(&acct.AccountID, validation.Required, validation.Length(5, 7)),
)
}
// AccountRepository represents the account's repository contract // AccountRepository represents the account's repository contract
type AccountRepository interface { type AccountRepository interface {
GetByID(ctx context.Context, id int64) (Account, error) GetByID(ctx context.Context, id int64) (Account, error)

View file

@ -1,6 +1,10 @@
package domain package domain
import "context" import (
"context"
validation "github.com/go-ozzo/ozzo-validation/v4"
)
const ( const (
DeviceGracePeriodDuration = 3600 // 1 hour DeviceGracePeriodDuration = 3600 // 1 hour
@ -14,6 +18,12 @@ type Device struct {
ActiveUntil int64 ActiveUntil int64
} }
func (dev *Device) Validate() error {
return validation.ValidateStruct(dev,
validation.Field(&dev.APNSToken, validation.Required, validation.Length(64, 200)),
)
}
type DeviceRepository interface { type DeviceRepository interface {
GetByID(ctx context.Context, id int64) (Device, error) GetByID(ctx context.Context, id int64) (Device, error)
GetByAPNSToken(ctx context.Context, token string) (Device, error) GetByAPNSToken(ctx context.Context, token string) (Device, error)

View file

@ -3,6 +3,8 @@ package domain
import ( import (
"context" "context"
"strings" "strings"
validation "github.com/go-ozzo/ozzo-validation/v4"
) )
type Subreddit struct { type Subreddit struct {
@ -18,6 +20,13 @@ func (sr *Subreddit) NormalizedName() string {
return strings.ToLower(sr.Name) return strings.ToLower(sr.Name)
} }
func (sr *Subreddit) Validate() error {
return validation.ValidateStruct(sr,
validation.Field(&sr.Name, validation.Required, validation.Length(3, 32)),
validation.Field(&sr.SubredditID, validation.Required, validation.Length(5, 7)),
)
}
type SubredditRepository interface { type SubredditRepository interface {
GetByID(ctx context.Context, id int64) (Subreddit, error) GetByID(ctx context.Context, id int64) (Subreddit, error)
GetByName(ctx context.Context, name string) (Subreddit, error) GetByName(ctx context.Context, name string) (Subreddit, error)

View file

@ -3,6 +3,8 @@ package domain
import ( import (
"context" "context"
"strings" "strings"
validation "github.com/go-ozzo/ozzo-validation/v4"
) )
type User struct { type User struct {
@ -18,6 +20,13 @@ func (u *User) NormalizedName() string {
return strings.ToLower(u.Name) return strings.ToLower(u.Name)
} }
func (u *User) Validate() error {
return validation.ValidateStruct(u,
validation.Field(&u.Name, validation.Required, validation.Length(3, 32)),
validation.Field(&u.UserID, validation.Required, validation.Length(5, 7)),
)
}
type UserRepository interface { type UserRepository interface {
GetByID(context.Context, int64) (User, error) GetByID(context.Context, int64) (User, error)
GetByName(context.Context, string) (User, error) GetByName(context.Context, string) (User, error)

View file

@ -102,6 +102,10 @@ func (p *postgresDeviceRepository) CreateOrUpdate(ctx context.Context, dev *doma
} }
func (p *postgresDeviceRepository) Create(ctx context.Context, dev *domain.Device) error { func (p *postgresDeviceRepository) Create(ctx context.Context, dev *domain.Device) error {
if err := dev.Validate(); err != nil {
return err
}
query := ` query := `
INSERT INTO devices INSERT INTO devices
(apns_token, sandbox, active_until) (apns_token, sandbox, active_until)
@ -118,6 +122,10 @@ func (p *postgresDeviceRepository) Create(ctx context.Context, dev *domain.Devic
} }
func (p *postgresDeviceRepository) Update(ctx context.Context, dev *domain.Device) error { func (p *postgresDeviceRepository) Update(ctx context.Context, dev *domain.Device) error {
if err := dev.Validate(); err != nil {
return err
}
query := ` query := `
UPDATE devices UPDATE devices
SET active_until = $2 SET active_until = $2

View file

@ -76,6 +76,10 @@ func (p *postgresSubredditRepository) GetByName(ctx context.Context, name string
} }
func (p *postgresSubredditRepository) CreateOrUpdate(ctx context.Context, sr *domain.Subreddit) error { func (p *postgresSubredditRepository) CreateOrUpdate(ctx context.Context, sr *domain.Subreddit) error {
if err := sr.Validate(); err != nil {
return err
}
query := ` query := `
INSERT INTO subreddits (subreddit_id, name) INSERT INTO subreddits (subreddit_id, name)
VALUES ($1, $2) VALUES ($1, $2)

View file

@ -5,8 +5,9 @@ import (
"fmt" "fmt"
"strings" "strings"
"github.com/christianselig/apollo-backend/internal/domain"
"github.com/jackc/pgx/v4/pgxpool" "github.com/jackc/pgx/v4/pgxpool"
"github.com/christianselig/apollo-backend/internal/domain"
) )
type postgresUserRepository struct { type postgresUserRepository struct {
@ -77,6 +78,10 @@ func (p *postgresUserRepository) GetByName(ctx context.Context, name string) (do
} }
func (p *postgresUserRepository) CreateOrUpdate(ctx context.Context, u *domain.User) error { func (p *postgresUserRepository) CreateOrUpdate(ctx context.Context, u *domain.User) error {
if err := u.Validate(); err != nil {
return err
}
query := ` query := `
INSERT INTO users (user_id, name) INSERT INTO users (user_id, name)
VALUES ($1, $2) VALUES ($1, $2)