/
handler_newdoc.go
55 lines (43 loc) · 1.3 KB
/
handler_newdoc.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package operation
import (
"context"
"fmt"
"github.com/tfaller/jsonball"
"github.com/tfaller/jsonball/event"
"github.com/tfaller/propchange"
)
func HandlerNewDoc(ctx context.Context, registry jsonball.Registry, detector propchange.Detector, handerNewDoc *event.HandlerNewDoc) error {
err := registry.HandlerNewDoc(ctx, handerNewDoc.Handler, handerNewDoc.Type, true)
if err != nil {
return fmt.Errorf("can't register handler for new doc: %w", err)
}
if handerNewDoc.Existing {
// We must trigger for already existing docs.
// To do this queue these documents as a change.
nextToken := ""
for {
docList, err := registry.ListDocuments(ctx, handerNewDoc.Type, nextToken, 100)
if err != nil {
return fmt.Errorf("can't list existing docs: %w", err)
}
if len(docList.Documents) == 0 {
// we iterated over all existing documents
break
}
for _, doc := range docList.Documents {
err = Listen(ctx, detector, event.ListenOnChange{
Handler: handerNewDoc.Handler,
Documents: []event.ListenOnChangeDocument{{
Type: handerNewDoc.Type,
Name: doc,
NewDocument: true,
}}})
if err != nil {
return fmt.Errorf("can't add queue-listener for existing doc: %w", err)
}
}
nextToken = docList.NextToken
}
}
return nil
}