init project
commit
e0b8eb3897
|
@ -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"
|
|
@ -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"
|
||||
}
|
|
@ -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
|
||||
)
|
|
@ -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=
|
|
@ -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)
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
package picture
|
|
@ -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)
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -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) */
|
||||
}
|
|
@ -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)
|
||||
}
|
|
@ -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;
|
Loading…
Reference in New Issue