From 4a8b58318fff97adea5a61da02c891526a56cefc Mon Sep 17 00:00:00 2001 From: Gabriel Augendre Date: Sun, 4 Jun 2023 16:24:12 +0200 Subject: [PATCH] initial commit --- .gitignore | 2 + .tool-versions | 1 + go.mod | 7 +++ go.sum | 4 ++ main.go | 124 +++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 138 insertions(+) create mode 100644 .gitignore create mode 100644 .tool-versions create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..691fbeb --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.idea +.envrc diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 0000000..e7eea5d --- /dev/null +++ b/.tool-versions @@ -0,0 +1 @@ +golang 1.20.4 diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..675b12f --- /dev/null +++ b/go.mod @@ -0,0 +1,7 @@ +module github.com/Crocmagnon/liste-invites + +go 1.20 + +require github.com/jomei/notionapi v1.12.1 + +require github.com/pkg/errors v0.9.1 // indirect diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..39934d7 --- /dev/null +++ b/go.sum @@ -0,0 +1,4 @@ +github.com/jomei/notionapi v1.12.1 h1:X2IoTlU4h6szqVHVpM+Umau5lf4cxanTTQsbcm707HQ= +github.com/jomei/notionapi v1.12.1/go.mod h1:wgxFlmxL+oIfxclWkt8jta0PkcBepajish2uCxzBxTo= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= diff --git a/main.go b/main.go new file mode 100644 index 0000000..0bb9975 --- /dev/null +++ b/main.go @@ -0,0 +1,124 @@ +package main + +import ( + "context" + "fmt" + "os" + "sort" + "sync" + "time" + + "github.com/jomei/notionapi" +) + +func main() { + token := os.Getenv("NOTION_TOKEN") + dbId := notionapi.DatabaseID(os.Getenv("NOTION_DB")) + client := notionapi.NewClient(notionapi.Token(token)) + ctx := context.Background() + request := notionapi.DatabaseQueryRequest{ + PageSize: 100, + } + + hasMore := true + updates := 0 + wg := sync.WaitGroup{} + rateLimit := make(chan bool, 15) + + for hasMore { + res, err := client.Database.Query(ctx, dbId, &request) + if err != nil { + fmt.Println("error querying db: ", err) + return + } + fmt.Printf("Got %d results, processing...\n", len(res.Results)) + for i, page := range res.Results { + i := i + page := page + wg.Add(1) + rateLimit <- true + go func() { + pageTitle, err := processPage(ctx, i, page, err, client) + if err != nil { + fmt.Printf("err updating page (%v): %w\n", pageTitle, err) + } + updates++ + wg.Done() + <-rateLimit + }() + } + hasMore = res.HasMore + request.StartCursor = res.NextCursor + } + wg.Wait() + fmt.Println("Finished,", updates) +} + +func processPage(ctx context.Context, i int, page notionapi.Page, err error, client *notionapi.Client) (string, error) { + id := notionapi.PageID(page.ID) + var present []string + status := notionapi.StatusProperty{} + statusChanged := false + statusBlocked := false + var pageTitle string + for name, prop := range page.Properties { + { + title, ok := prop.(*notionapi.TitleProperty) + if ok { + pageTitle = title.Title[0].PlainText + fmt.Printf("%d/%d %v...\n", i+1, 100, pageTitle) + defer fmt.Println(pageTitle, "ok") + continue + } + } + prop, ok := prop.(*notionapi.CheckboxProperty) + if !ok { + continue + } + if !prop.Checkbox { + continue + } + switch name { + case "Mairie": + present = append(present, "Mairie") + case "Team montage": + present = append(present, "Montage") + case "Vin d'honneur": + present = append(present, "Vin d'honneur") + case "Repas": + present = append(present, "Repas") + case "Nuit + Brunch": + present = append(present, "Nuit + Brunch") + case "Vin d'honneur confirmé", "Repas confirmé": + status.Status = notionapi.Option{Name: "Confirmé"} + statusChanged = true + statusBlocked = true + } + if name == "Invit envoyée" && !statusBlocked { + status.Status = notionapi.Option{Name: "Invité"} + statusChanged = true + } + } + wantedOrder := map[string]int{"Mairie": 0, "Montage": 1, "Vin d'honneur": 2, "Repas": 3, "Nuit + Brunch": 4} + sort.Slice(present, func(i, j int) bool { + valI := present[i] + valJ := present[j] + return wantedOrder[valI] < wantedOrder[valJ] + }) + presentProp := notionapi.MultiSelectProperty{} + for _, val := range present { + presentProp.MultiSelect = append(presentProp.MultiSelect, notionapi.Option{Name: val}) + } + update := notionapi.PageUpdateRequest{ + Properties: map[string]notionapi.Property{ + "Présent à": presentProp, + }, + } + if statusChanged { + update.Properties["Status"] = status + } + ctx, cancel := context.WithTimeout(ctx, 30*time.Second) + defer cancel() + _, err = client.Page.Update(ctx, id, &update) + return pageTitle, err +}