Skip to content

Commit abf9fd1

Browse files
authored
refactor: update minio api version (#26)
* refactor: update minio api version * chore: add `STORAGE_BUCKET_PREFIX` to the env example * ci: chore change build matrix
1 parent c32cecb commit abf9fd1

File tree

7 files changed

+132
-45
lines changed

7 files changed

+132
-45
lines changed

.env.example

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ STORAGE_CLIENT_ID=
33
STORAGE_CLIENT_SECRET=
44
STORAGE_ENDPOINT=
55
STORAGE_BUCKET=
6+
STORAGE_BUCKET_PREFIX=
67
ORIGIN_URL="" # eg: "http://localhost" depending on your nginx config changes
78
GITHUB_TOKEN="" # required for github version resolutions
89

.github/workflows/go.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ jobs:
1414
runs-on: ubuntu-latest
1515
strategy:
1616
matrix:
17-
version: ["1.19.0", "1.21.5", "1.22.2"]
17+
version: ["1.21", "1.22"]
1818
steps:
1919
- uses: actions/checkout@v3
2020

cmd/goblin-api/main.go

+15-3
Original file line numberDiff line numberDiff line change
@@ -140,25 +140,37 @@ func main() {
140140
}
141141

142142
func clearStorageBackgroundJob() {
143+
if !isStorageEnabled() {
144+
log.Printf("Clearer Disabled since storage is disabled")
145+
return
146+
}
147+
143148
cacheHoldEnv := env.Get("CLEAR_CACHE_TIME", "")
144149
if len(cacheHoldEnv) == 0 {
145150
return
146151
}
147152

148-
cacheHoldDuration, _ := time.ParseDuration(cacheHoldEnv)
153+
cacheHoldDuration, err := time.ParseDuration(cacheHoldEnv)
154+
if err != nil {
155+
log.Println(err)
156+
return
157+
}
158+
log.Printf("Clearer Initialized for: %v\n", cacheHoldDuration)
149159

150160
cleaner := func(storageClient storage.Storage) {
151161
log.Println("Cleaning Cached Storage Object")
152162
objects := storageClient.ListObjects()
163+
now := time.Now()
153164
for _, obj := range objects {
154165
objExpiry := obj.LastModified.Add(cacheHoldDuration)
155-
if time.Now().Equal(objExpiry) || time.Now().After(objExpiry) {
166+
if now.Equal(objExpiry) || now.After(objExpiry) {
156167
storageClient.RemoveObject(obj.Key)
157168
}
158169
}
159170
}
160171

161-
ticker := time.NewTicker(cacheHoldDuration)
172+
tickerDur, _ := time.ParseDuration("2m")
173+
ticker := time.NewTicker(tickerDur)
162174
quit := make(chan struct{})
163175

164176
go func() {

go.mod

+16-8
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
module github.com/barelyhuman/goblin
22

3-
go 1.19
3+
go 1.21
4+
5+
toolchain go1.22.2
46

57
require (
68
github.com/Masterminds/semver v1.5.0
79
github.com/barelyhuman/go v0.2.2
810
github.com/google/go-github/v53 v53.2.0
911
github.com/joho/godotenv v1.5.1
10-
github.com/minio/minio-go v6.0.14+incompatible
12+
github.com/minio/minio-go/v7 v7.0.77
1113
github.com/tj/go-semver v1.0.0
1214
go.uber.org/ratelimit v0.3.1
1315
golang.org/x/oauth2 v0.16.0
@@ -17,15 +19,21 @@ require (
1719
github.com/ProtonMail/go-crypto v1.0.0 // indirect
1820
github.com/benbjohnson/clock v1.3.0 // indirect
1921
github.com/cloudflare/circl v1.3.7 // indirect
22+
github.com/dustin/go-humanize v1.0.1 // indirect
2023
github.com/go-ini/ini v1.67.0 // indirect
24+
github.com/goccy/go-json v0.10.3 // indirect
2125
github.com/golang/protobuf v1.5.3 // indirect
2226
github.com/google/go-querystring v1.1.0 // indirect
23-
github.com/mitchellh/go-homedir v1.1.0 // indirect
24-
github.com/stretchr/testify v1.8.1 // indirect
25-
golang.org/x/crypto v0.18.0 // indirect
26-
golang.org/x/net v0.20.0 // indirect
27-
golang.org/x/sys v0.16.0 // indirect
28-
golang.org/x/text v0.14.0 // indirect
27+
github.com/google/uuid v1.6.0 // indirect
28+
github.com/klauspost/compress v1.17.9 // indirect
29+
github.com/klauspost/cpuid/v2 v2.2.8 // indirect
30+
github.com/minio/md5-simd v1.1.2 // indirect
31+
github.com/rs/xid v1.6.0 // indirect
32+
golang.org/x/crypto v0.26.0 // indirect
33+
golang.org/x/net v0.28.0 // indirect
34+
golang.org/x/sys v0.24.0 // indirect
35+
golang.org/x/text v0.17.0 // indirect
2936
google.golang.org/appengine v1.6.8 // indirect
3037
google.golang.org/protobuf v1.32.0 // indirect
38+
gopkg.in/yaml.v3 v3.0.1 // indirect
3139
)

go.sum

+29-19
Original file line numberDiff line numberDiff line change
@@ -13,49 +13,60 @@ github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBS
1313
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
1414
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
1515
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
16+
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
17+
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
1618
github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A=
1719
github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
20+
github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA=
21+
github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
1822
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
1923
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
2024
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
2125
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
2226
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
2327
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
2428
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
29+
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
2530
github.com/google/go-github/v53 v53.2.0 h1:wvz3FyF53v4BK+AsnvCmeNhf8AkTaeh2SoYu/XUvTtI=
2631
github.com/google/go-github/v53 v53.2.0/go.mod h1:XhFRObz+m/l+UCm9b7KSIC3lT3NWSXGt7mOsAWEloao=
2732
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
2833
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
34+
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
35+
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
2936
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
3037
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
31-
github.com/minio/minio-go v6.0.14+incompatible h1:fnV+GD28LeqdN6vT2XdGKW8Qe/IfjJDswNVuni6km9o=
32-
github.com/minio/minio-go v6.0.14+incompatible/go.mod h1:7guKYtitv8dktvNUGrhzmNlA5wrAABTQXCoesZdFQO8=
33-
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
34-
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
38+
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
39+
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
40+
github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
41+
github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM=
42+
github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
43+
github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
44+
github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=
45+
github.com/minio/minio-go/v7 v7.0.77 h1:GaGghJRg9nwDVlNbwYjSDJT1rqltQkBFDsypWX1v3Bw=
46+
github.com/minio/minio-go/v7 v7.0.77/go.mod h1:AVM3IUN6WwKzmwBxVdjzhH8xq+f57JSbbvzqvUzR6eg=
3547
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
3648
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
49+
github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU=
50+
github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=
3751
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
38-
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
39-
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
4052
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
41-
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
42-
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
43-
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
44-
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
53+
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
54+
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
4555
github.com/tj/assert v0.0.0-20190920132354-ee03d75cd160 h1:NSWpaDaurcAJY7PkL8Xt0PhZE7qpvbZl5ljd8r6U0bI=
4656
github.com/tj/assert v0.0.0-20190920132354-ee03d75cd160/go.mod h1:mZ9/Rh9oLWpLLDRpvE+3b7gP/C2YyLFYxNmcLnPTMe0=
4757
github.com/tj/go-semver v1.0.0 h1:vpn6Jmn6Hi3QSmrP1PzYcqScop9IZiGCVOSn18wzu8w=
4858
github.com/tj/go-semver v1.0.0/go.mod h1:YZuwVc013rh7KDV0k6tPbWrFeEHBHcp8amfJL+nHzjM=
4959
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
5060
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
61+
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
5162
go.uber.org/ratelimit v0.3.1 h1:K4qVE+byfv/B3tC+4nYWP7v/6SimcO7HzHekoMNBma0=
5263
go.uber.org/ratelimit v0.3.1/go.mod h1:6euWsTB6U/Nb3X++xEUXA8ciPJvr19Q/0h1+oDcJhRk=
5364
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
5465
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
5566
golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
5667
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
57-
golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc=
58-
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
68+
golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw=
69+
golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
5970
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
6071
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
6172
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
@@ -64,8 +75,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug
6475
golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
6576
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
6677
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
67-
golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo=
68-
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
78+
golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
79+
golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
6980
golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ=
7081
golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o=
7182
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -80,8 +91,8 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
8091
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
8192
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
8293
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
83-
golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU=
84-
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
94+
golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg=
95+
golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
8596
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
8697
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
8798
golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
@@ -94,8 +105,8 @@ golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
94105
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
95106
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
96107
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
97-
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
98-
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
108+
golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
109+
golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
99110
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
100111
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
101112
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
@@ -110,6 +121,5 @@ google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7
110121
google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
111122
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
112123
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
113-
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
114124
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
115125
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

readme.md

+1
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ The server can be configured easily using environment variables
173173
| STORAGE_CLIENT_SECRET | <empty> | CLIENT_SECRET of a S3 compatible storage | |
174174
| STORAGE_ENDPOINT | <empty> | Endpoint value of an S3 compatible storage | |
175175
| STORAGE_BUCKET | <empty> | Bucket name of the S3 compatible storage | |
176+
| STORAGE_BUCKET_PREFIX | <empty> | folder/namespace to store the files inside the bucket | |
176177
| PORT | `3000` | Default port for running the application | |
177178
| ORIGIN_URL | `http://localhost:${PORT}` | Default URL of the application | |
178179
| GITHUB_TOKEN | <empty> | Github authentication token for accessing github repositories and resolving versions | |

storage/minio.go

+69-14
Original file line numberDiff line numberDiff line change
@@ -2,46 +2,65 @@ package storage
22

33
import (
44
"bytes"
5+
"context"
56
"fmt"
67
"log"
78
"net/url"
9+
"path/filepath"
10+
"strings"
811
"time"
912

1013
"github.com/barelyhuman/go/env"
11-
"github.com/minio/minio-go"
14+
"github.com/minio/minio-go/v7"
15+
"github.com/minio/minio-go/v7/pkg/credentials"
1216
)
1317

1418
type S3Storage struct {
15-
client *minio.Client
16-
bucket string
19+
client *minio.Client
20+
bucket string
21+
bucketPrefix string
22+
ctx context.Context
1723
}
1824

1925
func NewAWSStorage(bucket string) *S3Storage {
2026
clientId := env.Get("STORAGE_CLIENT_ID", "")
2127
clientSecret := env.Get("STORAGE_CLIENT_SECRET", "")
2228
endpoint := env.Get("STORAGE_ENDPOINT", "")
29+
bucketPrefix := env.Get("STORAGE_BUCKET_PREFIX", "")
2330
ssl := true
31+
ctx := context.Background()
2432

2533
// Initiate a client using DigitalOcean Spaces.
26-
client, err := minio.New(endpoint, clientId, clientSecret, ssl)
34+
creds := credentials.NewStaticV4(clientId, clientSecret, "")
35+
opts := minio.Options{
36+
Secure: ssl,
37+
Creds: creds,
38+
Region: "blr1",
39+
}
40+
client, err := minio.New(endpoint, &opts)
2741
if err != nil {
2842
log.Fatal(err)
2943
}
3044

31-
bucketExists, _ := client.BucketExists(bucket)
45+
bucketExists, _ := client.BucketExists(ctx, bucket)
46+
47+
fmt.Printf("bucketExists: %v\n", bucketExists)
3248

3349
if !bucketExists {
3450
err := client.MakeBucket(
51+
ctx,
3552
bucket,
36-
"blr1",
53+
minio.MakeBucketOptions{
54+
Region: "blr1",
55+
},
3756
)
3857
if err != nil {
3958
log.Fatal(err)
4059
}
4160
}
4261

4362
// List all Spaces.
44-
spaces, err := client.ListBuckets()
63+
spaces, err := client.ListBuckets(ctx)
4564
if err != nil {
4665
log.Fatal(err)
4766
}
@@ -50,8 +69,10 @@ func NewAWSStorage(bucket string) *S3Storage {
5069
}
5170

5271
return &S3Storage{
53-
client: client,
54-
bucket: bucket,
72+
client: client,
73+
bucketPrefix: bucketPrefix,
74+
bucket: bucket,
75+
ctx: ctx,
5576
}
5677
}
5778

@@ -62,8 +83,9 @@ func (a *S3Storage) Connect() error {
6283
func (a *S3Storage) Upload(objectName string, data bytes.Buffer) error {
6384
dataBytes := bytes.NewReader(data.Bytes())
6485
_, err := a.client.PutObject(
86+
a.ctx,
6587
a.bucket,
66-
objectName,
88+
filepath.Join(a.bucketPrefix, objectName),
6789
dataBytes,
6890
dataBytes.Size(),
6991
minio.PutObjectOptions{},
@@ -72,16 +94,29 @@ func (a *S3Storage) Upload(objectName string, data bytes.Buffer) error {
7294
}
7395

7496
func (a *S3Storage) HasObject(objectName string) bool {
75-
obj, err := a.client.StatObject(a.bucket, objectName, minio.StatObjectOptions{})
97+
objectKey := objectName
98+
99+
if !strings.HasPrefix(objectName, a.bucketPrefix) {
100+
objectKey = filepath.Join(a.bucketPrefix, objectName)
101+
}
102+
103+
obj, err := a.client.StatObject(a.ctx, a.bucket, objectKey, minio.StatObjectOptions{})
76104
if err != nil {
77105
return false
78106
}
79107
return len(obj.Key) > 0
80108
}
81109

82110
func (a *S3Storage) GetSignedURL(objectName string) (string, error) {
111+
objectKey := objectName
112+
113+
if !strings.HasPrefix(objectName, a.bucketPrefix) {
114+
objectKey = filepath.Join(a.bucketPrefix, objectName)
115+
}
116+
83117
url, err := a.client.PresignedGetObject(
84-
a.bucket, objectName, time.Minute*15, url.Values{},
118+
a.ctx,
119+
a.bucket, objectKey, time.Minute*15, url.Values{},
85120
)
86121
return url.String(), err
87122
}
@@ -91,7 +126,21 @@ func (a *S3Storage) ListObjects() []MicroObject {
91126
defer close(doneCh)
92127
recursive := true
93128
collection := []MicroObject{}
94-
for obj := range a.client.ListObjectsV2(a.bucket, "", recursive, doneCh) {
129+
130+
for obj := range a.client.ListObjects(a.ctx, a.bucket, minio.ListObjectsOptions{
131+
Recursive: recursive,
132+
WithMetadata: true,
133+
UseV1: true,
134+
Prefix: filepath.Join(a.bucketPrefix),
135+
}) {
136+
if obj.Err != nil {
137+
fmt.Printf("obj.Err: %v\n", obj.Err)
138+
continue
139+
}
140+
if filepath.Clean(obj.Key) == a.bucketPrefix {
141+
continue
142+
}
143+
95144
collection = append(collection,
96145
MicroObject{
97146
LastModified: obj.LastModified,
@@ -103,7 +152,13 @@ func (a *S3Storage) ListObjects() []MicroObject {
103152
}
104153

105154
func (a *S3Storage) RemoveObject(objectName string) (bool, error) {
106-
err := a.client.RemoveObject(a.bucket, objectName)
155+
objectKey := objectName
156+
157+
if !strings.HasPrefix(objectName, a.bucketPrefix) {
158+
objectKey = filepath.Join(a.bucketPrefix, objectName)
159+
}
160+
161+
err := a.client.RemoveObject(a.ctx, a.bucket, objectKey, minio.RemoveObjectOptions{})
107162
if err != nil {
108163
return false, err
109164
}

0 commit comments

Comments
 (0)