diff --git a/.gitignore b/.gitignore index 854ada8..5dbc158 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,9 @@ _obj _test vendor +bin + +.env # Architecture specific extensions/prefixes *.[568vq] diff --git a/Taskfile.yml b/Taskfile.yml new file mode 100644 index 0000000..7fc7b4c --- /dev/null +++ b/Taskfile.yml @@ -0,0 +1,12 @@ +version: '3' + +tasks: + build: + cmds: + - go build -o "./bin/api.exe" "./cmd/api/main.go" + run: + cmds: + - go run cmd/api/main.go + migrate: + cmds: + - go run cmd/migrate/main.go \ No newline at end of file diff --git a/cmd/api/main.go b/cmd/api/main.go index d1fa35b..15aa75a 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -1,9 +1,25 @@ package main import ( + "os" + "wallet-api/pkg/api" + "wallet-api/pkg/utl/common" + "wallet-api/pkg/utl/db" "wallet-api/pkg/utl/server" + + "github.com/gin-gonic/gin" + "github.com/joho/godotenv" ) func main() { - server.Start() + err := godotenv.Load() + common.CheckError(err) + + dbUrl := os.Getenv("DATABASE_URL") + r := gin.Default() + + conn := db.CreateConnection(dbUrl) + api.Init(r, conn) + + server.Start(r) } diff --git a/cmd/migrate/main.go b/cmd/migrate/main.go index e69de29..237d84d 100644 --- a/cmd/migrate/main.go +++ b/cmd/migrate/main.go @@ -0,0 +1,23 @@ +package main + +import ( + "log" + "os" + "wallet-api/pkg/migrate" + "wallet-api/pkg/utl/db" + + "github.com/joho/godotenv" +) + +func main() { + + err := godotenv.Load() + if err != nil { + log.Fatal("Error loading .env file") + } + + dbUrl := os.Getenv("DATABASE_URL") + + conn := db.CreateConnection(dbUrl) + migrate.Start(conn) +} diff --git a/go.mod b/go.mod index a26e9eb..6297ee8 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,8 @@ require ( github.com/go-pg/pg/v10 v10.9.1 github.com/go-playground/validator/v10 v10.5.0 // indirect github.com/golang/protobuf v1.5.2 // indirect + github.com/google/uuid v1.2.0 // indirect + github.com/joho/godotenv v1.3.0 github.com/json-iterator/go v1.1.11 // indirect github.com/leodido/go-urn v1.2.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect diff --git a/go.sum b/go.sum index 2475951..add476f 100644 --- a/go.sum +++ b/go.sum @@ -50,9 +50,13 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= diff --git a/pkg/api/api.go b/pkg/api/api.go index e69de29..844d866 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -0,0 +1,14 @@ +package api + +import ( + "github.com/gin-gonic/gin" + "github.com/go-pg/pg/v10" +) + +func Init(s *gin.Engine, db *pg.DB) { + Routes(s, db) +} + +type API struct { + Api string `json:"api"` +} diff --git a/pkg/api/routes.go b/pkg/api/routes.go new file mode 100644 index 0000000..59b9a07 --- /dev/null +++ b/pkg/api/routes.go @@ -0,0 +1,15 @@ +package api + +import ( + "wallet-api/pkg/controllers" + "wallet-api/pkg/services" + + "github.com/gin-gonic/gin" + "github.com/go-pg/pg/v10" +) + +func Routes(s *gin.Engine, db *pg.DB) { + apiService := services.ApiService{Db: db} + apiController := controllers.ApiController{ApiService: &apiService} + apiController.Init(s) +} diff --git a/pkg/controllers/api.go b/pkg/controllers/api.go new file mode 100644 index 0000000..7350927 --- /dev/null +++ b/pkg/controllers/api.go @@ -0,0 +1,21 @@ +package controllers + +import ( + "wallet-api/pkg/services" + + "github.com/gin-gonic/gin" +) + +type ApiController struct { + ApiService *services.ApiService +} + +func (ac *ApiController) Init(s *gin.Engine) { + apiGroup := s.Group("/api") + apiGroup.GET("", ac.getFirst) +} + +func (ac *ApiController) getFirst(c *gin.Context) { + apiModel := ac.ApiService.GetFirst() + c.JSON(200, apiModel) +} diff --git a/pkg/migrate/migrate.go b/pkg/migrate/migrate.go new file mode 100644 index 0000000..0898093 --- /dev/null +++ b/pkg/migrate/migrate.go @@ -0,0 +1,13 @@ +package migrate + +import ( + "wallet-api/pkg/migrate/migrations" + + "github.com/go-pg/pg/v10" +) + +func Start(conn *pg.DB) { + apiMigration := migrations.ApiMigration{Db: conn} + + apiMigration.Create() +} diff --git a/pkg/migrate/migrations/api.go b/pkg/migrate/migrations/api.go new file mode 100644 index 0000000..63aec51 --- /dev/null +++ b/pkg/migrate/migrations/api.go @@ -0,0 +1,31 @@ +package migrations + +import ( + "fmt" + "log" + "wallet-api/pkg/models" + + "github.com/go-pg/pg/v10" + "github.com/go-pg/pg/v10/orm" +) + +type ApiMigration struct { + Db *pg.DB +} + +func (am *ApiMigration) Create() { + models := []interface{}{ + (*models.ApiModel)(nil), + } + + for _, model := range models { + err := am.Db.Model(model).CreateTable(&orm.CreateTableOptions{ + IfNotExists: true, + }) + if err != nil { + log.Printf("Error Creating Table: %s", err) + } else { + fmt.Println("Table created successfully") + } + } +} diff --git a/pkg/models/api.go b/pkg/models/api.go new file mode 100644 index 0000000..e670a4d --- /dev/null +++ b/pkg/models/api.go @@ -0,0 +1,6 @@ +package models + +type ApiModel struct { + tableName struct{} `pg:"api,alias:api"` + Api string `json:"api"` +} diff --git a/pkg/services/api.go b/pkg/services/api.go new file mode 100644 index 0000000..a2a58d7 --- /dev/null +++ b/pkg/services/api.go @@ -0,0 +1,17 @@ +package services + +import ( + "wallet-api/pkg/models" + + "github.com/go-pg/pg/v10" +) + +type ApiService struct { + Db *pg.DB +} + +func (as *ApiService) GetFirst() models.ApiModel { + apiModel := models.ApiModel{Api: "Works"} + as.Db.Model(&apiModel).First() + return apiModel +} diff --git a/pkg/utl/common/common.go b/pkg/utl/common/common.go index a335072..b28f373 100644 --- a/pkg/utl/common/common.go +++ b/pkg/utl/common/common.go @@ -4,6 +4,6 @@ import "log" func CheckError(err error) { if err != nil { - log.Fatalf("Unable to execute the query. %v", err) + log.Fatalf("Error occured. %v", err) } } diff --git a/pkg/utl/configs/configs.go b/pkg/utl/configs/configs.go index 8afc041..27459e6 100644 --- a/pkg/utl/configs/configs.go +++ b/pkg/utl/configs/configs.go @@ -1,5 +1 @@ package configs - -const ( - DbConfig = "" -) diff --git a/pkg/utl/db/db.go b/pkg/utl/db/db.go new file mode 100644 index 0000000..66c1b8f --- /dev/null +++ b/pkg/utl/db/db.go @@ -0,0 +1,17 @@ +package db + +import ( + "fmt" + "wallet-api/pkg/utl/common" + + "github.com/go-pg/pg/v10" +) + +func CreateConnection(dbUrl string) *pg.DB { + opt, err := pg.ParseURL(dbUrl) + common.CheckError(err) + conn := pg.Connect(opt) + + fmt.Println("Successfully connected!") + return conn +} diff --git a/pkg/utl/pg/pg.go b/pkg/utl/pg/pg.go deleted file mode 100644 index 038ac71..0000000 --- a/pkg/utl/pg/pg.go +++ /dev/null @@ -1,20 +0,0 @@ -package pg - -import ( - "fmt" - "os" - "wallet-api/pkg/utl/common" - - "github.com/go-pg/pg/v10" -) - -func CreateConnection() func() *pg.DB { - opt, err := pg.ParseURL(os.Getenv("DATABASE_URL")) - common.CheckError(err) - - db := pg.Connect(opt) - fmt.Println("Successfully connected!") - return func() *pg.DB { - return db - } -} diff --git a/pkg/utl/server/server.go b/pkg/utl/server/server.go index 5522c0f..35e8d52 100644 --- a/pkg/utl/server/server.go +++ b/pkg/utl/server/server.go @@ -6,8 +6,7 @@ import ( "github.com/gin-gonic/gin" ) -func Start() *gin.Engine { - r := gin.Default() +func Start(r *gin.Engine) *gin.Engine { r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong",