@@ -3,6 +3,7 @@ package lifecycle
33import (
44 "context"
55 "log/slog"
6+ "time"
67
78 "github.com/google/uuid"
89 "github.com/samber/do"
@@ -16,13 +17,15 @@ import (
1617type TaskNotifyHook struct {
1718 notify * dispatcher.Dispatcher
1819 logger * slog.Logger
20+ repo domain.TaskRepo
1921}
2022
2123// NewTaskNotifyHook 创建任务通知 Hook
2224func NewTaskNotifyHook (i * do.Injector ) * TaskNotifyHook {
2325 return & TaskNotifyHook {
2426 notify : do.MustInvoke [* dispatcher.Dispatcher ](i ),
2527 logger : do.MustInvoke [* slog.Logger ](i ).With ("hook" , "task-notify-hook" ),
28+ repo : do.MustInvoke [domain.TaskRepo ](i ),
2629 }
2730}
2831
@@ -38,17 +41,51 @@ func (h *TaskNotifyHook) OnStateChange(ctx context.Context, taskID uuid.UUID, fr
3841 default :
3942 return nil
4043 }
44+ logger := h .logger .With ("task_id" , taskID , "from" , from , "to" , to )
45+
46+ task , err := h .repo .GetByID (ctx , taskID )
47+ if err != nil {
48+ logger .With ("error" , err ).ErrorContext (ctx , "failed to get task on state change" )
49+ return err
50+ }
51+
52+ payload := domain.NotifyEventPayload {
53+ TaskID : taskID .String (),
54+ TaskStatus : string (to ),
55+ TaskContent : task .Content ,
56+ VMName : "" ,
57+ VMArch : "" ,
58+ VMCores : 0 ,
59+ VMMemory : 0 ,
60+ VMOS : "" ,
61+ }
62+ if u := task .Edges .User ; u != nil {
63+ payload .UserName = u .Name
64+ }
65+ if pts := task .Edges .ProjectTasks ; len (pts ) > 0 {
66+ pt := pts [0 ]
67+ if m := pt .Edges .Model ; m != nil {
68+ payload .ModelName = m .Model
69+ }
70+ }
71+ if vms := task .Edges .Vms ; len (vms ) > 0 {
72+ vm := vms [0 ]
73+ payload .VMID = vm .ID
74+ payload .VMName = vm .Name
75+ payload .VMArch = vm .Arch
76+ payload .VMCores = vm .Cores
77+ payload .VMMemory = vm .Memory
78+ payload .VMOS = vm .Os
79+ }
4180
4281 event := & domain.NotifyEvent {
4382 EventType : eventType ,
4483 SubjectUserID : metadata .UserID ,
4584 RefID : taskID .String (),
46- Payload : domain.NotifyEventPayload {
47- TaskID : taskID .String (),
48- TaskStatus : string (to ),
49- },
85+ Payload : payload ,
86+ OccurredAt : time .Now (),
5087 }
5188
52- h . logger .InfoContext (ctx , "publishing notify event" , "event" , eventType , "task_id" , taskID )
89+ logger .InfoContext (ctx , "publishing notify event" , "event" , eventType )
5390 return h .notify .Publish (ctx , event )
5491}
0 commit comments