// Function to recieve a registration form. func postRegistrationHandler(w http.ResponseWriter, r *http.Request, _ map[string]string) { if database.RetrieveUsersCount() == 0 { // TODO: Or check if authenticated user is admin when adding users from inside the admin area name := r.FormValue("name") email := r.FormValue("email") password := r.FormValue("password") if name != "" && password != "" { hashedPassword, err := authentication.EncryptPassword(password) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } user := structure.User{Name: []byte(name), Slug: slug.Generate(name, "users"), Email: []byte(email), Image: []byte(filenames.DefaultUserImageFilename), Cover: []byte(filenames.DefaultUserCoverFilename), Role: 4} err = methods.SaveUser(&user, hashedPassword, 1) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } http.Redirect(w, r, "/admin/", 302) return } http.Redirect(w, r, "/admin/", 302) return } else { name := r.FormValue("name") email := r.FormValue("email") password := r.FormValue("password") if name != "" && password != "" { hashedPassword, err := authentication.EncryptPassword(password) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } user := structure.User{Name: []byte(name), Slug: slug.Generate(name, "users"), Email: []byte(email), Image: []byte(filenames.DefaultUserImageFilename), Cover: []byte(filenames.DefaultUserCoverFilename), Role: 3} err = methods.SaveUser(&user, hashedPassword, 1) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } http.Redirect(w, r, "/admin/#/users/", 302) return } else { http.Error(w, "Not implemented yet.", http.StatusInternalServerError) return } } }
// 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 } }
func GenerateTagsFromCommaString(input string) []structure.Tag { output := make([]structure.Tag, 0) tags := strings.Split(input, ",") for index, _ := range tags { tags[index] = strings.TrimSpace(tags[index]) } for _, tag := range tags { if tag != "" { output = append(output, structure.Tag{Name: []byte(tag), Slug: slug.Generate(tag, "tags")}) } } return output }
// API function to create a post func postApiPostHandler(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 } // Create 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 if json.Slug != "" { // Ceck if user has submitted a custom slug postSlug = slug.Generate(json.Slug, "posts") } else { postSlug = slug.Generate(json.Title, "posts") } currentTime := time.Now() post := structure.Post{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.SavePost(&post) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.WriteHeader(http.StatusOK) w.Write([]byte("Post created!")) return } else { http.Error(w, "Not logged in!", http.StatusInternalServerError) return } }
func GenerateBlog() error { // Write lock the global blog if Blog != nil { Blog.Lock() defer Blog.Unlock() } // Generate blog from db blog, err := database.RetrieveBlog() if err != nil { return err } // Add parameters that are not saved in db blog.Url = []byte(configuration.Config.Url) blog.AssetPath = assetPath // Create navigation slugs for index, _ := range blog.NavigationItems { blog.NavigationItems[index].Slug = slug.Generate(blog.NavigationItems[index].Label, "navigation") } Blog = blog return nil }