chore: add description field to user

pull/3099/head
Steven 1 year ago
parent 7c1510e7a9
commit 8fe6874b1b

@ -51,11 +51,9 @@ func checkDataDir(dataDir string) (string, error) {
// Trim trailing \ or / in case user supplies // Trim trailing \ or / in case user supplies
dataDir = strings.TrimRight(dataDir, "\\/") dataDir = strings.TrimRight(dataDir, "\\/")
if _, err := os.Stat(dataDir); err != nil { if _, err := os.Stat(dataDir); err != nil {
return "", errors.Wrapf(err, "unable to access data folder %s", dataDir) return "", errors.Wrapf(err, "unable to access data folder %s", dataDir)
} }
return dataDir, nil return dataDir, nil
} }

@ -22,7 +22,8 @@ CREATE TABLE `user` (
`email` VARCHAR(256) NOT NULL DEFAULT '', `email` VARCHAR(256) NOT NULL DEFAULT '',
`nickname` VARCHAR(256) NOT NULL DEFAULT '', `nickname` VARCHAR(256) NOT NULL DEFAULT '',
`password_hash` VARCHAR(256) NOT NULL, `password_hash` VARCHAR(256) NOT NULL,
`avatar_url` LONGTEXT NOT NULL `avatar_url` LONGTEXT NOT NULL,
`description` VARCHAR(256) NOT NULL DEFAULT ''
); );
-- user_setting -- user_setting

@ -60,6 +60,9 @@ func (d *DB) UpdateUser(ctx context.Context, update *store.UpdateUser) (*store.U
if v := update.PasswordHash; v != nil { if v := update.PasswordHash; v != nil {
set, args = append(set, "`password_hash` = ?"), append(args, *v) set, args = append(set, "`password_hash` = ?"), append(args, *v)
} }
if v := update.Description; v != nil {
set, args = append(set, "`description` = ?"), append(args, *v)
}
args = append(args, update.ID) args = append(args, update.ID)
query := "UPDATE `user` SET " + strings.Join(set, ", ") + " WHERE `id` = ?" query := "UPDATE `user` SET " + strings.Join(set, ", ") + " WHERE `id` = ?"
@ -93,7 +96,7 @@ func (d *DB) ListUsers(ctx context.Context, find *store.FindUser) ([]*store.User
where, args = append(where, "`nickname` = ?"), append(args, *v) where, args = append(where, "`nickname` = ?"), append(args, *v)
} }
query := "SELECT `id`, `username`, `role`, `email`, `nickname`, `password_hash`, `avatar_url`, UNIX_TIMESTAMP(`created_ts`), UNIX_TIMESTAMP(`updated_ts`), `row_status` FROM `user` WHERE " + strings.Join(where, " AND ") + " ORDER BY `created_ts` DESC, `row_status` DESC" query := "SELECT `id`, `username`, `role`, `email`, `nickname`, `password_hash`, `avatar_url`, `description`, UNIX_TIMESTAMP(`created_ts`), UNIX_TIMESTAMP(`updated_ts`), `row_status` FROM `user` WHERE " + strings.Join(where, " AND ") + " ORDER BY `created_ts` DESC, `row_status` DESC"
rows, err := d.db.QueryContext(ctx, query, args...) rows, err := d.db.QueryContext(ctx, query, args...)
if err != nil { if err != nil {
return nil, err return nil, err
@ -111,6 +114,7 @@ func (d *DB) ListUsers(ctx context.Context, find *store.FindUser) ([]*store.User
&user.Nickname, &user.Nickname,
&user.PasswordHash, &user.PasswordHash,
&user.AvatarURL, &user.AvatarURL,
&user.Description,
&user.CreatedTs, &user.CreatedTs,
&user.UpdatedTs, &user.UpdatedTs,
&user.RowStatus, &user.RowStatus,

@ -22,7 +22,8 @@ CREATE TABLE "user" (
email TEXT NOT NULL DEFAULT '', email TEXT NOT NULL DEFAULT '',
nickname TEXT NOT NULL DEFAULT '', nickname TEXT NOT NULL DEFAULT '',
password_hash TEXT NOT NULL, password_hash TEXT NOT NULL,
avatar_url TEXT NOT NULL avatar_url TEXT NOT NULL,
description TEXT NOT NULL DEFAULT ''
); );
-- user_setting -- user_setting

@ -10,10 +10,11 @@ import (
func (d *DB) CreateUser(ctx context.Context, create *store.User) (*store.User, error) { func (d *DB) CreateUser(ctx context.Context, create *store.User) (*store.User, error) {
fields := []string{"username", "role", "email", "nickname", "password_hash", "avatar_url"} fields := []string{"username", "role", "email", "nickname", "password_hash", "avatar_url"}
args := []any{create.Username, create.Role, create.Email, create.Nickname, create.PasswordHash, create.AvatarURL} args := []any{create.Username, create.Role, create.Email, create.Nickname, create.PasswordHash, create.AvatarURL}
stmt := "INSERT INTO \"user\" (" + strings.Join(fields, ", ") + ") VALUES (" + placeholders(len(args)) + ") RETURNING id, avatar_url, created_ts, updated_ts, row_status" stmt := "INSERT INTO \"user\" (" + strings.Join(fields, ", ") + ") VALUES (" + placeholders(len(args)) + ") RETURNING id, avatar_url, description, created_ts, updated_ts, row_status"
if err := d.db.QueryRowContext(ctx, stmt, args...).Scan( if err := d.db.QueryRowContext(ctx, stmt, args...).Scan(
&create.ID, &create.ID,
&create.AvatarURL, &create.AvatarURL,
&create.Description,
&create.CreatedTs, &create.CreatedTs,
&create.UpdatedTs, &create.UpdatedTs,
&create.RowStatus, &create.RowStatus,
@ -47,12 +48,15 @@ func (d *DB) UpdateUser(ctx context.Context, update *store.UpdateUser) (*store.U
if v := update.PasswordHash; v != nil { if v := update.PasswordHash; v != nil {
set, args = append(set, "password_hash = "+placeholder(len(args)+1)), append(args, *v) set, args = append(set, "password_hash = "+placeholder(len(args)+1)), append(args, *v)
} }
if v := update.Description; v != nil {
set, args = append(set, "description = "+placeholder(len(args)+1)), append(args, *v)
}
query := ` query := `
UPDATE "user" UPDATE "user"
SET ` + strings.Join(set, ", ") + ` SET ` + strings.Join(set, ", ") + `
WHERE id = ` + placeholder(len(args)+1) + ` WHERE id = ` + placeholder(len(args)+1) + `
RETURNING id, username, role, email, nickname, password_hash, avatar_url, created_ts, updated_ts, row_status RETURNING id, username, role, email, nickname, password_hash, avatar_url, description, created_ts, updated_ts, row_status
` `
args = append(args, update.ID) args = append(args, update.ID)
user := &store.User{} user := &store.User{}
@ -64,6 +68,7 @@ func (d *DB) UpdateUser(ctx context.Context, update *store.UpdateUser) (*store.U
&user.Nickname, &user.Nickname,
&user.PasswordHash, &user.PasswordHash,
&user.AvatarURL, &user.AvatarURL,
&user.Description,
&user.CreatedTs, &user.CreatedTs,
&user.UpdatedTs, &user.UpdatedTs,
&user.RowStatus, &user.RowStatus,
@ -102,6 +107,7 @@ func (d *DB) ListUsers(ctx context.Context, find *store.FindUser) ([]*store.User
nickname, nickname,
password_hash, password_hash,
avatar_url, avatar_url,
description,
created_ts, created_ts,
updated_ts, updated_ts,
row_status row_status
@ -126,6 +132,7 @@ func (d *DB) ListUsers(ctx context.Context, find *store.FindUser) ([]*store.User
&user.Nickname, &user.Nickname,
&user.PasswordHash, &user.PasswordHash,
&user.AvatarURL, &user.AvatarURL,
&user.Description,
&user.CreatedTs, &user.CreatedTs,
&user.UpdatedTs, &user.UpdatedTs,
&user.RowStatus, &user.RowStatus,
@ -143,9 +150,7 @@ func (d *DB) ListUsers(ctx context.Context, find *store.FindUser) ([]*store.User
} }
func (d *DB) DeleteUser(ctx context.Context, delete *store.DeleteUser) error { func (d *DB) DeleteUser(ctx context.Context, delete *store.DeleteUser) error {
result, err := d.db.ExecContext(ctx, ` result, err := d.db.ExecContext(ctx, `DELETE FROM "user" WHERE id = $1`, delete.ID)
DELETE FROM "user" WHERE id = $1
`, delete.ID)
if err != nil { if err != nil {
return err return err
} }

@ -23,7 +23,8 @@ CREATE TABLE user (
email TEXT NOT NULL DEFAULT '', email TEXT NOT NULL DEFAULT '',
nickname TEXT NOT NULL DEFAULT '', nickname TEXT NOT NULL DEFAULT '',
password_hash TEXT NOT NULL, password_hash TEXT NOT NULL,
avatar_url TEXT NOT NULL DEFAULT '' avatar_url TEXT NOT NULL DEFAULT '',
description TEXT NOT NULL DEFAULT ''
); );
CREATE INDEX idx_user_username ON user (username); CREATE INDEX idx_user_username ON user (username);

@ -11,10 +11,11 @@ func (d *DB) CreateUser(ctx context.Context, create *store.User) (*store.User, e
fields := []string{"`username`", "`role`", "`email`", "`nickname`", "`password_hash`"} fields := []string{"`username`", "`role`", "`email`", "`nickname`", "`password_hash`"}
placeholder := []string{"?", "?", "?", "?", "?"} placeholder := []string{"?", "?", "?", "?", "?"}
args := []any{create.Username, create.Role, create.Email, create.Nickname, create.PasswordHash} args := []any{create.Username, create.Role, create.Email, create.Nickname, create.PasswordHash}
stmt := "INSERT INTO user (" + strings.Join(fields, ", ") + ") VALUES (" + strings.Join(placeholder, ", ") + ") RETURNING id, avatar_url, created_ts, updated_ts, row_status" stmt := "INSERT INTO user (" + strings.Join(fields, ", ") + ") VALUES (" + strings.Join(placeholder, ", ") + ") RETURNING id, avatar_url, description, created_ts, updated_ts, row_status"
if err := d.db.QueryRowContext(ctx, stmt, args...).Scan( if err := d.db.QueryRowContext(ctx, stmt, args...).Scan(
&create.ID, &create.ID,
&create.AvatarURL, &create.AvatarURL,
&create.Description,
&create.CreatedTs, &create.CreatedTs,
&create.UpdatedTs, &create.UpdatedTs,
&create.RowStatus, &create.RowStatus,
@ -48,13 +49,16 @@ func (d *DB) UpdateUser(ctx context.Context, update *store.UpdateUser) (*store.U
if v := update.PasswordHash; v != nil { if v := update.PasswordHash; v != nil {
set, args = append(set, "password_hash = ?"), append(args, *v) set, args = append(set, "password_hash = ?"), append(args, *v)
} }
if v := update.Description; v != nil {
set, args = append(set, "description = ?"), append(args, *v)
}
args = append(args, update.ID) args = append(args, update.ID)
query := ` query := `
UPDATE user UPDATE user
SET ` + strings.Join(set, ", ") + ` SET ` + strings.Join(set, ", ") + `
WHERE id = ? WHERE id = ?
RETURNING id, username, role, email, nickname, password_hash, avatar_url, created_ts, updated_ts, row_status RETURNING id, username, role, email, nickname, password_hash, avatar_url, description, created_ts, updated_ts, row_status
` `
user := &store.User{} user := &store.User{}
if err := d.db.QueryRowContext(ctx, query, args...).Scan( if err := d.db.QueryRowContext(ctx, query, args...).Scan(
@ -65,6 +69,7 @@ func (d *DB) UpdateUser(ctx context.Context, update *store.UpdateUser) (*store.U
&user.Nickname, &user.Nickname,
&user.PasswordHash, &user.PasswordHash,
&user.AvatarURL, &user.AvatarURL,
&user.Description,
&user.CreatedTs, &user.CreatedTs,
&user.UpdatedTs, &user.UpdatedTs,
&user.RowStatus, &user.RowStatus,
@ -103,6 +108,7 @@ func (d *DB) ListUsers(ctx context.Context, find *store.FindUser) ([]*store.User
nickname, nickname,
password_hash, password_hash,
avatar_url, avatar_url,
description,
created_ts, created_ts,
updated_ts, updated_ts,
row_status row_status
@ -127,6 +133,7 @@ func (d *DB) ListUsers(ctx context.Context, find *store.FindUser) ([]*store.User
&user.Nickname, &user.Nickname,
&user.PasswordHash, &user.PasswordHash,
&user.AvatarURL, &user.AvatarURL,
&user.Description,
&user.CreatedTs, &user.CreatedTs,
&user.UpdatedTs, &user.UpdatedTs,
&user.RowStatus, &user.RowStatus,

@ -57,6 +57,7 @@ type User struct {
Nickname string Nickname string
PasswordHash string PasswordHash string
AvatarURL string AvatarURL string
Description string
} }
type UpdateUser struct { type UpdateUser struct {
@ -71,6 +72,7 @@ type UpdateUser struct {
Password *string Password *string
AvatarURL *string AvatarURL *string
PasswordHash *string PasswordHash *string
Description *string
} }
type FindUser struct { type FindUser struct {

@ -40,10 +40,11 @@ func TestUserStore(t *testing.T) {
func createTestingHostUser(ctx context.Context, ts *store.Store) (*store.User, error) { func createTestingHostUser(ctx context.Context, ts *store.Store) (*store.User, error) {
userCreate := &store.User{ userCreate := &store.User{
Username: "test", Username: "test",
Role: store.RoleHost, Role: store.RoleHost,
Email: "test@test.com", Email: "test@test.com",
Nickname: "test_nickname", Nickname: "test_nickname",
Description: "test_description",
} }
passwordHash, err := bcrypt.GenerateFromPassword([]byte("test_password"), bcrypt.DefaultCost) passwordHash, err := bcrypt.GenerateFromPassword([]byte("test_password"), bcrypt.DefaultCost)
if err != nil { if err != nil {

Loading…
Cancel
Save