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  }