71 lines
1.7 KiB
Go
71 lines
1.7 KiB
Go
package gw
|
|
|
|
import (
|
|
"errors"
|
|
"mime/multipart"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"log/slog"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
db "github.com/itsscb/df/bff/db/sqlc"
|
|
)
|
|
|
|
type uploadDocumentRequest struct {
|
|
PersonID uint64 `form:"person_id"`
|
|
MailID uint64 `form:"mail_id"`
|
|
File *multipart.FileHeader `form:"file"`
|
|
}
|
|
|
|
func (server *Server) UploadDocument(ctx *gin.Context) {
|
|
authHeader := ctx.GetHeader("authorization")
|
|
|
|
authFields := strings.Fields(authHeader)
|
|
|
|
if len(authFields) != 2 {
|
|
ctx.JSON(http.StatusUnauthorized, errorResponse(errors.New("invalid or missing authorization header")))
|
|
return
|
|
}
|
|
|
|
token := authFields[1]
|
|
|
|
authPayload, err := server.tokenMaker.VerifyToken(token)
|
|
if err != nil {
|
|
ctx.JSON(http.StatusUnauthorized, errorResponse(errors.New("invalid authorization header")))
|
|
return
|
|
}
|
|
|
|
account, err := server.store.GetAccount(ctx, authPayload.AccountID)
|
|
if err != nil {
|
|
ctx.JSON(http.StatusNotFound, errorResponse(errors.New("account not found")))
|
|
return
|
|
}
|
|
|
|
var req *uploadDocumentRequest
|
|
err = ctx.ShouldBind(&req)
|
|
if err != nil {
|
|
ctx.JSON(http.StatusBadRequest, errorResponse(errors.New("failed to parse request")))
|
|
return
|
|
}
|
|
|
|
r := db.CreateDocumentTxParams{
|
|
AccountID: account.ID,
|
|
PersonID: req.PersonID,
|
|
MailID: req.MailID,
|
|
File: req.File,
|
|
Creator: account.Email,
|
|
}
|
|
|
|
doc, code, err := server.store.CreateDocumentTx(ctx, r)
|
|
if err != nil {
|
|
if code == http.StatusInternalServerError {
|
|
slog.Error("create_document", slog.Int64("invoked_by", int64(authPayload.AccountID)), slog.String("document_name", req.File.Filename), slog.String("error", err.Error()))
|
|
}
|
|
ctx.JSON(code, errorResponse(err))
|
|
return
|
|
}
|
|
|
|
ctx.JSON(http.StatusOK, doc)
|
|
}
|