mirror of
https://gitlab.com/nullmax17/personal-website.git
synced 2025-03-14 21:21:11 +03:00
92 lines
2.9 KiB
Go
92 lines
2.9 KiB
Go
|
/*
|
|||
|
Controller that handles everything d1xxe blog related features.
|
|||
|
Under the hood it operates with repositories.Blog to get all information from
|
|||
|
local database.
|
|||
|
|
|||
|
In a nutshell it's pretty simple.
|
|||
|
*/
|
|||
|
package controllers
|
|||
|
|
|||
|
import (
|
|||
|
"context"
|
|||
|
"fmt"
|
|||
|
"log"
|
|||
|
"net/http"
|
|||
|
"strconv"
|
|||
|
|
|||
|
"github.com/dixxe/personal-website/iternal/pkg/repositories"
|
|||
|
"github.com/dixxe/personal-website/web/templates"
|
|||
|
"github.com/go-chi/chi/v5"
|
|||
|
)
|
|||
|
|
|||
|
// This controller passes all posts in database in template and responds with page with all size-reduced posts.
|
|||
|
func GetShowBlog(w http.ResponseWriter, r *http.Request) {
|
|||
|
posts, err := repositories.Blog.GetAllValues()
|
|||
|
if err != nil {
|
|||
|
component := templates.ErrorPage(500, "Ошибка при обработке базы данных.")
|
|||
|
// For some reason I can't set status code for request x-x
|
|||
|
log.Println(err)
|
|||
|
component.Render(context.Background(), w)
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
component := templates.ShowBlogPage(posts)
|
|||
|
component.Render(context.Background(), w)
|
|||
|
}
|
|||
|
|
|||
|
// This controller looks for specific post in database and handles all possible errors. Responds with page with post.
|
|||
|
func GetPost(w http.ResponseWriter, r *http.Request) {
|
|||
|
id, err := strconv.Atoi(chi.URLParam(r, "id"))
|
|||
|
|
|||
|
if err != nil {
|
|||
|
component := templates.ErrorPage(500, "Не удалось преобразовать id в целое число.")
|
|||
|
log.Println(err)
|
|||
|
component.Render(context.Background(), w)
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
post, err := repositories.Blog.GetValueByID(id)
|
|||
|
|
|||
|
if err != nil {
|
|||
|
component := templates.ErrorPage(404, "Не удалось найти нужный пост.")
|
|||
|
log.Println(err)
|
|||
|
component.Render(context.Background(), w)
|
|||
|
return
|
|||
|
|
|||
|
}
|
|||
|
component := templates.ShowPost(post)
|
|||
|
component.Render(context.Background(), w)
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
// Controller that handles post creation. Responds with 200 if everything OK
|
|||
|
func PostCreatePost(w http.ResponseWriter, r *http.Request) {
|
|||
|
r.ParseForm() // Populating form.
|
|||
|
header := r.FormValue("header") // To get value you need to specify name="header" in the form.
|
|||
|
content := r.FormValue("content")
|
|||
|
|
|||
|
// Creating a new post with 0 Id, don't worry database handles id assignment
|
|||
|
// itself. And in the InsertValue() method I don't use Post.Id value
|
|||
|
newPost := repositories.Post{Id: 0, Header: header, Content: content}
|
|||
|
|
|||
|
// Process database is async way. WARNING errors are NOT HANDLED
|
|||
|
go repositories.Blog.InsertValue(newPost)
|
|||
|
|
|||
|
fmt.Println("Created post")
|
|||
|
}
|
|||
|
|
|||
|
// Controller that handles post deletion. Responds with 200 if everything is OK
|
|||
|
func PostDeletePost(w http.ResponseWriter, r *http.Request) {
|
|||
|
r.ParseForm()
|
|||
|
id, err := strconv.Atoi(r.FormValue("id"))
|
|||
|
|
|||
|
if err != nil {
|
|||
|
component := templates.ErrorPage(500, "Ошибка при переводе id (int) в string.")
|
|||
|
r.Response.StatusCode = 500
|
|||
|
log.Println(err)
|
|||
|
component.Render(context.Background(), w)
|
|||
|
}
|
|||
|
// Process database is async way. WARNING errors are NOT HANDLED
|
|||
|
go repositories.Blog.DeleteValueByID(id)
|
|||
|
}
|