138 lines
2.9 KiB
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,
|
|
})
|
|
}
|