package handler import ( "code_runner/pkg/database" "errors" "log" "net/http" "strconv" "database/sql" "encoding/base64" "github.com/gin-gonic/gin" ) func CreateTask(c *gin.Context) { var task tpTask if err := c.ShouldBindJSON(&task); err != nil { c.JSON(http.StatusBadRequest, gin.H{ "error": "Invalid request body", "details": err.Error(), }) log.Print("Invalid request body") } log.Print(task) query := `INSERT INTO task (id_category, id_profile, tp_level, tp_lang, "name", description, code, unit_test, dt_create) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, now()) RETURNING id` err := database.DB.QueryRow( query, task.Id_category, task.Id_profile, task.Tp_level, task.Tp_lang, task.Name, task.Description, task.Code, task.Unit_test, ).Scan(&task.ID) log.Print(task.ID) log.Print(err) } func GetTask(c *gin.Context) { log.SetFlags(log.Lshortfile) idStr := c.Param("id") id_user, ok := c.Get("id_user") if !ok { log.Fatalf("Ошибка получения пользователя!") } log.Print("id_user", id_user ) log.Print("id:", c.Param("id")) id, err := strconv.Atoi(idStr) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid task ID"}) return } var task tpTask err = database.DB.QueryRow(` SELECT id, name, description, code, tp_lang, unit_test FROM task WHERE id = $1`, id). Scan( &task.ID, &task.Name, &task.Description, &task.Code, &task.Tp_lang, &task.Unit_test, ) log.Println("task.Unit_test = ", task.Unit_test) // Декодирование Base64 строки decodedBytes, er := base64.StdEncoding.DecodeString(task.Code) if er != nil { log.Fatalf("Ошибка при декодировании Base64: %v", er) } task.Code = string(decodedBytes) if err != nil { if errors.Is(err, sql.ErrNoRows) { c.JSON(http.StatusNotFound, gin.H{"error": "Task not found: " + err.Error()}) } else { c.JSON(http.StatusInternalServerError, gin.H{"error": "Database error: " + err.Error()}) } return } c.HTML(http.StatusOK, "task_solution.html", gin.H{ "task": task, "id_user": id_user, }) } func GetAllTask(c *gin.Context) { rows, err := database.DB.Query(` SELECT id, description, tp_lang FROM task`) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to fetch tasks: " + err.Error()}) return } defer rows.Close() var taskList []tpTask for rows.Next() { var task tpTask err := rows.Scan( &task.ID, &task.Description, &task.Tp_lang, ) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to scan task: " + err.Error()}) return } taskList = append(taskList, task) } if err = rows.Err(); err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Error after scanning rows: " + err.Error()}) return } c.HTML(http.StatusOK, "task_list.html", gin.H{ "task_list": taskList, }) }