100 lines
2.6 KiB
Go
100 lines
2.6 KiB
Go
package handler
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"datarush/internal/gw/domain"
|
|
"datarush/internal/gw/grpc_client"
|
|
"datarush/internal/gw/utils"
|
|
)
|
|
|
|
type TaskHandler struct {
|
|
taskClient *grpc_client.TaskClient
|
|
}
|
|
|
|
func NewTaskHandler(taskClient *grpc_client.TaskClient) *TaskHandler {
|
|
return &TaskHandler{taskClient: taskClient}
|
|
}
|
|
|
|
func (h *TaskHandler) CreateTask(w http.ResponseWriter, r *http.Request) {
|
|
competitionID := getPathParam(r, "competition_id")
|
|
|
|
var req domain.TaskRequest
|
|
if err := utils.DecodeJSON(r, &req); err != nil {
|
|
utils.RespondError(w, err)
|
|
return
|
|
}
|
|
|
|
req.CompetitionID = competitionID
|
|
task := utils.TaskHTTPToProto(&req)
|
|
resp, err := h.taskClient.CreateTask(r.Context(), task)
|
|
if err != nil {
|
|
utils.RespondError(w, domain.NewInternalServerError("failed to create task"))
|
|
return
|
|
}
|
|
|
|
utils.RespondJSON(w, http.StatusCreated, utils.TaskProtoToHTTP(resp))
|
|
}
|
|
|
|
func (h *TaskHandler) GetTask(w http.ResponseWriter, r *http.Request) {
|
|
taskID := getPathParam(r, "task_id")
|
|
|
|
task, err := h.taskClient.GetTask(r.Context(), taskID)
|
|
if err != nil {
|
|
utils.RespondError(w, domain.NewNotFoundError("task not found"))
|
|
return
|
|
}
|
|
|
|
utils.RespondJSON(w, http.StatusOK, utils.TaskProtoToHTTP(task))
|
|
}
|
|
|
|
func (h *TaskHandler) UpdateTask(w http.ResponseWriter, r *http.Request) {
|
|
competitionID := getPathParam(r, "competition_id")
|
|
taskID := getPathParam(r, "task_id")
|
|
|
|
var req domain.TaskRequest
|
|
if err := utils.DecodeJSON(r, &req); err != nil {
|
|
utils.RespondError(w, err)
|
|
return
|
|
}
|
|
|
|
req.ID = taskID
|
|
req.CompetitionID = competitionID
|
|
task := utils.TaskHTTPToProto(&req)
|
|
resp, err := h.taskClient.EditTask(r.Context(), task)
|
|
if err != nil {
|
|
utils.RespondError(w, domain.NewInternalServerError("failed to update task"))
|
|
return
|
|
}
|
|
|
|
utils.RespondJSON(w, http.StatusOK, utils.TaskProtoToHTTP(resp))
|
|
}
|
|
|
|
func (h *TaskHandler) DeleteTask(w http.ResponseWriter, r *http.Request) {
|
|
taskID := getPathParam(r, "task_id")
|
|
|
|
if err := h.taskClient.DeleteTask(r.Context(), taskID); err != nil {
|
|
utils.RespondError(w, domain.NewInternalServerError("failed to delete task"))
|
|
return
|
|
}
|
|
|
|
w.WriteHeader(http.StatusNoContent)
|
|
}
|
|
|
|
func (h *TaskHandler) ListTasks(w http.ResponseWriter, r *http.Request) {
|
|
competitionID := getPathParam(r, "competition_id")
|
|
|
|
tasks, err := h.taskClient.ListCompetitionTasks(r.Context(), competitionID)
|
|
if err != nil {
|
|
utils.RespondError(w, domain.NewInternalServerError("failed to list tasks"))
|
|
return
|
|
}
|
|
|
|
response := make([]domain.TaskResponse, len(tasks))
|
|
for i, task := range tasks {
|
|
response[i] = *utils.TaskProtoToHTTP(task)
|
|
}
|
|
|
|
utils.RespondJSON(w, http.StatusOK, &domain.ListTasksResponse{Tasks: response})
|
|
}
|