108 lines
2.6 KiB
Go
108 lines
2.6 KiB
Go
|
package frontend
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"fmt"
|
||
|
"io"
|
||
|
"log"
|
||
|
"net/http"
|
||
|
"os"
|
||
|
"path/filepath"
|
||
|
"time"
|
||
|
|
||
|
"github.com/gabriel-vasile/mimetype"
|
||
|
"github.com/google/uuid"
|
||
|
b "streifling.com/jason/cpolis/cmd/backend"
|
||
|
)
|
||
|
|
||
|
func UploadDocx(c *b.Config, db *b.DB, s map[string]*Session) http.HandlerFunc {
|
||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||
|
session, err := ManageSession(w, r, c, s)
|
||
|
if err != nil {
|
||
|
http.Error(w, "Die Session ist abgelaufen. Bitte erneut anmelden.", http.StatusUnauthorized)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
file, fileHeader, err := r.FormFile("docx-upload")
|
||
|
if err != nil {
|
||
|
log.Println(err)
|
||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
defer file.Close()
|
||
|
|
||
|
var buf bytes.Buffer
|
||
|
if _, err = io.Copy(&buf, file); err != nil {
|
||
|
log.Println(err)
|
||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
mime := mimetype.Detect(buf.Bytes())
|
||
|
if !mime.Is("application/vnd.openxmlformats-officedocument.wordprocessingml.document") {
|
||
|
http.Error(w, "Die Datei ist kein DOCX Worddokument.", http.StatusBadRequest)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
docxFilename := fmt.Sprint(uuid.New(), ".docx")
|
||
|
absDocxFilepath, err := filepath.Abs("/tmp/" + docxFilename)
|
||
|
if err != nil {
|
||
|
log.Println(err)
|
||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
if err = os.WriteFile(absDocxFilepath, buf.Bytes(), 0644); err != nil {
|
||
|
log.Println(err)
|
||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
defer os.Remove(absDocxFilepath)
|
||
|
|
||
|
mdString, err := b.ConvertToMarkdown(c, absDocxFilepath)
|
||
|
if err != nil {
|
||
|
log.Println(err)
|
||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
uuidName := uuid.New()
|
||
|
mdFilename := fmt.Sprint(uuidName, ".md")
|
||
|
absMdFilepath, err := filepath.Abs(c.ArticleDir + "/" + mdFilename)
|
||
|
if err != nil {
|
||
|
log.Println(err)
|
||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
if err = os.WriteFile(absMdFilepath, mdString, 0644); err != nil {
|
||
|
log.Println(err)
|
||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
article := &b.Article{
|
||
|
Created: time.Now(),
|
||
|
UUID: uuidName,
|
||
|
CreatorID: session.User.ID,
|
||
|
Rejected: true,
|
||
|
}
|
||
|
article.Title = fmt.Sprint(fileHeader.Filename, "-", article.UUID)
|
||
|
|
||
|
id, err := db.AddArticle(article)
|
||
|
if err != nil {
|
||
|
log.Println(err)
|
||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
if err = db.WriteArticleAuthors(id, []int64{session.User.ID}); err != nil {
|
||
|
log.Println(err)
|
||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
w.WriteHeader(http.StatusOK)
|
||
|
}
|
||
|
}
|