Diffstat (limited to 'internal/router')
| -rw-r--r-- | internal/router/api-v1-email-send-verification-code.go | 2 | ||||
| -rw-r--r-- | internal/router/api-v1-email-verify.go | 2 | ||||
| -rw-r--r-- | internal/router/api-v1-general-page-body.go | 87 | ||||
| -rw-r--r-- | internal/router/api-v1-subs.go | 67 | ||||
| -rw-r--r-- | internal/router/client-cache.go | 18 | ||||
| -rw-r--r-- | internal/router/lang-user-unsubscribe.go | 71 |
6 files changed, 28 insertions, 219 deletions
diff --git a/internal/router/api-v1-email-send-verification-code.go b/internal/router/api-v1-email-send-verification-code.go index 9372eb3..2cde1bd 100644 --- a/internal/router/api-v1-email-send-verification-code.go +++ b/internal/router/api-v1-email-send-verification-code.go @@ -58,7 +58,7 @@ func Api_V1_Email_SendVerificationCode(l map[string]*locale.LocaleConfig) func(c }) } - if previousEmail, _, _ := Mailer.GetInfo(Mailer.GetHash(id)); previousEmail == email { + if previousEmail, _, _ := Mailer.GetInfo(id); previousEmail == email { return api_v1_email_sendStatusHtml(c, "email-message", l, "Failed", fiber.ErrUnprocessableEntity.Code, lang, l[lang].UserProfile.EmailAlreadyValidated, map[string]string{}) } diff --git a/internal/router/api-v1-email-verify.go b/internal/router/api-v1-email-verify.go index 7fbfdec..fad174b 100644 --- a/internal/router/api-v1-email-verify.go +++ b/internal/router/api-v1-email-verify.go @@ -45,7 +45,7 @@ func Api_V1_Email_Verify(l map[string]*locale.LocaleConfig) func(c *fiber.Ctx) e slog.Error("verification code is invalid", slog.String("verification_code", verificationCode), slog.String("error", err.Error())) return api_v1_email_sendStatusHtml(c, "verification-message", l, "Failed", fiber.ErrUnprocessableEntity.Code, lang, l[lang].UserProfile.VerificationFailed, map[string]string{}) } - return api_v1_email_sendStatusHtml(c, "verification-message", l, "OK", fiber.StatusOK, lang, l[lang].UserProfile.VerificationSuccess+"\n\n"+l[lang].UserProfile.RefreshPage, map[string]string{ + return api_v1_email_sendStatusHtml(c, "verification-message", l, "OK", fiber.StatusOK, lang, l[lang].UserProfile.VerificationSuccess, map[string]string{ "hide-verification-panel": "true", }) } diff --git a/internal/router/api-v1-general-page-body.go b/internal/router/api-v1-general-page-body.go index b5567b7..6f856d3 100644 --- a/internal/router/api-v1-general-page-body.go +++ b/internal/router/api-v1-general-page-body.go @@ -14,7 +14,6 @@ import ( "github.com/SayaAndy/saya-today-web/config" "github.com/SayaAndy/saya-today-web/internal/b2" - "github.com/SayaAndy/saya-today-web/internal/blogtrigger" "github.com/SayaAndy/saya-today-web/internal/factgiver" "github.com/SayaAndy/saya-today-web/internal/frontmatter" "github.com/SayaAndy/saya-today-web/internal/mailer" @@ -25,7 +24,6 @@ import ( var FactGiver *factgiver.FactGiver var Mailer *mailer.Mailer -var BlogTrigger *blogtrigger.BlogTriggerScheduler func init() { assert(0, tm.Add("general-page-body", "views/partials/general-page-body.html")) @@ -97,12 +95,33 @@ func Api_V1_GeneralPage_Body(l map[string]*locale.LocaleConfig, langs []config.A queryTags = append(queryTags, string(match[1])) } - tagsArray, err := getTags(b2Client, lang) + pages, err := b2Client.Scan(lang + "/") if err != nil { - slog.Warn("failed to get the available tags", slog.String("error", err.Error())) - return c.Status(fiber.ErrInternalServerError.Code).SendString("failed to gather available tags") + slog.Warn("failed to scan pages via b2", slog.String("error", err.Error())) + return c.Status(fiber.ErrInternalServerError.Code).SendString(fmt.Sprintf("failed to scan pages via b2: %s", slog.String("error", err.Error()))) } + tagsMap := make(map[string]int) + for _, page := range pages { + for _, tag := range page.Metadata.Tags { + tagsMap[tag]++ + } + } + slog.Debug("enlist pages for catalogue", slog.Int("tag_count", len(tagsMap)), slog.Int("page_count", len(pages)), slog.String("path", c.Path())) + + type Tag struct { + Name string `json:"Name" yaml:"name"` + Count int `json:"Count" yaml:"count"` + } + + tagsArray := make([]Tag, 0, len(tagsMap)) + for tag, count := range tagsMap { + tagsArray = append(tagsArray, Tag{tag, count}) + } + slices.SortFunc(tagsArray, func(a Tag, b Tag) int { + return strings.Compare(a.Name, b.Name) + }) + values["Tags"] = tagsArray values["QuerySort"] = querySort values["QueryTags"] = strings.Join(queryTags, ",") @@ -112,37 +131,12 @@ func Api_V1_GeneralPage_Body(l map[string]*locale.LocaleConfig, langs []config.A } else if len(pathParts) == 2 && pathParts[1] == "user" { values["Title"] = l[lang].UserProfile.Header - email, _, err := Mailer.GetInfo(Mailer.GetHash(c.IP())) + email, _, err := Mailer.GetInfo(c.IP()) if err != nil { slog.Error("get info from mailer about a client", slog.String("error", err.Error())) } - - tagsArray, err := getTags(b2Client, lang) - if err != nil { - slog.Warn("failed to get the available tags", slog.String("error", err.Error())) - return c.Status(fiber.ErrInternalServerError.Code).SendString("failed to gather available tags") - } - - subscriptionType, tags, err := Mailer.GetSubscriptions(c.IP()) - if err != nil { - slog.Warn("failed to get the user subscriptions", slog.String("error", err.Error())) - return c.Status(fiber.ErrInternalServerError.Code).SendString("failed to get the user subscriptions") - } - - switch subscriptionType { - case mailer.None: - values["TagsPicked"] = "none" - case mailer.All: - values["TagsPicked"] = "all" - case mailer.Specific: - values["TagsPicked"] = "specific" - } - - values["TagsPickedList"] = tags - values["Email"] = email values["EmailCode"] = c.Query("email_code") - values["ExistingTags"] = tagsArray additionalTemplates = append(additionalTemplates, "views/pages/user-page.html") } else if len(pathParts) == 3 && pathParts[1] == "blog" { @@ -210,34 +204,3 @@ func readBlogPost(md goldmark.Markdown, b2Client *b2.B2Client, sourceName string return metadata, buf.String(), nil } - -type Tag struct { - Name string `json:"Name" yaml:"name"` - Count int `json:"Count" yaml:"count"` -} - -func getTags(b2Client *b2.B2Client, lang string) (tags []Tag, err error) { - pages, err := b2Client.Scan(lang + "/") - if err != nil { - slog.Warn("failed to scan pages via b2", slog.String("error", err.Error())) - return nil, fmt.Errorf("failed to scan pages via b2: %w", err) - } - - tagsMap := make(map[string]int) - for _, page := range pages { - for _, tag := range page.Metadata.Tags { - tagsMap[tag]++ - } - } - slog.Debug("enlist pages for catalogue", slog.Int("tag_count", len(tagsMap)), slog.Int("page_count", len(pages)), slog.String("lang", lang)) - - tagsArray := make([]Tag, 0, len(tagsMap)) - for tag, count := range tagsMap { - tagsArray = append(tagsArray, Tag{tag, count}) - } - slices.SortFunc(tagsArray, func(a Tag, b Tag) int { - return strings.Compare(a.Name, b.Name) - }) - - return tagsArray, nil -} diff --git a/internal/router/api-v1-subs.go b/internal/router/api-v1-subs.go deleted file mode 100644 index 72f16e0..0000000 --- a/internal/router/api-v1-subs.go +++ /dev/null @@ -1,67 +0,0 @@ -package router - -import ( - "net/url" - "strings" - - "github.com/SayaAndy/saya-today-web/internal/mailer" - "github.com/SayaAndy/saya-today-web/locale" - "github.com/gofiber/fiber/v2" -) - -func init() { - assert(0, tm.Add("personal-page-status", "views/partials/personal-page-status.html")) -} - -func Api_V1_Subs_Put(l map[string]*locale.LocaleConfig) func(c *fiber.Ctx) error { - return func(c *fiber.Ctx) error { - c.Set(fiber.HeaderContentType, fiber.MIMETextPlainCharsetUTF8) - - id := c.IP() - lang := "en" - - var referer, path string - var pathParts []string - var urlStruct *url.URL - var err error - - referer = c.Get("Referer", "") - if referer == "" { - goto skipFetchingLang - } - - urlStruct, err = url.ParseRequestURI(referer) - if err != nil { - goto skipFetchingLang - } - - path = urlStruct.EscapedPath() - pathParts = strings.Split(strings.Trim(path, "/"), "/") - if len(pathParts) == 0 { - goto skipFetchingLang - } - - lang = pathParts[0] - - skipFetchingLang: - subscriptionType := c.FormValue("tags") - var subscriptionTypeEnum mailer.SubscriptionType - switch subscriptionType { - case "all": - subscriptionTypeEnum = mailer.All - case "none": - subscriptionTypeEnum = mailer.None - case "specific": - subscriptionTypeEnum = mailer.Specific - default: - return api_v1_email_sendStatusHtml(c, "subs-message", l, "Failed", fiber.StatusUnprocessableEntity, lang, l[lang].UserProfile.SubscribeInvalidType, map[string]string{}) - } - - specificTags := c.FormValue("tags_picked") - 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{}) - } - - return api_v1_email_sendStatusHtml(c, "subs-message", l, "OK", fiber.StatusOK, lang, l[lang].UserProfile.SubscribedSuccessfully, map[string]string{}) - } -} diff --git a/internal/router/client-cache.go b/internal/router/client-cache.go index e7cda30..d607cdd 100644 --- a/internal/router/client-cache.go +++ b/internal/router/client-cache.go @@ -31,12 +31,10 @@ func NewClientCache(db *sql.DB, salt []byte) (*ClientCache, error) { if err != nil { return nil, fmt.Errorf("fail to init transaction with db to fill cache: %w", err) } - slog.Debug("began db transaction", slog.String("method", "NewClientCache")) rows, err := tx.Query("select * from blog_likes;") if err != nil { tx.Rollback() - slog.Debug("ended db transaction", slog.String("method", "NewClientCache")) return nil, fmt.Errorf("fail to query db for blog_likes to fill cache: %w", err) } @@ -64,7 +62,6 @@ func NewClientCache(db *sql.DB, salt []byte) (*ClientCache, error) { rows, err = tx.Query("select * from blog_views;") if err != nil { tx.Rollback() - slog.Debug("ended db transaction", slog.String("method", "NewClientCache")) return nil, fmt.Errorf("fail to query db for blog_views to fill cache: %w", err) } @@ -84,11 +81,8 @@ func NewClientCache(db *sql.DB, salt []byte) (*ClientCache, error) { } if err = tx.Commit(); err != nil { - tx.Rollback() - slog.Debug("ended db transaction", slog.String("method", "NewClientCache")) return nil, fmt.Errorf("fail to commit transaction in db: %w", err) } - slog.Debug("ended db transaction", slog.String("method", "NewClientCache")) return &ClientCache{ hashMap: make(map[string]string), @@ -105,28 +99,18 @@ func (c *ClientCache) Close() error { if err != nil { return fmt.Errorf("fail to init transaction with db to dump cache: %w", err) } - slog.Debug("began db transaction in ClientCache.Close") if err = batchSave(tx, "blog_likes", c.likePageMap); err != nil { tx.Rollback() - slog.Debug("ended db transaction in ClientCache.Close") return fmt.Errorf("fail to save blog_likes: %s", err) } if err = batchSave(tx, "blog_views", c.viewPageMap); err != nil { tx.Rollback() - slog.Debug("ended db transaction in ClientCache.Close") return fmt.Errorf("fail to save blog_views: %s", err) } - if err = tx.Commit(); err != nil { - tx.Rollback() - slog.Debug("ended db transaction in ClientCache.Close") - return fmt.Errorf("fail to commit all the changes related to cache: %s", err) - } - - slog.Debug("ended db transaction in ClientCache.Close") - return nil + return tx.Commit() } func (c *ClientCache) GetHash(id string) string { diff --git a/internal/router/lang-user-unsubscribe.go b/internal/router/lang-user-unsubscribe.go deleted file mode 100644 index c39f5e7..0000000 --- a/internal/router/lang-user-unsubscribe.go +++ /dev/null @@ -1,71 +0,0 @@ -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 { - slog.Info("got a client error when unsubscribing", slog.String("error", clientError.Error())) - statusColor = "255, 0, 0" - statusEmoji = "(͠≖~≖ ͡ )" - statusText = l[lang].UnsubscribePage.InvalidCode - status = fiber.ErrBadRequest.Code - } else if serverError != nil { - slog.Error("got a server error when unsubscribing", slog.String("error", serverError.Error())) - 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) - } -} |