tâches planifiées : prompts cron persistés, outil scheduler, conversations liées aux tâches, rattrapage des exécutions manquées au redémarrage (go-cron MissedRunOnce)

This commit is contained in:
fabien committed 2026-10-06 22:15:59 +02:00
1 parent bedb6c98e7
commit 058370830f
71 files changed
+1627 -100

No files matched your search

+7 -1
View File
@@ -52,6 +52,7 @@ func (h *ChatHandler) NewChat(c *echo.Context) error {
userID,
teamID,
request.AgentID,
"",
)
if err != nil {
c.Logger().Error("error creating chat", "error", err.Error())
@@ -120,11 +121,16 @@ func (h *ChatHandler) List(c *echo.Context) error {
page := c.Param("page")
pageInt, _ := strconv.Atoi(page)
query := c.QueryParam("q")
chats, err := h.chatService.ListChats(userID, teamID, pageInt, query)
taskID := c.QueryParam("task")
chats, err := h.chatService.ListChats(userID, teamID, pageInt, query, taskID)
if err != nil {
c.Logger().Error("error listing chats", "error", err)
return echo.NewHTTPError(http.StatusBadRequest, "error listing chats")
}
// évite "null" dans la réponse quand il n'y a pas de conversation
if chats == nil {
chats = []*domain.Chat{}
}
return c.JSON(http.StatusOK, chats)
}
+70
View File
@@ -0,0 +1,70 @@
package handlers
import (
"net/http"
"github.com/labstack/echo/v5"
"trankilou.fr/lassistanoque/backend/internal/domain"
"trankilou.fr/lassistanoque/backend/internal/service/auth"
"trankilou.fr/lassistanoque/backend/internal/service/task"
)
type TaskHandler struct {
taskService *task.Service
}
func NewTaskGroup(prefix string, e *echo.Group, service *task.Service, middlewares ...echo.MiddlewareFunc) *echo.Group {
taskHandler := &TaskHandler{taskService: service}
auth := e.Group(prefix, middlewares...)
auth.GET("/:space", taskHandler.List)
auth.PUT("/:space/:id", taskHandler.Update)
auth.DELETE("/:space/:id", taskHandler.Delete)
return auth
}
func (h *TaskHandler) List(c *echo.Context) error {
userID := c.Get(auth.ContextUserIDKey).(string)
teamID := c.Param("space")
tasks, err := h.taskService.ListTasks(userID, teamID)
if err != nil {
c.Logger().Error("error listing tasks", "error", err)
return echo.NewHTTPError(http.StatusBadRequest, "error listing tasks")
}
// évite "null" dans la réponse quand il n'y a pas de tâche
if tasks == nil {
tasks = []*domain.Task{}
}
return c.JSON(http.StatusOK, tasks)
}
func (h *TaskHandler) Update(c *echo.Context) error {
userID := c.Get(auth.ContextUserIDKey).(string)
teamID := c.Param("space")
taskID := c.Param("id")
var taskModel domain.Task
if err := c.Bind(&taskModel); err != nil {
return echo.NewHTTPError(http.StatusBadRequest, "error binding request")
}
taskModel.ID = taskID
updated, err := h.taskService.UpdateTask(userID, teamID, &taskModel)
if err != nil {
c.Logger().Error("error updating task", "error", err)
return echo.NewHTTPError(http.StatusBadRequest, "error updating task")
}
return c.JSON(http.StatusOK, updated)
}
func (h *TaskHandler) Delete(c *echo.Context) error {
userID := c.Get(auth.ContextUserIDKey).(string)
teamID := c.Param("space")
taskID := c.Param("id")
if err := h.taskService.DeleteTask(userID, teamID, taskID); err != nil {
c.Logger().Error("error deleting task", "error", err)
return echo.NewHTTPError(http.StatusBadRequest, "error deleting task")
}
return c.JSON(http.StatusOK, "task deleted")
}