summaryrefslogtreecommitdiff
path: root/internal/b2/client.go
diff options
from:
to:
context:
space:
mode:
authorGravatar Saya Andy <145215889+SayaAndy@users.noreply.github.com> 2026-05-02 23:49:00 +0700
committerGravatar GitHub <noreply@github.com> 2026-05-02 23:49:00 +0700
commitd8de4ede8c6a0cc02b9c8c30d68155b1f838254c (patch)
tree449701dcf7ac0aafc7f21116b77203d0cc51fc98 /internal/b2/client.go
parent4c05d4c66827d6e5a131c657ee08293bcde497d1 (diff)
parentcca3ff72b5e29b31122c0a0496be741e7bc0162b (diff)
downloadweb-0.14.0.tar.gz
web-0.14.0.zip
v0.14.0 (#27)v0.14.0
* [feat: migrate to uz.saya.casa](https://github.com/SayaAndy/saya-today-web/commit/d3a63ca8a84bf4583bac8f5fd09bd52774bc4158) * [feat: overhaul the design of blog catalog](https://github.com/SayaAndy/saya-today-web/commit/99294b260661a8d3f6992404de7881945eab837b) * [feat: replace font-andika with M PLUS and Gentium Plus](https://github.com/SayaAndy/saya-today-web/commit/b1355436e96f2dfa777e843b53896d0bb71628e3) * [feat: use yandexcloud.kz for photos & static](https://github.com/SayaAndy/saya-today-web/commit/3898baa47faf268864ecac3699f7e98c6cac01a4) * [feat: move from b2 to s3 for blog pages & facts](https://github.com/SayaAndy/saya-today-web/commit/3efa6ed24713658af855c0ca9504f3e089342182) * [feat: support s3 for blog pages](https://github.com/SayaAndy/saya-today-web/commit/66b2a96fcca113105043be3cb9c49f8ee7fe240c) * [feat: use accent colors for glightbox tooltip](https://github.com/SayaAndy/saya-today-web/commit/81a9147c5406e3b2f2441373b935d7c5de2780da) * [fix: set sidecar onclick attribute correctly in update](https://github.com/SayaAndy/saya-today-web/commit/941bd3b3f3e26ca62757a34a20bc9b323be02a74) * [fix: set cache-control for non-cacheable pages](https://github.com/SayaAndy/saya-today-web/commit/78d6b00cd973e4254ea13cbb17bb35a30fef51b9) * [feat: update font-awesome 6.7.2 to 7.2.0](https://github.com/SayaAndy/saya-today-web/commit/5e64aa9db2796e8aa6267d2ed9179ea01dc6561b) * [fix: remove leading slash in path with going up](https://github.com/SayaAndy/saya-today-web/commit/13428b467f752d9b53b39a3c8122998f1896ed1e) * [feat: implement rate limiting](https://github.com/SayaAndy/saya-today-web/commit/ca1f36376865cb2a20923aa62fdff3ee217abde3) * [feat: integrate unix sockets into stage & prod](https://github.com/SayaAndy/saya-today-web/commit/507bcbac6b1bf9f1a731afbe82bec10700f4028c) * [feat: compact & move new fonts into yandexcloud.kz](https://github.com/SayaAndy/saya-today-web/pull/27/commits/cca3ff72b5e29b31122c0a0496be741e7bc0162b) * [feat: update all github actions, golang dependencies, golang to 1.26, alpine to 3.23](https://github.com/SayaAndy/saya-today-web/commit/a3aa1dd07abfbbb27a7dfeeb536a6fcc51709256) * [refactor: simpler frontmatter parser (replace regexp with bytes pkg)](https://github.com/SayaAndy/saya-today-web/commit/42bf9d8e7f459f9021fb6fb389d3b51fed5edc35) * [feat: allow some api methods + disallow user pages for bots](https://github.com/SayaAndy/saya-today-web/commit/e3c80a07514a052adafd5c0f51daf69b664530e0)
Diffstat (limited to 'internal/b2/client.go')
-rw-r--r--internal/b2/client.go136
1 files changed, 0 insertions, 136 deletions
diff --git a/internal/b2/client.go b/internal/b2/client.go
deleted file mode 100644
index fda79e0..0000000
--- a/internal/b2/client.go
+++ /dev/null
@@ -1,136 +0,0 @@
-package b2
-
-import (
- "context"
- "fmt"
- "slices"
- "strings"
- "time"
-
- "github.com/Backblaze/blazer/b2"
- "github.com/SayaAndy/saya-today-web/config"
- "github.com/SayaAndy/saya-today-web/internal/frontmatter"
-)
-
-type B2Client struct {
- prefix string
- bucket *b2.Bucket
- b2cl *b2.Client
-}
-
-func NewB2Client(cfg *config.B2Config) (*B2Client, error) {
- b2cl, err := b2.NewClient(context.Background(), cfg.KeyID, cfg.ApplicationKey)
- if err != nil {
- return nil, err
- }
-
- bucket, err := b2cl.Bucket(context.Background(), cfg.BucketName)
- if err != nil {
- return nil, err
- }
-
- return &B2Client{b2cl: b2cl, bucket: bucket, prefix: cfg.Prefix}, nil
-}
-
-type BlogPage struct {
- Link string
- FileName string
- Lang string
- ModifiedTime time.Time
- Metadata *frontmatter.Metadata
-}
-
-func (c *B2Client) Scan(prefix string) ([]*BlogPage, error) {
- filePaths := []*BlogPage{}
-
- iter := c.bucket.List(context.Background(), b2.ListPrefix(c.prefix+prefix))
-
- for iter.Next() {
- obj := iter.Object()
- if obj == nil {
- return nil, fmt.Errorf("failed to reference object in B2 bucket")
- }
-
- attrs, err := obj.Attrs(context.Background())
- if err != nil {
- return nil, fmt.Errorf("get attributes for object: %w", err)
- }
-
- if attrs.Status != b2.Uploaded {
- continue
- }
-
- if !strings.Contains(attrs.ContentType, "text/markdown") {
- continue
- }
-
- if _, ok := attrs.Info["title"]; !ok {
- continue
- }
-
- publishedTime, err := time.Parse(time.RFC3339, attrs.Info["published-time"])
- if err != nil {
- return nil, fmt.Errorf("failed to parse published time metadata field: %w", err)
- }
-
- linkParts := strings.Split(obj.Name(), "/")
- nameParts := strings.Split(linkParts[len(linkParts)-1], ".")
- fileName := strings.Join(nameParts[:len(linkParts)-1], ".")
-
- tags := strings.Split(attrs.Info["tags"], ",")
- slices.Sort(tags)
-
- lang, _ := strings.CutPrefix(linkParts[0], c.prefix)
-
- filePaths = append(filePaths, &BlogPage{
- Link: obj.Name(),
- FileName: fileName,
- Lang: lang,
- ModifiedTime: attrs.LastModified,
- Metadata: &frontmatter.Metadata{
- Title: attrs.Info["title"],
- ShortDescription: attrs.Info["short-description"],
- ActionDate: attrs.Info["action-date"],
- PublishedTime: publishedTime,
- Thumbnail: attrs.Info["thumbnail"],
- Tags: tags,
- Geolocation: attrs.Info["geolocation"],
- },
- })
- }
-
- if err := iter.Err(); err != nil {
- return nil, fmt.Errorf("iterate over B2 objects: %w", err)
- }
-
- return filePaths, nil
-}
-
-func (c *B2Client) ReadAll(path string) ([]byte, error) {
- obj := c.bucket.Object(c.prefix + path)
- if obj == nil {
- return nil, fmt.Errorf("failed to reference object in B2 bucket")
- }
- attrs, err := obj.Attrs(context.Background())
- if err != nil {
- return nil, fmt.Errorf("error getting attributes of an object: %w", err)
- }
-
- content := make([]byte, attrs.Size)
- reader := obj.NewReader(context.Background())
-
- if _, err = reader.Read(content); err != nil {
- return nil, fmt.Errorf("failed to read file content: %w", err)
- }
-
- return content, nil
-}
-
-func (c *B2Client) ReadFrontmatter(path string) (metadata *frontmatter.Metadata, markdown []byte, err error) {
- contentBytes, err := c.ReadAll(path)
- if err != nil {
- return nil, nil, fmt.Errorf("failed to read file for frontmatter parsing: %w", err)
- }
-
- return frontmatter.ParseFrontmatter(contentBytes)
-}