initialize CSV Importer

This commit is contained in:
Hayden 2022-09-06 11:15:07 -08:00
parent 1ab7435bf1
commit a903880f82
12 changed files with 600 additions and 5 deletions

View file

@ -93,6 +93,36 @@ const docTemplate = `{
}
}
},
"/v1/items/import": {
"post": {
"security": [
{
"Bearer": []
}
],
"produces": [
"application/json"
],
"tags": [
"Items"
],
"summary": "imports items into the database",
"parameters": [
{
"type": "file",
"description": "Image to upload",
"name": "csv",
"in": "formData",
"required": true
}
],
"responses": {
"204": {
"description": ""
}
}
}
},
"/v1/items/{id}": {
"get": {
"security": [

View file

@ -85,6 +85,36 @@
}
}
},
"/v1/items/import": {
"post": {
"security": [
{
"Bearer": []
}
],
"produces": [
"application/json"
],
"tags": [
"Items"
],
"summary": "imports items into the database",
"parameters": [
{
"type": "file",
"description": "Image to upload",
"name": "csv",
"in": "formData",
"required": true
}
],
"responses": {
"204": {
"description": ""
}
}
}
},
"/v1/items/{id}": {
"get": {
"security": [

View file

@ -677,6 +677,24 @@ paths:
summary: updates a item
tags:
- Items
/v1/items/import:
post:
parameters:
- description: Image to upload
in: formData
name: csv
required: true
type: file
produces:
- application/json
responses:
"204":
description: ""
security:
- Bearer: []
summary: imports items into the database
tags:
- Items
/v1/labels:
get:
produces:

View file

@ -71,6 +71,7 @@ func (a *app) newRouter(repos *repo.AllRepos) *chi.Mux {
r.Delete(v1Base("/labels/{id}"), v1Ctrl.HandleLabelDelete())
r.Get(v1Base("/items"), v1Ctrl.HandleItemsGetAll())
r.Post(v1Base("/items/import"), v1Ctrl.HandleItemsImport())
r.Post(v1Base("/items"), v1Ctrl.HandleItemsCreate())
r.Get(v1Base("/items/{id}"), v1Ctrl.HandleItemGet())
r.Put(v1Base("/items/{id}"), v1Ctrl.HandleItemUpdate())

View file

@ -1,6 +1,7 @@
package v1
import (
"encoding/csv"
"net/http"
"github.com/hay-kot/content/backend/internal/services"
@ -140,3 +141,45 @@ func (ctrl *V1Controller) HandleItemUpdate() http.HandlerFunc {
server.Respond(w, http.StatusOK, result)
}
}
// HandleItemsImport godocs
// @Summary imports items into the database
// @Tags Items
// @Produce json
// @Success 204
// @Param csv formData file true "Image to upload"
// @Router /v1/items/import [Post]
// @Security Bearer
func (ctrl *V1Controller) HandleItemsImport() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
// Max upload size of 10 MB - TODO: Set via config
r.ParseMultipartForm(10 << 20)
file, _, err := r.FormFile("csv")
if err != nil {
log.Err(err).Msg("failed to get file from form")
server.RespondServerError(w)
return
}
reader := csv.NewReader(file)
data, err := reader.ReadAll()
if err != nil {
log.Err(err).Msg("failed to read csv")
server.RespondServerError(w)
return
}
user := services.UseUserCtx(r.Context())
err = ctrl.svc.Items.CsvImport(r.Context(), user.GroupID, data)
if err != nil {
log.Err(err).Msg("failed to import items")
server.RespondServerError(w)
return
}
server.Respond(w, http.StatusNoContent, nil)
}
}