mirror of
https://github.com/crawlab-team/crawlab.git
synced 2026-01-22 17:31:03 +01:00
128 lines
3.0 KiB
Go
128 lines
3.0 KiB
Go
package controllers
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"github.com/crawlab-team/crawlab/core/constants"
|
|
"github.com/crawlab-team/crawlab/core/export"
|
|
"github.com/crawlab-team/crawlab/core/interfaces"
|
|
"github.com/gin-gonic/gin"
|
|
"net/http"
|
|
)
|
|
|
|
var ExportController ActionController
|
|
|
|
func getExportActions() []Action {
|
|
ctx := newExportContext()
|
|
return []Action{
|
|
{
|
|
Method: http.MethodPost,
|
|
Path: "/:type",
|
|
HandlerFunc: ctx.postExport,
|
|
},
|
|
{
|
|
Method: http.MethodGet,
|
|
Path: "/:type/:id",
|
|
HandlerFunc: ctx.getExport,
|
|
},
|
|
{
|
|
Method: http.MethodGet,
|
|
Path: "/:type/:id/download",
|
|
HandlerFunc: ctx.getExportDownload,
|
|
},
|
|
}
|
|
}
|
|
|
|
type exportContext struct {
|
|
csvSvc interfaces.ExportService
|
|
jsonSvc interfaces.ExportService
|
|
}
|
|
|
|
func (ctx *exportContext) postExport(c *gin.Context) {
|
|
exportType := c.Param("type")
|
|
exportTarget := c.Query("target")
|
|
exportFilter, _ := GetFilter(c)
|
|
|
|
var exportId string
|
|
var err error
|
|
switch exportType {
|
|
case constants.ExportTypeCsv:
|
|
exportId, err = ctx.csvSvc.Export(exportType, exportTarget, exportFilter)
|
|
case constants.ExportTypeJson:
|
|
exportId, err = ctx.jsonSvc.Export(exportType, exportTarget, exportFilter)
|
|
default:
|
|
HandleErrorBadRequest(c, errors.New(fmt.Sprintf("invalid export type: %s", exportType)))
|
|
return
|
|
}
|
|
if err != nil {
|
|
HandleErrorInternalServerError(c, err)
|
|
return
|
|
}
|
|
|
|
HandleSuccessWithData(c, exportId)
|
|
}
|
|
|
|
func (ctx *exportContext) getExport(c *gin.Context) {
|
|
exportType := c.Param("type")
|
|
exportId := c.Param("id")
|
|
|
|
var exp interfaces.Export
|
|
var err error
|
|
switch exportType {
|
|
case constants.ExportTypeCsv:
|
|
exp, err = ctx.csvSvc.GetExport(exportId)
|
|
case constants.ExportTypeJson:
|
|
exp, err = ctx.jsonSvc.GetExport(exportId)
|
|
default:
|
|
HandleErrorBadRequest(c, errors.New(fmt.Sprintf("invalid export type: %s", exportType)))
|
|
}
|
|
if err != nil {
|
|
HandleErrorInternalServerError(c, err)
|
|
return
|
|
}
|
|
|
|
HandleSuccessWithData(c, exp)
|
|
}
|
|
|
|
func (ctx *exportContext) getExportDownload(c *gin.Context) {
|
|
exportType := c.Param("type")
|
|
exportId := c.Param("id")
|
|
|
|
var exp interfaces.Export
|
|
var err error
|
|
switch exportType {
|
|
case constants.ExportTypeCsv:
|
|
exp, err = ctx.csvSvc.GetExport(exportId)
|
|
case constants.ExportTypeJson:
|
|
exp, err = ctx.jsonSvc.GetExport(exportId)
|
|
default:
|
|
HandleErrorBadRequest(c, errors.New(fmt.Sprintf("invalid export type: %s", exportType)))
|
|
}
|
|
if err != nil {
|
|
HandleErrorInternalServerError(c, err)
|
|
return
|
|
}
|
|
|
|
switch exportType {
|
|
case constants.ExportTypeCsv:
|
|
c.Header("Content-Type", "text/csv")
|
|
case constants.ExportTypeJson:
|
|
c.Header("Content-Type", "text/plain")
|
|
default:
|
|
HandleErrorBadRequest(c, errors.New(fmt.Sprintf("invalid export type: %s", exportType)))
|
|
}
|
|
if err != nil {
|
|
HandleErrorInternalServerError(c, err)
|
|
return
|
|
}
|
|
c.Header("Content-Disposition", fmt.Sprintf("attachment; filename=%s", exp.GetDownloadPath()))
|
|
c.File(exp.GetDownloadPath())
|
|
}
|
|
|
|
func newExportContext() *exportContext {
|
|
return &exportContext{
|
|
csvSvc: export.GetCsvService(),
|
|
jsonSvc: export.GetJsonService(),
|
|
}
|
|
}
|