bin/handlers.go

143 lines
3.9 KiB
Go

package main
import (
"fmt"
"net/http"
"github.com/alecthomas/chroma/lexers"
"github.com/labstack/echo/v4"
"github.com/sirupsen/logrus"
"gorm.io/gorm"
)
func indexHandler(c echo.Context) error {
id := c.Param("id")
logrus.Infof("id is '%s'", id)
return RenderComponent(c, http.StatusOK, indexFull())
}
// ░█▀█░█▀▀░█░█░░░░░█░░░█▀▀░█░█░█▀▄░█▄█░▀█▀░▀█▀░░░█▀█░█▀█░█▀▀░█▀▀
// ░█░█░█▀▀░█▄█░░░▄▀░░░░▀▀█░█░█░█▀▄░█░█░░█░░░█░░░░█▀▀░█▀█░█░█░█▀▀
// ░▀░▀░▀▀▀░▀░▀░░░▀░░░░░▀▀▀░▀▀▀░▀▀░░▀░▀░▀▀▀░░▀░░░░▀░░░▀░▀░▀▀▀░▀▀▀
func getNewHandler(c echo.Context) error {
values := c.QueryParams()
wantsText := values.Has("text")
return RenderComponent(c, http.StatusOK, newFull(wantsText))
}
func postNewHandler(c echo.Context) error {
file, err := c.FormFile("file")
text := c.FormValue("text")
wantsText := c.FormValue("wantsText") == "true"
name := c.FormValue("name")
description := c.FormValue("description")
lang := c.FormValue("lang")
if (file == nil || err != nil) && text == "" {
/* return RenderComponent(c, http.StatusOK,
CombineTempls(
newPartial(wantsText),
ErrorMessage("file or text must be provided", "error-span"),
),
) */
return RenderErrorToast(c, "File or text must be provided.")
}
code, adminCode, err := generateCodes()
if err != nil {
return RenderComponent(c, http.StatusOK,
CombineTempls(
newPartial(wantsText),
ErrorMessage("server-side error occurred", "error-span"),
),
)
}
if file != nil {
text, err = getTextFromFile(file)
if name == "" {
name = file.Filename
}
if err != nil {
return RenderComponent(c, http.StatusOK,
CombineTempls(
newPartial(wantsText),
ErrorMessage("server-side error occurred", "error-span"),
),
)
}
}
// Determine language from file extension if not set.
if lang == "" {
lexer := lexers.Match(name)
if lexer != nil {
lang = lexer.Config().Name
}
}
createdFile, err := createNewBin(text, name, description, lang, code, adminCode)
if err != nil {
return RenderComponent(c, http.StatusOK,
CombineTempls(
newPartial(wantsText),
ErrorMessage("server-side error occurred", "error-span"),
),
)
}
c.Response().Header().Add("HX-Push", fmt.Sprintf("/b/%s", code))
return RenderComponent(c, http.StatusOK,
binPartial(createdFile),
)
}
// ░█▀▄░▀█▀░█▀█░░░░░█░░░█▀▀░▀█▀░█░░░█▀▀░█▀▀
// ░█▀▄░░█░░█░█░░░▄▀░░░░█▀▀░░█░░█░░░█▀▀░▀▀█
// ░▀▀░░▀▀▀░▀░▀░░░▀░░░░░▀░░░▀▀▀░▀▀▀░▀▀▀░▀▀▀
// Individual pages of uploaded files.
func getBinHandler(c echo.Context) error {
file := File{}
result := db.Where("page_key = ?", c.Param("id")).First(&file)
if result.Error == gorm.ErrRecordNotFound {
logrus.WithError(result.Error).Errorln("no file")
}
if result.Error != nil {
logrus.WithError(result.Error).Errorln("server error")
}
file.AdminKey = c.QueryParam("delcode")
return RenderComponent(c, http.StatusOK,
binFull(file),
)
}
func deleteBinHandler(c echo.Context) error {
code := c.Param("id")
adminCode := c.FormValue("adminKey")
if adminCode == "" {
return RenderErrorToast(c, "deletion key cannot be empty")
}
file := File{}
result := db.Where("page_key = ?", code).First(&file)
if result.Error != nil {
return RenderErrorToast(c, "file not found")
}
if adminCode != file.AdminKey {
return RenderErrorToast(c, "invalid deletion key")
}
db.Delete(&file)
return c.HTML(http.StatusOK, "<h1>file deleted!</h1>")
}