From 75ec2a02f52b34cb2a8dae591abdf49ed2ef6f70 Mon Sep 17 00:00:00 2001 From: Asara Date: Sat, 20 Apr 2019 17:17:20 -0400 Subject: [PATCH] Add return success codes, wrap up createBlogPost --- main.go | 3 ++ packages/auth/auth.go | 8 +--- packages/blog/blog.go | 105 +++++++++++++++++++++++++++++++----------- 3 files changed, 83 insertions(+), 33 deletions(-) diff --git a/main.go b/main.go index ba5cdee..9526d69 100644 --- a/main.go +++ b/main.go @@ -25,10 +25,13 @@ func main() { auth.Init() users.DB = db users.Init() + blog.DB = db + blog.Init() // initiate jwt token auth.TokenAuth = jwtauth.New("HS256", []byte(os.Getenv("JWT_SECRET")), nil) users.TokenAuth = auth.TokenAuth + blog.TokenAuth = auth.TokenAuth // initiate the routes router := Routes() diff --git a/packages/auth/auth.go b/packages/auth/auth.go index 200fcb3..333b7be 100644 --- a/packages/auth/auth.go +++ b/packages/auth/auth.go @@ -20,7 +20,7 @@ var ( TokenAuth *jwtauth.JWTAuth ) -type RegistrationError struct { +type ReturnError struct { Message string `json:"error"` } @@ -61,7 +61,7 @@ func Routes() *chi.Mux { } func register(w http.ResponseWriter, r *http.Request) { - returnError := RegistrationError{} + returnError := ReturnError{} creds := &SignUpCredentials{} err := json.NewDecoder(r.Body).Decode(creds) if err != nil { @@ -127,10 +127,6 @@ func signin(w http.ResponseWriter, r *http.Request) { return } result := DB.QueryRow("SELECT password FROM users WHERE username=$1", creds.Username) - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - return - } storedCreds := &SignInCredentials{} err = result.Scan(&storedCreds.Password) if err != nil { diff --git a/packages/blog/blog.go b/packages/blog/blog.go index e41b3bd..f4974c1 100644 --- a/packages/blog/blog.go +++ b/packages/blog/blog.go @@ -2,10 +2,11 @@ package blog import ( "database/sql" + "encoding/json" "fmt" "github.com/go-chi/chi" "github.com/go-chi/jwtauth" - _ "github.com/go-chi/render" + "github.com/go-chi/render" "github.com/gosimple/slug" "net/http" "strings" @@ -26,7 +27,23 @@ type BlogPost struct { } type Tag struct { - Tag string `json:"tag",db:"tag"` + TagList string `json:"tags"` +} + +type NewBlogPost struct { + Title string `json:"title",db:"title"` + Content string `json:"content",db:"content"` + Tags string `json:"tags"` + Author string `json:"author",db:"author"` +} + +type ReturnError struct { + Message string `json:"error"` +} + +type ReturnSuccess struct { + Message string `json:"success"` + ID int `json:"id"` } func Init() { @@ -36,15 +53,15 @@ func Init() { title text, slug text, author text REFERENCES users (username), - content text + content text, date timestamp)` DB.Exec(createPostsTable) createTagsTable := ` CREATE TABLE IF NOT EXISTS tags (id SERIAL PRIMARY KEY, - tag string, - article_id REFERENCES posts (id))` + tag text, + article_id int REFERENCES posts (id))` DB.Exec(createTagsTable) } @@ -59,53 +76,83 @@ func Routes() *chi.Mux { }) r.Get("/", getBlogPosts) r.Get("/{slug}", getBlogPostBySlug) - r.Get("/tag/{slug}", getBlogPostByTag) - r.Get("/id/{id}", getBlogPostById) + r.Get("/by-tag/{tag}", getBlogPostByTag) + r.Get("/by-id/{id}", getBlogPostById) + r.Get("/by-author/{author}", getBlogPostByAuthor) return r } func createBlogPost(w http.ResponseWriter, r *http.Request) { - blogPost := &BlogPost{} - tags := &Tag{} + returnError := ReturnError{} + newBlogPost := &NewBlogPost{} _, claims, _ := jwtauth.FromContext(r.Context()) username := claims["username"].(string) - err := json.NewDecoder(r.Body).Decode(blogPost) + err := json.NewDecoder(r.Body).Decode(newBlogPost) if err != nil { w.WriteHeader(http.StatusBadRequest) - fmt.Println(err) return } - err := json.NewDecoder(r.Body).Decode(tags) - if err != nil { - w.WriteHeader(http.StatusBadRequest) - fmt.Println(err) - return - } - if blogPost.Title == "" { + if newBlogPost.Title == "" { returnError.Message = "title is required" w.WriteHeader(http.StatusBadRequest) render.JSON(w, r, returnError) return } - if blogPost.Content == "" { + if newBlogPost.Content == "" { returnError.Message = "content is required" w.WriteHeader(http.StatusBadRequest) render.JSON(w, r, returnError) return } - slug := slug.Make(blogPost.Content) + as := slug.Make(newBlogPost.Title) + slugCheck := DB.QueryRow("SELECT id FROM posts WHERE slug=$1", as) + // wow this is ugly. someone pls send help. + scr := 0 + err = slugCheck.Scan(&scr) + if err == nil { + returnError.Message = "slug already exists" + w.WriteHeader(http.StatusBadRequest) + render.JSON(w, r, returnError) + return + } + if err != nil { + if err != sql.ErrNoRows { + returnError.Message = "something is super broken..." + w.WriteHeader(http.StatusInternalServerError) + return + } + } s := `INSERT INTO posts (title, slug, author, content, date) - VALUES ($1, $2, $3, $4, $5)` - db.Exec(s, blogPost.Title, slug, username, blogPost.Content, time.UTC()) - if tags.Tag != "" { - t : = `INSERT INTO tags (tag, article_id) + VALUES ($1, $2, $3, $4, $5) + RETURNING id` + article_id := 0 + err = DB.QueryRow(s, newBlogPost.Title, as, username, newBlogPost.Content, time.Now().UTC()).Scan(&article_id) + if err != nil { + if err == sql.ErrNoRows { + returnError.Message = "something is super broken..." + w.WriteHeader(http.StatusInternalServerError) + render.JSON(w, r, returnError) + return + } + fmt.Println(err) + returnError.Message = "something is super broken..." + w.WriteHeader(http.StatusInternalServerError) + render.JSON(w, r, returnError) + return + } + fmt.Println(newBlogPost.Tags) + if newBlogPost.Tags != "" { + t := `INSERT INTO tags (tag, article_id) VALUES ($1, $2)` - for i := range strings.Split(tags.Tag, ",") { - db.Exec(t, i, article_id) + tags := strings.Split(newBlogPost.Tags, ",") + for i := range tags { + DB.Exec(t, tags[i], article_id) } } + returnSuccess := ReturnSuccess{Message: "post created", ID: article_id} w.WriteHeader(http.StatusCreated) + render.JSON(w, r, returnSuccess) return } @@ -129,7 +176,11 @@ func getBlogPostBySlug(w http.ResponseWriter, r *http.Request) { return } -func getBlogPostBySlug(w http.ResponseWriter, r *http.Request) { +func getBlogPostByTag(w http.ResponseWriter, r *http.Request) { + return +} + +func getBlogPostByAuthor(w http.ResponseWriter, r *http.Request) { return }