From f75297880d32dd7ae1676f42f910993c583b96d0 Mon Sep 17 00:00:00 2001 From: Varnit Goyal Date: Wed, 24 Jul 2024 12:51:37 +0530 Subject: [PATCH] TP-55555 | crud ingestor (#2) * TP-55555 | crud ingestor * TP-55555 | Project handler (#4) --------- Co-authored-by: Lokesh Dugar --- .../202310201651_initial-migration.up.sql | 1 + go.mod | 1 + internal/database/project.go | 11 ++++ internal/dependencies/dependencies.go | 43 ++++++++++++--- internal/transport/handler/project.go | 53 +++++++++++++++++++ internal/transport/handler/readiness.go | 3 +- internal/transport/router/project.go | 16 ++++++ internal/transport/server.go | 4 +- models/db/Release.go | 9 ++++ models/db/SourceMap.go | 9 ++++ models/db/project.go | 13 +++++ models/db/roles.go | 9 ++++ 12 files changed, 164 insertions(+), 8 deletions(-) create mode 100644 internal/database/project.go create mode 100644 internal/transport/handler/project.go create mode 100644 internal/transport/router/project.go create mode 100644 models/db/Release.go create mode 100644 models/db/SourceMap.go create mode 100644 models/db/project.go create mode 100644 models/db/roles.go diff --git a/db/migrations/202310201651_initial-migration.up.sql b/db/migrations/202310201651_initial-migration.up.sql index e69de29..faebb4b 100644 --- a/db/migrations/202310201651_initial-migration.up.sql +++ b/db/migrations/202310201651_initial-migration.up.sql @@ -0,0 +1 @@ +create database cybertron_dev; diff --git a/go.mod b/go.mod index 02c2346..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 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 5d27c4b..04a87aa 100644 --- a/internal/dependencies/dependencies.go +++ b/internal/dependencies/dependencies.go @@ -1,27 +1,45 @@ package dependencies import ( + "cybertron/internal/database" + "cybertron/internal/transport/handler" + "cybertron/pkg/db" "cybertron/pkg/log" "go.uber.org/zap" "gorm.io/gorm" ) type Dependencies struct { - Service *Service - DBClient *gorm.DB - Logger *zap.Logger + Service *Service + DBClient *gorm.DB + Logger *zap.Logger + Handler *Handler + Repositories *Repositories } type Service struct { // Add your service here } +type Handler struct { + ProjectHandler *handler.ProjectHandler +} + +type Repositories struct { + ProjectRepository *gorm.DB +} + func InitDependencies() *Dependencies { services := initServices() + dbClient := db.NewDBClient() + handlers := initHandlers(dbClient) + repositories := initRepositories(dbClient) return &Dependencies{ - Service: services, - //DBClient: db.NewDBClient(), - Logger: log.Log.GetLog(), + Service: services, + DBClient: dbClient, + Logger: log.Log.GetLog(), + Handler: handlers, + Repositories: repositories, } } @@ -30,3 +48,16 @@ func initServices() *Service { // Add your service here } } + +func initRepositories(dbClient *gorm.DB) *Repositories { + return &Repositories{ + ProjectRepository: database.InitProjectRepository(dbClient), + } +} + +func initHandlers(dbClient *gorm.DB) *Handler { + projectHandler := handler.NewProjectHandler(dbClient) + return &Handler{ + ProjectHandler: projectHandler, + } +} 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/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 7adb827..5b3e015 100644 --- a/internal/transport/server.go +++ b/internal/transport/server.go @@ -6,6 +6,7 @@ import ( "os" "os/signal" "syscall" + "time" "cybertron/configs" "cybertron/internal/dependencies" @@ -29,10 +30,11 @@ func NewServer(dep *dependencies.Dependencies) *Server { func (s *Server) router() { router.ReadinessRouter(s.gin) + router.ProjectRouter(s.gin, s.dependencies) } func (s *Server) Start() { - s.gin.Use(ginzap.RecoveryWithZap(s.dependencies.Logger, true)) + s.gin.Use(ginzap.Ginzap(s.dependencies.Logger, time.RFC3339, false)) s.router() port := configs.GetPort() diff --git a/models/db/Release.go b/models/db/Release.go new file mode 100644 index 0000000..43eab6d --- /dev/null +++ b/models/db/Release.go @@ -0,0 +1,9 @@ +package db + +import "gorm.io/gorm" + +type Release struct { + gorm.Model + ProjectReferenceId string `gorm:"primaryKey"` + ReleaseVersion string `gorm:"column:name"` +} diff --git a/models/db/SourceMap.go b/models/db/SourceMap.go new file mode 100644 index 0000000..f806728 --- /dev/null +++ b/models/db/SourceMap.go @@ -0,0 +1,9 @@ +package db + +import "gorm.io/gorm" + +type SourceMap struct { + gorm.Model + ReleaseReferenceId string `gorm:"primaryKey"` + SourceMapZipUrl 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 new file mode 100644 index 0000000..527caf7 --- /dev/null +++ b/models/db/roles.go @@ -0,0 +1,9 @@ +package db + +import "gorm.io/gorm" + +type Roles struct { + gorm.Model + ProjectReferenceId string `gorm:"primaryKey"` + Role string `gorm:"column:name"` +}