package cmd import ( "database/sql" "fmt" "log" "net/http" "github.com/gin-gonic/gin" _ "github.com/lib/pq" "github.com/spf13/viper" ) var ( ListenPort = "8080" db *sql.DB DB_Host string DB_Port string DB_User string DB_Pass string DB_Name string ) func getDBInfo() error { dbhost := viper.GetString("Server.DB_Host") if dbhost == "" { e := fmt.Errorf("No database IP address present in config file!\n") return e } else { DB_Host = dbhost } dbport := viper.GetString("Server.DB_Port") if dbport == "" { e := fmt.Errorf("No database port present in config file!\n") return e } else { DB_Port = dbport } dbuser := viper.GetString("Server.DB_User") if dbuser == "" { e := fmt.Errorf("No database username present in config file!\n") return e } else { DB_User = dbuser } dbpass := viper.GetString("Server.DB_Pass") if dbpass == "" { e := fmt.Errorf("No database password present in config file!\n") return e } else { DB_Pass = dbpass } dbname := viper.GetString("Server.DB_Name") if dbname == "" { e := fmt.Errorf("No database name present in config file!\n") return e } else { DB_Name = dbname } return nil } func openDB() error { psqlconn := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=disable", DB_Host, DB_Port, DB_User, DB_Pass, DB_Name) dba, err := sql.Open("postgres", psqlconn) if err != nil { return err } db = dba return nil } func setPort() { p := viper.GetString("Server.Port") if p != "" { ListenPort = p } } func server() { log.SetPrefix("[DRAHOOT] ") setPort() if err := getDBInfo(); err != nil { log.Fatalf("INVALID DB INFO: %v\nPlease refer to the example configuration file in the repo at https://git.bulgariu.xyz/raul/drahoot/src/branch/main/sample-config (default config path = ~/.config/drahoot/drahoot.toml)", err) } if err := openDB(); err != nil { log.Fatalf("Database machine broke: %v\n", err) } gin.SetMode(gin.ReleaseMode) r := gin.Default() r.GET("/", helloWorld) // TODO: Have fun creating new endpoints r.GET("/api/users", getUsers) r.GET("/api/user/:userid", getUser) r.Run(":" + ListenPort) } func getUser(c *gin.Context) { id := c.Param("userid") user := user{} err := db.QueryRow("SELECT id_alumno,nombre,apellido1,apellido2,email FROM alumnos WHERE id_alumno = "+id).Scan(&user.Id, &user.Name, &user.Surname1, &user.Surname2, &user.Email) if err != nil { e := fmt.Sprintf("SOMETHING BAD HAPPENED QUERYING THE DATABASE: %v\n", err) log.Print(e) c.String(http.StatusInternalServerError, e) return } c.IndentedJSON(http.StatusOK, user) } func getUsers(c *gin.Context) { users := []user{} rows, err := db.Query("SELECT id_alumno,nombre,apellido1,apellido2,email FROM alumnos") if err != nil { e := fmt.Sprintf("SOMETHING BAD HAPPENED QUERYING THE DATABASE: %v\n", err) log.Print(e) c.String(http.StatusInternalServerError, e) return } defer rows.Close() for rows.Next() { user := user{} err = rows.Scan(&user.Id, &user.Name, &user.Surname1, &user.Surname2, &user.Email) if err != nil { e := fmt.Sprintf("SOMETHING BAD HAPPENED SCANNING THE ROWS: %v\n", err) log.Print(e) c.String(http.StatusInternalServerError, e) return } users = append(users, user) } c.IndentedJSON(http.StatusOK, users) } // func createUser(c *gin.Context) { // var newUser user // if err := c.BindJSON(&newUser); err != nil { // return // } // dynStmt := `INSERT INTO "alumnos"("nombre", "apellido1", "apellido2", "email") values($1, $2, $3, $4)` // db, err := openDB() // if err != nil { // e := fmt.Sprintf("We couldn't complete your request because the database server exploded, more at 11: %v\n", err) // c.String(http.StatusInternalServerError, e) // return // } // // _, e := db.Exec(dynStmt, newUser.Name, newUser.Surname1, newUser.Surname2, newUser.Email) // if e != nil { // e := fmt.Sprintf("We couldn't complete your request because the database server imploded, more at 11: %v\n", err) // c.String(http.StatusInternalServerError, e) // return // } // // fmt.Println(newUser) // c.String(http.StatusOK, "Everything's fine!\n") // } func helloWorld(c *gin.Context) { ua := c.Request.UserAgent() message := fmt.Sprintf("Hello %v!\n", ua) c.String(http.StatusOK, message) }