From 32329e1e17e8623870d99180ab98f44fde31fb90 Mon Sep 17 00:00:00 2001 From: "Gustavo \"Guz\" L de Mello" Date: Tue, 11 Mar 2025 09:46:03 -0300 Subject: [PATCH] feat: pass s3 client to service --- .EXAMPLE.env | 4 ++++ cmd/cmd.go | 28 ++++++++++++++++++++++++++++ comicverse.go | 11 +++++++++++ go.mod | 11 +++++++++++ go.sum | 22 ++++++++++++++++++++++ service/service.go | 4 ++++ 6 files changed, 80 insertions(+) diff --git a/.EXAMPLE.env b/.EXAMPLE.env index 35e5b93..167909f 100644 --- a/.EXAMPLE.env +++ b/.EXAMPLE.env @@ -1 +1,5 @@ +AWS_ACCESS_KEY_ID=************************** +AWS_SECRET_ACCESS_KEY=**************************************************************** +AWS_DEFAULT_REGION=****** +AWS_ENDPOINT_URL=http://localhost:3900 DATABASE_URL=file://./libsql.db diff --git a/cmd/cmd.go b/cmd/cmd.go index 57d66bb..d497981 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -15,6 +15,9 @@ import ( comicverse "forge.capytal.company/capytalcode/project-comicverse" "forge.capytal.company/loreddev/x/tinyssert" + + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/s3" _ "github.com/tursodatabase/go-libsql" ) @@ -28,6 +31,11 @@ var ( var ( databaseURL = getEnv("DATABASE_URL", "file://./libsql.db") + + awsAccessKeyID = os.Getenv("AWS_ACCESS_KEY_ID") + awsSecretAccessKey = os.Getenv("AWS_SECRET_ACCESS_KEY") + awsDefaultRegion = os.Getenv("AWS_DEFAULT_REGION") + awsEndpointURL = os.Getenv("AWS_ENDPOINT_URL") ) func getEnv(key string, d string) string { @@ -44,6 +52,12 @@ func init() { switch { case databaseURL == "": log.Fatal("DATABASE_URL should not be a empty value") + case awsAccessKeyID == "": + log.Fatal("AWS_ACCESS_KEY_ID should not be a empty value") + case awsDefaultRegion == "": + log.Fatal("AWS_DEFAULT_REGION should not be a empty value") + case awsEndpointURL == "": + log.Fatal("AWS_ENDPOINT_URL should not be a empty value") } } @@ -69,6 +83,20 @@ func main() { os.Exit(1) } + credentials := aws.CredentialsProviderFunc(func(ctx context.Context) (aws.Credentials, error) { + return aws.Credentials{ + AccessKeyID: awsAccessKeyID, + SecretAccessKey: awsSecretAccessKey, + CanExpire: false, + }, nil + }) + storage := s3.New(s3.Options{ + AppID: "comicverse-pre-alpha", + BaseEndpoint: &awsEndpointURL, + Region: awsDefaultRegion, + Credentials: &credentials, + }) + opts := []comicverse.Option{ comicverse.WithContext(ctx), comicverse.WithAssertions(assertions), diff --git a/comicverse.go b/comicverse.go index c0cdbcb..c1e91de 100644 --- a/comicverse.go +++ b/comicverse.go @@ -14,11 +14,14 @@ import ( "forge.capytal.company/capytalcode/project-comicverse/static" "forge.capytal.company/capytalcode/project-comicverse/templates" "forge.capytal.company/loreddev/x/tinyssert" + "github.com/aws/aws-sdk-go-v2/service/s3" ) func New(cfg Config, opts ...Option) (http.Handler, error) { app := &app{ db: cfg.DB, + s3: cfg.S3, + staticFiles: static.Files(), developmentMode: false, context: context.Background(), @@ -34,6 +37,10 @@ func New(cfg Config, opts ...Option) (http.Handler, error) { if app.db == nil { return nil, errors.New("database interface must not be nil") } + if app.s3 == nil { + return nil, errors.New("s3 client must not be nil") + } + if app.staticFiles == nil { return nil, errors.New("static files must not be a nil interface") } @@ -55,6 +62,7 @@ func New(cfg Config, opts ...Option) (http.Handler, error) { type Config struct { DB *sql.DB + S3 *s3.Client } type Option func(*app) @@ -81,6 +89,8 @@ func WithDevelopmentMode() Option { type app struct { db *sql.DB + s3 *s3.Client + handler http.Handler staticFiles fs.FS @@ -93,6 +103,7 @@ type app struct { func (app *app) setup() error { app.assert.NotNil(app.db) + app.assert.NotNil(app.s3) app.assert.NotNil(app.staticFiles) app.assert.NotNil(app.context) app.assert.NotNil(app.logger) diff --git a/go.mod b/go.mod index 3790b85..355f286 100644 --- a/go.mod +++ b/go.mod @@ -6,11 +6,22 @@ toolchain go1.23.6 require ( forge.capytal.company/loreddev/x v0.0.0-20250305165122-0ccb26ab783b + github.com/aws/aws-sdk-go-v2 v1.36.3 + github.com/aws/aws-sdk-go-v2/service/s3 v1.78.1 github.com/tursodatabase/go-libsql v0.0.0-20241221181756-6121e81fbf92 ) require ( github.com/antlr4-go/antlr/v4 v4.13.0 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.6.2 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.15 // indirect + github.com/aws/smithy-go v1.22.2 // indirect github.com/libsql/sqlite-antlr4-parser v0.0.0-20240327125255-dbf53b6cbf06 // indirect golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc // indirect ) diff --git a/go.sum b/go.sum index 63f6b90..c01df5f 100644 --- a/go.sum +++ b/go.sum @@ -2,6 +2,28 @@ forge.capytal.company/loreddev/x v0.0.0-20250305165122-0ccb26ab783b h1:QxTrkGp1c forge.capytal.company/loreddev/x v0.0.0-20250305165122-0ccb26ab783b/go.mod h1:Fc5nkrgOwJYdiwZK9SElFAB5xd7C/fh/mD+tBERfUPM= github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI= github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g= +github.com/aws/aws-sdk-go-v2 v1.36.3 h1:mJoei2CxPutQVxaATCzDUjcZEjVRdpsiiXi2o38yqWM= +github.com/aws/aws-sdk-go-v2 v1.36.3/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10 h1:zAybnyUQXIZ5mok5Jqwlf58/TFE7uvd3IAsa1aF9cXs= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10/go.mod h1:qqvMj6gHLR/EXWZw4ZbqlPbQUyenf4h82UQUlKc+l14= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 h1:ZK5jHhnrioRkUNOc+hOgQKlUL5JeC3S6JgLxtQ+Rm0Q= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34/go.mod h1:p4VfIceZokChbA9FzMbRGz5OV+lekcVtHlPKEO0gSZY= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 h1:SZwFm17ZUNNg5Np0ioo/gq8Mn6u9w19Mri8DnJ15Jf0= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34/go.mod h1:dFZsC0BLo346mvKQLWmoJxT+Sjp+qcVR1tRVHQGOH9Q= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34 h1:ZNTqv4nIdE/DiBfUUfXcLZ/Spcuz+RjeziUtNJackkM= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34/go.mod h1:zf7Vcd1ViW7cPqYWEHLHJkS50X0JS2IKz9Cgaj6ugrs= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 h1:eAh2A4b5IzM/lum78bZ590jy36+d/aFLgKF/4Vd1xPE= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3/go.mod h1:0yKJC/kb8sAnmlYa6Zs3QVYqaC8ug2AbnNChv5Ox3uA= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.6.2 h1:t/gZFyrijKuSU0elA5kRngP/oU3mc0I+Dvp8HwRE4c0= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.6.2/go.mod h1:iu6FSzgt+M2/x3Dk8zhycdIcHjEFb36IS8HVUVFoMg0= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 h1:dM9/92u2F1JbDaGooxTq18wmmFzbJRfXfVfy96/1CXM= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15/go.mod h1:SwFBy2vjtA0vZbjjaFtfN045boopadnoVPhu4Fv66vY= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.15 h1:moLQUoVq91LiqT1nbvzDukyqAlCv89ZmwaHw/ZFlFZg= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.15/go.mod h1:ZH34PJUc8ApjBIfgQCFvkWcUDBtl/WTD+uiYHjd8igA= +github.com/aws/aws-sdk-go-v2/service/s3 v1.78.1 h1:1M0gSbyP6q06gl3384wpoKPaH9G16NPqZFieEhLboSU= +github.com/aws/aws-sdk-go-v2/service/s3 v1.78.1/go.mod h1:4qzsZSzB/KiX2EzDjs9D7A8rI/WGJxZceVJIHqtJjIU= +github.com/aws/smithy-go v1.22.2 h1:6D9hW43xKFrRx/tXXfAlIZc4JI+yQe6snnWcQyxSyLQ= +github.com/aws/smithy-go v1.22.2/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/libsql/sqlite-antlr4-parser v0.0.0-20240327125255-dbf53b6cbf06 h1:JLvn7D+wXjH9g4Jsjo+VqmzTUpl/LX7vfr6VOfSWTdM= diff --git a/service/service.go b/service/service.go index 331b9f4..cbc599d 100644 --- a/service/service.go +++ b/service/service.go @@ -6,10 +6,13 @@ import ( "log/slog" "forge.capytal.company/loreddev/x/tinyssert" + "github.com/aws/aws-sdk-go-v2/service/s3" ) type service struct { db *sql.DB + s3 *s3.Client + assert tinyssert.Assertions log *slog.Logger } @@ -37,6 +40,7 @@ func New(cfg Config) (Service, error) { type Config struct { DB *sql.DB + S3 *s3.Client Assertions tinyssert.Assertions Logger *slog.Logger