use transactions in user insert and select
This commit is contained in:
parent
d009bd98ac
commit
4415ed90e8
@ -74,8 +74,15 @@ func (m *UserModel) Insert(shortId uint64, username string, email string, passwo
|
|||||||
}
|
}
|
||||||
stmt := `INSERT INTO users (ShortId, Username, Email, IsBanned, HashedPassword, Created)
|
stmt := `INSERT INTO users (ShortId, Username, Email, IsBanned, HashedPassword, Created)
|
||||||
VALUES (?, ?, ?, FALSE, ?, ?)`
|
VALUES (?, ?, ?, FALSE, ?, ?)`
|
||||||
result, err := m.DB.Exec(stmt, shortId, username, email, hashedPassword, time.Now().UTC())
|
tx, err := m.DB.Begin()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
result, err := tx.Exec(stmt, shortId, username, email, hashedPassword, time.Now().UTC())
|
||||||
|
if err != nil {
|
||||||
|
if rollbackErr := tx.Rollback(); rollbackErr != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if sqliteError, ok := err.(sqlite3.Error); ok {
|
if sqliteError, ok := err.(sqlite3.Error); ok {
|
||||||
if sqliteError.ExtendedCode == 2067 && strings.Contains(sqliteError.Error(), "Email") {
|
if sqliteError.ExtendedCode == 2067 && strings.Contains(sqliteError.Error(), "Email") {
|
||||||
return ErrDuplicateEmail
|
return ErrDuplicateEmail
|
||||||
@ -85,50 +92,91 @@ func (m *UserModel) Insert(shortId uint64, username string, email string, passwo
|
|||||||
}
|
}
|
||||||
id, err := result.LastInsertId()
|
id, err := result.LastInsertId()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
if rollbackErr := tx.Rollback(); rollbackErr != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = m.initializeUserSettings(id, settings)
|
stmt = `INSERT INTO user_settings (UserId, SettingId, AllowedSettingValueId, UnconstrainedValue)
|
||||||
|
VALUES (?, ?, ?, ?)`
|
||||||
|
_, err = tx.Exec(stmt, id, m.Settings[SettingUserTimezone].id, nil, settings.LocalTimezone.String())
|
||||||
|
if err != nil {
|
||||||
|
if rollbackErr := tx.Rollback(); rollbackErr != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = tx.Commit()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *UserModel) Get(id uint64) (User, error) {
|
func (m *UserModel) Get(shortId uint64) (User, error) {
|
||||||
stmt := `SELECT Id, ShortId, Username, Email, Created FROM users WHERE ShortId = ? AND Deleted IS NULL`
|
stmt := `SELECT Id, ShortId, Username, Email, Created FROM users WHERE ShortId = ? AND Deleted IS NULL`
|
||||||
row := m.DB.QueryRow(stmt, id)
|
tx, err := m.DB.Begin()
|
||||||
var u User
|
|
||||||
err := row.Scan(&u.ID, &u.ShortId, &u.Username, &u.Email, &u.Created)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
return User{}, err
|
||||||
|
}
|
||||||
|
row := tx.QueryRow(stmt, shortId)
|
||||||
|
var u User
|
||||||
|
err = row.Scan(&u.ID, &u.ShortId, &u.Username, &u.Email, &u.Created)
|
||||||
|
if err != nil {
|
||||||
|
if rollbackErr := tx.Rollback(); rollbackErr != nil {
|
||||||
|
return User{}, err
|
||||||
|
}
|
||||||
if errors.Is(err, sql.ErrNoRows) {
|
if errors.Is(err, sql.ErrNoRows) {
|
||||||
return User{}, ErrNoRecord
|
return User{}, ErrNoRecord
|
||||||
}
|
}
|
||||||
return User{}, err
|
return User{}, err
|
||||||
}
|
}
|
||||||
settings, err := m.GetSettings(u.ID)
|
settings, err := m.getSettings(tx, u.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return u, err
|
if rollbackErr := tx.Rollback(); rollbackErr != nil {
|
||||||
|
return User{}, err
|
||||||
|
}
|
||||||
|
return User{}, err
|
||||||
}
|
}
|
||||||
u.Settings = settings
|
u.Settings = settings
|
||||||
|
err = tx.Commit()
|
||||||
|
if err != nil {
|
||||||
|
return User{}, err
|
||||||
|
}
|
||||||
return u, nil
|
return u, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *UserModel) GetById(id int64) (User, error) {
|
func (m *UserModel) GetById(id int64) (User, error) {
|
||||||
stmt := `SELECT Id, ShortId, Username, Email, Created FROM users WHERE Id = ? AND Deleted IS NULL`
|
stmt := `SELECT Id, ShortId, Username, Email, Created FROM users WHERE Id = ? AND Deleted IS NULL`
|
||||||
row := m.DB.QueryRow(stmt, id)
|
tx, err := m.DB.Begin()
|
||||||
var u User
|
|
||||||
err := row.Scan(&u.ID, &u.ShortId, &u.Username, &u.Email, &u.Created)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
return User{}, err
|
||||||
|
}
|
||||||
|
row := tx.QueryRow(stmt, id)
|
||||||
|
var u User
|
||||||
|
err = row.Scan(&u.ID, &u.ShortId, &u.Username, &u.Email, &u.Created)
|
||||||
|
if err != nil {
|
||||||
|
if rollbackErr := tx.Rollback(); rollbackErr != nil {
|
||||||
|
return User{}, err
|
||||||
|
}
|
||||||
if errors.Is(err, sql.ErrNoRows) {
|
if errors.Is(err, sql.ErrNoRows) {
|
||||||
return User{}, ErrNoRecord
|
return User{}, ErrNoRecord
|
||||||
}
|
}
|
||||||
return User{}, err
|
return User{}, err
|
||||||
}
|
}
|
||||||
settings, err := m.GetSettings(u.ID)
|
settings, err := m.getSettings(tx, u.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return u, err
|
if rollbackErr := tx.Rollback(); rollbackErr != nil {
|
||||||
|
return User{}, err
|
||||||
|
}
|
||||||
|
return User{}, err
|
||||||
}
|
}
|
||||||
u.Settings = settings
|
u.Settings = settings
|
||||||
|
err = tx.Commit()
|
||||||
|
if err != nil {
|
||||||
|
return User{}, err
|
||||||
|
}
|
||||||
return u, nil
|
return u, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -186,12 +234,12 @@ func (m *UserModel) Exists(id int64) (bool, error) {
|
|||||||
return exists, err
|
return exists, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *UserModel) GetSettings(userId int64) (UserSettings, error) {
|
func (m *UserModel) getSettings(tx *sql.Tx, userId int64) (UserSettings, error) {
|
||||||
stmt := `SELECT u.SettingId, a.ItemValue, u.UnconstrainedValue FROM user_settings AS u
|
stmt := `SELECT u.SettingId, a.ItemValue, u.UnconstrainedValue FROM user_settings AS u
|
||||||
LEFT JOIN allowed_setting_values AS a ON u.AllowedSettingValueId = a.Id
|
LEFT JOIN allowed_setting_values AS a ON u.AllowedSettingValueId = a.Id
|
||||||
WHERE UserId = ?`
|
WHERE UserId = ?`
|
||||||
var settings UserSettings
|
var settings UserSettings
|
||||||
rows, err := m.DB.Query(stmt, userId)
|
rows, err := tx.Query(stmt, userId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return settings, err
|
return settings, err
|
||||||
}
|
}
|
||||||
@ -214,16 +262,6 @@ func (m *UserModel) GetSettings(userId int64) (UserSettings, error) {
|
|||||||
return settings, err
|
return settings, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *UserModel) initializeUserSettings(userId int64, settings UserSettings) error {
|
|
||||||
stmt := `INSERT INTO user_settings (UserId, SettingId, AllowedSettingValueId, UnconstrainedValue)
|
|
||||||
VALUES (?, ?, ?, ?)`
|
|
||||||
_, err := m.DB.Exec(stmt, userId, m.Settings[SettingUserTimezone].id, nil, settings.LocalTimezone.String())
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *UserModel) UpdateUserSettings(userId int64, settings UserSettings) error {
|
func (m *UserModel) UpdateUserSettings(userId int64, settings UserSettings) error {
|
||||||
err := m.UpdateSetting(userId, m.Settings[SettingUserTimezone], settings.LocalTimezone.String())
|
err := m.UpdateSetting(userId, m.Settings[SettingUserTimezone], settings.LocalTimezone.String())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user