github.com/cozy/cozy-stack@v0.0.0-20240603063001-31110fa4cae1/model/job/trigger_thumbnail.go (about) 1 package job 2 3 import ( 4 "github.com/cozy/cozy-stack/model/permission" 5 "github.com/cozy/cozy-stack/pkg/consts" 6 "github.com/cozy/cozy-stack/pkg/logger" 7 "github.com/cozy/cozy-stack/pkg/realtime" 8 ) 9 10 type ThumbnailTrigger struct { 11 broker Broker 12 log *logger.Entry 13 unscheduled chan struct{} 14 } 15 16 func NewThumbnailTrigger(broker Broker) *ThumbnailTrigger { 17 return &ThumbnailTrigger{ 18 broker: broker, 19 log: logger.WithNamespace("scheduler"), 20 unscheduled: make(chan struct{}), 21 } 22 } 23 24 func (t *ThumbnailTrigger) Schedule() { 25 sub := realtime.GetHub().SubscribeFirehose() 26 defer sub.Close() 27 for { 28 select { 29 case e := <-sub.Channel: 30 if t.match(e) { 31 t.pushJob(e) 32 } 33 case <-t.unscheduled: 34 return 35 } 36 } 37 } 38 39 func (t *ThumbnailTrigger) match(e *realtime.Event) bool { 40 if e.Doc.DocType() != consts.Files { 41 return false 42 } 43 if e.Verb == realtime.EventNotify { 44 return false 45 } 46 47 if doc, ok := e.Doc.(permission.Fetcher); ok { 48 for _, class := range doc.Fetch("class") { 49 if class == "image" || class == "pdf" { 50 return true 51 } 52 } 53 } 54 return false 55 } 56 57 func (t *ThumbnailTrigger) pushJob(e *realtime.Event) { 58 event, err := NewEvent(e) 59 if err != nil { 60 return 61 } 62 req := &JobRequest{ 63 WorkerType: "thumbnail", 64 Message: Message("{}"), 65 Event: event, 66 } 67 log := t.log.WithField("domain", e.Domain) 68 log.Infof("trigger thumbnail: Pushing new job") 69 if _, err := t.broker.PushJob(e, req); err != nil { 70 log.Errorf("trigger thumbnail: Could not schedule a new job: %s", err.Error()) 71 } 72 } 73 74 func (t *ThumbnailTrigger) Unschedule() { 75 close(t.unscheduled) 76 }