2026-02-07 18:26:47 +00:00
|
|
|
package sync
|
|
|
|
|
|
|
|
|
|
import (
|
2026-02-08 01:44:44 +00:00
|
|
|
"fmt"
|
|
|
|
|
"net/http"
|
2026-02-09 19:03:27 +00:00
|
|
|
"strconv"
|
2026-02-08 01:44:44 +00:00
|
|
|
|
2026-02-17 06:05:24 +00:00
|
|
|
"github.com/Gleipnir-Technology/nidus-sync/db"
|
2026-02-07 18:26:47 +00:00
|
|
|
"github.com/Gleipnir-Technology/nidus-sync/db/models"
|
|
|
|
|
"github.com/Gleipnir-Technology/nidus-sync/html"
|
2026-02-08 01:44:44 +00:00
|
|
|
"github.com/Gleipnir-Technology/nidus-sync/platform"
|
2026-02-08 00:58:51 +00:00
|
|
|
"github.com/Gleipnir-Technology/nidus-sync/userfile"
|
2026-02-09 19:03:27 +00:00
|
|
|
"github.com/go-chi/chi/v5"
|
2026-02-07 18:26:47 +00:00
|
|
|
)
|
|
|
|
|
|
2026-02-17 06:05:24 +00:00
|
|
|
type contentPoolDetail struct {
|
|
|
|
|
CSVFileID int32
|
|
|
|
|
Organization *models.Organization
|
|
|
|
|
Upload platform.UploadPoolDetail
|
|
|
|
|
URL ContentURL
|
|
|
|
|
User User
|
2026-02-09 19:03:27 +00:00
|
|
|
}
|
2026-02-07 18:26:47 +00:00
|
|
|
type ContentPoolList struct {
|
2026-02-09 18:25:44 +00:00
|
|
|
Uploads []platform.PoolUpload
|
|
|
|
|
URL ContentURL
|
|
|
|
|
User User
|
2026-02-07 18:26:47 +00:00
|
|
|
}
|
2026-02-07 20:02:39 +00:00
|
|
|
type ContentPoolUpload struct {
|
|
|
|
|
URL ContentURL
|
|
|
|
|
User User
|
|
|
|
|
}
|
2026-02-07 18:26:47 +00:00
|
|
|
|
|
|
|
|
func getPoolList(w http.ResponseWriter, r *http.Request, u *models.User) {
|
2026-02-09 18:25:44 +00:00
|
|
|
ctx := r.Context()
|
|
|
|
|
userContent, err := contentForUser(ctx, u)
|
2026-02-07 18:26:47 +00:00
|
|
|
if err != nil {
|
|
|
|
|
respondError(w, "Failed to get user", err, http.StatusInternalServerError)
|
|
|
|
|
return
|
|
|
|
|
}
|
2026-02-09 18:25:44 +00:00
|
|
|
uploads, err := platform.PoolUploadList(ctx, u.OrganizationID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
respondError(w, "Failed to get uploads", err, http.StatusInternalServerError)
|
|
|
|
|
return
|
|
|
|
|
}
|
2026-02-07 18:26:47 +00:00
|
|
|
data := ContentPoolList{
|
2026-02-09 18:25:44 +00:00
|
|
|
Uploads: uploads,
|
|
|
|
|
URL: newContentURL(),
|
|
|
|
|
User: userContent,
|
2026-02-07 18:26:47 +00:00
|
|
|
}
|
|
|
|
|
html.RenderOrError(w, "sync/pool-list.html", data)
|
|
|
|
|
}
|
2026-02-07 20:02:39 +00:00
|
|
|
|
|
|
|
|
func getPoolUpload(w http.ResponseWriter, r *http.Request, u *models.User) {
|
|
|
|
|
userContent, err := contentForUser(r.Context(), u)
|
|
|
|
|
if err != nil {
|
|
|
|
|
respondError(w, "Failed to get user", err, http.StatusInternalServerError)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
data := ContentPoolUpload{
|
|
|
|
|
URL: newContentURL(),
|
|
|
|
|
User: userContent,
|
|
|
|
|
}
|
|
|
|
|
html.RenderOrError(w, "sync/pool-csv-upload.html", data)
|
|
|
|
|
}
|
2026-02-08 03:47:48 +00:00
|
|
|
func getPoolUploadByID(w http.ResponseWriter, r *http.Request, u *models.User) {
|
2026-02-17 06:05:24 +00:00
|
|
|
ctx := r.Context()
|
|
|
|
|
userContent, err := contentForUser(ctx, u)
|
2026-02-08 03:47:48 +00:00
|
|
|
if err != nil {
|
|
|
|
|
respondError(w, "Failed to get user", err, http.StatusInternalServerError)
|
|
|
|
|
return
|
|
|
|
|
}
|
2026-02-17 06:05:24 +00:00
|
|
|
org, err := u.Organization().One(ctx, db.PGInstance.BobDB)
|
|
|
|
|
if err != nil {
|
|
|
|
|
respondError(w, "Failed to get organization", err, http.StatusInternalServerError)
|
|
|
|
|
return
|
|
|
|
|
}
|
2026-02-09 19:03:27 +00:00
|
|
|
file_id_str := chi.URLParam(r, "id")
|
|
|
|
|
file_id, err := strconv.ParseInt(file_id_str, 10, 32)
|
|
|
|
|
if err != nil {
|
|
|
|
|
respondError(w, "Failed to parse file_id", err, http.StatusInternalServerError)
|
|
|
|
|
return
|
|
|
|
|
}
|
2026-02-09 19:13:42 +00:00
|
|
|
detail, err := platform.GetUploadPoolDetail(ctx, u.OrganizationID, int32(file_id))
|
2026-02-09 19:03:27 +00:00
|
|
|
if err != nil {
|
|
|
|
|
respondError(w, "Failed to get pool", err, http.StatusInternalServerError)
|
|
|
|
|
return
|
|
|
|
|
}
|
2026-02-17 06:05:24 +00:00
|
|
|
data := contentPoolDetail{
|
|
|
|
|
CSVFileID: int32(file_id),
|
|
|
|
|
Organization: org,
|
|
|
|
|
Upload: detail,
|
|
|
|
|
URL: newContentURL(),
|
|
|
|
|
User: userContent,
|
2026-02-08 03:47:48 +00:00
|
|
|
}
|
|
|
|
|
html.RenderOrError(w, "sync/pool-by-id.html", data)
|
|
|
|
|
}
|
2026-02-08 00:59:41 +00:00
|
|
|
func postPoolUpload(w http.ResponseWriter, r *http.Request, u *models.User) {
|
|
|
|
|
err := r.ParseMultipartForm(32 << 10) // 32 MB buffer
|
|
|
|
|
if err != nil {
|
|
|
|
|
respondError(w, "Failed to parse form", err, http.StatusBadRequest)
|
|
|
|
|
return
|
|
|
|
|
}
|
2026-02-08 04:36:12 +00:00
|
|
|
uploads, err := userfile.SaveFileUpload(r, "csvfile", userfile.CollectionCSV)
|
2026-02-08 00:59:41 +00:00
|
|
|
if err != nil {
|
|
|
|
|
respondError(w, "Failed to extract image uploads", err, http.StatusInternalServerError)
|
|
|
|
|
return
|
|
|
|
|
}
|
2026-02-08 01:44:44 +00:00
|
|
|
if len(uploads) == 0 {
|
|
|
|
|
respondError(w, "No upload found", nil, http.StatusBadRequest)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if len(uploads) != 1 {
|
|
|
|
|
respondError(w, "You must only submit one file at a time", nil, http.StatusBadRequest)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
upload := uploads[0]
|
|
|
|
|
pool_upload, err := platform.NewPoolUpload(r.Context(), u, upload)
|
2026-02-09 18:25:44 +00:00
|
|
|
if err != nil {
|
|
|
|
|
respondError(w, "Failed to create new pool", err, http.StatusInternalServerError)
|
|
|
|
|
return
|
|
|
|
|
}
|
2026-02-08 01:44:44 +00:00
|
|
|
http.Redirect(w, r, fmt.Sprintf("/pool/upload/%d", pool_upload.ID), http.StatusFound)
|
2026-02-08 00:59:41 +00:00
|
|
|
}
|