mirror of
https://github.com/usememos/memos.git
synced 2025-06-05 22:09:59 +02:00
chore: add description field to user
This commit is contained in:
@ -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 {
|
||||||
|
@ -44,6 +44,7 @@ func createTestingHostUser(ctx context.Context, ts *store.Store) (*store.User, e
|
|||||||
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 {
|
||||||
|
Reference in New Issue
Block a user