package users import ( "github.com/jmoiron/sqlx" "gitlab.quimbo.fr/odwrtw/canape-sql/random" ) const usersCreate = ` CREATE TABLE users ( id SERIAL PRIMARY KEY, name text NOT NULL UNIQUE ); CREATE TABLE token ( id SERIAL, value text NOT NULL UNIQUE, users_id integer REFERENCES users (id) ON DELETE CASCADE ); ` const ( addUserQuery = `INSERT INTO users (name) VALUES ($1) RETURNING id;` getUserQuery = `SELECT * FROM users WHERE name=$1;` updateUserQuery = `UPDATE users SET (name)=(:name);` deleteUseQuery = `DELETE FROM users WHERE id=:id;` addTokenQuery = `INSERT INTO token (value, users_id) VALUES ($1, $2) RETURNING id;` getTokensQuery = `SELECT id, value FROM token WHERE users_id=$1;` ) // User represents an user type User struct { ID int Name string } type Token struct { ID int Value string } // Get returns user with specified name func Get(q sqlx.Queryer, name string) (*User, error) { u := &User{} err := q.QueryRowx(getUserQuery, name).StructScan(u) if err != nil { return nil, err } return u, nil } // Add user to database or raises an error func (u *User) Add(q sqlx.Queryer) error { var id int err := q.QueryRowx(addUserQuery, u.Name).Scan(&id) if err != nil { return err } u.ID = id return nil } // Update user on database or raise an error func (u *User) Update(ex *sqlx.DB) error { _, err := ex.NamedExec(updateUserQuery, u) if err != nil { return err } return nil } // Delete user from database or raise an error func (u *User) Delete(ex *sqlx.DB) error { _, err := ex.NamedExec(deleteUseQuery, u) if err != nil { return err } return nil } func (u *User) GetTokens(ex *sqlx.DB) ([]*Token, error) { tokens := []*Token{} err := ex.Select(&tokens, getTokensQuery, u.ID) if err != nil { return nil, err } return tokens, nil } func (u *User) NewToken(ex *sqlx.DB) (*Token, error) { t := &Token{ Value: random.String(50), } var id int err := ex.QueryRowx(addTokenQuery, t.Value, u.ID).Scan(&id) if err != nil { return nil, err } t.ID = id return t, nil } func (u *User) CheckToken(ex *sqlx.DB, value string) error { return nil } func (u *User) DeleteToken(ex *sqlx.DB, value string) error { return nil }