// API function to update a post. func patchApiPostHandler(w http.ResponseWriter, r *http.Request, _ map[string]string) { userName := authentication.GetUserName(r) if userName != "" { userId, err := getUserId(userName) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } userRole, err := getUserRole(userName) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } // Update post decoder := json.NewDecoder(r.Body) var json JsonPost err = decoder.Decode(&json) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } var postSlug string // Get current slug of post post, err := database.RetrievePostById(json.Id) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } if post.Author.Id != userId && userRole != 4 { http.Error(w, "Not your post", http.StatusInternalServerError) return } if json.Slug != post.Slug { // Check if user has submitted a custom slug postSlug = slug.Generate(json.Slug, "posts") } else { postSlug = post.Slug } currentTime := time.Now() *post = structure.Post{Id: json.Id, Title: []byte(json.Title), Slug: postSlug, Markdown: []byte(json.Markdown), Html: conversion.SanitizeHtml([]byte(json.Html)), IsFeatured: json.IsFeatured, IsPage: json.IsPage, IsPublished: json.IsPublished, Image: []byte(json.Image), Date: ¤tTime, Tags: methods.GenerateTagsFromCommaString(json.Tags), Author: &structure.User{Id: userId}} err = methods.UpdatePost(post) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.WriteHeader(http.StatusOK) w.Write([]byte("Post updated!")) return } else { http.Error(w, "Not logged in!", http.StatusInternalServerError) return } }
// API function to delete a post by id. func deleteApiPostHandler(w http.ResponseWriter, r *http.Request, params map[string]string) { userName := authentication.GetUserName(r) if userName != "" { userId, err := getUserId(userName) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } userRole, err := getUserRole(userName) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } id := params["id"] // Delete post postId, err := strconv.ParseInt(id, 10, 64) if err != nil || postId < 1 { http.Error(w, err.Error(), http.StatusInternalServerError) return } post, err := database.RetrievePostById(postId) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } if post.Author.Id != userId && userRole != 4 { http.Error(w, "Not your post", http.StatusInternalServerError) return } err = methods.DeletePost(postId) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.WriteHeader(http.StatusOK) w.Write([]byte("Post deleted!")) return } else { http.Error(w, "Not logged in!", http.StatusInternalServerError) return } }
// API function to get a post by id func getApiPostHandler(w http.ResponseWriter, r *http.Request, params map[string]string) { userName := authentication.GetUserName(r) if userName != "" { userId, err := getUserId(userName) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } userRole, err := getUserRole(userName) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } id := params["id"] // Get post postId, err := strconv.ParseInt(id, 10, 64) if err != nil || postId < 1 { http.Error(w, err.Error(), http.StatusInternalServerError) return } post, err := database.RetrievePostById(postId) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } if post.Author.Id != userId && userRole != 4 { http.Error(w, "Not your post", http.StatusInternalServerError) return } json, err := json.Marshal(postToJson(post)) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/json") w.Write(json) return } else { http.Error(w, "Not logged in!", http.StatusInternalServerError) return } }
// API function to add and remove post authors func putApiPostAuthorsHandler(w http.ResponseWriter, r *http.Request, params map[string]string) { userName := authentication.GetUserName(r) if userName != "" { userId, err := getUserId(userName) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } userRole, err := getUserRole(userName) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } post_id := params["id"] postId, err := strconv.ParseInt(post_id, 10, 64) if err != nil || postId < 1 { http.Error(w, err.Error(), http.StatusInternalServerError) return } // Check the post for existence (there's no foreign key constraint) post, err := database.RetrievePostById(postId) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } // Allow this action only to the main author if post.Author.Id != userId && userRole != 4 { http.Error(w, "Not your post", http.StatusInternalServerError) return } decoder := json.NewDecoder(r.Body) var json JsonChangePostAuthors err = decoder.Decode(&json) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } delete_author_ids := json.Delete add_author_ids := json.Add var existing_authors []structure.User existing_authors, err = database.RetrieveAuthors(postId) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } // Delete users for _, author_id := range delete_author_ids { err = database.DeletePostAuthor(postId, author_id) // Don't even check for errors } // Filter out ones who is already listed as author for _, author_id := range add_author_ids { author_exists := false for _, author := range existing_authors { if author.Id == author_id { author_exists = true break } } if !author_exists { _, err = database.RetrieveUser(author_id) if err == nil { // Verify that this user exists in DB // and save him _ = database.InsertPostAuthor(int(postId), author_id) } } } w.WriteHeader(http.StatusOK) w.Write([]byte("Authors added!")) return } else { http.Error(w, "Not logged in!", http.StatusInternalServerError) return } }