bin/controllers/new.go

87 lines
2.0 KiB
Go
Raw Normal View History

2023-09-11 23:26:50 +02:00
package controllers
import (
"fmt"
"io"
"mime/multipart"
"net/http"
"git.myrkvi.com/myrkvi/bin/global"
"git.myrkvi.com/myrkvi/bin/models"
"git.myrkvi.com/myrkvi/bin/utils"
"git.myrkvi.com/myrkvi/bin/views/components"
"git.myrkvi.com/myrkvi/bin/views/pages"
"github.com/alecthomas/chroma/lexers"
"github.com/labstack/echo/v4"
)
func GetNewHandler(c echo.Context) error {
values := c.QueryParams()
wantsText := values.Has("text")
return utils.RenderComponents(c, http.StatusOK, pages.NewFull(wantsText))
}
func PostNewHandler(c echo.Context) error {
file, err := c.FormFile("file")
text := c.FormValue("text")
name := c.FormValue("name")
description := c.FormValue("description")
lang := c.FormValue("lang")
2023-09-12 22:30:58 +02:00
ip := c.RealIP()
2023-09-11 23:26:50 +02:00
if (file == nil || err != nil) && text == "" {
return utils.RenderErrorToast(c, "file or text must be provided")
}
code, adminCode, err := utils.GenerateCodes()
if err != nil {
return utils.RenderErrorToast(c, "server-side error occurred")
}
if file != nil {
text, err = getTextFromFile(file)
if name == "" {
name = file.Filename
}
if err != nil {
return utils.RenderErrorToast(c, "server-side error occurred")
}
}
// Determine language from file extension if not set.
2023-09-13 11:22:52 +02:00
if lang == "" && name != "" {
2023-09-11 23:26:50 +02:00
lexer := lexers.Match(name)
if lexer != nil {
lang = lexer.Config().Name
}
}
2023-09-12 22:30:58 +02:00
createdFile, err := models.CreateNewBin(global.DB, text, name, description, lang, code, adminCode, ip)
2023-09-11 23:26:50 +02:00
if err != nil {
return utils.RenderErrorToast(c, "server-side error occurred")
}
2023-09-13 11:22:52 +02:00
binPartial := pages.BinPartial(createdFile)
setTitle := components.SetTitle(name)
2023-09-11 23:26:50 +02:00
utils.SetHeader(c, "HX-Push", fmt.Sprintf("/b/%s", code))
return utils.RenderComponents(c, http.StatusOK,
2023-09-13 11:22:52 +02:00
binPartial,
setTitle,
2023-09-11 23:26:50 +02:00
)
}
func getTextFromFile(fileHeader *multipart.FileHeader) (text string, err error) {
f, err := fileHeader.Open()
if err != nil {
return
}
b, err := io.ReadAll(f)
if err != nil {
return
}
text = string(b)
return
}