From 7d92d92f2f45c6ed2d88dd274e5fe73354365450 Mon Sep 17 00:00:00 2001 From: Dhaverd Date: Wed, 26 Feb 2025 16:15:42 +0800 Subject: [PATCH] initial-commit --- .env | 6 ++++++ Controllers/Controller.go | 21 ++++++++++++++++++++ Controllers/UserController.go | 34 ++++++++++++++++++++++++++++++++ Database/DBHelper.go | 22 +++++++++++++++++++++ Models/User.go | 10 ++++++++++ Services/UserService.go | 26 ++++++++++++++++++++++++ go.mod | 18 +++++++++++++++++ go.sum | 20 +++++++++++++++++++ main.go | 37 +++++++++++++++++++++++++++++++++++ migrate.go | 15 ++++++++++++++ 10 files changed, 209 insertions(+) create mode 100644 .env create mode 100644 Controllers/Controller.go create mode 100644 Controllers/UserController.go create mode 100644 Database/DBHelper.go create mode 100644 Models/User.go create mode 100644 Services/UserService.go create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go create mode 100644 migrate.go diff --git a/.env b/.env new file mode 100644 index 0000000..382bdae --- /dev/null +++ b/.env @@ -0,0 +1,6 @@ +DB_HOST=127.0.0.1 +DB_PORT=3306 +DB_USER=root +DB_PASSWORD=root +DB_NAME=dbname +HTTP_PORT=3210 \ No newline at end of file diff --git a/Controllers/Controller.go b/Controllers/Controller.go new file mode 100644 index 0000000..61ee86f --- /dev/null +++ b/Controllers/Controller.go @@ -0,0 +1,21 @@ +package Controllers + +import ( + "fmt" + "github.com/gorilla/mux" + "net/http" +) + +func MasterController() *mux.Router { + r := mux.NewRouter() + r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + fmt.Fprintf(w, "Welcome to the api!") + }) + r = composeSubrouters(r) + return r +} + +func composeSubrouters(r *mux.Router) *mux.Router { + r = UserController(r) + return r +} diff --git a/Controllers/UserController.go b/Controllers/UserController.go new file mode 100644 index 0000000..df8acd9 --- /dev/null +++ b/Controllers/UserController.go @@ -0,0 +1,34 @@ +package Controllers + +import ( + "Dhaverd/computer-journal/Services" + "encoding/json" + "fmt" + "github.com/gorilla/mux" + "net/http" +) + +func UserController(router *mux.Router) *mux.Router { + userrouter := router.PathPrefix("/users").Subrouter() + userrouter.HandleFunc("/", getAllUsers).Methods("GET") + userrouter.HandleFunc("/{id}", getUserById) + + return router +} + +func getAllUsers(w http.ResponseWriter, r *http.Request) { + users := Services.GetAllUsers() + err := json.NewEncoder(w).Encode(users) + if err != nil { + fmt.Println("Error encoding users\n" + err.Error()) + } +} + +func getUserById(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + user := Services.GetUserById(vars["id"]) + err := json.NewEncoder(w).Encode(user) + if err != nil { + fmt.Println("Error encoding user\n" + err.Error()) + } +} diff --git a/Database/DBHelper.go b/Database/DBHelper.go new file mode 100644 index 0000000..2b1f8b0 --- /dev/null +++ b/Database/DBHelper.go @@ -0,0 +1,22 @@ +package Database + +import ( + "gorm.io/driver/mysql" + "gorm.io/gorm" + "os" +) + +func GetDSN() string { + dbHost := os.Getenv("DB_HOST") + dbPort := os.Getenv("DB_PORT") + dbUser := os.Getenv("DB_USER") + dbPassword := os.Getenv("DB_PASSWORD") + dbName := os.Getenv("DB_NAME") + dsn := dbUser + ":" + dbPassword + "@tcp(" + dbHost + ":" + dbPort + ")/" + dbName + return dsn +} + +func GetConnection() *gorm.DB { + db, _ := gorm.Open(mysql.Open(GetDSN()), &gorm.Config{}) + return db +} diff --git a/Models/User.go b/Models/User.go new file mode 100644 index 0000000..2494d2d --- /dev/null +++ b/Models/User.go @@ -0,0 +1,10 @@ +package Models + +import "gorm.io/gorm" + +type User struct { + gorm.Model + Name string `gorm:"size:255,not null"` + Email string `gorm:"size:255,not null"` + Password string `gorm:"size:255,not null"` +} diff --git a/Services/UserService.go b/Services/UserService.go new file mode 100644 index 0000000..c71e40e --- /dev/null +++ b/Services/UserService.go @@ -0,0 +1,26 @@ +package Services + +import ( + "Dhaverd/computer-journal/Database" + "Dhaverd/computer-journal/Models" +) + +type User struct { + Name string `json:"name"` + Email string `json:"email"` + Password int `json:"password"` +} + +func GetAllUsers() []Models.User { + connection := Database.GetConnection() + var users []Models.User + connection.Find(&users) + return users +} + +func GetUserById(id string) Models.User { + connection := Database.GetConnection() + var user Models.User + connection.First(&user, id) + return user +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..57ca112 --- /dev/null +++ b/go.mod @@ -0,0 +1,18 @@ +module Dhaverd/computer-journal + +go 1.24.0 + +require ( + github.com/gorilla/mux v1.8.1 + github.com/joho/godotenv v1.5.1 + gorm.io/driver/mysql v1.5.7 + gorm.io/gorm v1.25.12 +) + +require ( + filippo.io/edwards25519 v1.1.0 // indirect + github.com/go-sql-driver/mysql v1.9.0 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + golang.org/x/text v0.22.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..7976ccf --- /dev/null +++ b/go.sum @@ -0,0 +1,20 @@ +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-sql-driver/mysql v1.9.0 h1:Y0zIbQXhQKmQgTp44Y1dp3wTXcn804QoTptLZT1vtvo= +github.com/go-sql-driver/mysql v1.9.0/go.mod h1:pDetrLJeA3oMujJuvXc8RJoasr589B6A9fwzD3QMrqw= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +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/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= +gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo= +gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= +gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8= +gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= diff --git a/main.go b/main.go new file mode 100644 index 0000000..326f81a --- /dev/null +++ b/main.go @@ -0,0 +1,37 @@ +package main + +import ( + "Dhaverd/computer-journal/Controllers" + "fmt" + "github.com/joho/godotenv" + "net/http" + "os" +) + +func LoadDotEnv() { + errEnv := godotenv.Load(".env.local") + if errEnv != nil { + fmt.Println("Error loading .env.local file. Trying to load .env file...") + errEnv = godotenv.Load(".env") + if errEnv != nil { + fmt.Println("Error loading .env file") + } else { + fmt.Println(".env loaded successfully") + } + } else { + fmt.Println(".env.local loaded successfully") + } +} + +func main() { + masterController := Controllers.MasterController() + fmt.Println("Trying to load .env.local file...") + LoadDotEnv() + port := os.Getenv("HTTP_PORT") + fmt.Printf("Starting server on port %s\n", port) + errSrv := http.ListenAndServe(":"+port, masterController) + if errSrv != nil { + fmt.Println("Server start error") + return + } +} diff --git a/migrate.go b/migrate.go new file mode 100644 index 0000000..cec4522 --- /dev/null +++ b/migrate.go @@ -0,0 +1,15 @@ +package main + +import ( + "Dhaverd/computer-journal/Database" + "Dhaverd/computer-journal/Models" + "fmt" +) + +func main() { + connection := Database.GetConnection() + err := connection.AutoMigrate(&Models.User{}) + if err != nil { + fmt.Println("Error migrating database") + } +}