mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-11-22 13:25:36 +03:00
Introduced ErrNotValid
This commit is contained in:
parent
cb4690e570
commit
c4f9f8578a
8 changed files with 47 additions and 22 deletions
|
@ -25,7 +25,7 @@ func GetFederationHost(ctx context.Context, ID int64) (*FederationHost, error) {
|
||||||
return nil, fmt.Errorf("FederationInfo record %v does not exist", ID)
|
return nil, fmt.Errorf("FederationInfo record %v does not exist", ID)
|
||||||
}
|
}
|
||||||
if res, err := validation.IsValid(host); !res {
|
if res, err := validation.IsValid(host); !res {
|
||||||
return nil, fmt.Errorf("FederationInfo is not valid: %v", err)
|
return nil, err
|
||||||
}
|
}
|
||||||
return host, nil
|
return host, nil
|
||||||
}
|
}
|
||||||
|
@ -39,14 +39,14 @@ func FindFederationHostByFqdn(ctx context.Context, fqdn string) (*FederationHost
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
if res, err := validation.IsValid(host); !res {
|
if res, err := validation.IsValid(host); !res {
|
||||||
return nil, fmt.Errorf("FederationInfo is not valid: %v", err)
|
return nil, err
|
||||||
}
|
}
|
||||||
return host, nil
|
return host, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func CreateFederationHost(ctx context.Context, host *FederationHost) error {
|
func CreateFederationHost(ctx context.Context, host *FederationHost) error {
|
||||||
if res, err := validation.IsValid(host); !res {
|
if res, err := validation.IsValid(host); !res {
|
||||||
return fmt.Errorf("FederationInfo is not valid: %v", err)
|
return err
|
||||||
}
|
}
|
||||||
_, err := db.GetEngine(ctx).Insert(host)
|
_, err := db.GetEngine(ctx).Insert(host)
|
||||||
return err
|
return err
|
||||||
|
@ -54,7 +54,7 @@ func CreateFederationHost(ctx context.Context, host *FederationHost) error {
|
||||||
|
|
||||||
func UpdateFederationHost(ctx context.Context, host *FederationHost) error {
|
func UpdateFederationHost(ctx context.Context, host *FederationHost) error {
|
||||||
if res, err := validation.IsValid(host); !res {
|
if res, err := validation.IsValid(host); !res {
|
||||||
return fmt.Errorf("FederationInfo is not valid: %v", err)
|
return err
|
||||||
}
|
}
|
||||||
_, err := db.GetEngine(ctx).ID(host.ID).Update(host)
|
_, err := db.GetEngine(ctx).ID(host.ID).Update(host)
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -6,6 +6,7 @@ package forgefed
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"code.gitea.io/gitea/modules/validation"
|
"code.gitea.io/gitea/modules/validation"
|
||||||
|
@ -52,12 +53,14 @@ func Test_NodeInfoWellKnownValidate(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
sut = NodeInfoWellKnown{Href: "./federated-repo.prod.meissa.de/api/v1/nodeinfo"}
|
sut = NodeInfoWellKnown{Href: "./federated-repo.prod.meissa.de/api/v1/nodeinfo"}
|
||||||
if _, err := validation.IsValid(sut); err.Error() != "Href has to be absolute\nValue is not contained in allowed values [http https]" {
|
_, err := validation.IsValid(sut)
|
||||||
|
if !validation.IsErrNotValid(err) && strings.Contains(err.Error(), "Href has to be absolute\nValue is not contained in allowed values [http https]") {
|
||||||
t.Errorf("validation error expected but was: %v\n", err)
|
t.Errorf("validation error expected but was: %v\n", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
sut = NodeInfoWellKnown{Href: "https://federated-repo.prod.meissa.de/api/v1/nodeinfo?alert=1"}
|
sut = NodeInfoWellKnown{Href: "https://federated-repo.prod.meissa.de/api/v1/nodeinfo?alert=1"}
|
||||||
if _, err := validation.IsValid(sut); err.Error() != "Href may not contain query" {
|
_, err = validation.IsValid(sut)
|
||||||
|
if !validation.IsErrNotValid(err) && strings.Contains(err.Error(), "Href has to be absolute\nValue is not contained in allowed values [http https]") {
|
||||||
t.Errorf("sut should be valid, %v, %v", sut, err)
|
t.Errorf("sut should be valid, %v, %v", sut, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,6 @@ package repo
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"code.gitea.io/gitea/models/db"
|
"code.gitea.io/gitea/models/db"
|
||||||
"code.gitea.io/gitea/modules/validation"
|
"code.gitea.io/gitea/modules/validation"
|
||||||
|
@ -26,7 +25,7 @@ func FindFollowingReposByRepoID(ctx context.Context, repoID int64) ([]*Following
|
||||||
}
|
}
|
||||||
for _, followingRepo := range followingRepoList {
|
for _, followingRepo := range followingRepoList {
|
||||||
if res, err := validation.IsValid(*followingRepo); !res {
|
if res, err := validation.IsValid(*followingRepo); !res {
|
||||||
return make([]*FollowingRepo, 0, maxFollowingRepos), fmt.Errorf("FederationInfo is not valid: %v", err)
|
return make([]*FollowingRepo, 0, maxFollowingRepos), err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return followingRepoList, nil
|
return followingRepoList, nil
|
||||||
|
@ -35,7 +34,7 @@ func FindFollowingReposByRepoID(ctx context.Context, repoID int64) ([]*Following
|
||||||
func StoreFollowingRepos(ctx context.Context, localRepoID int64, followingRepoList []*FollowingRepo) error {
|
func StoreFollowingRepos(ctx context.Context, localRepoID int64, followingRepoList []*FollowingRepo) error {
|
||||||
for _, followingRepo := range followingRepoList {
|
for _, followingRepo := range followingRepoList {
|
||||||
if res, err := validation.IsValid(*followingRepo); !res {
|
if res, err := validation.IsValid(*followingRepo); !res {
|
||||||
return fmt.Errorf("FederationInfo is not valid: %v", err)
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ func init() {
|
||||||
|
|
||||||
func CreateFederatedUser(ctx context.Context, user *User, federatedUser *FederatedUser) error {
|
func CreateFederatedUser(ctx context.Context, user *User, federatedUser *FederatedUser) error {
|
||||||
if res, err := validation.IsValid(user); !res {
|
if res, err := validation.IsValid(user); !res {
|
||||||
return fmt.Errorf("User is not valid: %v", err)
|
return err
|
||||||
}
|
}
|
||||||
overwrite := CreateUserOverwriteOptions{
|
overwrite := CreateUserOverwriteOptions{
|
||||||
IsActive: optional.Some(false),
|
IsActive: optional.Some(false),
|
||||||
|
@ -38,7 +38,7 @@ func CreateFederatedUser(ctx context.Context, user *User, federatedUser *Federat
|
||||||
|
|
||||||
federatedUser.UserID = user.ID
|
federatedUser.UserID = user.ID
|
||||||
if res, err := validation.IsValid(federatedUser); !res {
|
if res, err := validation.IsValid(federatedUser); !res {
|
||||||
return fmt.Errorf("FederatedUser is not valid: %v", err)
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = db.GetEngine(ctx).Insert(federatedUser)
|
_, err = db.GetEngine(ctx).Insert(federatedUser)
|
||||||
|
@ -69,10 +69,10 @@ func FindFederatedUser(ctx context.Context, externalID string,
|
||||||
}
|
}
|
||||||
|
|
||||||
if res, err := validation.IsValid(*user); !res {
|
if res, err := validation.IsValid(*user); !res {
|
||||||
return nil, nil, fmt.Errorf("FederatedUser is not valid: %v", err)
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
if res, err := validation.IsValid(*federatedUser); !res {
|
if res, err := validation.IsValid(*federatedUser); !res {
|
||||||
return nil, nil, fmt.Errorf("FederatedUser is not valid: %v", err)
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
return user, federatedUser, nil
|
return user, federatedUser, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,8 +32,8 @@ func NewActorID(uri string) (ActorID, error) {
|
||||||
return ActorID{}, err
|
return ActorID{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if valid, outcome := validation.IsValid(result); !valid {
|
if valid, err := validation.IsValid(result); !valid {
|
||||||
return ActorID{}, outcome
|
return ActorID{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return result, nil
|
return result, nil
|
||||||
|
@ -83,8 +83,8 @@ func NewPersonID(uri, source string) (PersonID, error) {
|
||||||
|
|
||||||
// validate Person specific path
|
// validate Person specific path
|
||||||
personID := PersonID{result}
|
personID := PersonID{result}
|
||||||
if valid, outcome := validation.IsValid(personID); !valid {
|
if valid, err := validation.IsValid(personID); !valid {
|
||||||
return PersonID{}, outcome
|
return PersonID{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return personID, nil
|
return personID, nil
|
||||||
|
@ -137,8 +137,8 @@ func NewRepositoryID(uri, source string) (RepositoryID, error) {
|
||||||
|
|
||||||
// validate Person specific path
|
// validate Person specific path
|
||||||
repoID := RepositoryID{result}
|
repoID := RepositoryID{result}
|
||||||
if valid, outcome := validation.IsValid(repoID); !valid {
|
if valid, err := validation.IsValid(repoID); !valid {
|
||||||
return RepositoryID{}, outcome
|
return RepositoryID{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return repoID, nil
|
return repoID, nil
|
||||||
|
|
|
@ -92,7 +92,9 @@ func TestPersonIdValidation(t *testing.T) {
|
||||||
sut.Host = "an.other.host"
|
sut.Host = "an.other.host"
|
||||||
sut.Port = ""
|
sut.Port = ""
|
||||||
sut.UnvalidatedInput = "https://an.other.host/path/1"
|
sut.UnvalidatedInput = "https://an.other.host/path/1"
|
||||||
if _, err := validation.IsValid(sut); err.Error() != "path: \"path\" has to be a person specific api path" {
|
|
||||||
|
_, err := validation.IsValid(sut)
|
||||||
|
if validation.IsErrNotValid(err) && strings.Contains(err.Error(), "path: \"path\" has to be a person specific api path\n") {
|
||||||
t.Errorf("validation error expected but was: %v\n", err)
|
t.Errorf("validation error expected but was: %v\n", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,20 +6,37 @@ package validation
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
|
|
||||||
"code.gitea.io/gitea/modules/timeutil"
|
"code.gitea.io/gitea/modules/timeutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// ErrNotValid represents an validation error
|
||||||
|
type ErrNotValid struct {
|
||||||
|
Message string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (err ErrNotValid) Error() string {
|
||||||
|
return fmt.Sprintf("Validation Error: %v", err.Message)
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsErrNotValid checks if an error is a ErrNotValid.
|
||||||
|
func IsErrNotValid(err error) bool {
|
||||||
|
_, ok := err.(ErrNotValid)
|
||||||
|
return ok
|
||||||
|
}
|
||||||
|
|
||||||
type Validateable interface {
|
type Validateable interface {
|
||||||
Validate() []string
|
Validate() []string
|
||||||
}
|
}
|
||||||
|
|
||||||
func IsValid(v Validateable) (bool, error) {
|
func IsValid(v Validateable) (bool, error) {
|
||||||
if err := v.Validate(); len(err) > 0 {
|
if err := v.Validate(); len(err) > 0 {
|
||||||
|
typeof := reflect.TypeOf(v)
|
||||||
errString := strings.Join(err, "\n")
|
errString := strings.Join(err, "\n")
|
||||||
return false, fmt.Errorf(errString)
|
return false, ErrNotValid{fmt.Sprint(typeof, ": ", errString)}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true, nil
|
return true, nil
|
||||||
|
|
|
@ -26,9 +26,13 @@ func Test_IsValid(t *testing.T) {
|
||||||
t.Errorf("sut expected to be valid: %v\n", sut.Validate())
|
t.Errorf("sut expected to be valid: %v\n", sut.Validate())
|
||||||
}
|
}
|
||||||
sut = Sut{valid: false}
|
sut = Sut{valid: false}
|
||||||
if res, _ := IsValid(sut); res {
|
res, err := IsValid(sut)
|
||||||
|
if res {
|
||||||
t.Errorf("sut expected to be invalid: %v\n", sut.Validate())
|
t.Errorf("sut expected to be invalid: %v\n", sut.Validate())
|
||||||
}
|
}
|
||||||
|
if err == nil || !IsErrNotValid(err) || err.Error() != "Validation Error: validation.Sut: invalid" {
|
||||||
|
t.Errorf("validation error expected, but was %v", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func Test_ValidateNotEmpty_ForString(t *testing.T) {
|
func Test_ValidateNotEmpty_ForString(t *testing.T) {
|
||||||
|
|
Loading…
Reference in a new issue