diff --git a/api/.env b/api/.env
index d268296..43a8ee8 100644
--- a/api/.env
+++ b/api/.env
@@ -7,4 +7,8 @@ MYSQL_ROOT_PASSWORD="Root#123"
MYSQL_HOST="localhost"
MYSQL_PORT=3306
-OAUTH_CLIENT=''
\ No newline at end of file
+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 e0b5bfa..a17b683 100644
--- a/api/.env.deployment
+++ b/api/.env.deployment
@@ -7,5 +7,8 @@ MYSQL_ROOT_PASSWORD="changeme" #TODO change me.
MYSQL_HOST="mysql"
MYSQL_PORT="3306"
-OAUTH_CLIENT='' #TODO set me
-
+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/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/cmd/main.go b/api/cmd/main.go
index ab4902a..b3c177d 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"
@@ -15,7 +18,7 @@ import (
"os"
)
-func setupRouter(db *sql.DB) *gin.Engine {
+func setupRouter(db *sql.DB, azClient *azblob.Client) *gin.Engine {
//Setup Gin
r := gin.Default()
//Cors
@@ -23,7 +26,7 @@ func setupRouter(db *sql.DB) *gin.Engine {
//Setup Repositories
gamesRepository := repositories.GameRepository(db)
- gamesService := services.GameService(gamesRepository)
+ gamesService := services.GameService(gamesRepository, azClient)
gamesController := controllers.GameController(gamesService)
authService := services.AuthService()
@@ -86,10 +89,30 @@ func CORSMiddleware() gin.HandlerFunc {
}
}
+func setupAzureBlobContainer(azClient *azblob.Client) {
+
+ containerName := os.Getenv("AZURE_CONTAINER_NAME")
+ 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("Creating Azure Blob Container failed")
+ }
+ log.Println(fmt.Sprintf("Created Azure container %s", containerName))
+ }
+}
+
func main() {
//Load config file
loadConfig()
+ //Setup Azure
+ azClient := setupAzureBlobClient()
+ setupAzureBlobContainer(azClient)
+
//Setup database
db := setupDatabase()
defer db.Close()
@@ -98,7 +121,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")))
@@ -106,3 +129,19 @@ func main() {
log.Fatal(err.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 {
+ log.Fatal("Initializing DefaultAzureCredential failed")
+ }
+
+ client, err := azblob.NewClient(url, credential, nil)
+ if err != nil {
+ log.Fatal("Initializing Azure Blob Client failed")
+ }
+
+ return client
+}
diff --git a/api/go.mod b/api/go.mod
index 768b521..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,6 +19,9 @@ 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
@@ -30,6 +35,7 @@ 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
@@ -37,11 +43,13 @@ require (
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/cpuid/v2 v2.2.7 // 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/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.12 // indirect
go.opencensus.io v0.24.0 // indirect
@@ -58,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 a6147e5..90b83fc 100644
--- a/api/go.sum
+++ b/api/go.sum
@@ -7,6 +7,17 @@ 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.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=
+github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
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=
@@ -15,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=
@@ -26,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=
@@ -36,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=
@@ -58,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=
@@ -103,6 +114,8 @@ github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+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/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
@@ -114,6 +127,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/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=
@@ -177,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=
@@ -219,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=
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())
diff --git a/api/services/gameService.go b/api/services/gameService.go
index aedcca7..d79ac06 100644
--- a/api/services/gameService.go
+++ b/api/services/gameService.go
@@ -4,10 +4,18 @@ import (
"api/models"
"api/repositories"
"api/shared"
+ "context"
+ "fmt"
+ "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
"github.com/google/uuid"
+ "io"
+ "log"
"mime/multipart"
+ "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)
@@ -18,6 +26,7 @@ type IGameService interface {
type gameService struct {
repository repositories.IGameRepository
+ azClient *azblob.Client
}
func (g gameService) ReadOwner(id uuid.UUID) (string, error) {
@@ -30,9 +39,7 @@ func (g gameService) FindAllByOwner(owner string) ([]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, owner string) (*models.Game, error) {
-
- //TODO save file
+func (g gameService) Save(fileHeader *multipart.FileHeader, title string, owner string) (*models.Game, error) {
game := models.Game{
ID: uuid.New(),
@@ -42,15 +49,46 @@ func (g gameService) Save(file *multipart.FileHeader, title string, owner string
Url: "",
Owner: owner,
}
+
+ // 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)
+ }
+
+ _, err = g.azClient.UploadFile(context.Background(), azureBlobContainerName, 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)
}
func (g gameService) Delete(id uuid.UUID) error {
+
+ _, err := g.azClient.DeleteBlob(context.Background(), azureBlobContainerName, id.String(), nil)
+ if err != nil {
+ log.Fatal(err)
+ }
+
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,
}
}