163 lines
3.2 KiB
Go
163 lines
3.2 KiB
Go
![]() |
package routes
|
||
|
|
||
|
import (
|
||
|
"database/sql"
|
||
|
"log"
|
||
|
"net/http"
|
||
|
|
||
|
"github.com/gofiber/fiber/v2"
|
||
|
"github.com/ngn13/website/api/util"
|
||
|
)
|
||
|
|
||
|
func BlogDb(db *sql.DB) {
|
||
|
_, err := db.Exec(`
|
||
|
CREATE TABLE IF NOT EXISTS posts(
|
||
|
id TEXT NOT NULL UNIQUE,
|
||
|
title TEXT NOT NULL,
|
||
|
author TEXT NOT NULL,
|
||
|
date TEXT NOT NULL,
|
||
|
content TEXT NOT NULL,
|
||
|
public INTEGER NOT NULL,
|
||
|
vote INTEGER NOT NULL
|
||
|
);
|
||
|
`)
|
||
|
DB = db
|
||
|
if err != nil {
|
||
|
log.Fatal("Error creating table: "+err.Error())
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func GetIP(c *fiber.Ctx) string {
|
||
|
if c.Get("X-Real-IP") != "" {
|
||
|
return c.Get("X-Real-IP")
|
||
|
}
|
||
|
|
||
|
return c.IP()
|
||
|
}
|
||
|
|
||
|
func VoteStat(c *fiber.Ctx) error{
|
||
|
var id = c.Query("id")
|
||
|
if id == "" {
|
||
|
return util.ErrBadData(c)
|
||
|
}
|
||
|
|
||
|
for i := 0; i < len(votelist); i++ {
|
||
|
if votelist[i].Client == GetIP(c) && votelist[i].Post == id {
|
||
|
return c.JSON(fiber.Map {
|
||
|
"error": "",
|
||
|
"result": votelist[i].Status,
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return c.Status(http.StatusNotFound).JSON(util.ErrorJSON("Client never voted"))
|
||
|
}
|
||
|
|
||
|
func VoteSet(c *fiber.Ctx) error{
|
||
|
var id = c.Query("id")
|
||
|
var to = c.Query("to")
|
||
|
voted := false
|
||
|
|
||
|
if id == "" || (to != "upvote" && to != "downvote") {
|
||
|
return util.ErrBadData(c)
|
||
|
}
|
||
|
|
||
|
for i := 0; i < len(votelist); i++ {
|
||
|
if votelist[i].Client == GetIP(c) && votelist[i].Post == id && votelist[i].Status == to {
|
||
|
return c.Status(http.StatusForbidden).JSON(util.ErrorJSON("Client already voted"))
|
||
|
}
|
||
|
|
||
|
if votelist[i].Client == GetIP(c) && votelist[i].Post == id && votelist[i].Status != to {
|
||
|
voted = true
|
||
|
}
|
||
|
}
|
||
|
|
||
|
post, msg := GetPostByID(id)
|
||
|
if msg != ""{
|
||
|
return c.Status(http.StatusNotFound).JSON(util.ErrorJSON(msg))
|
||
|
}
|
||
|
|
||
|
vote := post.Vote+1
|
||
|
|
||
|
if to == "downvote" {
|
||
|
vote = post.Vote-1
|
||
|
}
|
||
|
|
||
|
if to == "downvote" && voted {
|
||
|
vote = vote-1
|
||
|
}
|
||
|
|
||
|
if to == "upvote" && voted {
|
||
|
vote = vote+1
|
||
|
}
|
||
|
|
||
|
_, err := DB.Exec("UPDATE posts SET vote = ? WHERE title = ?", vote, post.Title)
|
||
|
if util.ErrorCheck(err, c){
|
||
|
return util.ErrServer(c)
|
||
|
}
|
||
|
|
||
|
for i := 0; i < len(votelist); i++ {
|
||
|
if votelist[i].Client == GetIP(c) && votelist[i].Post == id && votelist[i].Status != to {
|
||
|
votelist[i].Status = to
|
||
|
return util.NoError(c)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var entry = Vote{}
|
||
|
entry.Client = GetIP(c)
|
||
|
entry.Status = to
|
||
|
entry.Post = id
|
||
|
votelist = append(votelist, entry)
|
||
|
return util.NoError(c)
|
||
|
}
|
||
|
|
||
|
func GetPost(c *fiber.Ctx) error{
|
||
|
var id = c.Query("id")
|
||
|
if id == "" {
|
||
|
return util.ErrBadData(c)
|
||
|
}
|
||
|
|
||
|
post, msg := GetPostByID(id)
|
||
|
if msg != ""{
|
||
|
return c.Status(http.StatusNotFound).JSON(util.ErrorJSON(msg))
|
||
|
}
|
||
|
|
||
|
return c.JSON(fiber.Map {
|
||
|
"error": "",
|
||
|
"result": post,
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func SumPost(c *fiber.Ctx) error{
|
||
|
var posts []Post = []Post{}
|
||
|
rows, err := DB.Query("SELECT * FROM posts")
|
||
|
if util.ErrorCheck(err, c) {
|
||
|
return util.ErrServer(c)
|
||
|
}
|
||
|
|
||
|
for rows.Next() {
|
||
|
var post Post
|
||
|
err := PostFromRow(&post, rows)
|
||
|
|
||
|
if util.ErrorCheck(err, c) {
|
||
|
return util.ErrServer(c)
|
||
|
}
|
||
|
|
||
|
if post.Public == 0 {
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
if len(post.Content) > 255{
|
||
|
post.Content = post.Content[0:250]
|
||
|
}
|
||
|
|
||
|
posts = append(posts, post)
|
||
|
}
|
||
|
rows.Close()
|
||
|
|
||
|
return c.JSON(fiber.Map {
|
||
|
"error": "",
|
||
|
"result": posts,
|
||
|
})
|
||
|
}
|