diff options
| author | 2025-10-24 20:40:00 +0700 | |
|---|---|---|
| committer | 2025-10-24 20:40:00 +0700 | |
| commit | df7a0ae1c0fc177cba2eae8cc73fe21d2afdd229 (patch) | |
| tree | d7120bf3ee681e279048747c0498521974570ed1 /internal/router | |
| parent | adcd8cf82f7ec4027701643c545b1f27a7cfc221 (diff) | |
| download | web-df7a0ae1c0fc177cba2eae8cc73fe21d2afdd229.tar.gz web-df7a0ae1c0fc177cba2eae8cc73fe21d2afdd229.zip | |
feat: allow to unsubscribe from an email
Diffstat (limited to 'internal/router')
| -rw-r--r-- | internal/router/api-v1-subs.go | 2 | ||||
| -rw-r--r-- | internal/router/lang-user-unsubscribe.go | 69 |
2 files changed, 70 insertions, 1 deletions
diff --git a/internal/router/api-v1-subs.go b/internal/router/api-v1-subs.go index 8995ebe..72f16e0 100644 --- a/internal/router/api-v1-subs.go +++ b/internal/router/api-v1-subs.go @@ -58,7 +58,7 @@ func Api_V1_Subs_Put(l map[string]*locale.LocaleConfig) func(c *fiber.Ctx) error } specificTags := c.FormValue("tags_picked") - if err = Mailer.Subscribe(id, subscriptionTypeEnum, specificTags); err != nil { + if err = Mailer.Subscribe(Mailer.GetHash(id), subscriptionTypeEnum, specificTags); err != nil { return api_v1_email_sendStatusHtml(c, "subs-message", l, "Failed", fiber.StatusUnprocessableEntity, lang, l[lang].UserProfile.FailedToSubscribe, map[string]string{}) } diff --git a/internal/router/lang-user-unsubscribe.go b/internal/router/lang-user-unsubscribe.go new file mode 100644 index 0000000..a6ca89f --- /dev/null +++ b/internal/router/lang-user-unsubscribe.go @@ -0,0 +1,69 @@ +package router + +import ( + "fmt" + "html/template" + "log/slog" + + "github.com/SayaAndy/saya-today-web/config" + "github.com/SayaAndy/saya-today-web/locale" + "github.com/gofiber/fiber/v2" +) + +func init() { + assert(0, tm.Add("unsubscribe-page", "views/pages/unsubscribe-page.html")) +} + +func Lang_User_Unsubscribe(l map[string]*locale.LocaleConfig, langs []config.AvailableLanguageConfig) func(c *fiber.Ctx) error { + return func(c *fiber.Ctx) error { + lang := c.Params("lang") + for _, availableLang := range langs { + if availableLang.Name == lang { + goto langIsAvailable + } + } + return c.Status(fiber.ErrNotFound.Code).SendString(fmt.Sprintf("server does not support '%s' language", lang)) + + langIsAvailable: + var statusEmoji, statusText, statusColor string + var status int + + unsubscribeCode := c.FormValue("code") + if unsubscribeCode == "" { + statusColor = "0, 0, 255" + statusEmoji = "(╭ರ_•́)" + statusText = l[lang].UnsubscribePage.UnsetCode + status = fiber.ErrBadRequest.Code + } else if clientError, serverError := Mailer.Unsubscribe(unsubscribeCode); clientError != nil { + statusColor = "255, 0, 0" + statusEmoji = "(͠≖~≖ ͡ )" + statusText = l[lang].UnsubscribePage.InvalidCode + status = fiber.ErrBadRequest.Code + } else if serverError != nil { + statusColor = "255, 128, 0" + statusEmoji = "( ˶°ㅁ°) !!" + statusText = l[lang].UnsubscribePage.OnServerError + status = fiber.ErrInternalServerError.Code + } else { + statusColor = "0, 255, 0," + statusEmoji = "♡⸜(˶˃ ᵕ ˂˶)⸝♡" + statusText = l[lang].UnsubscribePage.Success + status = fiber.StatusOK + } + + content, err := tm.Render("unsubscribe-page", fiber.Map{ + "Lang": lang, + "L": l[lang], + "StatusEmoji": statusEmoji, + "StatusText": statusText, + "StatusColor": template.HTML(statusColor), + }) + if err != nil { + slog.Warn("failed to generate page", slog.String("page", "/"+lang+"/user/unsubscribe"), slog.String("error", err.Error())) + c.Set(fiber.HeaderContentType, fiber.MIMETextPlainCharsetUTF8) + return c.Status(fiber.ErrInternalServerError.Code).SendString("failed to generate page") + } + + return c.Type("html").Status(status).Send(content) + } +} |