diff --git a/README.md b/README.md index 78f821e..b5b792f 100644 --- a/README.md +++ b/README.md @@ -4,12 +4,12 @@ ai 繪圖服務端(快速重構) TEST: +- [ ] [/api/users](/api/users) - [ ] [/api/sessions](/api/sessions) - [ ] [/api/servers](/api/servers) - [ ] [/api/models](/api/models) - [ ] [/api/images](/api/images) - [ ] [/api/tasks](/api/tasks) -- [ ] [/api/users](/api/users) - [ ] [/api/tags](/api/tags) diff --git a/main.go b/main.go index cbf81f4..a8413e0 100644 --- a/main.go +++ b/main.go @@ -36,17 +36,29 @@ func main() { // 設定路由 r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - // 從本地讀取Markdown文件 input, err := ioutil.ReadFile("./README.md") if err != nil { log.Println(err) return } - //output := blackfriday.MarkdownBasic(input) output := blackfriday.Markdown(input, blackfriday.HtmlRenderer(0, "", ""), blackfriday.EXTENSION_TABLES|blackfriday.EXTENSION_FENCED_CODE|blackfriday.EXTENSION_AUTOLINK) - w.Write(output) + html := "API Document" + string(output) + "" + w.Header().Set("Content-Type", "text/html; charset=utf-8") + w.Write([]byte(html)) }) + r.HandleFunc("/api/users", routers.UsersGet).Methods("GET") + r.HandleFunc("/api/users", routers.UsersPost).Methods("POST") + r.HandleFunc("/api/users/{id}", routers.UsersItemGet).Methods("GET") + r.HandleFunc("/api/users/{id}", routers.UsersItemPatch).Methods("PATCH") + r.HandleFunc("/api/users/{id}", routers.UsersItemDelete).Methods("DELETE") + + r.HandleFunc("/api/sessions", routers.SessionsGet).Methods("GET") + r.HandleFunc("/api/sessions", routers.SessionsPost).Methods("POST") + r.HandleFunc("/api/sessions/{id}", routers.SessionsItemGet).Methods("GET") + r.HandleFunc("/api/sessions/{id}", routers.SessionsItemPatch).Methods("PATCH") + r.HandleFunc("/api/sessions/{id}", routers.SessionsItemDelete).Methods("DELETE") + r.HandleFunc("/api/models", routers.ModelsGet).Methods("GET") r.HandleFunc("/api/models", routers.ModelsPost).Methods("POST") r.HandleFunc("/api/models/{id}", routers.ModelItemGet).Methods("GET") @@ -65,18 +77,6 @@ func main() { r.HandleFunc("/api/tasks/{id}", routers.TasksItemPatch).Methods("PATCH") r.HandleFunc("/api/tasks/{id}", routers.TasksItemDelete).Methods("DELETE") - r.HandleFunc("/api/users", routers.UsersGet).Methods("GET") - r.HandleFunc("/api/users", routers.UsersPost).Methods("POST") - r.HandleFunc("/api/users/{id}", routers.UsersItemGet).Methods("GET") - r.HandleFunc("/api/users/{id}", routers.UsersItemPatch).Methods("PATCH") - r.HandleFunc("/api/users/{id}", routers.UsersItemDelete).Methods("DELETE") - - r.HandleFunc("/api/sessions", routers.SessionsGet).Methods("GET") - r.HandleFunc("/api/sessions", routers.SessionsPost).Methods("POST") - r.HandleFunc("/api/sessions/{id}", routers.SessionsItemGet).Methods("GET") - r.HandleFunc("/api/sessions/{id}", routers.SessionsItemPatch).Methods("PATCH") - r.HandleFunc("/api/sessions/{id}", routers.SessionsItemDelete).Methods("DELETE") - r.HandleFunc("/api/servers", routers.ServersGet).Methods("GET") r.HandleFunc("/api/servers", routers.ServersPost).Methods("POST") r.HandleFunc("/api/servers/{id}", routers.ServersItemGet).Methods("GET") diff --git a/models/User.go b/models/User.go index be015c0..515c265 100644 --- a/models/User.go +++ b/models/User.go @@ -1,34 +1,51 @@ package models import ( + "crypto/md5" + "fmt" "log" "main/configs" + "main/utils" + "time" ) type User struct { ID int `json:"id"` Name string `json:"name"` Email string `json:"email"` - Password string `json:"password"` - Slat string `json:"slat"` CreatedAt string `json:"created_at"` UpdatedAt string `json:"updated_at"` + password string + slat string } -func (user *User) Create() error { +func (user *User) Create(name, email, password string) error { + + if name == "" || email == "" || password == "" { + return fmt.Errorf("name, email and password can not be empty") + } + + user.slat = utils.RandomString(16) + user.password = fmt.Sprintf("%x", md5.Sum([]byte(password+user.slat))) + user.Name = name + user.Email = email + user.CreatedAt = time.Now().Format("2006-01-02 15:04:05") + user.UpdatedAt = user.CreatedAt + db, err := configs.GetDB() if err != nil { log.Println(err) return err } defer db.Close() - stmt, err := db.Prepare("INSERT INTO users(name, email, created_at, updated_at) values(?, ?, ?, ?)") + fmt.Println(user) + stmt, err := db.Prepare("INSERT INTO users(name, email, password, slat, created_at, updated_at) values(?, ?, ?, ?, ?, ?)") if err != nil { log.Println(err) return err } defer stmt.Close() - result, err := stmt.Exec(user.Name, user.Email, user.CreatedAt, user.UpdatedAt) + result, err := stmt.Exec(user.Name, user.Email, user.password, user.slat, user.CreatedAt, user.UpdatedAt) if err != nil { log.Println(err) return err diff --git a/routers/users.go b/routers/users.go index a07db74..b2a83b1 100644 --- a/routers/users.go +++ b/routers/users.go @@ -1,6 +1,9 @@ package routers import ( + "encoding/json" + "fmt" + "io/ioutil" "main/models" "main/utils" "net/http" @@ -22,8 +25,30 @@ func UsersGet(w http.ResponseWriter, r *http.Request) { // 創建用戶 func UsersPost(w http.ResponseWriter, r *http.Request) { + var form struct { + Name string `json:"name"` + Email string `json:"email"` + Password string `json:"password"` + } + body, err := ioutil.ReadAll(r.Body) + if err != nil { + fmt.Println(err) + return + } + defer r.Body.Close() + if err = json.Unmarshal(body, &form); err != nil { + fmt.Println(err) + return + } + + // 創建用戶 var user models.User - user.Create() + if err := user.Create(form.Name, form.Email, form.Password); err != nil { + fmt.Println(err) + return + } + + // 返回信息 w.Header().Set("Content-Type", "application/json; charset=utf-8") w.Write(utils.ToJSON(user)) } diff --git a/utils/params.go b/utils/params.go index f387e1c..a192d58 100644 --- a/utils/params.go +++ b/utils/params.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "log" + "math/rand" "net/http" "strconv" "time" @@ -71,3 +72,18 @@ func LogComponent(startTime int64, r *http.Request) { url := fmt.Sprintf("\033[1;34m%s\033[0m", r.URL) // 藍色加重 log.Println(method, url, endTime) } + +// 隨機字串 +func RandomString(length int) string { + const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + b := make([]byte, length) + for i := range b { + b[i] = charset[RandomInt(0, len(charset)-1)] + } + return string(b) +} + +// 隨機數字 +func RandomInt(min, max int) int { + return min + rand.Intn(max-min+1) +}