commit e0b8eb38974a6b18072355f20cdb94e4f2be443d Author: RuisPipe Date: Thu May 6 20:36:59 2021 +0200 init project diff --git a/config.toml b/config.toml new file mode 100644 index 0000000..952a428 --- /dev/null +++ b/config.toml @@ -0,0 +1,13 @@ +[server] +host = "127.0.0.1:3000" + +[database] +host = "127.0.0.1:3306" +database = "app-idea" +username = "root" +password = "admin" + +# example +[output] +directory = "./output" +format = "toml" \ No newline at end of file diff --git a/example.http b/example.http new file mode 100644 index 0000000..f28b09c --- /dev/null +++ b/example.http @@ -0,0 +1,15 @@ +### + +GET http://localhost:3000/api/v1/users + + +### + +POST http://localhost:3000/api/v1/users +Content-Type: application/json + +{ + "username": "alex", + "email": "restapi@roese.dev", + "password": "hello wolrd" +} \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..2a9ef3f --- /dev/null +++ b/go.mod @@ -0,0 +1,16 @@ +module git.umbach.dev/app-idea/rest-api + +go 1.16 + +require ( + github.com/BurntSushi/toml v0.3.1 // indirect + github.com/andybalholm/brotli v1.0.2 // indirect + github.com/go-sql-driver/mysql v1.6.0 // indirect + github.com/gofiber/fiber/v2 v2.8.0 // indirect + github.com/google/uuid v1.2.0 // indirect + github.com/klauspost/compress v1.12.2 // indirect + github.com/valyala/fasthttp v1.24.0 // indirect + github.com/valyala/tcplisten v1.0.0 // indirect + golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf // indirect + golang.org/x/sys v0.0.0-20210503173754-0981d6026fa6 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..fa15bce --- /dev/null +++ b/go.sum @@ -0,0 +1,43 @@ +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= +github.com/andybalholm/brotli v1.0.2 h1:JKnhI/XQ75uFBTiuzXpzFrUriDPiZjlOSzh6wXogP0E= +github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= +github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/gofiber/fiber/v2 v2.8.0 h1:BdWvZmg/WY/Vjtjm38aXOp1Lks1BhuyS2b7lSWSPAzk= +github.com/gofiber/fiber/v2 v2.8.0/go.mod h1:Ah3IJikrKNRepl/HuVawppS25X7FWohwfCSRn7kJG28= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/klauspost/compress v1.11.8/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.12.2 h1:2KCfW3I9M7nSc5wOqXAlW2v2U6v+w6cbjvbfp+OykW8= +github.com/klauspost/compress v1.12.2/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.23.0/go.mod h1:0mw2RjXGOzxf4NL2jni3gUQ7LfjjUSiG5sskOUUSEpU= +github.com/valyala/fasthttp v1.24.0 h1:AAiG4oLDUArTb7rYf9oO2bkGooOqCaUF6a2u8asBP3I= +github.com/valyala/fasthttp v1.24.0/go.mod h1:0mw2RjXGOzxf4NL2jni3gUQ7LfjjUSiG5sskOUUSEpU= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf h1:B2n+Zi5QeYRDAEodEu72OS36gmTWjgpXr2+cWcBW90o= +golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20210226101413-39120d07d75e/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210503173754-0981d6026fa6 h1:cdsMqa2nXzqlgs183pHxtvoVwU7CyzaCTAUOg94af4c= +golang.org/x/sys v0.0.0-20210503173754-0981d6026fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/main.go b/main.go new file mode 100644 index 0000000..98be4d2 --- /dev/null +++ b/main.go @@ -0,0 +1,21 @@ +package main + +import ( + "git.umbach.dev/app-idea/rest-api/routers/config" + "git.umbach.dev/app-idea/rest-api/routers/database" + "git.umbach.dev/app-idea/rest-api/routers/router" + + _ "github.com/go-sql-driver/mysql" + "github.com/gofiber/fiber/v2" +) + +func main() { + app := fiber.New() + + router.SetupRoutes(app) + + config.LoadConfig() + database.InitDatabase() + + app.Listen(config.GetConfig().Server.Host) +} diff --git a/routers/api/v1/picture/picture.go b/routers/api/v1/picture/picture.go new file mode 100644 index 0000000..11c742a --- /dev/null +++ b/routers/api/v1/picture/picture.go @@ -0,0 +1 @@ +package picture diff --git a/routers/api/v1/user/user.go b/routers/api/v1/user/user.go new file mode 100644 index 0000000..832ba14 --- /dev/null +++ b/routers/api/v1/user/user.go @@ -0,0 +1,88 @@ +package user + +import ( + "fmt" + + "git.umbach.dev/app-idea/rest-api/routers/database" + "github.com/gofiber/fiber/v2" + "golang.org/x/crypto/bcrypt" +) + +// ABCDEFGHIJKLMNOPQRSTUVWXYZ +// 0123456789 + +func NewUser(c *fiber.Ctx) error { + db, err := database.GetDatabase() + + if db == nil || err != nil { + return c.SendString(err.Error()) + } + + type LoginInput struct { + Username string `json:"username"` + Email string `json:"email"` + Password string `json:"password"` + } + + var input LoginInput + + if err := c.BodyParser(&input); err != nil { + return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"status": "error", "message": "Error on login request", "data": err}) + } + + fmt.Println(input, input.Password) + + password := []byte(input.Password) + + hashedPassword, err := bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost) + + if err != nil { + panic(err) + } + fmt.Println(string(hashedPassword)) + + err = bcrypt.CompareHashAndPassword(hashedPassword, []byte("hello wolrd")) + fmt.Println(err) + + /*sqlStatement, err := db.Prepare("INSERT INTO users (name) VALUES (?);") + res, err := sqlStatement.Exec(uuid.New().String()) + rowCount, err := res.RowsAffected() + fmt.Printf("inserted %d row(s) of data. %s \n", rowCount, err) + + fmt.Println("finish") */ + + return c.JSON(fiber.Map{"status": "error", "message": "invalid or ..."}) +} + +func GetUser(c *fiber.Ctx) error { + return c.SendString("user") +} + +func GetUsers(c *fiber.Ctx) error { + db, err := database.GetDatabase() + + // c.Params("id") + + if db == nil || err != nil { + return c.SendString("db error") + } + + list := []string{} + + var ( + name string + ) + + rows, err := db.Query("SELECT username FROM users;") + defer rows.Close() + fmt.Println("reading data:") + for rows.Next() { + err := rows.Scan(&name) + fmt.Printf("Data row = (%s, %s)\n", name, err) + list = append(list, name) + } + err = rows.Err() + fmt.Println("Done") + + return c.JSON(list) +} diff --git a/routers/config/config.go b/routers/config/config.go new file mode 100644 index 0000000..93d83e6 --- /dev/null +++ b/routers/config/config.go @@ -0,0 +1,32 @@ +package config + +import ( + "github.com/BurntSushi/toml" + _ "github.com/go-sql-driver/mysql" +) + +var conf Config + +type Config struct { + Server server + Database database +} + +type database struct { + Host string + Database string + Username string + Password string +} + +type server struct { + Host string +} + +func LoadConfig() { + toml.DecodeFile("./config.toml", &conf) +} + +func GetConfig() Config { + return conf +} diff --git a/routers/database/database.go b/routers/database/database.go new file mode 100644 index 0000000..178c5b8 --- /dev/null +++ b/routers/database/database.go @@ -0,0 +1,47 @@ +package database + +import ( + "database/sql" + "errors" + "fmt" + + "git.umbach.dev/app-idea/rest-api/routers/config" +) + +func getConnectionString() string { + conf := config.GetConfig() + + return fmt.Sprintf("%s:%s@tcp(%s)/%s", conf.Database.Username, conf.Database.Password, conf.Database.Host, conf.Database.Database) +} + +func GetDatabase() (*sql.DB, error) { + db, err := sql.Open("mysql", getConnectionString()) + + if err != nil { + return db, errors.New("db error") + } + + return db, nil +} + +func InitDatabase() { + /* + var connectionString = getConnectionString() + + db, err := sql.Open("mysql", connectionString) + + if err != nil { + fmt.Println(err) + } + + defer db.Close() + + //_, err = db.Exec("CREATE TABLE IF NOT EXISTS users (id VARCHAR(36), name VARCHAR(255), avatar_url VARCHAR(255), created);") + //fmt.Println("Finished creating table.") + + /* + sqlStatement, err := db.Prepare("INSERT INTO users (name) VALUES (?);") + res, err := sqlStatement.Exec(uuid.New().String()) + rowCount, err := res.RowsAffected() + fmt.Printf("inserted %d row(s) of data. \n", rowCount) */ +} diff --git a/routers/router/router.go b/routers/router/router.go new file mode 100644 index 0000000..3a769cb --- /dev/null +++ b/routers/router/router.go @@ -0,0 +1,18 @@ +package router + +import ( + "git.umbach.dev/app-idea/rest-api/routers/api/v1/user" + + "github.com/gofiber/fiber/v2" +) + +func SetupRoutes(app *fiber.App) { + api := app.Group("/api/v1") + + app.Get("/user", user.GetUser) + + // Users + users := api.Group("/users") + users.Get("/", user.GetUsers) + users.Post("/", user.NewUser) +} diff --git a/scheme.sql b/scheme.sql new file mode 100644 index 0000000..7a5acfc --- /dev/null +++ b/scheme.sql @@ -0,0 +1,42 @@ +-- +-- Database: `app-idea` +-- + +-- -------------------------------------------------------- + +-- +-- Table structure for table `users` +-- + +CREATE TABLE `users` ( + `user_id` varchar(36) DEFAULT NULL, + `user_hashtag` varchar(6) NOT NULL, + `username` varchar(255) NOT NULL, + `email` varchar(255) NOT NULL, + `password` char(60) NOT NULL, + `rank` tinyint(4) DEFAULT 0, + `avatar_url` varchar(255) NOT NULL, + `location` varchar(20) DEFAULT NULL, + `description` varchar(255) DEFAULT NULL, + `language` tinyint(4) DEFAULT 0, + `cash` int(11) DEFAULT 0, + `posts` int(11) DEFAULT 0, + `followers` int(11) DEFAULT 0, + `following` int(11) DEFAULT 0, + `last_login` datetime DEFAULT NULL, + `created` datetime NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- +-- Table structure for table `pictures` +-- + +CREATE TABLE `pictures` ( + `user_id` varchar(36) NOT NULL, + `picture_id` int(11) NOT NULL, + `likes` int(11) DEFAULT 0, + `dislikes` int(11) DEFAULT 0, + `location` varchar(20) NOT NULL, + `description` varchar(250) DEFAULT NULL, + `created` datetime NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;