Changeset 0.17.1 (#76)

This commit is contained in:
2026-02-28 01:40:31 +00:00
parent c9141a6896
commit 856dc9b0ac
64 changed files with 8037 additions and 1657 deletions

View File

@@ -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