diff --git a/Makefile b/Makefile index 2f5da83..89512db 100644 --- a/Makefile +++ b/Makefile @@ -34,6 +34,9 @@ build: go build -ldflags="$(LDFLAGS)" -o gozen dist: + cp man/gozen.1 man/gozen.old + sed -e "s|BUILDDATE|$(BUILDDATE)|g" -e "s|VERSION|$(VERSION)|g" man/gozen.old > man/gozen.1 + GOOS=linux GOARCH=amd64 go build -ldflags="$(LDFLAGS)" -o build/gozen-linux-amd64 cp build/gozen-linux-amd64 build/gozen tar -zcvf build/gozen-linux-amd64.tar.gz build/gozen man/gozen.1 @@ -62,6 +65,9 @@ dist: cd build && sha256sum * >> checksum-sha256sum.txt cd build && md5sum * >> checksum-md5sum.txt + # Cleaning + mv man/gozen.old man/gozen.1 + clean: rm -rf gozen* rm -rf build diff --git a/cmd/create_app.go b/cmd/create_app.go index 63d4cad..fb0192d 100644 --- a/cmd/create_app.go +++ b/cmd/create_app.go @@ -19,10 +19,10 @@ type appCmd struct { } func (cmd *appCmd) CreateApp() error { - workDir := constants.CURRENT_WORKING_DIRECTORY - if len(cmd.project.WorkingDir) > 1 { - workDir = cmd.project.WorkingDir - } + workDir := constants.CURRENT_WORKING_DIRECTORY + if len(cmd.project.WorkingDir) > 1 { + workDir = cmd.project.WorkingDir + } appPath := fmt.Sprintf(`%s/%s`, workDir, cmd.project.AppName) fmt.Println("Project created at location: " + appPath) utils.CreateDirectory(appPath) @@ -36,15 +36,13 @@ func (cmd *appCmd) CreateApp() error { cmd.helper.Write("templates/env.sample.tpl", appPath+"/.env.sample", cmd.project) cmd.helper.Write("templates/env.sample.tpl", appPath+"/docker/.env", cmd.project) cmd.helper.Write("templates/env.sample.tpl", appPath+"/docker/.env.sample", cmd.project) - cmd.helper.Write("templates/docker/Dockerfile.debug", appPath+"/docker/Dockerfile.debug", cmd.project) - cmd.helper.Write("templates/docker/Dockerfile.dev", appPath+"/docker/Dockerfile.dev", cmd.project) - cmd.helper.Write("templates/docker/Dockerfile.prod", appPath+"/docker/Dockerfile.prod", cmd.project) - cmd.helper.Write("templates/docker/docker-compose-debug.yml", appPath+"/docker/docker-compose-debug.yml", cmd.project) - cmd.helper.Write("templates/docker/docker-compose.yml", appPath+"/docker/docker-compose.yml", cmd.project) - cmd.helper.Write("templates/docker/entrypoint-debug.sh", appPath+"/docker/entrypoint-debug.sh", cmd.project) - cmd.helper.Write("templates/docker/entrypoint-dev.sh", appPath+"/docker/entrypoint-dev.sh", cmd.project) - cmd.helper.Write("templates/docker/modd-debug.conf", appPath+"/docker/modd-debug.conf", cmd.project) - cmd.helper.Write("templates/docker/modd-dev.conf", appPath+"/docker/modd-dev.conf", cmd.project) + cmd.helper.Write("templates/docker/Dockerfile.debug", appPath+"/docker/Dockerfile.debug", cmd.project) + cmd.helper.Write("templates/docker/Dockerfile.dev", appPath+"/docker/Dockerfile.dev", cmd.project) + cmd.helper.Write("templates/docker/Dockerfile.prod", appPath+"/docker/Dockerfile.prod", cmd.project) + cmd.helper.Write("templates/docker/docker-compose-debug.yml", appPath+"/docker/docker-compose-debug.yml", cmd.project) + cmd.helper.Write("templates/docker/docker-compose.yml", appPath+"/docker/docker-compose.yml", cmd.project) + cmd.helper.Write("templates/docker/modd-debug.conf", appPath+"/docker/modd-debug.conf", cmd.project) + cmd.helper.Write("templates/docker/modd-dev.conf", appPath+"/docker/modd-dev.conf", cmd.project) cmd.helper.Write("templates/gitignore.tpl", appPath+"/.gitignore", cmd.project) cmd.helper.Write("templates/Makefile.tpl", appPath+"/Makefile", cmd.project) diff --git a/cmd/helper/common.go b/cmd/helper/common.go index 3a4f275..4438158 100644 --- a/cmd/helper/common.go +++ b/cmd/helper/common.go @@ -11,57 +11,57 @@ import ( ) type CommonHelper interface { - Write(templatePath string, outputPath string, data interface{}) error - ExecShell(command string, args ...string) ([]string, error) - ExecShellRaw(command string, args ...string) ([]byte, error) + Write(templatePath string, outputPath string, data interface{}) error + ExecShell(command string, args ...string) ([]string, error) + ExecShellRaw(command string, args ...string) ([]byte, error) } type commonHelper struct { - templatesFS embed.FS + templatesFS embed.FS } // Write: generate code and write to file func (helper *commonHelper) Write(templatePath string, outputPath string, data interface{}) error { - baseDir := filepath.Dir(outputPath) - err := utils.CreateDirectory(baseDir) - if err != nil { - return err - } - tpl, err := utils.GenerateCode(helper.templatesFS, templatePath, data) - if err != nil { - return err - } - return utils.WriteFile(outputPath, tpl) + baseDir := filepath.Dir(outputPath) + err := utils.CreateDirectory(baseDir) + if err != nil { + return err + } + tpl, err := utils.GenerateCode(helper.templatesFS, templatePath, data) + if err != nil { + return err + } + return utils.WriteFile(outputPath, tpl) } // ExecShell: execute shell command and return output as string slice func (helper *commonHelper) ExecShell(command string, args ...string) ([]string, error) { - fmt.Printf(`%s %+v\n`, command, args) - cmd := exec.Command(command, args...) - output, err := cmd.Output() - if err != nil { - fmt.Println("Error executing command:", err) - return nil, err - } - lines := strings.Split(strings.TrimSpace(string(output)), "\n") - return lines, nil + fmt.Printf(`%s %+v\n`, command, args) + cmd := exec.Command(command, args...) + output, err := cmd.Output() + if err != nil { + fmt.Println("Error executing command:", err) + return nil, err + } + lines := strings.Split(strings.TrimSpace(string(output)), "\n") + return lines, nil } // ExecShellRaw: execute shell command and return output as byte array func (helper *commonHelper) ExecShellRaw(command string, args ...string) ([]byte, error) { - fmt.Printf(`%s %+v\n`, command, args) - cmd := exec.Command(command, args...) - output, err := cmd.Output() - if err != nil { - fmt.Println("Error executing command:", err) - return nil, err - } - return output, nil + fmt.Printf(`%s %+v\n`, command, args) + cmd := exec.Command(command, args...) + output, err := cmd.Output() + if err != nil { + fmt.Println("Error executing command:", err) + return nil, err + } + return output, nil } // NewCommonHelper returns a new CommonHelper func NewCommonHelper(tpl embed.FS) CommonHelper { - return &commonHelper{ - templatesFS: tpl, - } + return &commonHelper{ + templatesFS: tpl, + } } diff --git a/constants/app.go b/constants/app.go index a4b9630..81788cc 100644 --- a/constants/app.go +++ b/constants/app.go @@ -1,3 +1,3 @@ package constants -const CURRENT_WORKING_DIRECTORY="." +const CURRENT_WORKING_DIRECTORY = "." diff --git a/main.go b/main.go index f2f7512..0b4dec0 100644 --- a/main.go +++ b/main.go @@ -12,9 +12,9 @@ import ( ) var ( - AppVersion = "v0.0.0" - CommitHash = "unknown" - BuildDate = "unknown" + AppVersion = "v0.0.0" + CommitHash = "unknown" + BuildDate = "unknown" ) //go:embed templates/* @@ -31,7 +31,7 @@ func main() { clientApp := cli.NewApp() clientApp.Name = "gozen" - clientApp.Version = AppVersion + clientApp.Version = AppVersion clientApp.Commands = []*cli.Command{ { Name: "create", @@ -64,16 +64,16 @@ func main() { AppName: ctx.Args().Get(0), PackageName: packageName, Driver: driver, - WorkingDir: outputDir, + WorkingDir: outputDir, } - err := project.Validate() - if err != nil { - fmt.Println(err) - return nil - } + err := project.Validate() + if err != nil { + fmt.Println(err) + return nil + } - project.AutoFixes() + project.AutoFixes() app := cmd.NewAppCmd(project, helper) diff --git a/man/gozen.1 b/man/gozen.1 index b1a930d..a3ea37f 100644 --- a/man/gozen.1 +++ b/man/gozen.1 @@ -1,4 +1,4 @@ -.TH GOZEN 1 "September 25, 2024" "Version 0.1.2" "User Commands" +.TH GOZEN 1 "BUILDDATE" "Version VERSION" "User Commands" .SH NAME gozen \- is a simplified golang MVC framework to generate projects and components. .SH SYNOPSIS diff --git a/models/project.go b/models/project.go index f1915f7..609e295 100644 --- a/models/project.go +++ b/models/project.go @@ -15,20 +15,20 @@ type Project struct { AppName string `json:"app_name"` PackageName string `json:"package_name"` Driver string `json:"driver"` - WorkingDir string `json:"-"` + WorkingDir string `json:"-"` } func (p Project) Validate() error { - if len(p.PackageName) == 0 { - return errors.New("Please provide package name.") - } - return nil + if len(p.PackageName) == 0 { + return errors.New("Please provide package name.") + } + return nil } func (p *Project) AutoFixes() { - if len(p.AppName) == 0 { - p.AppName = p.PackageName[strings.LastIndex(p.PackageName, "/")+1:] - } + if len(p.AppName) == 0 { + p.AppName = p.PackageName[strings.LastIndex(p.PackageName, "/")+1:] + } } func (p Project) ToJSON() string { @@ -58,10 +58,10 @@ func (p *Project) LoadFromJsonFile() error { } func (p Project) WriteToJsonFile() error { - workDir := constants.CURRENT_WORKING_DIRECTORY - if len(p.WorkingDir) > 1 { - workDir = p.WorkingDir - } + workDir := constants.CURRENT_WORKING_DIRECTORY + if len(p.WorkingDir) > 1 { + workDir = p.WorkingDir + } filename := fmt.Sprintf(`%s/%s/gozen.json`, workDir, p.AppName) file, err := os.Create(filename) diff --git a/templates/app/controllers/health.tpl b/templates/app/controllers/health.tpl index fd0a506..cc3828c 100644 --- a/templates/app/controllers/health.tpl +++ b/templates/app/controllers/health.tpl @@ -22,12 +22,14 @@ func (c *healthController) Ping(ctx *gin.Context) { ctx.JSON(http.StatusOK, gin.H{ "success": false, "message": err.Error(), + "heart_beat": 0, }) return } ctx.JSON(http.StatusOK, gin.H{ "success": res.Success, "message": res.Message, + "heart_beat": res.HeartBeat, }) } diff --git a/templates/config/config.tpl b/templates/config/config.tpl index 95a2337..fc3b4a6 100644 --- a/templates/config/config.tpl +++ b/templates/config/config.tpl @@ -6,8 +6,8 @@ type Configuration interface { Version() string AppName() string APIPort() string - - DbDriver() string + + DbDriver() string DbHost() string DbPort() string DbUser() string @@ -19,12 +19,12 @@ type configuration struct { appName string apiPort string - db_driver string - db_host string - db_port string - db_user string - db_pass string - db_name string + db_driver string + db_host string + db_port string + db_user string + db_pass string + db_name string } // Version returns version @@ -44,32 +44,32 @@ func (cfg *configuration) APIPort() string { // DbDriver returns database driver func (config *configuration) DbDriver() string { - return config.db_driver + return config.db_driver } // DbHost returns database host func (config *configuration) DbHost() string { - return config.db_host + return config.db_host } // DbPort returns database port func (config *configuration) DbPort() string { - return config.db_port + return config.db_port } // DbUser returns database user func (config *configuration) DbUser() string { - return config.db_user + return config.db_user } // DbPass returns database password func (config *configuration) DbPass() string { - return config.db_pass + return config.db_pass } // DbName returns database name func (config *configuration) DbName() string { - return config.db_name + return config.db_name } func Init( @@ -82,11 +82,11 @@ func Init( config.version = env.GetString("version") config.apiPort = env.GetString("app_name") config.apiPort = env.GetString("api_port") - config.db_driver = env.GetString("db_driver") - config.db_host = env.GetString("db_host") - config.db_port = env.GetString("db_port") - config.db_user = env.GetString("db_user") - config.db_pass = env.GetString("db_pass") - config.db_name = env.GetString("db_name") + config.db_driver = env.GetString("db_driver") + config.db_host = env.GetString("db_host") + config.db_port = env.GetString("db_port") + config.db_user = env.GetString("db_user") + config.db_pass = env.GetString("db_pass") + config.db_name = env.GetString("db_name") return config } diff --git a/templates/constants/app.tpl b/templates/constants/app.tpl index f8043fa..3fe819e 100644 --- a/templates/constants/app.tpl +++ b/templates/constants/app.tpl @@ -7,4 +7,3 @@ const ( ) // TODO: Add constants here. - diff --git a/templates/docker/Dockerfile.debug b/templates/docker/Dockerfile.debug index 02ffbb3..e737cbd 100644 --- a/templates/docker/Dockerfile.debug +++ b/templates/docker/Dockerfile.debug @@ -7,12 +7,35 @@ RUN apt-get update && \ curl \ gnupg-agent -RUN curl -sSL https://packagecloud.io/golang-migrate/migrate/gpgkey | apt-key add - -RUN echo "deb https://packagecloud.io/golang-migrate/migrate/ubuntu/ bionic main" > /etc/apt/sources.list.d/migrate.list -RUN apt-get update && \ - apt-get install -y migrate +RUN apt-get update + +# Install modd based on arch +RUN set -x && \ + arch=$(dpkg --print-architecture) && \ + case "$arch" in \ + amd64) file="modd-0.8-linux64.tgz" ;; \ + armhf|armel|arm64) file="modd-0.8-linuxARM.tgz" ;; \ + i386) file="modd-0.8-linux32.tgz" ;; \ + *) echo "Unsupported architecture: $arch" && exit 1 ;; \ + esac && \ + curl -sL "https://github.com/cortesi/modd/releases/download/v0.8/$file" -o modd.tgz && \ + tar -xf modd.tgz && \ + cp modd-0.8-*/modd /usr/bin/ && \ + chmod +x /usr/bin/modd && rm -rf modd.tgz modd-0.8-* +# Install migrate +RUN set -x && \ + arch=$(dpkg --print-architecture) && \ + case "$arch" in \ + amd64) file="migrate.linux-amd64.deb" ;; \ + arm64) file="migrate.linux-arm64.deb" ;; \ + armhf|armel) file="migrate.linux-armv7.deb" ;; \ + i386) file="migrate.linux-386.deb" ;; \ + *) echo "Unsupported architecture: $arch" && exit 1 ;; \ + esac && \ + curl -sL "https://github.com/golang-migrate/migrate/releases/download/v4.18.1/$file" -o migrate.deb && \ + dpkg -i migrate.deb && rm migrate.deb WORKDIR /app -ENTRYPOINT ["bash", "docker/entrypoint-dev.sh"] +ENTRYPOINT ["modd", "-f", "./docker/modd-debug.conf"] diff --git a/templates/docker/Dockerfile.dev b/templates/docker/Dockerfile.dev index 02ffbb3..fcf18aa 100644 --- a/templates/docker/Dockerfile.dev +++ b/templates/docker/Dockerfile.dev @@ -7,12 +7,35 @@ RUN apt-get update && \ curl \ gnupg-agent -RUN curl -sSL https://packagecloud.io/golang-migrate/migrate/gpgkey | apt-key add - -RUN echo "deb https://packagecloud.io/golang-migrate/migrate/ubuntu/ bionic main" > /etc/apt/sources.list.d/migrate.list -RUN apt-get update && \ - apt-get install -y migrate +RUN apt-get update + +# Install modd based on arch +RUN set -x && \ + arch=$(dpkg --print-architecture) && \ + case "$arch" in \ + amd64) file="modd-0.8-linux64.tgz" ;; \ + armhf|armel|arm64) file="modd-0.8-linuxARM.tgz" ;; \ + i386) file="modd-0.8-linux32.tgz" ;; \ + *) echo "Unsupported architecture: $arch" && exit 1 ;; \ + esac && \ + curl -sL "https://github.com/cortesi/modd/releases/download/v0.8/$file" -o modd.tgz && \ + tar -xf modd.tgz && \ + cp modd-0.8-*/modd /usr/bin/ && \ + chmod +x /usr/bin/modd && rm -rf modd.tgz modd-0.8-* +# Install migrate +RUN set -x && \ + arch=$(dpkg --print-architecture) && \ + case "$arch" in \ + amd64) file="migrate.linux-amd64.deb" ;; \ + arm64) file="migrate.linux-arm64.deb" ;; \ + armhf|armel) file="migrate.linux-armv7.deb" ;; \ + i386) file="migrate.linux-386.deb" ;; \ + *) echo "Unsupported architecture: $arch" && exit 1 ;; \ + esac && \ + curl -sL "https://github.com/golang-migrate/migrate/releases/download/v4.18.1/$file" -o migrate.deb && \ + dpkg -i migrate.deb && rm migrate.deb WORKDIR /app -ENTRYPOINT ["bash", "docker/entrypoint-dev.sh"] +ENTRYPOINT ["modd", "-f", "./docker/modd-dev.conf"] diff --git a/templates/docker/docker-compose-debug.yml b/templates/docker/docker-compose-debug.yml index 06d8096..645ac97 100644 --- a/templates/docker/docker-compose-debug.yml +++ b/templates/docker/docker-compose-debug.yml @@ -16,20 +16,5 @@ services: volumes: - "../:/app" - # app-workers: - # networks: - # - app - # build: - # context: . - # dockerfile: Dockerfile.Workers - # container_name: app-workers - # security_opt: - # - seccomp:unconfined - # env_file: .env - # volumes: - # - "../:/app" - # depends_on: - # - app - networks: app: diff --git a/templates/docker/docker-compose.yml b/templates/docker/docker-compose.yml index de15864..ea398fb 100644 --- a/templates/docker/docker-compose.yml +++ b/templates/docker/docker-compose.yml @@ -15,20 +15,5 @@ services: volumes: - "../:/app" - # app-workers: - # networks: - # - app - # build: - # context: . - # dockerfile: Dockerfile.Workers - # container_name: app-workers - # security_opt: - # - seccomp:unconfined - # env_file: .env - # volumes: - # - "../:/app" - # depends_on: - # - app - networks: app: diff --git a/templates/docker/entrypoint-debug.sh b/templates/docker/entrypoint-debug.sh deleted file mode 100755 index cfe5317..0000000 --- a/templates/docker/entrypoint-debug.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash -cd .. -go get -u github.com/go-delve/delve/cmd/dlv -cd - -MODD_DIR=modd -cd docker -if [ ! -d "$MODD_DIR" ]; then - git clone https://github.com/cortesi/modd - git checkout 45e41bb091af8d3c7bfdc523851a9fc993df8a80 - cd modd - go get mvdan.cc/sh@8aeb0734cd0f - cd - -fi -cd modd -go install ./cmd/modd -cd - -cd .. -modd -f ./docker/modd-debug.conf diff --git a/templates/docker/entrypoint-dev.sh b/templates/docker/entrypoint-dev.sh deleted file mode 100644 index dd6ed49..0000000 --- a/templates/docker/entrypoint-dev.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -MODD_DIR=modd -cd docker -if [ ! -d "$MODD_DIR" ]; then - git clone https://github.com/cortesi/modd - git checkout 45e41bb091af8d3c7bfdc523851a9fc993df8a80 - cd modd - go get mvdan.cc/sh@8aeb0734cd0f - cd - -fi -cd modd -go install ./cmd/modd -cd - -cd .. -modd -f ./docker/modd-dev.conf diff --git a/templates/instance/instance.tpl b/templates/instance/instance.tpl index ae462ba..74be350 100644 --- a/templates/instance/instance.tpl +++ b/templates/instance/instance.tpl @@ -1,12 +1,12 @@ package instance import ( - "fmt" - "log" - "gorm.io/driver/sqlite" - "gorm.io/driver/mysql" - "gorm.io/driver/postgres" - "gorm.io/gorm" + "fmt" + "gorm.io/driver/mysql" + "gorm.io/driver/postgres" + "gorm.io/driver/sqlite" + "gorm.io/gorm" + "log" "{{.PackageName}}/config" "{{.PackageName}}/constants" @@ -14,11 +14,11 @@ import ( type Instance interface { Destroy() error - DB() *gorm.DB + DB() *gorm.DB } type instance struct { - db *gorm.DB + db *gorm.DB // TODO: define singleton object here } @@ -34,25 +34,25 @@ func (instance *instance) DB() *gorm.DB { // Init initializes the instance func Init(cfg config.Configuration) Instance { instance := &instance{} - - var conn gorm.Dialector - if cfg.DbDriver() == constants.DbDriverSQLite { - conn = sqlite.Open(cfg.DbName()) - } else if cfg.DbDriver() == constants.DbDriverMySQL { - url := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local", cfg.DbUser(), cfg.DbPass(), cfg.DbHost(), cfg.DbPort(), cfg.DbName()) - conn = mysql.Open(url) - } else if cfg.DbDriver() == constants.DbDriverPostgres { - url := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s sslmode=disable TimeZone=Asia/Jakarta", cfg.DbHost(), cfg.DbUser(), cfg.DbPass(), cfg.DbName(), cfg.DbPort()) - conn = postgres.Open(url) - } - gormDB, err := gorm.Open(conn, &gorm.Config{}) + + var conn gorm.Dialector + if cfg.DbDriver() == constants.DbDriverSQLite { + conn = sqlite.Open(cfg.DbName()) + } else if cfg.DbDriver() == constants.DbDriverMySQL { + url := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local", cfg.DbUser(), cfg.DbPass(), cfg.DbHost(), cfg.DbPort(), cfg.DbName()) + conn = mysql.Open(url) + } else if cfg.DbDriver() == constants.DbDriverPostgres { + url := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s sslmode=disable TimeZone=Asia/Jakarta", cfg.DbHost(), cfg.DbUser(), cfg.DbPass(), cfg.DbName(), cfg.DbPort()) + conn = postgres.Open(url) + } + gormDB, err := gorm.Open(conn, &gorm.Config{}) if err != nil { log.Fatal(err) } instance.db = gormDB - // TODO: initialize singleton object here + // TODO: initialize singleton object here return instance } diff --git a/templates/logger/logger.tpl b/templates/logger/logger.tpl index 7122ca3..b8bea1d 100644 --- a/templates/logger/logger.tpl +++ b/templates/logger/logger.tpl @@ -8,4 +8,4 @@ var Log *logrus.Logger func init() { logrus.SetFormatter(&logrus.JSONFormatter{}) Log = logrus.New() -} \ No newline at end of file +} diff --git a/templates/main.tpl b/templates/main.tpl index de8cfda..a766158 100644 --- a/templates/main.tpl +++ b/templates/main.tpl @@ -5,8 +5,8 @@ import ( "os" "sync" - "github.com/urfave/cli" "github.com/spf13/viper" + "github.com/urfave/cli" "{{.PackageName}}/config" "{{.PackageName}}/instance" "{{.PackageName}}/runner" diff --git a/templates/models/health.tpl b/templates/models/health.tpl index 05bb6ce..9b9399b 100644 --- a/templates/models/health.tpl +++ b/templates/models/health.tpl @@ -3,10 +3,11 @@ package models import "{{.PackageName}}/instance/registry" type Health struct { - Success bool `json:"success"` - Message string `json:"message"` + Success bool `json:"success"` + Message string `json:"message"` + HeartBeat int64 `json:"heart_beat"` } func init() { - registry.RegisterModel(new(Health)) + registry.RegisterModel(new(Health)) } diff --git a/templates/repository/health.tpl b/templates/repository/health.tpl index 2c79926..3e6d45e 100644 --- a/templates/repository/health.tpl +++ b/templates/repository/health.tpl @@ -1,8 +1,8 @@ package repository import ( - "context" - "gorm.io/gorm" + "context" + "gorm.io/gorm" "{{.PackageName}}/logger" "{{.PackageName}}/models" @@ -17,7 +17,7 @@ type healthRepo struct { } func (r *healthRepo) Ping(ctx context.Context) (bool, error) { - doc := models.Health{ + doc := models.Health{ Success: true, Message: "Service is up and running.", } diff --git a/templates/runner/api.tpl b/templates/runner/api.tpl index fb807a0..3ae5d63 100644 --- a/templates/runner/api.tpl +++ b/templates/runner/api.tpl @@ -47,7 +47,7 @@ func (runner *api) Go(ctx context.Context, wg *sync.WaitGroup) { signal.Notify(stopChan, os.Interrupt, os.Kill) go func() { - <- stopChan + <-stopChan fmt.Println("\nShutting down server...") cancel() @@ -62,7 +62,10 @@ func (runner *api) Go(ctx context.Context, wg *sync.WaitGroup) { } }() - logger.Log.Infof("Starting Rest API server on %v...", runner.cfg.APIPort()) + logger.Log.Infof("Starting Rest API server...") + logger.Log.Infof("Listening on server: http://127.0.0.1:%s", runner.cfg.APIPort()) + logger.Log.Infof("Health check URL: http://127.0.0.1:%s/ping", runner.cfg.APIPort()) + if err := s.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatal(err) } diff --git a/templates/service/health.tpl b/templates/service/health.tpl index 11fee0b..dd6bf1e 100644 --- a/templates/service/health.tpl +++ b/templates/service/health.tpl @@ -5,6 +5,7 @@ import ( "{{.PackageName}}/models" "{{.PackageName}}/repository" + "{{.PackageName}}/utils" ) type HealthSvc interface { @@ -12,25 +13,30 @@ type HealthSvc interface { } type healthSvc struct { - healthRepo repository.HealthRepo + healthRepo repository.HealthRepo } func (svc *healthSvc) Ping(ctx context.Context) (*models.Health, error) { - // groupError := "PING_HEALTH_SERVICE" - // logger.Log.WithError(err).Error(groupError) - doc := models.Health{ - Success: true, - Message: "Service is up and running", - } + status, err := svc.healthRepo.Ping(ctx) + + if err != nil { + return nil, err + } + + doc := models.Health{ + Success: status, + Message: "Service is up and running", + HeartBeat: utils.EpochTime(), + } return &doc, nil } func NewHealthSvc( - healthRepo repository.HealthRepo, + healthRepo repository.HealthRepo, ) HealthSvc { return &healthSvc{ - healthRepo: healthRepo, + healthRepo: healthRepo, } } diff --git a/templates/utils/utils.tpl b/templates/utils/utils.tpl index 58acd5a..eb943a0 100644 --- a/templates/utils/utils.tpl +++ b/templates/utils/utils.tpl @@ -1,3 +1,9 @@ package utils -// TODO: Write utility functions here. +import "time" + +func EpochTime() int64 { + return time.Now().Unix() +} + +// TODO: Write utility functions here. diff --git a/utils/utils.go b/utils/utils.go index 233f10c..9977197 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -9,7 +9,6 @@ import ( "strings" ) - func GenerateCode(tplFS embed.FS, tplFile string, data interface{}) (string, error) { tpl, err := template.ParseFS(tplFS, tplFile) if err != nil { @@ -25,20 +24,20 @@ func GenerateCode(tplFS embed.FS, tplFile string, data interface{}) (string, err } func WriteFile(path, data string) error { - // Replacing escape characters - data = strings.ReplaceAll(data, "<", "<") - data = strings.ReplaceAll(data, ">", ">") - data = strings.ReplaceAll(data, "&", "&") + // Replacing escape characters + data = strings.ReplaceAll(data, "<", "<") + data = strings.ReplaceAll(data, ">", ">") + data = strings.ReplaceAll(data, "&", "&") file, err := os.Create(path) if err != nil { return err } defer file.Close() - _, err = fmt.Fprintf(file, `%s`, data) - if err != nil { - return err - } + _, err = fmt.Fprintf(file, `%s`, data) + if err != nil { + return err + } return nil }