Changeset 0.17.1 (#76)
This commit is contained in:
@@ -54,10 +54,10 @@ func (h *SettingsHandler) GetProfile(c *gin.Context) {
|
||||
|
||||
var p profileResponse
|
||||
var settingsRaw string
|
||||
err := database.DB.QueryRow(`
|
||||
err := database.DB.QueryRow(database.Q(`
|
||||
SELECT id, username, email, display_name, role, avatar_url, settings::text, created_at
|
||||
FROM users WHERE id = $1
|
||||
`, userID).Scan(
|
||||
`), userID).Scan(
|
||||
&p.ID, &p.Username, &p.Email, &p.DisplayName, &p.Role,
|
||||
&p.Avatar, &settingsRaw, &p.CreatedAt,
|
||||
)
|
||||
@@ -89,7 +89,7 @@ func (h *SettingsHandler) UpdateProfile(c *gin.Context) {
|
||||
|
||||
if req.DisplayName != nil {
|
||||
_, err := database.DB.Exec(
|
||||
`UPDATE users SET display_name = $1, updated_at = NOW() WHERE id = $2`,
|
||||
database.Q(`UPDATE users SET display_name = $1, updated_at = NOW() WHERE id = $2`),
|
||||
*req.DisplayName, userID,
|
||||
)
|
||||
if err != nil {
|
||||
@@ -101,11 +101,11 @@ func (h *SettingsHandler) UpdateProfile(c *gin.Context) {
|
||||
if req.Email != nil {
|
||||
email := strings.ToLower(strings.TrimSpace(*req.Email))
|
||||
_, err := database.DB.Exec(
|
||||
`UPDATE users SET email = $1, updated_at = NOW() WHERE id = $2`,
|
||||
database.Q(`UPDATE users SET email = $1, updated_at = NOW() WHERE id = $2`),
|
||||
email, userID,
|
||||
)
|
||||
if err != nil {
|
||||
if strings.Contains(err.Error(), "duplicate key") {
|
||||
if database.IsUniqueViolation(err) {
|
||||
c.JSON(http.StatusConflict, gin.H{"error": "email already taken"})
|
||||
return
|
||||
}
|
||||
@@ -131,7 +131,7 @@ func (h *SettingsHandler) ChangePassword(c *gin.Context) {
|
||||
// Verify current password
|
||||
var hash string
|
||||
err := database.DB.QueryRow(
|
||||
`SELECT password_hash FROM users WHERE id = $1`, userID,
|
||||
database.Q(`SELECT password_hash FROM users WHERE id = $1`), userID,
|
||||
).Scan(&hash)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to verify password"})
|
||||
@@ -151,7 +151,7 @@ func (h *SettingsHandler) ChangePassword(c *gin.Context) {
|
||||
}
|
||||
|
||||
_, err = database.DB.Exec(
|
||||
`UPDATE users SET password_hash = $1, updated_at = NOW() WHERE id = $2`,
|
||||
database.Q(`UPDATE users SET password_hash = $1, updated_at = NOW() WHERE id = $2`),
|
||||
string(newHash), userID,
|
||||
)
|
||||
if err != nil {
|
||||
@@ -172,7 +172,7 @@ func (h *SettingsHandler) GetSettings(c *gin.Context) {
|
||||
|
||||
var settingsRaw string
|
||||
err := database.DB.QueryRow(
|
||||
`SELECT settings::text FROM users WHERE id = $1`, userID,
|
||||
database.Q(`SELECT settings::text FROM users WHERE id = $1`), userID,
|
||||
).Scan(&settingsRaw)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to load settings"})
|
||||
@@ -203,10 +203,13 @@ func (h *SettingsHandler) UpdateSettings(c *gin.Context) {
|
||||
}
|
||||
|
||||
// JSONB merge — existing keys preserved, incoming keys overwrite
|
||||
_, err = database.DB.Exec(`
|
||||
UPDATE users SET settings = settings || $1::jsonb, updated_at = NOW()
|
||||
WHERE id = $2
|
||||
`, string(patch), userID)
|
||||
var mergeQuery string
|
||||
if database.IsSQLite() {
|
||||
mergeQuery = `UPDATE users SET settings = json_patch(settings, ?), updated_at = datetime('now') WHERE id = ?`
|
||||
} else {
|
||||
mergeQuery = `UPDATE users SET settings = settings || $1::jsonb, updated_at = NOW() WHERE id = $2`
|
||||
}
|
||||
_, err = database.DB.Exec(mergeQuery, string(patch), userID)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to update settings"})
|
||||
return
|
||||
@@ -227,10 +230,10 @@ func (h *SettingsHandler) rewrapVault(userID, oldPassword, newPassword string) {
|
||||
|
||||
var vaultSet bool
|
||||
var encUEK, salt, nonce []byte
|
||||
err := database.DB.QueryRow(`
|
||||
err := database.DB.QueryRow(database.Q(`
|
||||
SELECT vault_set, encrypted_uek, uek_salt, uek_nonce
|
||||
FROM users WHERE id = $1
|
||||
`, userID).Scan(&vaultSet, &encUEK, &salt, &nonce)
|
||||
`), userID).Scan(&vaultSet, &encUEK, &salt, &nonce)
|
||||
if err != nil || !vaultSet || len(encUEK) == 0 {
|
||||
return // No vault to re-wrap
|
||||
}
|
||||
@@ -257,11 +260,11 @@ func (h *SettingsHandler) rewrapVault(userID, oldPassword, newPassword string) {
|
||||
return
|
||||
}
|
||||
|
||||
_, err = database.DB.Exec(`
|
||||
_, err = database.DB.Exec(database.Q(`
|
||||
UPDATE users
|
||||
SET encrypted_uek = $1, uek_salt = $2, uek_nonce = $3, updated_at = NOW()
|
||||
WHERE id = $4
|
||||
`, newEncUEK, newSalt, newNonce, userID)
|
||||
`), newEncUEK, newSalt, newNonce, userID)
|
||||
if err != nil {
|
||||
log.Printf("⚠ Vault re-wrap failed for user %s (persist): %v", userID, err)
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user