feat: add auto-trigger hooks for revision and BOM changes
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
package api
|
package api
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"encoding/csv"
|
"encoding/csv"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
@@ -1219,6 +1220,9 @@ func (s *Server) HandleMergeBOM(w http.ResponseWriter, r *http.Request) {
|
|||||||
"unreferenced": len(diff.Removed),
|
"unreferenced": len(diff.Removed),
|
||||||
}))
|
}))
|
||||||
|
|
||||||
|
// Trigger auto-jobs (e.g. assembly validation)
|
||||||
|
go s.triggerJobs(context.Background(), "bom_changed", parent.ID, parent)
|
||||||
|
|
||||||
writeJSON(w, http.StatusOK, resp)
|
writeJSON(w, http.StatusOK, resp)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1489,6 +1489,9 @@ func (s *Server) HandleCreateRevision(w http.ResponseWriter, r *http.Request) {
|
|||||||
"part_number": partNumber,
|
"part_number": partNumber,
|
||||||
"revision_number": rev.RevisionNumber,
|
"revision_number": rev.RevisionNumber,
|
||||||
}))
|
}))
|
||||||
|
|
||||||
|
// Trigger auto-jobs (e.g. validation, export)
|
||||||
|
go s.triggerJobs(context.Background(), "revision_created", item.ID, item)
|
||||||
}
|
}
|
||||||
|
|
||||||
// HandleUploadFile uploads a file and creates a new revision.
|
// HandleUploadFile uploads a file and creates a new revision.
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package api
|
package api
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
@@ -321,3 +322,57 @@ func (s *Server) HandleDeleteRunner(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
w.WriteHeader(http.StatusNoContent)
|
w.WriteHeader(http.StatusNoContent)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// triggerJobs creates jobs for all enabled definitions matching the trigger type.
|
||||||
|
// It applies trigger filters (e.g. item_type) before creating each job.
|
||||||
|
func (s *Server) triggerJobs(ctx context.Context, triggerType string, itemID string, item *db.Item) {
|
||||||
|
defs, err := s.jobs.GetDefinitionsByTrigger(ctx, triggerType)
|
||||||
|
if err != nil {
|
||||||
|
s.logger.Error().Err(err).Str("trigger", triggerType).Msg("failed to get job definitions for trigger")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, def := range defs {
|
||||||
|
// Apply trigger filter (e.g. item_type == "assembly")
|
||||||
|
if def.Definition != nil {
|
||||||
|
if triggerCfg, ok := def.Definition["trigger"].(map[string]any); ok {
|
||||||
|
if filterCfg, ok := triggerCfg["filter"].(map[string]any); ok {
|
||||||
|
if reqType, ok := filterCfg["item_type"].(string); ok && item != nil {
|
||||||
|
if item.ItemType != reqType {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
job := &db.Job{
|
||||||
|
JobDefinitionID: &def.ID,
|
||||||
|
DefinitionName: def.Name,
|
||||||
|
Priority: def.Priority,
|
||||||
|
ItemID: &itemID,
|
||||||
|
RunnerTags: def.RunnerTags,
|
||||||
|
TimeoutSeconds: def.TimeoutSeconds,
|
||||||
|
MaxRetries: def.MaxRetries,
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := s.jobs.CreateJob(ctx, job); err != nil {
|
||||||
|
s.logger.Error().Err(err).Str("definition", def.Name).Msg("failed to create triggered job")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
s.broker.Publish("job.created", mustMarshal(map[string]any{
|
||||||
|
"job_id": job.ID,
|
||||||
|
"definition_name": def.Name,
|
||||||
|
"trigger": triggerType,
|
||||||
|
"item_id": itemID,
|
||||||
|
}))
|
||||||
|
|
||||||
|
s.logger.Info().
|
||||||
|
Str("job_id", job.ID).
|
||||||
|
Str("definition", def.Name).
|
||||||
|
Str("trigger", triggerType).
|
||||||
|
Str("item_id", itemID).
|
||||||
|
Msg("triggered job")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user