diff --git a/server/profile/profile.go b/server/profile/profile.go index bd22193f..74cde1eb 100644 --- a/server/profile/profile.go +++ b/server/profile/profile.go @@ -51,11 +51,9 @@ func checkDataDir(dataDir string) (string, error) { // Trim trailing \ or / in case user supplies dataDir = strings.TrimRight(dataDir, "\\/") - if _, err := os.Stat(dataDir); err != nil { return "", errors.Wrapf(err, "unable to access data folder %s", dataDir) } - return dataDir, nil } diff --git a/store/db/mysql/migration/dev/LATEST__SCHEMA.sql b/store/db/mysql/migration/dev/LATEST__SCHEMA.sql index f69bbe30..770fc556 100644 --- a/store/db/mysql/migration/dev/LATEST__SCHEMA.sql +++ b/store/db/mysql/migration/dev/LATEST__SCHEMA.sql @@ -22,7 +22,8 @@ CREATE TABLE `user` ( `email` VARCHAR(256) NOT NULL DEFAULT '', `nickname` VARCHAR(256) NOT NULL DEFAULT '', `password_hash` VARCHAR(256) NOT NULL, - `avatar_url` LONGTEXT NOT NULL + `avatar_url` LONGTEXT NOT NULL, + `description` VARCHAR(256) NOT NULL DEFAULT '' ); -- user_setting diff --git a/store/db/mysql/user.go b/store/db/mysql/user.go index 19262135..764f7427 100644 --- a/store/db/mysql/user.go +++ b/store/db/mysql/user.go @@ -60,6 +60,9 @@ func (d *DB) UpdateUser(ctx context.Context, update *store.UpdateUser) (*store.U if v := update.PasswordHash; v != nil { 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) 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) } - 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...) if err != nil { return nil, err @@ -111,6 +114,7 @@ func (d *DB) ListUsers(ctx context.Context, find *store.FindUser) ([]*store.User &user.Nickname, &user.PasswordHash, &user.AvatarURL, + &user.Description, &user.CreatedTs, &user.UpdatedTs, &user.RowStatus, diff --git a/store/db/postgres/migration/dev/LATEST__SCHEMA.sql b/store/db/postgres/migration/dev/LATEST__SCHEMA.sql index 1ab5f95e..3d611c2b 100644 --- a/store/db/postgres/migration/dev/LATEST__SCHEMA.sql +++ b/store/db/postgres/migration/dev/LATEST__SCHEMA.sql @@ -22,7 +22,8 @@ CREATE TABLE "user" ( email TEXT NOT NULL DEFAULT '', nickname TEXT NOT NULL DEFAULT '', password_hash TEXT NOT NULL, - avatar_url TEXT NOT NULL + avatar_url TEXT NOT NULL, + description TEXT NOT NULL DEFAULT '' ); -- user_setting diff --git a/store/db/postgres/user.go b/store/db/postgres/user.go index 588bbac3..81602558 100644 --- a/store/db/postgres/user.go +++ b/store/db/postgres/user.go @@ -10,10 +10,11 @@ import ( func (d *DB) CreateUser(ctx context.Context, create *store.User) (*store.User, error) { fields := []string{"username", "role", "email", "nickname", "password_hash", "avatar_url"} 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( &create.ID, &create.AvatarURL, + &create.Description, &create.CreatedTs, &create.UpdatedTs, &create.RowStatus, @@ -47,12 +48,15 @@ func (d *DB) UpdateUser(ctx context.Context, update *store.UpdateUser) (*store.U if v := update.PasswordHash; v != nil { 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 := ` UPDATE "user" SET ` + strings.Join(set, ", ") + ` 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) user := &store.User{} @@ -64,6 +68,7 @@ func (d *DB) UpdateUser(ctx context.Context, update *store.UpdateUser) (*store.U &user.Nickname, &user.PasswordHash, &user.AvatarURL, + &user.Description, &user.CreatedTs, &user.UpdatedTs, &user.RowStatus, @@ -102,6 +107,7 @@ func (d *DB) ListUsers(ctx context.Context, find *store.FindUser) ([]*store.User nickname, password_hash, avatar_url, + description, created_ts, updated_ts, row_status @@ -126,6 +132,7 @@ func (d *DB) ListUsers(ctx context.Context, find *store.FindUser) ([]*store.User &user.Nickname, &user.PasswordHash, &user.AvatarURL, + &user.Description, &user.CreatedTs, &user.UpdatedTs, &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 { - result, err := d.db.ExecContext(ctx, ` - DELETE FROM "user" WHERE id = $1 - `, delete.ID) + result, err := d.db.ExecContext(ctx, `DELETE FROM "user" WHERE id = $1`, delete.ID) if err != nil { return err } diff --git a/store/db/sqlite/migration/dev/LATEST__SCHEMA.sql b/store/db/sqlite/migration/dev/LATEST__SCHEMA.sql index b2408ddc..f1114df7 100644 --- a/store/db/sqlite/migration/dev/LATEST__SCHEMA.sql +++ b/store/db/sqlite/migration/dev/LATEST__SCHEMA.sql @@ -23,7 +23,8 @@ CREATE TABLE user ( email TEXT NOT NULL DEFAULT '', nickname TEXT NOT NULL DEFAULT '', 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); diff --git a/store/db/sqlite/user.go b/store/db/sqlite/user.go index 216d1170..b3f177f5 100644 --- a/store/db/sqlite/user.go +++ b/store/db/sqlite/user.go @@ -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`"} placeholder := []string{"?", "?", "?", "?", "?"} 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( &create.ID, &create.AvatarURL, + &create.Description, &create.CreatedTs, &create.UpdatedTs, &create.RowStatus, @@ -48,13 +49,16 @@ func (d *DB) UpdateUser(ctx context.Context, update *store.UpdateUser) (*store.U if v := update.PasswordHash; v != nil { 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) query := ` UPDATE user SET ` + strings.Join(set, ", ") + ` 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{} 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.PasswordHash, &user.AvatarURL, + &user.Description, &user.CreatedTs, &user.UpdatedTs, &user.RowStatus, @@ -103,6 +108,7 @@ func (d *DB) ListUsers(ctx context.Context, find *store.FindUser) ([]*store.User nickname, password_hash, avatar_url, + description, created_ts, updated_ts, row_status @@ -127,6 +133,7 @@ func (d *DB) ListUsers(ctx context.Context, find *store.FindUser) ([]*store.User &user.Nickname, &user.PasswordHash, &user.AvatarURL, + &user.Description, &user.CreatedTs, &user.UpdatedTs, &user.RowStatus, diff --git a/store/user.go b/store/user.go index 4dcda4f6..cec1c48a 100644 --- a/store/user.go +++ b/store/user.go @@ -57,6 +57,7 @@ type User struct { Nickname string PasswordHash string AvatarURL string + Description string } type UpdateUser struct { @@ -71,6 +72,7 @@ type UpdateUser struct { Password *string AvatarURL *string PasswordHash *string + Description *string } type FindUser struct { diff --git a/test/store/user_test.go b/test/store/user_test.go index dde7d156..14131b4a 100644 --- a/test/store/user_test.go +++ b/test/store/user_test.go @@ -40,10 +40,11 @@ func TestUserStore(t *testing.T) { func createTestingHostUser(ctx context.Context, ts *store.Store) (*store.User, error) { userCreate := &store.User{ - Username: "test", - Role: store.RoleHost, - Email: "test@test.com", - Nickname: "test_nickname", + Username: "test", + Role: store.RoleHost, + Email: "test@test.com", + Nickname: "test_nickname", + Description: "test_description", } passwordHash, err := bcrypt.GenerateFromPassword([]byte("test_password"), bcrypt.DefaultCost) if err != nil {