Add return success codes, wrap up createBlogPost

This commit is contained in:
Amarpreet Minhas 2019-04-20 17:17:20 -04:00
parent 9f9beb2f0b
commit 75ec2a02f5
3 changed files with 83 additions and 33 deletions

View file

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

View file

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

View file

@ -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 != "" {
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
}