140 lines
2.6 KiB
Go
140 lines
2.6 KiB
Go
package routes
|
|
|
|
import (
|
|
"database/sql"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
"github.com/ngn13/website/api/database"
|
|
"github.com/ngn13/website/api/util"
|
|
)
|
|
|
|
func getVoteHash(id string, ip string) string {
|
|
return util.GetSHA512(id + "_" + ip)
|
|
}
|
|
|
|
func GET_VoteGet(c *fiber.Ctx) error {
|
|
var (
|
|
db *sql.DB
|
|
id string
|
|
hash string
|
|
vote database.Vote
|
|
found bool
|
|
err error
|
|
)
|
|
|
|
db = *(c.Locals("database").(**sql.DB))
|
|
|
|
if id = c.Query("id"); id == "" {
|
|
return util.ErrBadData(c)
|
|
}
|
|
|
|
hash = getVoteHash(id, util.GetIP(c))
|
|
|
|
if found, err = vote.Get(db, hash); err != nil {
|
|
util.Fail("error while searchig for a vote (\"%s\"): %s", hash, err.Error())
|
|
return util.ErrServer(c)
|
|
}
|
|
|
|
if !found {
|
|
return util.ErrEntryNotExists(c)
|
|
}
|
|
|
|
if vote.IsUpvote {
|
|
return c.JSON(fiber.Map{
|
|
"error": "",
|
|
"result": "upvote",
|
|
})
|
|
}
|
|
|
|
return c.JSON(fiber.Map{
|
|
"error": "",
|
|
"result": "downvote",
|
|
})
|
|
}
|
|
|
|
func GET_VoteSet(c *fiber.Ctx) error {
|
|
var (
|
|
db *sql.DB
|
|
id string
|
|
is_upvote bool
|
|
hash string
|
|
vote database.Vote
|
|
post database.Post
|
|
found bool
|
|
err error
|
|
)
|
|
|
|
db = *(c.Locals("database").(**sql.DB))
|
|
id = c.Query("id")
|
|
|
|
if c.Query("to") == "" || id == "" {
|
|
return util.ErrBadData(c)
|
|
}
|
|
|
|
if found, err = post.Get(db, id); err != nil {
|
|
util.Fail("error while searching for a post (\"%s\"): %s", id, err.Error())
|
|
return util.ErrServer(c)
|
|
}
|
|
|
|
if !found {
|
|
return util.ErrEntryNotExists(c)
|
|
}
|
|
|
|
is_upvote = c.Query("to") == "upvote"
|
|
hash = getVoteHash(id, util.GetIP(c))
|
|
|
|
if found, err = vote.Get(db, hash); err != nil {
|
|
util.Fail("error while searching for a vote (\"%s\"): %s", hash, err.Error())
|
|
return util.ErrServer(c)
|
|
}
|
|
|
|
if found {
|
|
if vote.IsUpvote == is_upvote {
|
|
return util.ErrEntryExists(c)
|
|
}
|
|
|
|
if vote.IsUpvote && !is_upvote {
|
|
post.Vote -= 2
|
|
}
|
|
|
|
if !vote.IsUpvote && is_upvote {
|
|
post.Vote += 2
|
|
}
|
|
|
|
vote.IsUpvote = is_upvote
|
|
|
|
if err = post.Update(db); err != nil {
|
|
util.Fail("error while updating post (\"%s\"): %s", post.ID, err.Error())
|
|
return util.ErrServer(c)
|
|
}
|
|
|
|
if err = vote.Update(db); err != nil {
|
|
util.Fail("error while updating vote (\"%s\"): %s", vote.Hash, err.Error())
|
|
return util.ErrServer(c)
|
|
}
|
|
|
|
return util.NoError(c)
|
|
}
|
|
|
|
vote.Hash = hash
|
|
vote.IsUpvote = is_upvote
|
|
|
|
if is_upvote {
|
|
post.Vote++
|
|
} else {
|
|
post.Vote--
|
|
}
|
|
|
|
if err = post.Update(db); err != nil {
|
|
util.Fail("error while updating post (\"%s\"): %s", post.ID, err.Error())
|
|
return util.ErrServer(c)
|
|
}
|
|
|
|
if err = vote.Save(db); err != nil {
|
|
util.Fail("error while updating vote (\"%s\"): %s", vote.Hash, err.Error())
|
|
return util.ErrServer(c)
|
|
}
|
|
|
|
return util.NoError(c)
|
|
}
|