code_runner/internal/handler/task.go

138 lines
2.9 KiB
Go

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,
})
}