fyp/logic/tasks/handleUpload.go

128 lines
3.0 KiB
Go
Raw Permalink Normal View History

2024-04-12 20:36:23 +01:00
package tasks
import (
"bytes"
"io"
"net/http"
"os"
"path"
2024-04-14 14:51:16 +01:00
. "git.andr3h3nriqu3s.com/andr3/fyp/logic/db_types"
2024-04-12 20:36:23 +01:00
. "git.andr3h3nriqu3s.com/andr3/fyp/logic/models"
. "git.andr3h3nriqu3s.com/andr3/fyp/logic/tasks/utils"
. "git.andr3h3nriqu3s.com/andr3/fyp/logic/utils"
)
func handleUpload(handler *Handle) {
handler.PostAuth("/tasks/start/image", 1, func(c *Context) *Error {
read_form, err := c.R.MultipartReader()
if err != nil {
return c.JsonBadRequest("Please provide a valid form data request!")
}
var json_data string
var file []byte
for {
part, err_part := read_form.NextPart()
if err_part == io.EOF {
break
} else if err_part != nil {
return c.JsonBadRequest("Please provide a valid form data request!")
}
if part.FormName() == "json_data" {
buf := new(bytes.Buffer)
buf.ReadFrom(part)
json_data = buf.String()
}
if part.FormName() == "file" {
buf := new(bytes.Buffer)
buf.ReadFrom(part)
file = buf.Bytes()
}
}
var requestData struct {
ModelId string `json:"id" validate:"required"`
}
2024-04-14 14:51:16 +01:00
2024-04-14 15:19:32 +01:00
_err := c.ParseJson(&requestData, json_data)
2024-04-12 20:36:23 +01:00
if _err != nil {
return _err
}
model, err := GetBaseModel(c.Db, requestData.ModelId)
if err != nil {
return c.Error500(err)
} else if model.CanTrain == 0 {
return c.JsonBadRequest("Model can not be trained!")
2024-04-12 20:36:23 +01:00
}
switch model.Status {
case READY:
case READY_RETRAIN:
case READY_ALTERATION:
case READY_ALTERATION_FAILED:
case READY_RETRAIN_FAILED:
// Model can run
default:
return c.SendJSONStatus(http.StatusBadRequest, "Model not in the correct status to be able to evaludate a model")
}
// TODO Check if the user can use this model
type CreateNewTask struct {
UserId string `db:"user_id"`
ModelId string `db:"model_id"`
TaskType int `db:"task_type"`
Status int `db:"status"`
}
newTask := CreateNewTask{
UserId: c.User.Id,
ModelId: model.Id,
// TODO move this to an enum
TaskType: 1,
Status: 0,
}
id, err := InsertReturnId(c, &newTask, "tasks", "id")
2024-04-14 15:19:32 +01:00
if err != nil {
2024-04-12 20:36:23 +01:00
return c.E500M("Error 500", err)
2024-04-14 15:19:32 +01:00
}
2024-04-12 20:36:23 +01:00
save_path := path.Join("savedData", model.Id, "tasks")
os.MkdirAll(save_path, os.ModePerm)
img_path := path.Join(save_path, id+"."+model.Format)
img_file, err := os.Create(img_path)
if err != nil {
2024-04-14 15:19:32 +01:00
if _err := UpdateTaskStatus(c, id, -1, "Failed to create the file"); _err != nil {
c.Logger.Error("Failed to update tasks")
}
2024-04-12 20:36:23 +01:00
return c.E500M("Failed to create the file", err)
}
defer img_file.Close()
img_file.Write(file)
if !TestImgForModel(c, model, img_path) {
2024-04-14 15:19:32 +01:00
if _err := UpdateTaskStatus(c, id, -1, "The provided image is not a valid image for this model"); _err != nil {
c.Logger.Error("Failed to update tasks")
}
2024-04-12 20:36:23 +01:00
return c.JsonBadRequest(struct {
2024-04-14 15:19:32 +01:00
Message string `json:"message"`
Id string `json:"task_id"`
}{"Provided image does not match the model", id})
2024-04-12 20:36:23 +01:00
}
2024-04-14 14:51:16 +01:00
2024-04-14 15:19:32 +01:00
UpdateStatus(c, "tasks", id, 1)
2024-04-12 20:36:23 +01:00
2024-04-14 15:19:32 +01:00
return c.SendJSON(struct {
Id string `json:"id"`
}{id})
2024-04-12 20:36:23 +01:00
})
}