Skip to content

Commit aa6cc64

Browse files
committed
feat: add file storage, via miniIO
1 parent fa96399 commit aa6cc64

File tree

8 files changed

+198
-2
lines changed

8 files changed

+198
-2
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
data/
2+
.env

cmd/main/main.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,25 @@
11
package main
22

33
import (
4+
"log"
45
"time"
56

67
"github.com/gin-contrib/cors"
78
"github.com/gin-gonic/gin"
89
"github.com/interfacerproject/interfacer-dpp/internal/handler"
10+
"github.com/interfacerproject/interfacer-dpp/internal/storage"
11+
"github.com/joho/godotenv"
912
)
1013

1114
func main() {
15+
err := godotenv.Load("../../.env")
16+
if err != nil {
17+
log.Println("No .env file found, proceeding with environment variables")
18+
}
19+
20+
21+
storage.InitMinio()
22+
1223
router := gin.Default()
1324

1425
router.Use(cors.New(cors.Config{
@@ -25,6 +36,7 @@ func main() {
2536
router.PUT("/dpp/:id", handler.UpdateDPP)
2637
router.DELETE("/dpp/:id", handler.DeleteDPP)
2738
router.GET("/dpps", handler.GetAllDPPs)
39+
router.POST("/upload", handler.UploadFile)
2840

2941
router.Run(":8080")
3042
}

docker-compose.yml

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,59 @@ services:
1111
networks:
1212
- dpp-network
1313

14+
minio:
15+
image: minio/minio:latest
16+
container_name: dpp-minio
17+
ports:
18+
- "9000:9000" # API port
19+
- "9001:9001" # Console UI port
20+
environment:
21+
- MINIO_ROOT_USER=admin
22+
- MINIO_ROOT_PASSWORD=passwordsegreta
23+
command: server /data --console-address ":9001"
24+
volumes:
25+
- minio_data:/data
26+
networks:
27+
- dpp-network
28+
29+
# Job opzionale per creare il bucket automaticamente all'avvio
30+
createbuckets:
31+
image: minio/mc
32+
depends_on:
33+
- minio
34+
networks:
35+
- dpp-network
36+
entrypoint: >
37+
/bin/sh -c "
38+
/usr/bin/mc alias set myminio http://minio:9000 admin passwordsegreta;
39+
/usr/bin/mc mb myminio/dpp-assets;
40+
/usr/bin/mc anonymous set download myminio/dpp-assets;
41+
exit 0;
42+
"
43+
1444
app:
1545
build: .
1646
container_name: dpp-app
1747
ports:
1848
- "8080:8080"
1949
environment:
2050
- MONGODB_URI=mongodb://mongodb:27017
51+
- MINIO_ENDPOINT=minio:9000
52+
- MINIO_ACCESS_KEY=admin
53+
- MINIO_SECRET_KEY=passwordsegreta
54+
- MINIO_BUCKET=dpp-assets
55+
- MINIO_USE_SSL=false
2156
depends_on:
2257
- mongodb
58+
- minio
59+
- createbuckets
2360
networks:
2461
- dpp-network
2562

2663
volumes:
2764
mongodb_data:
65+
minio_data:
2866

2967
networks:
3068
dpp-network:
31-
driver: bridge
69+
driver: bridge

go.mod

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,28 +7,41 @@ require (
77
github.com/bytedance/sonic v1.14.1 // indirect
88
github.com/bytedance/sonic/loader v0.3.0 // indirect
99
github.com/cloudwego/base64x v0.1.6 // indirect
10+
github.com/dustin/go-humanize v1.0.1 // indirect
1011
github.com/dyne/Zenroom/bindings/golang/zenroom v0.0.0-20251114120259-b40f827d54ab // indirect
1112
github.com/gabriel-vasile/mimetype v1.4.10 // indirect
1213
github.com/gin-contrib/cors v1.7.6 // indirect
1314
github.com/gin-contrib/sse v1.1.0 // indirect
1415
github.com/gin-gonic/gin v1.11.0 // indirect
16+
github.com/go-ini/ini v1.67.0 // indirect
1517
github.com/go-playground/locales v0.14.1 // indirect
1618
github.com/go-playground/universal-translator v0.18.1 // indirect
1719
github.com/go-playground/validator/v10 v10.28.0 // indirect
1820
github.com/goccy/go-json v0.10.5 // indirect
1921
github.com/goccy/go-yaml v1.18.0 // indirect
2022
github.com/golang/snappy v1.0.0 // indirect
23+
github.com/google/uuid v1.6.0 // indirect
24+
github.com/joho/godotenv v1.5.1 // indirect
2125
github.com/json-iterator/go v1.1.12 // indirect
22-
github.com/klauspost/compress v1.16.7 // indirect
26+
github.com/klauspost/compress v1.18.0 // indirect
2327
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
28+
github.com/klauspost/crc32 v1.3.0 // indirect
2429
github.com/leodido/go-urn v1.4.0 // indirect
2530
github.com/mattn/go-isatty v0.0.20 // indirect
31+
github.com/minio/crc64nvme v1.1.0 // indirect
32+
github.com/minio/md5-simd v1.1.2 // indirect
33+
github.com/minio/minio-go v6.0.14+incompatible // indirect
34+
github.com/minio/minio-go/v7 v7.0.97 // indirect
35+
github.com/mitchellh/go-homedir v1.1.0 // indirect
2636
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
2737
github.com/modern-go/reflect2 v1.0.2 // indirect
2838
github.com/oklog/ulid/v2 v2.1.1 // indirect
2939
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
40+
github.com/philhofer/fwd v1.2.0 // indirect
3041
github.com/quic-go/qpack v0.5.1 // indirect
3142
github.com/quic-go/quic-go v0.55.0 // indirect
43+
github.com/rs/xid v1.6.0 // indirect
44+
github.com/tinylib/msgp v1.3.0 // indirect
3245
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
3346
github.com/ugorji/go/codec v1.3.0 // indirect
3447
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
@@ -47,4 +60,5 @@ require (
4760
golang.org/x/text v0.30.0 // indirect
4861
golang.org/x/tools v0.38.0 // indirect
4962
google.golang.org/protobuf v1.36.10 // indirect
63+
gopkg.in/yaml.v3 v3.0.1 // indirect
5064
)

go.sum

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI
88
github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU=
99
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
1010
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
11+
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
12+
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
1113
github.com/dyne/Zenroom v5.28.4+incompatible/go.mod h1:v1t1B6sdXailbxgabvlKAaVoq5IGdA+CMfGmtSD80wI=
1214
github.com/dyne/Zenroom/bindings/golang/zenroom v0.0.0-20251114120259-b40f827d54ab h1:HKEYqXSvO5/9JAsG+XEWbRhXtbwokuOxzkPLONSkrTE=
1315
github.com/dyne/Zenroom/bindings/golang/zenroom v0.0.0-20251114120259-b40f827d54ab/go.mod h1:ysQV5vx0OYClaDG0gK2yH/m2h4iGy+0ow+7nVdGXago=
@@ -19,6 +21,8 @@ github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w
1921
github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM=
2022
github.com/gin-gonic/gin v1.11.0 h1:OW/6PLjyusp2PPXtyxKHU0RbX6I/l28FTdDlae5ueWk=
2123
github.com/gin-gonic/gin v1.11.0/go.mod h1:+iq/FyxlGzII0KHiBGjuNn4UNENUlKbGlNmc+W50Dls=
24+
github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A=
25+
github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
2226
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
2327
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
2428
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
@@ -32,16 +36,35 @@ github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7Lk
3236
github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs=
3337
github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
3438
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
39+
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
40+
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
41+
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
42+
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
3543
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
3644
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
3745
github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I=
3846
github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
47+
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
48+
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
49+
github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
3950
github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
4051
github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
52+
github.com/klauspost/crc32 v1.3.0 h1:sSmTt3gUt81RP655XGZPElI0PelVTZ6YwCRnPSupoFM=
53+
github.com/klauspost/crc32 v1.3.0/go.mod h1:D7kQaZhnkX/Y0tstFGf8VUzv2UofNGqCjnC3zdHB0Hw=
4154
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
4255
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
4356
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
4457
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
58+
github.com/minio/crc64nvme v1.1.0 h1:e/tAguZ+4cw32D+IO/8GSf5UVr9y+3eJcxZI2WOO/7Q=
59+
github.com/minio/crc64nvme v1.1.0/go.mod h1:eVfm2fAzLlxMdUGc0EEBGSMmPwmXD5XiNRpnu9J3bvg=
60+
github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
61+
github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=
62+
github.com/minio/minio-go v6.0.14+incompatible h1:fnV+GD28LeqdN6vT2XdGKW8Qe/IfjJDswNVuni6km9o=
63+
github.com/minio/minio-go v6.0.14+incompatible/go.mod h1:7guKYtitv8dktvNUGrhzmNlA5wrAABTQXCoesZdFQO8=
64+
github.com/minio/minio-go/v7 v7.0.97 h1:lqhREPyfgHTB/ciX8k2r8k0D93WaFqxbJX36UZq5occ=
65+
github.com/minio/minio-go/v7 v7.0.97/go.mod h1:re5VXuo0pwEtoNLsNuSr0RrLfT/MBtohwdaSmPPSRSk=
66+
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
67+
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
4568
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
4669
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
4770
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -52,18 +75,24 @@ github.com/oklog/ulid/v2 v2.1.1/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNs
5275
github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o=
5376
github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
5477
github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
78+
github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM=
79+
github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM=
5580
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
5681
github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
5782
github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
5883
github.com/quic-go/quic-go v0.55.0 h1:zccPQIqYCXDt5NmcEabyYvOnomjs8Tlwl7tISjJh9Mk=
5984
github.com/quic-go/quic-go v0.55.0/go.mod h1:DR51ilwU1uE164KuWXhinFcKWGlEjzys2l8zUl5Ss1U=
85+
github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU=
86+
github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=
6087
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
6188
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
6289
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
6390
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
6491
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
6592
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
6693
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
94+
github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww=
95+
github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0=
6796
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
6897
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
6998
github.com/ugorji/go/codec v1.3.0 h1:Qd2W2sQawAfG8XSvzwhBeoGq71zXOC/Q1E9y/wUcsUA=
@@ -141,4 +170,5 @@ google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aO
141170
google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
142171
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
143172
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
173+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
144174
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

internal/handler/handler.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
package handler
22

33
import (
4+
"bytes"
45
"context"
6+
"crypto/sha256"
7+
"encoding/hex"
58
"encoding/json"
9+
"fmt"
610
"io"
711
"log"
812
"net/http"
13+
"path/filepath"
914
"time"
1015

1116
b64 "encoding/base64"
@@ -17,6 +22,9 @@ import (
1722
"github.com/oklog/ulid/v2"
1823
"go.mongodb.org/mongo-driver/bson"
1924
"go.mongodb.org/mongo-driver/v2/mongo"
25+
26+
"github.com/interfacerproject/interfacer-dpp/internal/storage"
27+
"github.com/minio/minio-go/v7"
2028
)
2129

2230
func getCollection() (*mongo.Collection, error) {
@@ -198,3 +206,52 @@ func GetAllDPPs(c *gin.Context) {
198206

199207
c.JSON(http.StatusOK, dpps)
200208
}
209+
210+
func UploadFile(c *gin.Context) {
211+
c.Request.Body = http.MaxBytesReader(c.Writer, c.Request.Body, 10<<20)
212+
213+
file, header, err := c.Request.FormFile("file")
214+
if err != nil {
215+
c.JSON(http.StatusBadRequest, gin.H{"error": "File is required", "details": err.Error()})
216+
return
217+
}
218+
defer file.Close()
219+
220+
hasher := sha256.New()
221+
buffer := bytes.NewBuffer(nil)
222+
if _, err := io.Copy(io.MultiWriter(hasher, buffer), file); err != nil {
223+
c.JSON(http.StatusInternalServerError, gin.H{"error": "Error processing file"})
224+
return
225+
}
226+
checksum := hex.EncodeToString(hasher.Sum(nil))
227+
228+
ext := filepath.Ext(header.Filename)
229+
fileID := ulid.Make().String()
230+
objectName := fmt.Sprintf("%s%s", fileID, ext)
231+
contentType := header.Header.Get("Content-Type")
232+
233+
ctx := context.Background()
234+
_, err = storage.MinioClient.PutObject(ctx, storage.BucketName, objectName, buffer, int64(buffer.Len()), minio.PutObjectOptions{
235+
ContentType: contentType,
236+
})
237+
if err != nil {
238+
log.Printf("MinIO upload error: %v", err)
239+
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to upload file to storage"})
240+
return
241+
}
242+
243+
// PUBLIC_ASSET_URL
244+
fileURL := fmt.Sprintf("http://localhost:9000/%s/%s", storage.BucketName, objectName)
245+
246+
attachment := model.Attachment{
247+
ID: fileID,
248+
FileName: header.Filename,
249+
ContentType: contentType,
250+
URL: fileURL,
251+
Size: header.Size,
252+
Checksum: checksum,
253+
UploadedAt: time.Now(),
254+
}
255+
256+
c.JSON(http.StatusCreated, attachment)
257+
}

internal/model/model.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package model
22

33
import (
44
"github.com/oklog/ulid/v2"
5+
"time"
56
)
67

78
type TransformedValue struct {
@@ -10,6 +11,16 @@ type TransformedValue struct {
1011
Units string `json:"units,omitempty" bson:"units,omitempty"`
1112
}
1213

14+
type Attachment struct {
15+
ID string `bson:"id" json:"id"`
16+
FileName string `bson:"file_name" json:"fileName"`
17+
ContentType string `bson:"content_type" json:"contentType"`
18+
URL string `bson:"url" json:"url"`
19+
Size int64 `bson:"size" json:"size"`
20+
Checksum string `bson:"checksum" json:"checksum"`
21+
UploadedAt time.Time `bson:"uploaded_at" json:"uploadedAt"`
22+
}
23+
1324
type DigitalProductPassport struct {
1425
ID ulid.ULID `json:"id" bson:"_id"`
1526
ProductOverview *ProductOverview `json:"productOverview,omitempty" bson:"productOverview,omitempty"`

internal/storage/minio.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package storage
2+
3+
import (
4+
// "context"
5+
"log"
6+
"os"
7+
8+
"github.com/minio/minio-go/v7"
9+
"github.com/minio/minio-go/v7/pkg/credentials"
10+
)
11+
12+
var MinioClient *minio.Client
13+
var BucketName string
14+
15+
func InitMinio() {
16+
endpoint := os.Getenv("MINIO_ENDPOINT")
17+
accessKeyID := os.Getenv("MINIO_ACCESS_KEY")
18+
secretAccessKey := os.Getenv("MINIO_SECRET_KEY")
19+
BucketName = os.Getenv("MINIO_BUCKET")
20+
useSSL := os.Getenv("MINIO_USE_SSL") == "true"
21+
22+
var err error
23+
MinioClient, err = minio.New(endpoint, &minio.Options{
24+
Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
25+
Secure: useSSL,
26+
})
27+
if err != nil {
28+
log.Fatalln("Failed to connect to MinIO:", err)
29+
}
30+
31+
log.Println("MinIO connected successfully")
32+
}

0 commit comments

Comments
 (0)