summaryrefslogtreecommitdiffci
path: root/internal/blog
diff options
from:
to:
context:
space:
mode:
authorGravatar SayaAndy <saya.andy@posteo.com> 2026-05-17 17:13:32 +0700
committerGravatar SayaAndy <saya.andy@posteo.com> 2026-05-17 17:13:32 +0700
commite9353a66bf51486f702eaa0f591dea54c9bd4cd1 (patch)
treedd8d121366259045799475f4e402f2908af1d997 /internal/blog
parent1c441f5eab9a2a24fe5309178ce010f32adac1c7 (diff)
downloadweb-e9353a66bf51486f702eaa0f591dea54c9bd4cd1.tar.gz
web-e9353a66bf51486f702eaa0f591dea54c9bd4cd1.zip
refactor: rewrite localization for dynamic set and get
feat: medley localnames feat: integrate package minor updates fix: on errors with blog client init write correct type
Diffstat (limited to 'internal/blog')
-rw-r--r--internal/blog/b2.go21
-rw-r--r--internal/blog/client.go1
-rw-r--r--internal/blog/index.go5
-rw-r--r--internal/blog/s3.go24
4 files changed, 46 insertions, 5 deletions
diff --git a/internal/blog/b2.go b/internal/blog/b2.go
index 8a4d363..f2ac890 100644
--- a/internal/blog/b2.go
+++ b/internal/blog/b2.go
@@ -2,6 +2,7 @@ package blog
import (
"context"
+ "encoding/json"
"fmt"
"slices"
"strings"
@@ -37,6 +38,20 @@ func NewB2Client(cfg *config.StorageConfig) (Client, error) {
return &B2Client{b2cl: b2cl, bucket: bucket, prefix: b2cfg.Prefix}, nil
}
+func (c *B2Client) GetMedleys() ([]MedleyEntry, error) {
+ idxRaw, err := c.readAll(MedleysIndexFileName)
+ if err != nil {
+ return nil, fmt.Errorf("read %s: %w", MedleysIndexFileName, err)
+ }
+
+ var idx []MedleyEntry
+ if err := json.Unmarshal(idxRaw, &idx); err != nil {
+ return nil, fmt.Errorf("unmarshal %s: %w", MedleysIndexFileName, err)
+ }
+
+ return idx, nil
+}
+
func (c *B2Client) Scan(prefix string) ([]*Page, error) {
filePaths := []*Page{}
@@ -102,7 +117,11 @@ func (c *B2Client) Scan(prefix string) ([]*Page, error) {
}
func (c *B2Client) ReadAll(path string) ([]byte, error) {
- obj := c.bucket.Object(c.prefix + path)
+ return c.readAll(c.prefix + path)
+}
+
+func (c *B2Client) readAll(path string) ([]byte, error) {
+ obj := c.bucket.Object(path)
if obj == nil {
return nil, fmt.Errorf("failed to reference object in B2 bucket")
}
diff --git a/internal/blog/client.go b/internal/blog/client.go
index 56bbee4..53eb0fd 100644
--- a/internal/blog/client.go
+++ b/internal/blog/client.go
@@ -17,6 +17,7 @@ type Page struct {
type Client interface {
Scan(prefix string) ([]*Page, error)
+ GetMedleys() ([]MedleyEntry, error)
ReadAll(path string) ([]byte, error)
ReadFrontmatter(path string) (metadata *frontmatter.Metadata, markdown []byte, err error)
}
diff --git a/internal/blog/index.go b/internal/blog/index.go
index 6c1a560..a09b59e 100644
--- a/internal/blog/index.go
+++ b/internal/blog/index.go
@@ -92,8 +92,9 @@ func (idx *Index) UnmarshalJSON(data []byte) error {
}
type MedleyEntry struct {
- Codename string `json:"codename"`
- Content []string `json:"content"`
+ Codename string `json:"codename"`
+ Localnames map[string]string `json:"localnames"`
+ Content []string `json:"content"`
}
type MedleyPageEntry struct {
diff --git a/internal/blog/s3.go b/internal/blog/s3.go
index 04fad33..3c1a932 100644
--- a/internal/blog/s3.go
+++ b/internal/blog/s3.go
@@ -10,14 +10,13 @@ import (
"github.com/SayaAndy/saya-today-web/config"
"github.com/SayaAndy/saya-today-web/internal/frontmatter"
+ "github.com/SayaAndy/saya-today-web/l10n"
"github.com/aws/aws-sdk-go-v2/aws"
awsconfig "github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/credentials"
"github.com/aws/aws-sdk-go-v2/service/s3"
)
-const s3ScanConcurrency = 32
-
type S3Client struct {
prefix string
bucketName string
@@ -60,6 +59,20 @@ func NewS3Client(cfg *config.StorageConfig) (Client, error) {
return &S3Client{s3cfg.Prefix, s3cfg.BucketName, s3cl}, nil
}
+func (c *S3Client) GetMedleys() ([]MedleyEntry, error) {
+ idxRaw, err := c.readAll(MedleysIndexFileName)
+ if err != nil {
+ return nil, fmt.Errorf("read %s: %w", MedleysIndexFileName, err)
+ }
+
+ var idx []MedleyEntry
+ if err := json.Unmarshal(idxRaw, &idx); err != nil {
+ return nil, fmt.Errorf("unmarshal %s: %w", MedleysIndexFileName, err)
+ }
+
+ return idx, nil
+}
+
func (c *S3Client) Scan(prefix string) ([]*Page, error) {
out, err := c.s3cl.GetObject(context.Background(), &s3.GetObjectInput{
Bucket: aws.String(c.bucketName),
@@ -156,6 +169,13 @@ func (c *S3Client) Scan(prefix string) ([]*Page, error) {
}
}
+ medleys, _ := c.GetMedleys()
+ for _, medley := range medleys {
+ for locale, localname := range medley.Localnames {
+ l10n.T.SetPath(localname, true, locale, "Medleys", medley.Codename)
+ }
+ }
+
return pages, nil
}