init project

master
RuisPipe 2021-05-06 20:36:59 +02:00
commit e0b8eb3897
11 changed files with 336 additions and 0 deletions

13
config.toml Normal file
View File

@ -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"

15
example.http Normal file
View File

@ -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"
}

16
go.mod Normal file
View File

@ -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
)

43
go.sum Normal file
View File

@ -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=

21
main.go Normal file
View File

@ -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)
}

View File

@ -0,0 +1 @@
package picture

View File

@ -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)
}

32
routers/config/config.go Normal file
View File

@ -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
}

View File

@ -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) */
}

18
routers/router/router.go Normal file
View File

@ -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)
}

42
scheme.sql Normal file
View File

@ -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;