summaryrefslogtreecommitdiff
diff options
from:
to:
context:
space:
mode:
authorGravatar SayaAndy <saya.andy@posteo.com> 2025-10-25 18:53:30 +0700
committerGravatar SayaAndy <saya.andy@posteo.com> 2025-10-25 18:53:30 +0700
commit427ab1a9a4d6094d9f3a84e62f09cc396b49a09b (patch)
tree83535f9d535921cff7739c0166b9494cd7eb2217
parentdf7a0ae1c0fc177cba2eae8cc73fe21d2afdd229 (diff)
downloadweb-427ab1a9a4d6094d9f3a84e62f09cc396b49a09b.tar.gz
web-427ab1a9a4d6094d9f3a84e62f09cc396b49a09b.zip
fix: make sure db transactions end always
-rw-r--r--internal/mailer/mailer.go18
-rw-r--r--internal/router/client-cache.go6
-rw-r--r--views/pages/blog-catalogue.html8
3 files changed, 24 insertions, 8 deletions
diff --git a/internal/mailer/mailer.go b/internal/mailer/mailer.go
index c146548..eb86d56 100644
--- a/internal/mailer/mailer.go
+++ b/internal/mailer/mailer.go
@@ -151,13 +151,17 @@ func (m *Mailer) MailIsTaken(email string) (bool, error) {
if err != nil {
return false, fmt.Errorf("failed to initialize transaction with db: %s", err)
}
+ defer func(tx *sql.Tx) {
+ if err = tx.Commit(); err != nil {
+ tx.Rollback()
+ }
+ }(tx)
var rows *sql.Rows
if rows, err = tx.Query(`SELECT email FROM user_email_table WHERE email=? LIMIT 1;`, email); err != nil {
tx.Rollback()
return false, fmt.Errorf("failed to query user-email settings in db: %s", err)
}
- defer tx.Commit()
defer rows.Close()
isTaken := rows.Next()
@@ -169,13 +173,17 @@ func (m *Mailer) GetInfo(userIdHash []byte) (email string, lang string, err erro
if err != nil {
return "", "", fmt.Errorf("failed to initialize transaction with db: %s", err)
}
+ defer func(tx *sql.Tx) {
+ if err = tx.Commit(); err != nil {
+ tx.Rollback()
+ }
+ }(tx)
var rows *sql.Rows
if rows, err = tx.Query(`SELECT email, lang FROM user_email_table WHERE user_id=? LIMIT 1;`, userIdHash); err != nil {
tx.Rollback()
return "", "", fmt.Errorf("failed to query user-email settings in db: %s", err)
}
- defer tx.Commit()
defer rows.Close()
if !rows.Next() {
@@ -325,6 +333,11 @@ func (m *Mailer) GetSubscriptions(userId string) (subscriptionType SubscriptionT
if err != nil {
return None, nil, fmt.Errorf("failed to initialize transaction with db: %s", err)
}
+ defer func(tx *sql.Tx) {
+ if err = tx.Commit(); err != nil {
+ tx.Rollback()
+ }
+ }(tx)
hash := m.GetHash(userId)
@@ -333,7 +346,6 @@ func (m *Mailer) GetSubscriptions(userId string) (subscriptionType SubscriptionT
tx.Rollback()
return None, nil, fmt.Errorf("failed to query user-to-tags table in db for the user: %s", err)
}
- defer tx.Commit()
defer rows.Close()
if !rows.Next() {
diff --git a/internal/router/client-cache.go b/internal/router/client-cache.go
index d607cdd..26557d0 100644
--- a/internal/router/client-cache.go
+++ b/internal/router/client-cache.go
@@ -110,7 +110,11 @@ func (c *ClientCache) Close() error {
return fmt.Errorf("fail to save blog_views: %s", err)
}
- return tx.Commit()
+ if err = tx.Commit(); err != nil {
+ tx.Rollback()
+ return fmt.Errorf("fail to commit all the changes related to cache: %s", err)
+ }
+ return nil
}
func (c *ClientCache) GetHash(id string) string {
diff --git a/views/pages/blog-catalogue.html b/views/pages/blog-catalogue.html
index 8e91798..d209205 100644
--- a/views/pages/blog-catalogue.html
+++ b/views/pages/blog-catalogue.html
@@ -1,10 +1,10 @@
{{ define "body" }}
-<div class="flex flex-row ar-lt-0.8:flex-col text-base h-[100%]">
+<div class="flex flex-row ar-lt-0.8:flex-col text-base h-full">
<form hx-get="/api/v1/blog-search" hx-vals='{"lang": "{{ .Lang }}"}' hx-target=".blog-cards" hx-swap="innerHTML"
- class="tags-list ar-gt-0.8:min-w-[10dvh] ar-gt-0.8:max-w-[20dvh] ar-gt-0.8:w-fit ar-lt-0.8:w-[100%] ar-lt-0.8:max-h-[30%] flex shrink-0 flex-col ar-gt-0.8:mr-6 bg-background-light inset-shadow-[0_0_0.4rem_black]">
+ class="tags-list ar-gt-0.8:min-w-[10dvh] ar-gt-0.8:max-w-[20dvh] ar-gt-0.8:w-fit ar-lt-0.8:w-full ar-lt-0.8:max-h-[30%] flex shrink-0 flex-col ar-gt-0.8:mr-6 bg-background-light inset-shadow-[0_0_0.4rem_black]">
<div class="flex flex-col overflow-y-auto">
<fieldset>
- <legend class="font-bold w-[100%] text-center">{{ .L.BlogSearch.TagsHeader }}</legend>
+ <legend class="font-bold w-full text-center">{{ .L.BlogSearch.TagsHeader }}</legend>
<div class="flex flex-col ar-lt-0.8:grid grid-cols-3 xs:grid-cols-4 sm:grid-cols-5 grid-flow-row-dense">
<div class="m-1">
<label class="font-bold"><input type="checkbox" id="tagsAllCheckbox" onclick="selectAll();"> {{ .L.BlogSearch.ChooseAllTags }}</label>
@@ -17,7 +17,7 @@
</div>
</fieldset>
<fieldset class="mt-1">
- <legend class="font-bold w-[100%] text-center">{{ .L.BlogSearch.OrderByHeader }}</legend>
+ <legend class="font-bold w-full text-center">{{ .L.BlogSearch.OrderByHeader }}</legend>
<div class="flex flex-col ar-lt-0.8:grid grid-cols-3 grid-rows-2 grid-flow-col">
<div class="m-1">
<label><input type="radio" id="sortTitleAsc" name="sort" value="titleAsc" {{ if eq .QuerySort "titleAsc" }}checked{{ end }}> {{ .L.BlogSearch.TitleOrdered }} <i class="fas fa-arrow-down-a-z"></i></label>