diff --git a/go.mod b/go.mod index aa409d6..faeb7d0 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( github.com/gin-contrib/zap v0.2.0 github.com/gin-gonic/gin v1.9.1 github.com/golang-migrate/migrate/v4 v4.17.1 + github.com/google/uuid v1.4.0 github.com/prometheus/client_golang v1.19.1 github.com/spf13/cobra v1.7.0 github.com/spf13/viper v1.17.0 @@ -28,7 +29,6 @@ require ( github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.15.5 // indirect github.com/goccy/go-json v0.10.2 // indirect - github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/hcl v1.0.0 // indirect diff --git a/internal/database/product.go b/internal/database/product.go deleted file mode 100644 index faef203..0000000 --- a/internal/database/product.go +++ /dev/null @@ -1,11 +0,0 @@ -package database - -import ( - "cybertron/models/db" - "gorm.io/gorm" -) - -func InitProductRepository(dbClient *gorm.DB) *gorm.DB { - dbClient.AutoMigrate(&db.Product{}) - return dbClient -} diff --git a/internal/database/project.go b/internal/database/project.go new file mode 100644 index 0000000..32a5ca6 --- /dev/null +++ b/internal/database/project.go @@ -0,0 +1,11 @@ +package database + +import ( + "cybertron/models/db" + "gorm.io/gorm" +) + +func InitProjectRepository(dbClient *gorm.DB) *gorm.DB { + dbClient.AutoMigrate(&db.Project{}) + return dbClient +} diff --git a/internal/dependencies/dependencies.go b/internal/dependencies/dependencies.go index ba69333..04a87aa 100644 --- a/internal/dependencies/dependencies.go +++ b/internal/dependencies/dependencies.go @@ -22,11 +22,11 @@ type Service struct { } type Handler struct { - ProductHandler *handler.ProductHandler + ProjectHandler *handler.ProjectHandler } type Repositories struct { - ProductRepository *gorm.DB + ProjectRepository *gorm.DB } func InitDependencies() *Dependencies { @@ -51,13 +51,13 @@ func initServices() *Service { func initRepositories(dbClient *gorm.DB) *Repositories { return &Repositories{ - ProductRepository: database.InitProductRepository(dbClient), + ProjectRepository: database.InitProjectRepository(dbClient), } } func initHandlers(dbClient *gorm.DB) *Handler { - productHandler := handler.NewProductHandler(dbClient) + projectHandler := handler.NewProjectHandler(dbClient) return &Handler{ - ProductHandler: productHandler, + ProjectHandler: projectHandler, } } diff --git a/internal/transport/handler/product.go b/internal/transport/handler/product.go deleted file mode 100644 index 399cb3c..0000000 --- a/internal/transport/handler/product.go +++ /dev/null @@ -1,32 +0,0 @@ -package handler - -import ( - "cybertron/models/db" - "github.com/gin-gonic/gin" - "gorm.io/gorm" - "net/http" -) - -type ProductHandler struct { - dbClient *gorm.DB -} - -func (h *ProductHandler) ProductCreate(c *gin.Context) { - h.dbClient.Create(&db.Product{ProductReferenceId: "1", Name: "name"}) - c.JSON(http.StatusOK, gin.H{ - "message": "create product", - }) -} - -func (h *ProductHandler) ProductGet(c *gin.Context) { - var product db.Product - h.dbClient.First(&product, 1) - c.JSON(http.StatusOK, gin.H{ - "message": product, - }) -} -func NewProductHandler(dbClient *gorm.DB) *ProductHandler { - return &ProductHandler{ - dbClient: dbClient, - } -} diff --git a/internal/transport/handler/project.go b/internal/transport/handler/project.go new file mode 100644 index 0000000..5beb2d5 --- /dev/null +++ b/internal/transport/handler/project.go @@ -0,0 +1,53 @@ +package handler + +import ( + "cybertron/models/db" + "github.com/gin-gonic/gin" + "github.com/google/uuid" + "gorm.io/gorm" + "net/http" +) + +type ProjectHandler struct { + dbClient *gorm.DB +} + +type ProjectBody struct { + Name string `json:"name" binding:"required"` + Team string `json:"team" binding:"required"` +} + +func (h *ProjectHandler) ProjectCreate(c *gin.Context) { + var projectBody ProjectBody + if err := c.BindJSON(&projectBody); err != nil { + c.JSON(http.StatusBadRequest, gin.H{ + "message": "Invalid Request", + }) + return + } + + // Write to database + h.dbClient.Create(&db.Project{ + ProjectReferenceId: uuid.New(), + Name: projectBody.Name, + Team: projectBody.Team, + }) + + c.JSON(http.StatusOK, gin.H{ + "message": "Project created", + }) +} + +func (h *ProjectHandler) ProjectGet(c *gin.Context) { + var project db.Project + h.dbClient.First(&project, 1) + c.JSON(http.StatusOK, gin.H{ + "message": project, + }) +} + +func NewProjectHandler(dbClient *gorm.DB) *ProjectHandler { + return &ProjectHandler{ + dbClient: dbClient, + } +} diff --git a/internal/transport/handler/readiness.go b/internal/transport/handler/readiness.go index 737a19f..7913b7c 100644 --- a/internal/transport/handler/readiness.go +++ b/internal/transport/handler/readiness.go @@ -6,7 +6,8 @@ import ( "github.com/gin-gonic/gin" ) -type HealthCheckHandler struct{} +type HealthCheckHandler struct { +} func (h *HealthCheckHandler) Readiness(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ diff --git a/internal/transport/router/product.go b/internal/transport/router/product.go deleted file mode 100644 index 049c5b1..0000000 --- a/internal/transport/router/product.go +++ /dev/null @@ -1,11 +0,0 @@ -package router - -import ( - "cybertron/internal/dependencies" - "github.com/gin-gonic/gin" -) - -func ProductRouter(r *gin.Engine, dep *dependencies.Dependencies) { - r.GET("/product", dep.Handler.ProductHandler.ProductCreate) - r.GET("/productGet", dep.Handler.ProductHandler.ProductGet) -} diff --git a/internal/transport/router/project.go b/internal/transport/router/project.go new file mode 100644 index 0000000..f925efe --- /dev/null +++ b/internal/transport/router/project.go @@ -0,0 +1,16 @@ +package router + +import ( + "cybertron/internal/dependencies" + "cybertron/internal/transport/handler" + "github.com/gin-gonic/gin" +) + +func ProjectRouter(r *gin.Engine, dep *dependencies.Dependencies) { + projectHandler := handler.NewProjectHandler(dep.DBClient) + projectRouterGroup := r.Group("/api/v1") + { + projectRouterGroup.POST("/project", projectHandler.ProjectCreate) + projectRouterGroup.GET("/project", projectHandler.ProjectGet) // TODO: Can make this paginated in future + } +} diff --git a/internal/transport/server.go b/internal/transport/server.go index 85e445c..5b3e015 100644 --- a/internal/transport/server.go +++ b/internal/transport/server.go @@ -30,7 +30,7 @@ func NewServer(dep *dependencies.Dependencies) *Server { func (s *Server) router() { router.ReadinessRouter(s.gin) - router.ProductRouter(s.gin, s.dependencies) + router.ProjectRouter(s.gin, s.dependencies) } func (s *Server) Start() { diff --git a/models/db/Release.go b/models/db/Release.go index 8a6db3f..43eab6d 100644 --- a/models/db/Release.go +++ b/models/db/Release.go @@ -4,6 +4,6 @@ import "gorm.io/gorm" type Release struct { gorm.Model - ProductReferenceId string `gorm:"primaryKey"` + ProjectReferenceId string `gorm:"primaryKey"` ReleaseVersion string `gorm:"column:name"` } diff --git a/models/db/product.go b/models/db/product.go deleted file mode 100644 index c962822..0000000 --- a/models/db/product.go +++ /dev/null @@ -1,9 +0,0 @@ -package db - -import "gorm.io/gorm" - -type Product struct { - gorm.Model - ProductReferenceId string `gorm:"primaryKey"` - Name string `gorm:"column:name"` -} diff --git a/models/db/project.go b/models/db/project.go new file mode 100644 index 0000000..d91764c --- /dev/null +++ b/models/db/project.go @@ -0,0 +1,13 @@ +package db + +import ( + "github.com/google/uuid" + "gorm.io/gorm" +) + +type Project struct { + gorm.Model + ProjectReferenceId uuid.UUID `gorm:"primaryKey"` + Name string `gorm:"column:name;unique"` + Team string +} diff --git a/models/db/roles.go b/models/db/roles.go index 0d944e2..527caf7 100644 --- a/models/db/roles.go +++ b/models/db/roles.go @@ -4,7 +4,6 @@ import "gorm.io/gorm" type Roles struct { gorm.Model - ProductReferenceId string `gorm:"primaryKey"` + ProjectReferenceId string `gorm:"primaryKey"` Role string `gorm:"column:name"` } -