From 9a93471f1b7f017f1c84a99c893abb17968754f7 Mon Sep 17 00:00:00 2001 From: Stefan Date: Fri, 31 May 2024 15:54:13 +0200 Subject: [PATCH 01/12] connecting to azure + creating a container --- api/.env | 2 +- api/.env.deployment | 1 + api/go.mod | 10 +++++++++- api/go.sum | 21 +++++++++++++++++++++ api/services/gameService.go | 30 ++++++++++++++++++++++++++++++ 5 files changed, 62 insertions(+), 2 deletions(-) diff --git a/api/.env b/api/.env index d5e69e1..450c7c4 100644 --- a/api/.env +++ b/api/.env @@ -7,4 +7,4 @@ MYSQL_ROOT_PASSWORD="Root#123" MYSQL_HOST="localhost" MYSQL_PORT=3306 - +AZURE_CLIENT_ID='bb7a8061-82d8-4234-b10f-ebfb866cd10a' diff --git a/api/.env.deployment b/api/.env.deployment index 614a6a8..6bbeda5 100644 --- a/api/.env.deployment +++ b/api/.env.deployment @@ -7,3 +7,4 @@ MYSQL_ROOT_PASSWORD="changeme" #TODO change me. MYSQL_HOST="mysql" MYSQL_PORT="3306" +AZURE_CLIENT_ID='bb7a8061-82d8-4234-b10f-ebfb866cd10a' diff --git a/api/go.mod b/api/go.mod index ff57214..35e7661 100644 --- a/api/go.mod +++ b/api/go.mod @@ -7,11 +7,16 @@ require ( github.com/dranikpg/dto-mapper v0.2.1 github.com/gin-gonic/gin v1.9.1 github.com/go-sql-driver/mysql v1.8.1 - github.com/google/uuid v1.4.0 + github.com/google/uuid v1.6.0 ) require ( filippo.io/edwards25519 v1.1.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 // indirect + github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect github.com/bytedance/sonic v1.11.4 // indirect github.com/cloudwego/base64x v0.1.1 // indirect github.com/cloudwego/iasm v0.1.1 // indirect @@ -22,10 +27,12 @@ require ( github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.19.0 // indirect github.com/goccy/go-json v0.10.2 // indirect + github.com/golang-jwt/jwt/v5 v5.2.1 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/joho/godotenv v1.5.1 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/kylelemons/godebug v1.1.0 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mattn/go-isatty v0.0.20 // indirect @@ -33,6 +40,7 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pelletier/go-toml/v2 v2.2.1 // indirect + github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // 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 diff --git a/api/go.sum b/api/go.sum index 7762e57..425a7a5 100644 --- a/api/go.sum +++ b/api/go.sum @@ -1,5 +1,17 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.0 h1:U/kwEXj0Y+1REAkV4kV8VO1CsEp8tSaQDG/7qC5XuqQ= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.0/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqbjDYsgN+RzP4q16yV5eM= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2 h1:FDif4R1+UUR+00q6wquyX90K7A8dN+R5E8GEadoP7sU= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2/go.mod h1:aiYBYui4BJ/BJCAIKs92XiPyQfTaBWqvHujDwKb6CBU= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 h1:LqbJ/WzJUwBf8UiaSzgX7aMclParm9/5Vgp+TY51uBQ= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2/go.mod h1:yInRyqWXAuaPrgI7p70+lDDgh3mlBohis29jGMISnmc= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2 h1:YUUxeiOWgdAQE3pXt2H7QXzZs0q8UBjgRbl56qo8GYM= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2/go.mod h1:dmXQgZuiSubAecswZE+Sm8jkvEa7kQgTPVRvwL/nd0E= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= @@ -40,10 +52,14 @@ github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpv github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= github.com/google/uuid v1.4.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= @@ -60,6 +76,8 @@ github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= @@ -75,6 +93,8 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pelletier/go-toml/v2 v2.2.1 h1:9TA9+T8+8CUCO2+WYnDLCgrYi9+omqKXyjDtosvtEhg= github.com/pelletier/go-toml/v2 v2.2.1/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= @@ -123,6 +143,7 @@ golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjs golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= diff --git a/api/services/gameService.go b/api/services/gameService.go index deaad06..c877ba6 100644 --- a/api/services/gameService.go +++ b/api/services/gameService.go @@ -4,8 +4,15 @@ import ( "api/models" "api/repositories" "api/shared" + "context" + "fmt" "github.com/google/uuid" + "log" "mime/multipart" + "os" + + "github.com/Azure/azure-sdk-for-go/sdk/azidentity" + "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" ) type IGameService interface { @@ -36,6 +43,29 @@ func (g gameService) Save(file *multipart.FileHeader, title string) (*models.Gam Url: "", } + // TODO replace stamango + url := "https://stamango.blob.core.windows.net/" + + //clientID := os.Getenv("AZURE_CLIENT_ID") + //opts := &azidentity.ManagedIdentityCredentialOptions{ID: azidentity.ClientID(clientID)} + //credential, err := azidentity.NewManagedIdentityCredential(opts) + credential, err := azidentity.NewDefaultAzureCredential(nil) + if err != nil { + log.Println(fmt.Sprintf("------------------------- err1: %s", err)) + return nil, err + } + + client, err := azblob.NewClient(url, credential, nil) + if err != nil { + return nil, err + } + + containerName := "indiegamestream" + _, err = client.CreateContainer(context.Background(), containerName, nil) + if err != nil { + return nil, err + } + return &game, g.repository.Save(&game) } From fc553fbd44dd652854a80e1f791e268dcbc9cd93 Mon Sep 17 00:00:00 2001 From: Kai Date: Mon, 3 Jun 2024 17:40:48 +0200 Subject: [PATCH 02/12] create azure client in startup --- api/.env | 6 +++++- api/.env.deployment | 8 ++++++-- api/cmd/main.go | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/api/.env b/api/.env index 450c7c4..cfc52ad 100644 --- a/api/.env +++ b/api/.env @@ -7,4 +7,8 @@ MYSQL_ROOT_PASSWORD="Root#123" MYSQL_HOST="localhost" MYSQL_PORT=3306 -AZURE_CLIENT_ID='bb7a8061-82d8-4234-b10f-ebfb866cd10a' +AZURE_CLIENT_ID="" +AZURE_TENANT_ID="" +AZURE_CLIENT_SECRET="" +AZURE_STORAGE_ACCOUNT="indiegamestream0" +AZURE_CONTAINER_NAME="games" \ No newline at end of file diff --git a/api/.env.deployment b/api/.env.deployment index 6bbeda5..f6bd06b 100644 --- a/api/.env.deployment +++ b/api/.env.deployment @@ -6,5 +6,9 @@ MYSQL_ROOT_USER="root"#login name MYSQL_ROOT_PASSWORD="changeme" #TODO change me. MYSQL_HOST="mysql" MYSQL_PORT="3306" - -AZURE_CLIENT_ID='bb7a8061-82d8-4234-b10f-ebfb866cd10a' + +AZURE_CLIENT_ID="" +AZURE_TENANT_ID="" +AZURE_CLIENT_SECRET="" +AZURE_STORAGE_ACCOUNT="indiegamestream0" +AZURE_CONTAINER_NAME="games" \ No newline at end of file diff --git a/api/cmd/main.go b/api/cmd/main.go index ca09e0d..a61c25c 100644 --- a/api/cmd/main.go +++ b/api/cmd/main.go @@ -5,8 +5,11 @@ import ( "api/repositories" "api/scripts" "api/services" + "context" "database/sql" "fmt" + "github.com/Azure/azure-sdk-for-go/sdk/azidentity" + "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" "github.com/gin-gonic/gin" _ "github.com/go-sql-driver/mysql" "github.com/joho/godotenv" @@ -65,10 +68,30 @@ func setupDatabase() *sql.DB { return db } +func setupAzure() { + client, err := azureClient() + if err != nil { + log.Fatal(err) + } + + //TODO: Check if container is already existing + + containerName := os.Getenv("AZURE_CONTAINER_NAME") + _, err = client.CreateContainer(context.Background(), containerName, nil) + if err != nil { + log.Fatal(err) + } + log.Println(fmt.Sprintf("Created Azure container %s", containerName)) + +} + func main() { //Load config file loadConfig() + //Setup Azure + setupAzure() + //Setup database db := setupDatabase() defer db.Close() @@ -85,3 +108,13 @@ func main() { log.Fatal(err.Error()) } } + +func azureClient() (*azblob.Client, error) { + url := fmt.Sprintf("https://%s.blob.core.windows.net/", os.Getenv("AZURE_STORAGE_ACCOUNT")) + + credential, err := azidentity.NewDefaultAzureCredential(nil) + if err != nil { + return nil, err + } + return azblob.NewClient(url, credential, nil) +} From 957d14d82c6432085ba1f31e20669ab0f289d903 Mon Sep 17 00:00:00 2001 From: Kai Date: Mon, 3 Jun 2024 17:41:51 +0200 Subject: [PATCH 03/12] dockerfile added microsoft CAs --- api/Dockerfile | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/api/Dockerfile b/api/Dockerfile index 61d431d..641b0b8 100644 --- a/api/Dockerfile +++ b/api/Dockerfile @@ -1,3 +1,5 @@ + + #Stage 1: Compile and build FROM golang:1.22-alpine as build # Set destination for COPY @@ -10,14 +12,30 @@ COPY . . # Build RUN CGO_ENABLED=0 GOOS=linux go build -C cmd -o /api -#Stage 2a: Run tests +#Stage 2: Run tests FROM golang:1.22-alpine as test WORKDIR /app COPY . . CMD ["go", "test", "./tests"] -#Stage 2b: Run Api +#Stage 3: Prepare release +FROM alpine:3.20 as prepare +#Download and microsoft CA Certiciates +RUN apk update && apk add curl +WORKDIR /usr/local/share/ca-certificates +RUN curl -ks 'https://cacerts.digicert.com/BaltimoreCyberTrustRoot.crt' -o '/usr/local/share/ca-certificates/BaltimoreCyberTrustRoot.crt' +RUN curl -ks 'https://cacerts.digicert.com/DigiCertGlobalRootCA.crt' -o '/usr/local/share/ca-certificates/DigiCertGlobalRootCA.crt' +RUN curl -ks 'https://cacerts.digicert.com/DigiCertGlobalRootG2.crt' -o '/usr/local/share/ca-certificates/DigiCertGlobalRootG2.crt' +RUN curl -ks 'https://cacerts.digicert.com/DigiCertGlobalRootG3.crt' -o '/usr/local/share/ca-certificates/DigiCertGlobalRootG2.crt' +RUN curl -ks 'https://www.microsoft.com/pkiops/certs/Microsoft%20ECC%20Root%20Certificate%20Authority%202017.crt' -o '/usr/local/share/ca-certificates/MicrosoftRootCertificateAuthority.crt' +#Add microsoft CA to trusted root certificates +RUN /usr/sbin/update-ca-certificates + +#Stage $: Run Api FROM scratch as release + +#Copy trusted CA certificates +COPY --from=prepare /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt #Copy migration scripts COPY migrations migrations #Copy build result to next stage From d28f1df6b389751d6b8ff6af77740704325b4f52 Mon Sep 17 00:00:00 2001 From: Kai Date: Mon, 3 Jun 2024 17:43:01 +0200 Subject: [PATCH 04/12] removed azure stuff from gameService --- api/services/gameService.go | 31 +------------------------------ 1 file changed, 1 insertion(+), 30 deletions(-) diff --git a/api/services/gameService.go b/api/services/gameService.go index c877ba6..5a40687 100644 --- a/api/services/gameService.go +++ b/api/services/gameService.go @@ -4,15 +4,8 @@ import ( "api/models" "api/repositories" "api/shared" - "context" - "fmt" "github.com/google/uuid" - "log" "mime/multipart" - "os" - - "github.com/Azure/azure-sdk-for-go/sdk/azidentity" - "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" ) type IGameService interface { @@ -33,7 +26,6 @@ func (g gameService) FindAll() ([]models.Game, error) { func (g gameService) FindByID(id uuid.UUID) (*models.Game, error) { return g.repository.FindByID(id) } func (g gameService) Save(file *multipart.FileHeader, title string) (*models.Game, error) { - //TODO save file game := models.Game{ ID: uuid.New(), @@ -43,28 +35,7 @@ func (g gameService) Save(file *multipart.FileHeader, title string) (*models.Gam Url: "", } - // TODO replace stamango - url := "https://stamango.blob.core.windows.net/" - - //clientID := os.Getenv("AZURE_CLIENT_ID") - //opts := &azidentity.ManagedIdentityCredentialOptions{ID: azidentity.ClientID(clientID)} - //credential, err := azidentity.NewManagedIdentityCredential(opts) - credential, err := azidentity.NewDefaultAzureCredential(nil) - if err != nil { - log.Println(fmt.Sprintf("------------------------- err1: %s", err)) - return nil, err - } - - client, err := azblob.NewClient(url, credential, nil) - if err != nil { - return nil, err - } - - containerName := "indiegamestream" - _, err = client.CreateContainer(context.Background(), containerName, nil) - if err != nil { - return nil, err - } + // TODO uplaod game to azure using client created in startup return &game, g.repository.Save(&game) } From 11147edef885418dc5e6d1e01e28f379f4ad4c67 Mon Sep 17 00:00:00 2001 From: stefancsukker Date: Mon, 3 Jun 2024 19:09:48 +0200 Subject: [PATCH 05/12] changed setup of azure client; reusing azure client in gameService --- api/cmd/main.go | 29 +++++++++++++++-------------- api/services/gameService.go | 5 ++++- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/api/cmd/main.go b/api/cmd/main.go index a61c25c..d50af5d 100644 --- a/api/cmd/main.go +++ b/api/cmd/main.go @@ -18,13 +18,13 @@ import ( "os" ) -func setupRouter(db *sql.DB) *gin.Engine { +func setupRouter(db *sql.DB, azClient *azblob.Client) *gin.Engine { //Setup Gin r := gin.Default() //Setup Repositories gamesRepository := repositories.GameRepository(db) - gamesService := services.GameService(gamesRepository) + gamesService := services.GameService(gamesRepository, azClient) gamesController := controllers.GameController(gamesService) // Ping test @@ -68,16 +68,10 @@ func setupDatabase() *sql.DB { return db } -func setupAzure() { - client, err := azureClient() - if err != nil { - log.Fatal(err) - } - - //TODO: Check if container is already existing +func setupAzureBlobContainer(azClient *azblob.Client) { containerName := os.Getenv("AZURE_CONTAINER_NAME") - _, err = client.CreateContainer(context.Background(), containerName, nil) + _, err := azClient.CreateContainer(context.Background(), containerName, nil) if err != nil { log.Fatal(err) } @@ -90,7 +84,8 @@ func main() { loadConfig() //Setup Azure - setupAzure() + azClient, _ := setupAzureClient() + setupAzureBlobContainer(azClient) //Setup database db := setupDatabase() @@ -100,7 +95,7 @@ func main() { gin.SetMode(os.Getenv("GIN_MODE")) //Setup Routes - r := setupRouter(db) + r := setupRouter(db, azClient) // Listen and Server in 0.0.0.0:8080 err := r.Run(fmt.Sprintf(":%s", os.Getenv("PORT"))) @@ -109,12 +104,18 @@ func main() { } } -func azureClient() (*azblob.Client, error) { +func setupAzureClient() (*azblob.Client, error) { url := fmt.Sprintf("https://%s.blob.core.windows.net/", os.Getenv("AZURE_STORAGE_ACCOUNT")) credential, err := azidentity.NewDefaultAzureCredential(nil) if err != nil { return nil, err } - return azblob.NewClient(url, credential, nil) + + client, err := azblob.NewClient(url, credential, nil) + if err != nil { + return nil, err + } + + return client, nil } diff --git a/api/services/gameService.go b/api/services/gameService.go index 5a40687..a605058 100644 --- a/api/services/gameService.go +++ b/api/services/gameService.go @@ -6,6 +6,7 @@ import ( "api/shared" "github.com/google/uuid" "mime/multipart" + "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" ) type IGameService interface { @@ -17,6 +18,7 @@ type IGameService interface { type gameService struct { repository repositories.IGameRepository + azClient *azblob.Client } func (g gameService) FindAll() ([]models.Game, error) { @@ -44,8 +46,9 @@ func (g gameService) Delete(id uuid.UUID) error { return g.repository.Delete(id) } -func GameService(repository repositories.IGameRepository) IGameService { +func GameService(repository repositories.IGameRepository, azClient *azblob.Client) IGameService { return &gameService{ repository: repository, + azClient: azClient, } } From 58acbd542ecc88de193a7983f859aa61078893d9 Mon Sep 17 00:00:00 2001 From: stefancsukker Date: Mon, 3 Jun 2024 19:37:30 +0200 Subject: [PATCH 06/12] checking if azure blob container exists --- api/cmd/main.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/api/cmd/main.go b/api/cmd/main.go index d50af5d..3eafbf8 100644 --- a/api/cmd/main.go +++ b/api/cmd/main.go @@ -71,12 +71,17 @@ func setupDatabase() *sql.DB { func setupAzureBlobContainer(azClient *azblob.Client) { containerName := os.Getenv("AZURE_CONTAINER_NAME") - _, err := azClient.CreateContainer(context.Background(), containerName, nil) - if err != nil { - log.Fatal(err) + containerClient := azClient.ServiceClient().NewContainerClient(containerName) + + if containerClient != nil { + log.Println(fmt.Sprintf("Azure blob container with name %s exists already", containerName)) + } else { + _, err := azClient.CreateContainer(context.Background(), containerName, nil) + if err != nil { + log.Fatal(err) + } + log.Println(fmt.Sprintf("Created Azure container %s", containerName)) } - log.Println(fmt.Sprintf("Created Azure container %s", containerName)) - } func main() { From ba1627538fee23187b97936f5fa0a52caac68e41 Mon Sep 17 00:00:00 2001 From: stefancsukker Date: Mon, 3 Jun 2024 20:17:15 +0200 Subject: [PATCH 07/12] saving game file to az file storage; saving storage location to DB --- api/services/gameService.go | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/api/services/gameService.go b/api/services/gameService.go index a605058..8d8fd4d 100644 --- a/api/services/gameService.go +++ b/api/services/gameService.go @@ -4,9 +4,14 @@ import ( "api/models" "api/repositories" "api/shared" + "context" + "fmt" "github.com/google/uuid" + "io" + "log" "mime/multipart" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" + "os" ) type IGameService interface { @@ -27,7 +32,7 @@ func (g gameService) FindAll() ([]models.Game, error) { func (g gameService) FindByID(id uuid.UUID) (*models.Game, error) { return g.repository.FindByID(id) } -func (g gameService) Save(file *multipart.FileHeader, title string) (*models.Game, error) { +func (g gameService) Save(fileHeader *multipart.FileHeader, title string) (*models.Game, error) { game := models.Game{ ID: uuid.New(), @@ -37,7 +42,31 @@ func (g gameService) Save(file *multipart.FileHeader, title string) (*models.Gam Url: "", } - // TODO uplaod game to azure using client created in startup + containerName := os.Getenv("AZURE_CONTAINER_NAME") + + // Creating file on disk because UploadFile() needs *os.File + dst, err := os.Create(fileHeader.Filename) + file, err := fileHeader.Open() + _, err = io.Copy(dst, file) + + if err != nil { + log.Fatal(err) + } + + // TODO RESPONSE 403: This request is not authorized to perform this operation using this permission. ERROR CODE: AuthorizationPermissionMismatch + _, err = g.azClient.UploadFile(context.Background(), containerName, game.ID.String(), dst, nil) + if err != nil { + log.Fatal(err) + } + + // Deleting file from disk + err = os.Remove(dst.Name()) + if err != nil { + log.Fatal(err) + } + + storageAccount := os.Getenv("AZURE_STORAGE_ACCOUNT") + game.StorageLocation = fmt.Sprintf("https://%s.blob.core.windows.net/games/%s", storageAccount, game.ID.String()) return &game, g.repository.Save(&game) } From 6893b656c093d50fd0fab572e77b571ead42d038 Mon Sep 17 00:00:00 2001 From: stefancsukker Date: Mon, 10 Jun 2024 15:34:37 +0200 Subject: [PATCH 08/12] api: renamed setupAzureClient function; removed TODO for 403 error --- api/cmd/main.go | 4 ++-- api/services/gameService.go | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/api/cmd/main.go b/api/cmd/main.go index 3eafbf8..c04ecdb 100644 --- a/api/cmd/main.go +++ b/api/cmd/main.go @@ -89,7 +89,7 @@ func main() { loadConfig() //Setup Azure - azClient, _ := setupAzureClient() + azClient, _ := setupAzureBlobClient() setupAzureBlobContainer(azClient) //Setup database @@ -109,7 +109,7 @@ func main() { } } -func setupAzureClient() (*azblob.Client, error) { +func setupAzureBlobClient() (*azblob.Client, error) { url := fmt.Sprintf("https://%s.blob.core.windows.net/", os.Getenv("AZURE_STORAGE_ACCOUNT")) credential, err := azidentity.NewDefaultAzureCredential(nil) diff --git a/api/services/gameService.go b/api/services/gameService.go index 8d8fd4d..8265690 100644 --- a/api/services/gameService.go +++ b/api/services/gameService.go @@ -53,7 +53,6 @@ func (g gameService) Save(fileHeader *multipart.FileHeader, title string) (*mode log.Fatal(err) } - // TODO RESPONSE 403: This request is not authorized to perform this operation using this permission. ERROR CODE: AuthorizationPermissionMismatch _, err = g.azClient.UploadFile(context.Background(), containerName, game.ID.String(), dst, nil) if err != nil { log.Fatal(err) From 152c1bdb4a77b6e544958c8e918810267c99741d Mon Sep 17 00:00:00 2001 From: stefancsukker Date: Mon, 10 Jun 2024 20:52:52 +0200 Subject: [PATCH 09/12] api: implemented delete azure blob --- api/services/gameService.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/api/services/gameService.go b/api/services/gameService.go index 8265690..929d38e 100644 --- a/api/services/gameService.go +++ b/api/services/gameService.go @@ -71,6 +71,13 @@ func (g gameService) Save(fileHeader *multipart.FileHeader, title string) (*mode } func (g gameService) Delete(id uuid.UUID) error { + + containerName := os.Getenv("AZURE_CONTAINER_NAME") + _, err := g.azClient.DeleteBlob(context.Background(), containerName, id.String(), nil) + if err != nil { + log.Fatal(err) + } + return g.repository.Delete(id) } From 5c9b20b6ee7213740e146c36ac41c3b39e7673e4 Mon Sep 17 00:00:00 2001 From: stefancsukker Date: Tue, 11 Jun 2024 20:01:02 +0200 Subject: [PATCH 10/12] fixed issue after merge --- api/go.mod | 28 ++++++++-------------------- api/go.sum | 22 ++++++++++------------ 2 files changed, 18 insertions(+), 32 deletions(-) diff --git a/api/go.mod b/api/go.mod index 79af623..dc19709 100644 --- a/api/go.mod +++ b/api/go.mod @@ -3,6 +3,8 @@ module api go 1.20 require ( + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2 + github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2 github.com/DATA-DOG/go-sqlmock v1.5.2 github.com/dranikpg/dto-mapper v0.2.1 github.com/gin-gonic/gin v1.9.1 @@ -17,20 +19,14 @@ require ( cloud.google.com/go/auth/oauth2adapt v0.2.2 // indirect cloud.google.com/go/compute/metadata v0.3.0 // indirect filippo.io/edwards25519 v1.1.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect github.com/bytedance/sonic v1.11.6 // indirect github.com/bytedance/sonic/loader v0.1.1 // indirect github.com/cloudwego/base64x v0.1.4 // indirect github.com/cloudwego/iasm v0.2.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 // indirect - github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect - github.com/bytedance/sonic v1.11.4 // indirect - github.com/cloudwego/base64x v0.1.1 // indirect - github.com/cloudwego/iasm v0.1.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/gabriel-vasile/mimetype v1.4.3 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-logr/logr v1.4.1 // indirect @@ -39,30 +35,21 @@ require ( github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.20.0 // indirect github.com/goccy/go-json v0.10.2 // indirect + github.com/golang-jwt/jwt/v5 v5.2.1 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/s2a-go v0.1.7 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/golang-jwt/jwt/v5 v5.2.1 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/joho/godotenv v1.5.1 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/cpuid/v2 v2.2.7 // indirect - github.com/kylelemons/godebug v1.1.0 // indirect github.com/kr/pretty v0.3.1 // indirect + github.com/kylelemons/godebug v1.1.0 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pelletier/go-toml/v2 v2.2.1 // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // 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 - github.com/spf13/afero v1.11.0 // indirect - github.com/spf13/cast v1.6.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/subosito/gotenv v1.6.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.12 // indirect go.opencensus.io v0.24.0 // indirect @@ -79,5 +66,6 @@ require ( google.golang.org/genproto/googleapis/rpc v0.0.0-20240521202816-d264139d666e // indirect google.golang.org/grpc v1.64.0 // indirect google.golang.org/protobuf v1.34.1 // indirect + gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/api/go.sum b/api/go.sum index 5f8a6ba..90b83fc 100644 --- a/api/go.sum +++ b/api/go.sum @@ -7,14 +7,13 @@ cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2Qx cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.0 h1:U/kwEXj0Y+1REAkV4kV8VO1CsEp8tSaQDG/7qC5XuqQ= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.0/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqbjDYsgN+RzP4q16yV5eM= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2 h1:FDif4R1+UUR+00q6wquyX90K7A8dN+R5E8GEadoP7sU= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2/go.mod h1:aiYBYui4BJ/BJCAIKs92XiPyQfTaBWqvHujDwKb6CBU= github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 h1:LqbJ/WzJUwBf8UiaSzgX7aMclParm9/5Vgp+TY51uBQ= github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2/go.mod h1:yInRyqWXAuaPrgI7p70+lDDgh3mlBohis29jGMISnmc= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.5.0 h1:AifHbc4mg0x9zW52WOpKbsHaDKuRhlI7TVl47thgQ70= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2 h1:YUUxeiOWgdAQE3pXt2H7QXzZs0q8UBjgRbl56qo8GYM= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2/go.mod h1:dmXQgZuiSubAecswZE+Sm8jkvEa7kQgTPVRvwL/nd0E= github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= @@ -27,7 +26,6 @@ github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1 github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= @@ -38,6 +36,7 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dranikpg/dto-mapper v0.2.1 h1:1DaphrSfBXZVlVolCP+XspMzBAFYGne91+SK594xyTg= github.com/dranikpg/dto-mapper v0.2.1/go.mod h1:Hkidt8Lkurm7pLPYOiq3I/LlIBmDdB4J4c/VMqFXHfg= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -48,8 +47,6 @@ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2 github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= -github.com/gin-contrib/cors v1.7.2 h1:oLDHxdg8W/XDoN/8zamqk/Drgt4oVZDvaV0YmvVICQw= -github.com/gin-contrib/cors v1.7.2/go.mod h1:SUJVARKgQ40dmrzgXEVxj2m7Ig1v1qIboQkPDTQ9t2E= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= @@ -70,6 +67,8 @@ github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpv github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= @@ -92,9 +91,6 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= -github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= @@ -131,10 +127,10 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pelletier/go-toml/v2 v2.2.1 h1:9TA9+T8+8CUCO2+WYnDLCgrYi9+omqKXyjDtosvtEhg= github.com/pelletier/go-toml/v2 v2.2.1/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= @@ -196,6 +192,7 @@ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= @@ -238,9 +235,10 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From 4550f6215327b24aeb232dcf94b9cf6fddffc0ea Mon Sep 17 00:00:00 2001 From: stefancsukker Date: Tue, 11 Jun 2024 20:27:44 +0200 Subject: [PATCH 11/12] implemented recommendations from pull request --- api/cmd/main.go | 12 ++++++------ api/services/gameService.go | 15 +++++++-------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/api/cmd/main.go b/api/cmd/main.go index e1455b4..b3c177d 100644 --- a/api/cmd/main.go +++ b/api/cmd/main.go @@ -99,7 +99,7 @@ func setupAzureBlobContainer(azClient *azblob.Client) { } else { _, err := azClient.CreateContainer(context.Background(), containerName, nil) if err != nil { - log.Fatal(err) + log.Fatal("Creating Azure Blob Container failed") } log.Println(fmt.Sprintf("Created Azure container %s", containerName)) } @@ -110,7 +110,7 @@ func main() { loadConfig() //Setup Azure - azClient, _ := setupAzureBlobClient() + azClient := setupAzureBlobClient() setupAzureBlobContainer(azClient) //Setup database @@ -130,18 +130,18 @@ func main() { } } -func setupAzureBlobClient() (*azblob.Client, error) { +func setupAzureBlobClient() *azblob.Client { url := fmt.Sprintf("https://%s.blob.core.windows.net/", os.Getenv("AZURE_STORAGE_ACCOUNT")) credential, err := azidentity.NewDefaultAzureCredential(nil) if err != nil { - return nil, err + log.Fatal("Initializing DefaultAzureCredential failed") } client, err := azblob.NewClient(url, credential, nil) if err != nil { - return nil, err + log.Fatal("Initializing Azure Blob Client failed") } - return client, nil + return client } diff --git a/api/services/gameService.go b/api/services/gameService.go index ec3367a..d79ac06 100644 --- a/api/services/gameService.go +++ b/api/services/gameService.go @@ -6,14 +6,16 @@ import ( "api/shared" "context" "fmt" + "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" "github.com/google/uuid" "io" "log" "mime/multipart" - "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" "os" ) +var azureBlobContainerName = os.Getenv("AZURE_CONTAINER_NAME") + type IGameService interface { FindByID(id uuid.UUID) (*models.Game, error) Save(file *multipart.FileHeader, title string, owner string) (*models.Game, error) @@ -24,7 +26,7 @@ type IGameService interface { type gameService struct { repository repositories.IGameRepository - azClient *azblob.Client + azClient *azblob.Client } func (g gameService) ReadOwner(id uuid.UUID) (string, error) { @@ -48,8 +50,6 @@ func (g gameService) Save(fileHeader *multipart.FileHeader, title string, owner Owner: owner, } - containerName := os.Getenv("AZURE_CONTAINER_NAME") - // Creating file on disk because UploadFile() needs *os.File dst, err := os.Create(fileHeader.Filename) file, err := fileHeader.Open() @@ -59,7 +59,7 @@ func (g gameService) Save(fileHeader *multipart.FileHeader, title string, owner log.Fatal(err) } - _, err = g.azClient.UploadFile(context.Background(), containerName, game.ID.String(), dst, nil) + _, err = g.azClient.UploadFile(context.Background(), azureBlobContainerName, game.ID.String(), dst, nil) if err != nil { log.Fatal(err) } @@ -78,8 +78,7 @@ func (g gameService) Save(fileHeader *multipart.FileHeader, title string, owner func (g gameService) Delete(id uuid.UUID) error { - containerName := os.Getenv("AZURE_CONTAINER_NAME") - _, err := g.azClient.DeleteBlob(context.Background(), containerName, id.String(), nil) + _, err := g.azClient.DeleteBlob(context.Background(), azureBlobContainerName, id.String(), nil) if err != nil { log.Fatal(err) } @@ -90,6 +89,6 @@ func (g gameService) Delete(id uuid.UUID) error { func GameService(repository repositories.IGameRepository, azClient *azblob.Client) IGameService { return &gameService{ repository: repository, - azClient: azClient, + azClient: azClient, } } From 7c6c4c9c2ffa9464a2348c40e131c54d804d7fba Mon Sep 17 00:00:00 2001 From: Kai Date: Wed, 12 Jun 2024 12:15:47 +0200 Subject: [PATCH 12/12] replaced env OAUTH_CLIENT with hardcoded client just like in frontend --- api/.env | 4 +--- api/.env.deployment | 5 +---- api/README.md | 1 - api/services/authService.go | 15 +-------------- 4 files changed, 3 insertions(+), 22 deletions(-) diff --git a/api/.env b/api/.env index d268296..9ecd214 100644 --- a/api/.env +++ b/api/.env @@ -5,6 +5,4 @@ MYSQL_DATABASE="api"#database name MYSQL_ROOT_USER="root"#login name MYSQL_ROOT_PASSWORD="Root#123" MYSQL_HOST="localhost" -MYSQL_PORT=3306 - -OAUTH_CLIENT='' \ No newline at end of file +MYSQL_PORT=3306 \ No newline at end of file diff --git a/api/.env.deployment b/api/.env.deployment index e0b5bfa..ba71044 100644 --- a/api/.env.deployment +++ b/api/.env.deployment @@ -5,7 +5,4 @@ MYSQL_DATABASE="api"#database name MYSQL_ROOT_USER="root"#login name MYSQL_ROOT_PASSWORD="changeme" #TODO change me. MYSQL_HOST="mysql" -MYSQL_PORT="3306" - -OAUTH_CLIENT='' #TODO set me - +MYSQL_PORT="3306" \ No newline at end of file diff --git a/api/README.md b/api/README.md index b63d612..5e50285 100644 --- a/api/README.md +++ b/api/README.md @@ -16,5 +16,4 @@ The docker image will use the following environment variables: | MYSQL_DATABASE | "api" | | | MYSQL_ROOT_USER | "root" | | | MYSQL_ROOT_PASSWORD | "changeme" | | -| OAUTH_CLIENT | | Google OAuth Client ID | If you use the docker image directly (without our provided docker-compose), you must specify them. \ No newline at end of file diff --git a/api/services/authService.go b/api/services/authService.go index 4f3d53b..df15fd3 100644 --- a/api/services/authService.go +++ b/api/services/authService.go @@ -6,7 +6,6 @@ import ( "google.golang.org/api/idtoken" "log" "net/http" - "os" "strings" ) @@ -18,20 +17,8 @@ type authService struct { } func (_ authService) Authorize(c *gin.Context) { - //Check if OAUTH_CLIENT has been set - /*if len(os.Getenv("OAUTH_CLIENT")) == 0 { - //if not set & we are in production mode, abort - if os.Getenv("GIN_MODE") == "release" { - log.Fatalf("OAUTH_CLIENT is not set, cannot authorize requests") - } - //otherwise we are in debug mode and we can accept it - log.Println("OAUTH_CLIENT is not set, cannot authorize requests") - c.Set("subject", "") - return - }*/ - tokenString := strings.TrimPrefix(c.GetHeader("Authorization"), "Bearer ") - payload, err := idtoken.Validate(context.Background(), tokenString, os.Getenv("OAUTH_CLIENT")) + payload, err := idtoken.Validate(context.Background(), tokenString, "516825360638-ai7mibm97c1i5o66l18iqlfuqffl1dba.apps.googleusercontent.com") if err != nil { log.Println(err.Error())