108 lines
2.3 KiB
Go
108 lines
2.3 KiB
Go
package handler
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"net/http"
|
|
"strconv"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/xuri/excelize/v2"
|
|
"gitstore.ru/tolikproh/sirius/internal/model"
|
|
)
|
|
|
|
const (
|
|
MAX_UPLOAD_SIZE = 30 << 20 // 5 megabytes
|
|
)
|
|
|
|
var (
|
|
JSON_TYPES = map[string]interface{}{
|
|
"application/json": nil,
|
|
"text/json": nil,
|
|
"multipart/form-data": nil,
|
|
}
|
|
)
|
|
|
|
type uploadResponse struct {
|
|
Status string `json:"status"`
|
|
Msg string `json:"message,omitempty"`
|
|
URL string `json:"url,omitempty"`
|
|
}
|
|
|
|
func Upload(c *gin.Context) {
|
|
// Limit Upload File Size
|
|
c.Request.Body = http.MaxBytesReader(c.Writer, c.Request.Body, MAX_UPLOAD_SIZE)
|
|
|
|
file, fileHeader, err := c.Request.FormFile("file")
|
|
if err != nil {
|
|
c.JSON(http.StatusBadRequest, &uploadResponse{
|
|
Status: "error",
|
|
Msg: err.Error(),
|
|
})
|
|
return
|
|
}
|
|
|
|
defer file.Close()
|
|
|
|
buffer := make([]byte, fileHeader.Size)
|
|
file.Read(buffer)
|
|
buffer = bytes.TrimPrefix(buffer, []byte("\xef\xbb\xbf"))
|
|
fileType := http.DetectContentType(buffer)
|
|
|
|
// Validate File Type
|
|
if _, ex := JSON_TYPES[fileType]; !ex || !json.Valid(buffer) {
|
|
c.JSON(http.StatusBadRequest, &uploadResponse{
|
|
Status: "error",
|
|
Msg: "file type is not supported",
|
|
})
|
|
return
|
|
}
|
|
|
|
var sirius model.Sirius
|
|
err = json.Unmarshal(buffer, &sirius)
|
|
if err != nil {
|
|
c.JSON(http.StatusBadRequest, &uploadResponse{
|
|
Status: "error",
|
|
Msg: err.Error(),
|
|
})
|
|
return
|
|
}
|
|
|
|
if err := SaveToExel("sirius.xlsx", sirius.NewBolid().ZoneInfo()); err != nil {
|
|
c.JSON(http.StatusBadRequest, &uploadResponse{
|
|
Status: "error",
|
|
Msg: err.Error(),
|
|
})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, &uploadResponse{
|
|
Status: "ok",
|
|
})
|
|
}
|
|
|
|
func SaveToExel(filename string, data []model.ZoneInfo) error {
|
|
f := excelize.NewFile()
|
|
defer func() {
|
|
if err := f.Close(); err != nil {
|
|
return
|
|
}
|
|
}()
|
|
// Create a new sheet.
|
|
f.SetCellValue("Sheet1", "A2", "№ зоны")
|
|
f.SetCellValue("Sheet1", "B2", "Описание зоны")
|
|
f.SetCellValue("Sheet1", "C2", "Адреса в зоне")
|
|
i := 3
|
|
for _, d := range data {
|
|
f.SetCellValue("Sheet1", "A"+strconv.Itoa(i), d.ZoneNum)
|
|
f.SetCellValue("Sheet1", "B"+strconv.Itoa(i), d.ZoneName)
|
|
f.SetCellValue("Sheet1", "C"+strconv.Itoa(i), d.InputString())
|
|
i++
|
|
}
|
|
// Save spreadsheet by the given path.
|
|
if err := f.SaveAs(filename); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|