From f9984d8b89a17124ab72f2d78f255895e89b242d Mon Sep 17 00:00:00 2001 From: Nicolas Duhamel Date: Wed, 27 Apr 2016 20:16:15 +0200 Subject: [PATCH] Add user config --- sql/0001_initial.up.sql | 3 ++- users/handles_test.go | 59 ----------------------------------------- users/users.go | 42 ++++++++++++++++++++++++++--- users/users_test.go | 31 ++++++++++++++++++++++ 4 files changed, 72 insertions(+), 63 deletions(-) delete mode 100644 users/handles_test.go diff --git a/sql/0001_initial.up.sql b/sql/0001_initial.up.sql index a8c4213..20e1578 100644 --- a/sql/0001_initial.up.sql +++ b/sql/0001_initial.up.sql @@ -17,7 +17,8 @@ CREATE TABLE users ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), name text NOT NULL UNIQUE, hash text NOT NULL, - admin boolean, + admin boolean DEFAULT false, + rawconfig json DEFAULT '{}', LIKE base INCLUDING DEFAULTS ); CREATE TRIGGER update_users_updated_at BEFORE UPDATE ON users FOR EACH ROW EXECUTE PROCEDURE update_updated_at_column(); diff --git a/users/handles_test.go b/users/handles_test.go deleted file mode 100644 index 67cabf3..0000000 --- a/users/handles_test.go +++ /dev/null @@ -1,59 +0,0 @@ -package users - -import ( - "io/ioutil" - "net/http" - "net/http/cookiejar" - "net/http/httptest" - "net/url" - "testing" - - "github.com/Sirupsen/logrus" - "github.com/jmoiron/sqlx" - - "gitlab.quimbo.fr/odwrtw/canape-sql/auth" - "gitlab.quimbo.fr/odwrtw/canape-sql/sqly" - "gitlab.quimbo.fr/odwrtw/canape-sql/web" -) - -type UserBackend struct { - db *sqlx.DB -} - -func (b *UserBackend) Get(username string) (auth.User, error) { - return Get(db, username) -} - -func createUserBackend(db *sqlx.DB) *UserBackend { - return &UserBackend{db: db} -} - -func TestLoginSubmit(t *testing.T) { - sqly.RunWithLastestMigration(db, pgdsn, t, func(db *sqlx.DB, t *testing.T) { - backend := createUserBackend(db) - authorizer := auth.New(backend, "peeper", "cookieName", "cookieKey", 10) - e := web.NewEnv(db, authorizer, logrus.NewEntry(logrus.New()), "../templates") - e.Mode = web.TestMode - e.Router.Handle("/login", e.Handler(loginSubmitHandler)).Methods("POST").Name("loginPost") - - ts := httptest.NewServer(e.Router) - defer ts.Close() - - cookieJar, _ := cookiejar.New(nil) - client := &http.Client{ - Jar: cookieJar, - } - - v := url.Values{} - v.Add("username", "plop") - v.Add("password", "ploppwd") - resp, err := client.PostForm(ts.URL+"/login", v) - if err != nil { - t.Fatal(err) - } - str, _ := ioutil.ReadAll(resp.Body) - if string(str) != `{"RouteName":"loginPost","Data":{"FormErrors":{"password":"Invalid username or password"}}}` { - t.Fatalf("Unpected content: %s", string(str)) - } - }) -} diff --git a/users/users.go b/users/users.go index dcca860..135ae34 100644 --- a/users/users.go +++ b/users/users.go @@ -1,9 +1,11 @@ package users import ( + "encoding/json" "fmt" "github.com/jmoiron/sqlx" + "github.com/jmoiron/sqlx/types" "gitlab.quimbo.fr/odwrtw/canape-sql/random" "gitlab.quimbo.fr/odwrtw/canape-sql/sqly" ) @@ -31,9 +33,43 @@ var ErrUnknownUser = fmt.Errorf("users: user does'nt exist") // User represents an user type User struct { sqly.BaseModel - Name string - Hash string - Admin bool + Name string + Hash string + Admin bool + RawConfig types.JSONText +} + +// GetConfig unmarshal json from specified config key into v +func (u *User) GetConfig(key string, v interface{}) error { + var configMap map[string]*json.RawMessage + err := u.RawConfig.Unmarshal(&configMap) + if err != nil { + return err + } + return json.Unmarshal(*configMap[key], v) +} + +// SetConfig marshal v into json for specified config key +func (u *User) SetConfig(key string, v interface{}) error { + var configMap map[string]*json.RawMessage + err := u.RawConfig.Unmarshal(&configMap) + if err != nil { + return err + } + + b, err := json.Marshal(v) + if err != nil { + return err + } + + r := json.RawMessage(b) + configMap[key] = &r + b, err = json.Marshal(configMap) + if err != nil { + return err + } + + return u.RawConfig.UnmarshalJSON(b) } // Token represents a token diff --git a/users/users_test.go b/users/users_test.go index 0076bc6..385c883 100644 --- a/users/users_test.go +++ b/users/users_test.go @@ -193,3 +193,34 @@ func TestAutoUpdateCols(t *testing.T) { } }) } + +func TestConfig(t *testing.T) { + sqly.RunWithLastestMigration(db, pgdsn, t, func(db *sqlx.DB, t *testing.T) { + u := &User{Name: "plop", Hash: "plop"} + u.Add(db) + + u, err := Get(db, "plop") + if err != nil { + t.Fatal(err) + } + type test struct { + Test string + } + te := test{"coucou"} + err = u.SetConfig("test1", te) + if err != nil { + t.Fatal(err) + } + + var te2 test + err = u.GetConfig("test1", &te2) + if err != nil { + t.Fatal(err) + } + + if te != te2 { + t.Fatal("unexpected config") + } + + }) +}