Files
hammond/server/controllers/files.go
Akhil Gupta d25c30a7b2 first commit
2021-05-29 15:20:50 +05:30

158 lines
4.4 KiB
Go

package controllers
import (
"net/http"
"os"
"github.com/akhilrex/hammond/common"
"github.com/akhilrex/hammond/db"
"github.com/akhilrex/hammond/models"
"github.com/akhilrex/hammond/service"
"github.com/gin-gonic/gin"
)
func RegisterFilesController(router *gin.RouterGroup) {
router.POST("/upload", uploadFile)
router.POST("/quickEntries", createQuickEntry)
router.GET("/quickEntries", getAllQuickEntries)
router.GET("/me/quickEntries", getMyQuickEntries)
router.GET("/quickEntries/:id", getQuickEntryById)
router.POST("/quickEntries/:id/process", setQuickEntryAsProcessed)
router.GET("/attachments/:id/file", getAttachmentFile)
}
func createQuickEntry(c *gin.Context) {
var request models.CreateQuickEntryModel
if err := c.ShouldBind(&request); err != nil {
c.JSON(http.StatusUnprocessableEntity, common.NewValidatorError(err))
return
}
attachment, err := saveUploadedFile(c, "file")
if err != nil {
c.JSON(http.StatusUnprocessableEntity, err)
return
}
if err := c.ShouldBind(&request); err != nil {
c.JSON(http.StatusUnprocessableEntity, err)
return
}
quickEntry, err := service.CreateQuickEntry(request, attachment.ID, c.MustGet("userId").(string))
if err != nil {
c.JSON(http.StatusUnprocessableEntity, common.NewError("createQuickEntry", err))
return
}
c.JSON(http.StatusCreated, quickEntry)
}
func getAllQuickEntries(c *gin.Context) {
quickEntries, err := service.GetAllQuickEntries("")
if err != nil {
c.JSON(http.StatusUnprocessableEntity, common.NewError("getAllQuickEntries", err))
return
}
c.JSON(http.StatusOK, quickEntries)
}
func getMyQuickEntries(c *gin.Context) {
quickEntries, err := service.GetQuickEntriesForUser(c.MustGet("userId").(string), "")
if err != nil {
c.JSON(http.StatusUnprocessableEntity, common.NewError("getMyQuickEntries", err))
return
}
c.JSON(http.StatusOK, quickEntries)
}
func getQuickEntryById(c *gin.Context) {
var searchByIdQuery models.SearchByIdQuery
if c.ShouldBindUri(&searchByIdQuery) == nil {
quickEntry, err := service.GetQuickEntryById(searchByIdQuery.Id)
if err != nil {
c.JSON(http.StatusUnprocessableEntity, common.NewError("getVehicleById", err))
return
}
c.JSON(http.StatusOK, quickEntry)
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request"})
}
}
func setQuickEntryAsProcessed(c *gin.Context) {
var searchByIdQuery models.SearchByIdQuery
if c.ShouldBindUri(&searchByIdQuery) == nil {
err := service.SetQuickEntryAsProcessed(searchByIdQuery.Id)
if err != nil {
c.JSON(http.StatusUnprocessableEntity, common.NewError("getVehicleById", err))
return
}
c.JSON(http.StatusOK, gin.H{})
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request"})
}
}
func uploadFile(c *gin.Context) {
attachment, err := saveMultipleUploadedFile(c, "file")
if err != nil {
c.JSON(http.StatusBadRequest, err)
} else {
c.JSON(http.StatusOK, attachment)
}
}
func getAttachmentFile(c *gin.Context) {
var searchByIdQuery models.SearchByIdQuery
if c.ShouldBindUri(&searchByIdQuery) == nil {
attachment, err := db.GetAttachmentById(searchByIdQuery.Id)
if err == nil {
if _, err = os.Stat(attachment.Path); os.IsNotExist(err) {
c.Status(404)
} else {
c.File(attachment.Path)
}
}
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request"})
}
}
func saveUploadedFile(c *gin.Context, fileVariable string) (*db.Attachment, error) {
if fileVariable == "" {
fileVariable = "file"
}
file, err := c.FormFile(fileVariable)
if err != nil {
return nil, err
}
filePath := service.GetFilePath(file.Filename)
if err := c.SaveUploadedFile(file, filePath); err != nil {
return nil, err
}
return service.CreateAttachment(filePath, file.Filename, file.Size, file.Header.Get("Content-Type"), c.MustGet("userId").(string))
}
func saveMultipleUploadedFile(c *gin.Context, fileVariable string) ([]*db.Attachment, error) {
if fileVariable == "" {
fileVariable = "files"
}
form, err := c.MultipartForm()
if err != nil {
return nil, err
}
files := form.File[fileVariable]
var toReturn []*db.Attachment
for _, file := range files {
filePath := service.GetFilePath(file.Filename)
if err := c.SaveUploadedFile(file, filePath); err != nil {
return nil, err
}
attachment, err := service.CreateAttachment(filePath, file.Filename, file.Size, file.Header.Get("Content-Type"), c.MustGet("userId").(string))
if err != nil {
return nil, err
}
toReturn = append(toReturn, attachment)
}
return toReturn, nil
}