Skip to content
Merged

Wip #32

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,17 @@ MINIO_SECRET_KEY=
MINIO_SECURE=

GOOGLE_CREDS_PATH=
IMAGE_EMBEDDING_PROJECTNAME=
EMBEDDING_PROJECTNAME=
SERVICE_VERSION=
RELEASE_VERSION=

TELEGRAM_TOKEN=
TELEGRAM_WEBHOOK_EXTERNALURL=

POSTGRES_USER=
POSTGRES_PASSWORD=
POSTGRES_DB=
POSTGRES_DB=

FFMPEG_BINARY=
FFMPEG_CPULIMIT=
FFMPEG_THREADSLIMIT=
33 changes: 23 additions & 10 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ jobs:
host: ${{ vars.SSH_HOST }}
username: ${{ vars.SSH_USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
envs: ELASTIC_USERNAME,ELASTIC_PASSWORD,ELASTIC_JAVA_OPTS,MINIO_ENDPOINT,MINIO_ACCESS_KEY,MINIO_SECRET_KEY,MINIO_SECURE,IMAGE_EMBEDDING_PROJECTNAME,GOOGLE_CREDS_PATH,REPO_URL,DEPLOY_PATH,RELEASE_VERSION,TELEGRAM_TOKEN,POSTGRES_DB,POSTGRES_PASSWORD,TAG
envs: ELASTIC_CLOUDID,ELASTIC_APIKEY,METADATA_ELASTIC_INDEX,TAG_ELASTIC_INDEX,MINIO_ENDPOINT,MINIO_ACCESS_KEY,MINIO_SECRET_KEY,MINIO_SECURE,EMBEDDING_PROJECTNAME,GOOGLE_CREDS_PATH,REPO_URL,DEPLOY_PATH,RELEASE_VERSION,TELEGRAM_TOKEN,POSTGRES_DB,POSTGRES_PASSWORD,TAG,TELEGRAM_WEBHOOK_EXTERNALURL,FFMPEG_CPULIMIT,MEDIA_STORAGE_BUCKET,TEMP_STORAGE_BUCKET
script: |
if [ ! -d "$DEPLOY_PATH/.git" ]; then
git clone "$REPO_URL" "$DEPLOY_PATH"
Expand All @@ -81,14 +81,17 @@ jobs:
docker compose pull
docker compose -p memelo up -d --wait --wait-timeout 300
env:
ELASTIC_USERNAME: ${{ vars.ELASTIC_USERNAME }}
ELASTIC_PASSWORD: ${{ secrets.ELASTIC_PASSWORD }}
ELASTIC_JAVA_OPTS: ${{ vars.ELASTIC_JAVA_OPTS }}
ELASTIC_CLOUDID: ${{ secrets.ELASTIC_CLOUDID }}
ELASTIC_APIKEY: ${{ secrets.ELASTIC_APIKEY }}
METADATA_ELASTIC_INDEX: ${{vars.METADATA_ELASTIC_INDEX}}
TAG_ELASTIC_INDEX: ${{vars.TAG_ELASTIC_INDEX}}

MINIO_ENDPOINT: ${{ vars.MINIO_ENDPOINT }}
MINIO_ACCESS_KEY: ${{ vars.MINIO_ACCESS_KEY }}
MINIO_SECRET_KEY: ${{ secrets.MINIO_SECRET_KEY }}
MINIO_SECURE: ${{ vars.MINIO_SECURE }}
IMAGE_EMBEDDING_PROJECTNAME: ${{ vars.IMAGE_EMBEDDING_PROJECTNAME }}

EMBEDDING_PROJECTNAME: ${{ vars.EMBEDDING_PROJECTNAME }}
GOOGLE_CREDS_PATH: ${{ vars.GOOGLE_CREDS_PATH }}
TELEGRAM_TOKEN: ${{secrets.TELEGRAM_TOKEN}}
POSTGRES_DB: ${{vars.POSTGRES_DB}}
Expand All @@ -98,6 +101,10 @@ jobs:
DEPLOY_PATH: ${{ vars.DEPLOY_REPO_PATH }}
RELEASE_VERSION: dev-${{ github.sha }}
TAG: ${{ github.sha }}
TELEGRAM_WEBHOOK_EXTERNALURL: ${{vars.TELEGRAM_WEBHOOK_EXTERNALURL}}
FFMPEG_CPULIMIT: ${{vars.FFMPEG_CPULIMIT}}
MEDIA_STORAGE_BUCKET: ${{vars.MEDIA_STORAGE_BUCKET}}
TEMP_STORAGE_BUCKET: ${{vars.TEMP_STORAGE_BUCKET}}

- name: Tests
uses: robherley/go-test-action@v0
Expand Down Expand Up @@ -174,7 +181,7 @@ jobs:
host: ${{ vars.SSH_HOST }}
username: ${{ vars.SSH_USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
envs: ELASTIC_USERNAME,ELASTIC_PASSWORD,ELASTIC_JAVA_OPTS,MINIO_ENDPOINT,MINIO_ACCESS_KEY,MINIO_SECRET_KEY,MINIO_SECURE,IMAGE_EMBEDDING_PROJECTNAME,GOOGLE_CREDS_PATH,REPO_URL,DEPLOY_PATH,RELEASE_VERSION,TELEGRAM_TOKEN,POSTGRES_DB,POSTGRES_PASSWORD,TAG
envs: ELASTIC_CLOUDID,ELASTIC_APIKEY,METADATA_ELASTIC_INDEX,TAG_ELASTIC_INDEX,MINIO_ENDPOINT,MINIO_ACCESS_KEY,MINIO_SECRET_KEY,MINIO_SECURE,EMBEDDING_PROJECTNAME,GOOGLE_CREDS_PATH,REPO_URL,DEPLOY_PATH,RELEASE_VERSION,TELEGRAM_TOKEN,POSTGRES_DB,POSTGRES_PASSWORD,TAG,TELEGRAM_WEBHOOK_EXTERNALURL,FFMPEG_CPULIMIT,MEDIA_STORAGE_BUCKET,TEMP_STORAGE_BUCKET
script: |
if [ ! -d "$DEPLOY_PATH/.git" ]; then
git clone "$REPO_URL" "$DEPLOY_PATH"
Expand All @@ -197,14 +204,16 @@ jobs:
docker compose pull
docker compose -p memelo up -d --wait --wait-timeout 300
env:
ELASTIC_USERNAME: ${{ vars.ELASTIC_USERNAME }}
ELASTIC_PASSWORD: ${{ secrets.ELASTIC_PASSWORD }}
ELASTIC_JAVA_OPTS: ${{ vars.ELASTIC_JAVA_OPTS }}
ELASTIC_CLOUDID: ${{ secrets.ELASTIC_CLOUDID }}
ELASTIC_APIKEY: ${{ secrets.ELASTIC_APIKEY }}
METADATA_ELASTIC_INDEX: ${{vars.METADATA_ELASTIC_INDEX}}
TAG_ELASTIC_INDEX: ${{vars.TAG_ELASTIC_INDEX}}

MINIO_ENDPOINT: ${{ vars.MINIO_ENDPOINT }}
MINIO_ACCESS_KEY: ${{ vars.MINIO_ACCESS_KEY }}
MINIO_SECRET_KEY: ${{ secrets.MINIO_SECRET_KEY }}
MINIO_SECURE: ${{ vars.MINIO_SECURE }}
IMAGE_EMBEDDING_PROJECTNAME: ${{ vars.IMAGE_EMBEDDING_PROJECTNAME }}
EMBEDDING_PROJECTNAME: ${{ vars.EMBEDDING_PROJECTNAME }}
GOOGLE_CREDS_PATH: ${{ vars.GOOGLE_CREDS_PATH }}
TELEGRAM_TOKEN: ${{secrets.TELEGRAM_TOKEN}}
POSTGRES_DB: ${{vars.POSTGRES_DB}}
Expand All @@ -214,6 +223,10 @@ jobs:
DEPLOY_PATH: ${{ vars.DEPLOY_REPO_PATH }}
RELEASE_VERSION: ${{ github.ref_name }}
TAG: ${{ github.sha }}
TELEGRAM_WEBHOOK_EXTERNALURL: ${{vars.TELEGRAM_WEBHOOK_EXTERNALURL}}
FFMPEG_CPULIMIT: ${{vars.FFMPEG_CPULIMIT}}
MEDIA_STORAGE_BUCKET: ${{vars.MEDIA_STORAGE_BUCKET}}
TEMP_STORAGE_BUCKET: ${{vars.TEMP_STORAGE_BUCKET}}

- name: Tests
uses: robherley/go-test-action@v0
Expand Down
5 changes: 2 additions & 3 deletions Dockerfile-storage-service
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM golang:1.24.10-alpine AS builder
FROM golang:1.25.0-alpine AS builder

WORKDIR /app
RUN apk add --update --no-cache bash curl \
Expand All @@ -15,11 +15,10 @@
FROM alpine:latest

WORKDIR /app
RUN apk add curl
RUN apk add vips vips-poppler
RUN apk add curl vips vips-poppler ffmpeg cpulimit
COPY --from=builder /app/storage-service/output.bin storage-service

WORKDIR /app/config
ENV APPLICATION_CONFIGPATH "/app/config"

Check warning on line 22 in Dockerfile-storage-service

View workflow job for this annotation

GitHub Actions / build

Legacy key/value format with whitespace separator should not be used

LegacyKeyValueFormat: "ENV key=value" should be used instead of legacy "ENV key value" format More info: https://docs.docker.com/go/dockerfile/rule/legacy-key-value-format/

WORKDIR /app
Expand Down
2 changes: 1 addition & 1 deletion Dockerfile-telegram-service
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM golang:1.24.10-alpine AS builder
FROM golang:1.25.0-alpine AS builder

WORKDIR /app
RUN apk add --update --no-cache bash curl \
Expand All @@ -20,6 +20,6 @@
COPY --from=builder /app/telegram-service/output.bin telegram-service

WORKDIR /app/config
ENV APPLICATION_CONFIGPATH "/app/config"

Check warning on line 23 in Dockerfile-telegram-service

View workflow job for this annotation

GitHub Actions / build

Legacy key/value format with whitespace separator should not be used

LegacyKeyValueFormat: "ENV key=value" should be used instead of legacy "ENV key value" format More info: https://docs.docker.com/go/dockerfile/rule/legacy-key-value-format/

WORKDIR /app
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ Integration services ──(gRPC)─► storage-service

**Start dependencies:**
```sh
docker compose up elasticsearch minio -d
docker compose up elasticsearch service -d
```

This starts Elasticsearch (`:9200`), MinIO (`:9000`).
Expand Down
8 changes: 8 additions & 0 deletions common/config/InitConfig.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,11 @@ type ServerConfig struct {
type LoggingConfig struct {
Level string
}

type MediaStorageConfig struct {
Endpoint string
AccessKey string
SecretKey string
Bucket string
Secure bool
}
14 changes: 12 additions & 2 deletions common/go.mod
Original file line number Diff line number Diff line change
@@ -1,21 +1,29 @@
module github.com/weoses/memelo/common

go 1.24.10
go 1.25.0

require (
github.com/google/uuid v1.5.0
github.com/google/uuid v1.6.0
github.com/joho/godotenv v1.5.1
github.com/spf13/viper v1.19.0
)

require (
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/fsnotify/fsnotify v1.9.0 // indirect
github.com/go-ini/ini v1.67.0 // indirect
github.com/goccy/go-json v0.10.4 // indirect
github.com/google/go-cmp v0.7.0 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/klauspost/compress v1.17.11 // indirect
github.com/klauspost/cpuid/v2 v2.2.9 // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/minio/md5-simd v1.1.2 // indirect
github.com/minio/minio-go/v7 v7.0.84 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
github.com/rogpeppe/go-internal v1.13.1 // indirect
github.com/rs/xid v1.6.0 // indirect
github.com/sagikazarmark/locafero v0.4.0 // indirect
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
github.com/sourcegraph/conc v0.3.0 // indirect
Expand All @@ -25,7 +33,9 @@ require (
github.com/stretchr/testify v1.11.1 // indirect
github.com/subosito/gotenv v1.6.0 // indirect
go.uber.org/multierr v1.10.0 // indirect
golang.org/x/crypto v0.31.0 // indirect
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect
golang.org/x/net v0.33.0 // indirect
golang.org/x/sys v0.38.0 // indirect
golang.org/x/text v0.31.0 // indirect
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
Expand Down
23 changes: 23 additions & 0 deletions common/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,31 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A=
github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM=
github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=
github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=
github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=
github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
Expand All @@ -23,6 +36,10 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=
github.com/minio/minio-go/v7 v7.0.84 h1:D1HVmAF8JF8Bpi6IU4V9vIEj+8pc+xU88EWMs2yed0E=
github.com/minio/minio-go/v7 v7.0.84/go.mod h1:57YXpvc5l3rjPdhqNrDsvVlY0qPI6UTk1bflAe+9doY=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
Expand All @@ -32,6 +49,8 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU=
github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=
github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
Expand Down Expand Up @@ -60,8 +79,12 @@ github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=
go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g=
golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k=
golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
Expand Down
34 changes: 34 additions & 0 deletions common/helper/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,31 @@ package helper
import (
"crypto/md5"
"encoding/hex"
"io"
)

type ErrLogger interface {
Error(msg string, args ...any)
}

func QuietClose(c io.Closer, logger ErrLogger) {
if c == nil {
return
}
if err := c.Close(); err != nil {
logger.Error("failed to close", "error", err)
}
}

func QuietCloseAll[T io.Closer](c []T, logger ErrLogger) {
if c == nil {
return
}
for _, c := range c {
QuietClose(c, logger)
}
}

func Addr[T any](v T) *T { return &v }

func DefaultString(item *string) string {
Expand All @@ -21,6 +44,17 @@ func TransformSlice[F any, T any](from []F, to []T, transformer func(F) T) []T {
return to
}

func TransformSliceErr[F any, T any](from []F, to []T, transformer func(F) (T, error)) ([]T, error) {
var err error
for i, f := range from {
to[i], err = transformer(f)
if err != nil {
return nil, err
}
}
return to, nil
}

func CalcHash(base64Image string) string {
hasher := md5.New()
hasher.Write([]byte(base64Image))
Expand Down
65 changes: 65 additions & 0 deletions common/service/TmpDataService.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package service

import (
"context"
"fmt"
"io"

"github.com/google/uuid"
"github.com/weoses/memelo/common/storage"
"github.com/weoses/memelo/common/temp"
)

type TmpDataService interface {
ByBytes(ctx context.Context, data []byte) (temp.S3BackedData, error)
ByReader(ctx context.Context, reader io.Reader) (temp.S3BackedData, error)

WrapData(context.Context, temp.Data) (temp.S3BackedData, error)
WrapS3Path(context.Context, string) (temp.S3BackedData, error)
}

type TmpDataServiceImpl struct {
ops storage.S3OperationsAdapter
}

func (s *TmpDataServiceImpl) ByBytes(ctx context.Context, data []byte) (temp.S3BackedData, error) {
return s.WrapData(ctx, temp.DataBytes(data))
}

func (s *TmpDataServiceImpl) ByReader(ctx context.Context, reader io.Reader) (temp.S3BackedData, error) {
data, err := temp.DataTemp(reader)
if err != nil {
return nil, err
}
return s.WrapData(ctx, data)
}

func (s *TmpDataServiceImpl) WrapData(ctx context.Context, data temp.Data) (temp.S3BackedData, error) {
return temp.NewS3BackedDataFromLocal(
data,
s.ops.IsGs(),
func(ctx context.Context, d temp.Data) (string, error) {
path := uuid.NewString()
if err := s.ops.Save(ctx, path, d, storage.WithContentType("application/octet-stream")); err != nil {
return "", fmt.Errorf("upload failed: %w", err)
}
return path, nil
},
s.ops.GetUrl,
s.ops.Delete,
), nil
}

func (s *TmpDataServiceImpl) WrapS3Path(ctx context.Context, path string) (temp.S3BackedData, error) {
return temp.NewS3BackedDataFromPath(
path,
s.ops.IsGs(),
s.ops.Read,
s.ops.GetUrl,
s.ops.Delete,
), nil
}

func NewTmpDataS3Service(ops storage.S3OperationsAdapter) (TmpDataService, error) {
return &TmpDataServiceImpl{ops: ops}, nil
}
Loading
Loading