Skip to content

Commit da0a674

Browse files
committed
add csv import functionality
1 parent e8a5814 commit da0a674

File tree

16 files changed

+132
-232
lines changed

16 files changed

+132
-232
lines changed

cmd/mass-gh-sponsor/main.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
animaterepos "github.com/thnxdev/utils/commands/animate-repos"
1919
dlrepos "github.com/thnxdev/utils/commands/dl-repos"
2020
"github.com/thnxdev/utils/commands/donate"
21+
importcsv "github.com/thnxdev/utils/commands/import-csv"
2122
)
2223

2324
// Populated during build.
@@ -32,6 +33,7 @@ var cli struct {
3233

3334
DbPath string `help:"Path to db file." required:"" env:"DB_PATH" default:"db.sql"`
3435

36+
ImportCsv importcsv.CmdImportCsv `cmd:"" help:"Import list of donations from csv file."`
3537
DlRepos dlrepos.CmdDlRepos `cmd:"" help:"Import the user's github repos."`
3638
AnimateRepos animaterepos.CmdAnimateRepos `cmd:"" help:"Animate the sponsorable dependencies for each repo."`
3739
Donate donate.CmdDonate `cmd:"" help:"Create the require GitHub sponsorships."`

commands/animate-repos/cmd.go

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -123,13 +123,6 @@ func (c *CmdAnimateRepos) Run(
123123
for _, d := range m.Depenencies.Nodes {
124124
o := d.Repository.Owner
125125
if o.Sponsorable.HasSponsorsListing {
126-
/* autoquery name: InsertDonation :exec
127-
128-
INSERT INTO donations (sponsor_id, recipient_id, last_ts)
129-
VALUES (?, ?, ?)
130-
ON CONFLICT (sponsor_id, recipient_id)
131-
DO NOTHING;
132-
*/
133126
_ = db.InsertDonation(ctx, database.InsertDonationParams{
134127
SponsorID: row.OwnerName,
135128
RecipientID: o.RepositoryOwner.Login,

commands/import-csv/cmd.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
//go:generate autoquery
2+
package importcsv
3+
4+
import (
5+
"context"
6+
"encoding/csv"
7+
"errors"
8+
"fmt"
9+
"os"
10+
"time"
11+
12+
"github.com/thnxdev/utils"
13+
"github.com/thnxdev/utils/database"
14+
"github.com/thnxdev/utils/utils/log"
15+
)
16+
17+
type CmdImportCsv struct {
18+
FilePath string `help:"The csv file to import from." type:"path" required:""`
19+
Entity utils.Entity `help:"The GitHub entity to import into." required:""`
20+
}
21+
22+
func (c *CmdImportCsv) Run(
23+
ctx context.Context,
24+
db *database.DB,
25+
) error {
26+
log.FromContext(ctx).Infof("opening %s for import", c.FilePath)
27+
28+
file, err := os.Open(c.FilePath)
29+
if err != nil {
30+
return fmt.Errorf("failed to open %s", c.FilePath)
31+
}
32+
defer file.Close()
33+
34+
reader := csv.NewReader(file)
35+
lines, err := reader.ReadAll()
36+
if err != nil {
37+
return fmt.Errorf("failed to read %s", c.FilePath)
38+
}
39+
40+
if len(lines) == 0 {
41+
return errors.New("file is empty")
42+
}
43+
44+
// first line is header
45+
for _, line := range lines[1:] {
46+
ghUsername := line[0]
47+
log.FromContext(ctx).Infof("adding %s", ghUsername)
48+
_ = db.InsertDonation(ctx, database.InsertDonationParams{
49+
SponsorID: string(c.Entity),
50+
RecipientID: ghUsername,
51+
LastTs: time.Now().Unix(),
52+
})
53+
}
54+
55+
return nil
56+
}

database/Makefile

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,4 @@ help:
66
regen: Makefile $(wildcard */db.go */query.sql.go */models.go) ## Rebuild the sqlc database access layers
77

88
db.go query.sql.go models.go: Makefile sqlc.yaml $$(wildcard queries/*.sql) $$(wildcard schema/*.sql)
9-
sqlc generate
10-
11-
.PHONY: migrate
12-
migrate: ## Create all databases and apply migrations
13-
for i in */schema; do \
14-
db="td-$$(dirname $$i)"; \
15-
createdb "$$db" || true; \
16-
(cd "$$i" && $ goose postgres "dbname=$$db sslmode=disable" up); \
17-
done
18-
19-
.PHONY: drop
20-
drop: ## Drop all databases
21-
for i in */schema; do \
22-
db="td-$$(dirname $$i)"; \
23-
dropdb "$$db"; \
24-
done
9+
sqlc generate

database/wkrrepos.sql.go renamed to database/animaterepos.sql.go

Lines changed: 1 addition & 35 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

database/dlrepos.sql.go

Lines changed: 28 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

database/wkrdonate.sql.go renamed to database/donate.sql.go

Lines changed: 1 addition & 25 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

database/models.go

Lines changed: 0 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

database/queries/wkrrepos.sql renamed to database/queries/animaterepos.sql

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,6 @@ FROM repos
55
WHERE animate_ts < last_ts
66
LIMIT 1;
77

8-
-- name: GetAreReposFinished :one
9-
10-
WITH d AS (VALUES(1))
11-
SELECT kv.v IS NOT NULL AS is_finished
12-
FROM d
13-
LEFT JOIN kvstore kv ON k = 'entity-ts';
14-
15-
-- name: InsertDonation :exec
16-
17-
INSERT INTO donations (sponsor_id, recipient_id, last_ts)
18-
VALUES (?, ?, ?)
19-
ON CONFLICT (sponsor_id, recipient_id)
20-
DO NOTHING;
21-
228
-- name: RepoUpdateCursorDep :exec
239

2410
UPDATE repos

database/queries/dlrepos.sql

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
-- name: ReposInsert :exec
2+
3+
INSERT INTO repos (owner_name, repo_name, last_ts)
4+
VALUES (?, ?, UNIXEPOCH())
5+
ON CONFLICT (owner_name, repo_name)
6+
DO NOTHING;
7+

database/queries/wkrdonate.sql renamed to database/queries/donate.sql

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,6 @@ WHERE
66
donate_ts < last_ts AND
77
donate_attempt_ts < UNIXEPOCH() - 3600;
88

9-
-- name: GetAreDonatesFinished :one
10-
11-
WITH
12-
num_repos_remaining AS (
13-
SELECT COUNT(rowid) AS num
14-
FROM repos
15-
WHERE animate_ts < last_ts
16-
)
17-
SELECT
18-
(
19-
num_repos_remaining.num = 0 AND
20-
kv.v IS NOT NULL
21-
) AS is_finished
22-
FROM num_repos_remaining
23-
LEFT JOIN kvstore kv ON k = 'entity-ts';
24-
259
-- name: UpdateDonationDonateAttemptTs :exec
2610

2711
UPDATE donations

database/queries/query.sql

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
-- name: InsertDonation :exec
2+
3+
INSERT INTO donations (sponsor_id, recipient_id, last_ts)
4+
VALUES (?, ?, ?)
5+
ON CONFLICT (sponsor_id, recipient_id)
6+
DO NOTHING;

database/queries/wkrentities.sql

Lines changed: 0 additions & 33 deletions
This file was deleted.

database/query.sql.go

Lines changed: 29 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)