diff --git a/bosmang.go b/bosmang.go index bf2e214bb..6c32f21ac 100644 --- a/bosmang.go +++ b/bosmang.go @@ -16,7 +16,7 @@ import ( "zgo.at/zdb" "zgo.at/zstd/zjson" "zgo.at/zstd/zruntime" - "zgo.at/zstd/zstring" + "zgo.at/zstd/ztype" ) type BosmangStat struct { @@ -45,7 +45,7 @@ func (a *BosmangStats) List(ctx context.Context) error { aa := *a for i := range aa { if aa[i].BillingAmount != nil { - aa[i].BillingAmount = zstring.NewPtr(curr.Replace(*aa[i].BillingAmount)).P + aa[i].BillingAmount = ztype.Ptr[string](curr.Replace(*aa[i].BillingAmount)) } } return nil diff --git a/cmd/goatcounter/db.go b/cmd/goatcounter/db.go index d49efbe29..2bb389999 100644 --- a/cmd/goatcounter/db.go +++ b/cmd/goatcounter/db.go @@ -20,6 +20,7 @@ import ( "zgo.at/zstd/zcrypto" "zgo.at/zstd/zint" "zgo.at/zstd/zstring" + "zgo.at/zstd/ztype" "zgo.at/zvalidate" ) @@ -335,7 +336,11 @@ func cmdDB(f zli.Flags, ready chan<- struct{}, stop chan struct{}) error { ) start: - cmd := f.ShiftCommand() + cmd, err := f.ShiftCommand() + if err != nil && !errors.Is(err, zli.ErrCommandNoneGiven{}) { + return err + } + switch cmd { default: // Be forgiving if someone reverses the order of "create" and "site". @@ -346,7 +351,7 @@ start: } return errors.Errorf("unknown command for \"db\": %q\n%s", cmd, helpDBShort) - case "", zli.CommandNoneGiven: + case "": //, zli.CommandNoneGiven: return errors.New("\"db\" needs a subcommand\n" + helpDBShort) case "help": zli.WantColor = true @@ -399,11 +404,15 @@ start: } func getTable(f *zli.Flags, cmd string) (string, error) { - tbl := f.ShiftCommand() + tbl, err := f.ShiftCommand() + if err != nil && !errors.Is(err, zli.ErrCommandNoneGiven{}) { + return "", err + } + switch tbl { default: return "", errors.Errorf("unknown table %q\n%s", tbl, helpDBShort) - case "", zli.CommandNoneGiven: + case "": return "", errors.Errorf("%q commands needs a table name\n%s", cmd, helpDBShort) case "help": zli.WantColor = true @@ -749,7 +758,7 @@ func cmdDBSiteUpdate(ctx context.Context, find []string, } if vhost.Set() { - s.Cname = zstring.NewPtr(vhost.String()).P + s.Cname = ztype.Ptr(vhost.String()) err := s.Update(ctx) if err != nil { return err diff --git a/cmd/goatcounter/main.go b/cmd/goatcounter/main.go index 92315d280..2082444b3 100644 --- a/cmd/goatcounter/main.go +++ b/cmd/goatcounter/main.go @@ -49,11 +49,17 @@ func cmdMain(f zli.Flags, ready chan<- struct{}, stop chan struct{}) { mainDone.Add(1) defer mainDone.Done() - cmd := f.ShiftCommand() + cmd, err := f.ShiftCommand() if zstring.ContainsAny(f.Args, "-h", "-help", "--help") { f.Args = append([]string{cmd}, f.Args...) cmd = "help" } + if err != nil && !errors.Is(err, zli.ErrCommandNoneGiven{}) { + zli.Errorf(usage[""]) + zli.Errorf("%s", err) + zli.Exit(1) + return + } var run command switch cmd { @@ -61,8 +67,7 @@ func cmdMain(f zli.Flags, ready chan<- struct{}, stop chan struct{}) { zli.Errorf(usage[""]) zli.Errorf("unknown command: %q", cmd) zli.Exit(1) - return - case "", "help", zli.CommandNoneGiven: + case "", "help": run = cmdHelp case "version": fmt.Fprintln(zli.Stdout, getVersion()) @@ -108,7 +113,7 @@ func cmdMain(f zli.Flags, ready chan<- struct{}, stop chan struct{}) { return } - err := run(f, ready, stop) + err = run(f, ready, stop) if err != nil { if !zstring.Contains(zlog.Config.Debug, "cli-trace") { for { diff --git a/cmd/goatcounter/old.go b/cmd/goatcounter/old.go index 6995b6c64..83c39e0b5 100644 --- a/cmd/goatcounter/old.go +++ b/cmd/goatcounter/old.go @@ -2,13 +2,13 @@ // under the terms of a slightly modified EUPL v1.2 license, which can be found // in the LICENSE file or at https://license.goatcounter.com -//go:build !go1.17 -// +build !go1.17 +//go:build !go1.18 +// +build !go1.18 package main // Make sure people don't try to build GoatCounter with older versions of Go, as // that will introduce some runtime problems (e.g. using %w). func init() { - "You need Go 1.17 or newer to compile GoatCounter" + "You need Go 1.18 or newer to compile GoatCounter" } diff --git a/db/migrate/gomig/2020-12-31-1-user_agents.go b/db/migrate/gomig/2020-12-31-1-user_agents.go index 2e620fd8f..2455fc607 100644 --- a/db/migrate/gomig/2020-12-31-1-user_agents.go +++ b/db/migrate/gomig/2020-12-31-1-user_agents.go @@ -45,9 +45,9 @@ func UserAgents(ctx context.Context) error { } if strings.ContainsRune(u.UserAgent, '~') { - u.UserAgent = gadget.Unshorten(u.UserAgent) + u.UserAgent = gadget.UnshortenUA(u.UserAgent) } else { - u.UserAgent = gadget.Shorten(u.UserAgent) + u.UserAgent = gadget.ShortenUA(u.UserAgent) } var dupes []int64 @@ -84,10 +84,10 @@ func UserAgents(ctx context.Context) error { } if strings.ContainsRune(u.UserAgent, '~') { - u.UserAgent = gadget.Unshorten(u.UserAgent) + u.UserAgent = gadget.UnshortenUA(u.UserAgent) } - ua := gadget.Parse(u.UserAgent) + ua := gadget.ParseUA(u.UserAgent) var browser goatcounter.Browser err := browser.GetOrInsert(ctx, ua.BrowserName, ua.BrowserVersion) @@ -106,7 +106,7 @@ func UserAgents(ctx context.Context) error { bot := isbot.UserAgent(u.UserAgent) err = zdb.Exec(ctx, `update user_agents set browser_id=$1, system_id=$2, ua=$3, isbot=$4 where user_agent_id=$5`, - browser.ID, system.ID, gadget.Shorten(u.UserAgent), bot, u.ID) + browser.ID, system.ID, gadget.ShortenUA(u.UserAgent), bot, u.ID) errs.Append(errors.Wrapf(err, "update user_agent %d", u.ID)) } if errs.Len() > 0 { diff --git a/export.go b/export.go index e75577d14..32daa5501 100644 --- a/export.go +++ b/export.go @@ -462,7 +462,7 @@ func (h *ExportRows) Export(ctx context.Context, limit, paginate int64) (int64, hh := *h for i := range hh { - hh[i].UserAgent = gadget.Unshorten(hh[i].UserAgent) + hh[i].UserAgent = gadget.UnshortenUA(hh[i].UserAgent) } *h = hh diff --git a/gctest/gctest.go b/gctest/gctest.go index 44aee2ec1..3708b9460 100644 --- a/gctest/gctest.go +++ b/gctest/gctest.go @@ -20,7 +20,7 @@ import ( "zgo.at/zdb/drivers/go-sqlite3" "zgo.at/zstd/zcrypto" "zgo.at/zstd/zgo" - "zgo.at/zstd/zstring" + "zgo.at/zstd/ztype" ) var pgSQL = false @@ -107,7 +107,7 @@ func db(t testing.TB, storeFile bool) context.Context { } func initData(ctx context.Context, db zdb.DB, t testing.TB) context.Context { - site := goatcounter.Site{Code: "gctest", Cname: zstring.NewPtr("gctest.localhost").P, Plan: goatcounter.PlanFree} + site := goatcounter.Site{Code: "gctest", Cname: ztype.Ptr("gctest.localhost"), Plan: goatcounter.PlanFree} err := site.Insert(ctx) if err != nil { t.Fatalf("create site: %s", err) diff --git a/gctest/gctest_test.go b/gctest/gctest_test.go index f3a98fd4d..96f7a71d7 100644 --- a/gctest/gctest_test.go +++ b/gctest/gctest_test.go @@ -11,7 +11,7 @@ import ( "zgo.at/goatcounter/v2" "zgo.at/zdb" "zgo.at/zlog" - "zgo.at/zstd/zstring" + "zgo.at/zstd/ztype" ) func TestDB(t *testing.T) { @@ -64,7 +64,7 @@ func TestSite(t *testing.T) { } { - s := goatcounter.Site{Cname: zstring.NewPtr("XXX.XXX").P} + s := goatcounter.Site{Cname: ztype.Ptr("XXX.XXX")} u := goatcounter.User{Email: "XXX@XXX.XXX"} Site(ctx, t, &s, &u) diff --git a/go.mod b/go.mod index 746da77c0..ac427e1e3 100644 --- a/go.mod +++ b/go.mod @@ -1,42 +1,43 @@ module zgo.at/goatcounter/v2 -go 1.17 +go 1.18 require ( code.soquee.net/otp v0.0.1 - github.com/BurntSushi/toml v1.0.0 + github.com/BurntSushi/toml v1.1.0 github.com/PuerkitoBio/goquery v1.8.0 - github.com/bmatcuk/doublestar/v3 v3.0.0 + github.com/bmatcuk/doublestar/v4 v4.0.2 github.com/boombuler/barcode v1.0.1 github.com/go-chi/chi/v5 v5.0.7 github.com/google/uuid v1.3.0 github.com/gorilla/websocket v1.5.0 - github.com/mattn/go-sqlite3 v1.14.12 + github.com/mattn/go-sqlite3 v1.14.13 github.com/monoculum/formam v3.5.5+incompatible github.com/oschwald/geoip2-golang v1.4.0 github.com/russross/blackfriday/v2 v2.1.0 - github.com/teamwork/reload v1.4.0 - golang.org/x/crypto v0.0.0-20220214200702-86341886e292 - golang.org/x/image v0.0.0-20220302094943-723b81ca9867 - golang.org/x/net v0.0.0-20220225172249-27dd8689420f - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c + github.com/teamwork/reload v1.4.1 + golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e + golang.org/x/image v0.0.0-20220601225756-64ec528b34cd + golang.org/x/net v0.0.0-20220531201128-c960675eff93 + golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f golang.org/x/text v0.3.7 zgo.at/blackmail v0.0.0-20211212060815-1f8e8a94692b zgo.at/errors v1.1.0 zgo.at/follow v0.0.0-20211017230838-112008350298 - zgo.at/gadget v0.0.0-20220215192223-d8b0d7a0f8e8 + zgo.at/gadget v1.0.0 zgo.at/guru v1.1.0 - zgo.at/isbot v0.0.0-20220218084749-37964349899b + zgo.at/isbot v1.0.0 zgo.at/json v0.0.0-20211017213340-cc8bf51df08c + zgo.at/termtext v1.1.0 zgo.at/tz v0.0.0-20211017223207-006eae99adf6 - zgo.at/z18n v0.0.0-20211201221236-c1ccdacc3808 - zgo.at/zcache v1.0.1-0.20210412145246-76039d792310 - zgo.at/zdb v0.0.0-20220305202237-4742bea134e5 + zgo.at/z18n v0.0.0-20220606095325-513ddb98b28f + zgo.at/zcache v1.2.0 + zgo.at/zdb v0.0.0-20220409200746-018582f47c20 zgo.at/zhttp v0.0.0-20220306174538-ede1552bdf7c - zgo.at/zli v0.0.0-20211215141047-76dae1509b03 + zgo.at/zli v0.0.0-20220603144944-094944de19e6 zgo.at/zlog v0.0.0-20211008102840-46c1167bf2a9 zgo.at/zprof v0.0.0-20211217104121-c3c12596d8f0 - zgo.at/zstd v0.0.0-20220306174247-aa79e904bd64 + zgo.at/zstd v0.0.0-20220606095932-df1f8a2ae661 zgo.at/zstripe v1.1.1-0.20210407063143-62ac9deebc08 zgo.at/ztpl v0.0.0-20211128061406-6ff34b1256c4 zgo.at/zvalidate v0.0.0-20211128195927-d13b18611e62 @@ -47,17 +48,15 @@ require ( github.com/fsnotify/fsnotify v1.4.9 // indirect github.com/go-sql-driver/mysql v1.6.0 // indirect github.com/lib/pq v1.10.4 // indirect + github.com/mattn/go-runewidth v0.0.13 // indirect github.com/oschwald/maxminddb-golang v1.8.0 // indirect - golang.org/x/mod v0.5.1 // indirect - golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e // indirect - golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect - golang.org/x/tools v0.1.9 // indirect - golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect + github.com/rivo/uniseg v0.2.0 // indirect + golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect + golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect + golang.org/x/term v0.0.0-20220411215600-e5f449aeb171 // indirect + golang.org/x/tools v0.1.11-0.20220513221640-090b14e8501f // indirect ) -// https://github.com/Teamwork/reload/pull/12 -replace github.com/teamwork/reload => github.com/arp242/reload v1.4.1-0.20220116060443-b28a54916036 - // https://github.com/oschwald/maxminddb-golang/pull/75 replace github.com/oschwald/maxminddb-golang => github.com/arp242/maxminddb-golang v1.8.1-0.20201227124339-dc03187a9664 diff --git a/go.sum b/go.sum index 670f8ad19..6a583f91c 100644 --- a/go.sum +++ b/go.sum @@ -1,8 +1,7 @@ code.soquee.net/otp v0.0.1 h1:sPALeimyp/DAj4MXMjj94QDdYN/y2+dSoMXQCxttpvw= code.soquee.net/otp v0.0.1/go.mod h1:sv1t9zLujoOZ8T14ty2ffdj6y+fjScwX7m76G+dzrm0= -github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/toml v1.0.0 h1:dtDWrepsVPfW9H/4y7dDgFc2MBUSeJhlaDtK13CxFlU= -github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I= +github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U= github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI= github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c= @@ -11,10 +10,8 @@ github.com/arp242/geoip2-golang v1.4.1-0.20201227124715-9eb17ed0da06 h1:rixtl++v github.com/arp242/geoip2-golang v1.4.1-0.20201227124715-9eb17ed0da06/go.mod h1:G1gi89KVrG9jLzIPvR7hk/0pg0zfzp+FeRWnYzyF9c0= github.com/arp242/maxminddb-golang v1.8.1-0.20201227124339-dc03187a9664 h1:dmj4nhkeg9oq8UpM8XmcCrDEOEdak8zMzobLJ2LGUEY= github.com/arp242/maxminddb-golang v1.8.1-0.20201227124339-dc03187a9664/go.mod h1:RXZtst0N6+FY/3qCNmZMBApR19cdQj43/NM9VkrNAis= -github.com/arp242/reload v1.4.1-0.20220116060443-b28a54916036 h1:/6FPkO3Ct5N4f2SxUIjy0AWE7/aGL4F8OzPYxnOqU0s= -github.com/arp242/reload v1.4.1-0.20220116060443-b28a54916036/go.mod h1:xR3BcLHeCmLBX/2jKDG2vWOLTcql3+aah4puN18lmTo= -github.com/bmatcuk/doublestar/v3 v3.0.0 h1:TQtVPlDnAYwcrVNB2JiGuMc++H5qzWZd9PhkNo5WyHI= -github.com/bmatcuk/doublestar/v3 v3.0.0/go.mod h1:6PcTVMw80pCY1RVuoqu3V++99uQB3vsSYKPTd8AWA0k= +github.com/bmatcuk/doublestar/v4 v4.0.2 h1:X0krlUVAVmtr2cRoTqR8aDMrDqnB36ht8wpWTiQ3jsA= +github.com/bmatcuk/doublestar/v4 v4.0.2/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= github.com/boombuler/barcode v1.0.1 h1:NDBbPmhS+EqABEs5Kg3n/5ZNjy73Pz7SIV+KCeqyXcs= github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= @@ -31,40 +28,38 @@ github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWm github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/lib/pq v1.10.4 h1:SO9z7FRPzA03QhHKJrH5BXA6HU1rS4V2nIVrrNC1iYk= github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/mattn/go-sqlite3 v1.14.12 h1:TJ1bhYJPV44phC+IMu1u2K/i5RriLTPe+yc68XDJ1Z0= +github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.13 h1:1tj15ngiFfcZzii7yd82foL+ks+ouQcj8j/TPq3fk1I= +github.com/mattn/go-sqlite3 v1.14.13/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/monoculum/formam v3.5.5+incompatible h1:iPl5csfEN96G2N2mGu8V/ZB62XLf9ySTpC8KRH6qXec= github.com/monoculum/formam v3.5.5+incompatible/go.mod h1:RKgILGEJq24YyJ2ban8EO0RUVSJlF1pGsEvoLEACr/Q= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/teamwork/reload v1.4.1 h1:r+OPumeA8SY06DmhmPgdwhL34fECmqu9HAy0H01dnjk= +github.com/teamwork/reload v1.4.1/go.mod h1:xR3BcLHeCmLBX/2jKDG2vWOLTcql3+aah4puN18lmTo= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292 h1:f+lwQ+GtmgoY+A2YaQxlSOnDjXcQ7ZRLWOHbC6HtRqE= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/image v0.0.0-20220302094943-723b81ca9867 h1:TcHcE0vrmgzNH1v3ppjcMGbhG5+9fMuvOmUYwNEF4q4= -golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/image v0.0.0-20220601225756-64ec528b34cd h1:9NbNcTg//wfC5JskFW4Z3sqwVnjmJKHxLAol1bW2qgw= +golang.org/x/image v0.0.0-20220601225756-64ec528b34cd/go.mod h1:doUCurBvlfPMKfmIpRIywoHmhN3VyhnoFDbvIEWF4hY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.0.0-20220531201128-c960675eff93 h1:MYimHLfoXEpOhqd/zgoA/uoXzHB86AEky4LAx5ij9xA= +golang.org/x/net v0.0.0-20220531201128-c960675eff93/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f h1:Ax0t5p6N38Ga0dThY21weqDEyz2oklo4IvDkpigvkD8= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -73,60 +68,50 @@ golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210317153231-de623e64d2a6/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220411215600-e5f449aeb171 h1:EH1Deb8WZJ0xc0WK//leUHXcX9aLE5SymusoTmMZye8= +golang.org/x/term v0.0.0-20220411215600-e5f449aeb171/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= -golang.org/x/tools v0.1.9 h1:j9KsMiaP1c3B0OTQGth0/k+miLGTgLsAFUCrF2vLcF8= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/tools v0.1.11-0.20220513221640-090b14e8501f h1:OKYpQQVE3DKSc3r3zHVzq46vq5YH7x8xpR3/k9ixmUg= +golang.org/x/tools v0.1.11-0.20220513221640-090b14e8501f/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= zgo.at/blackmail v0.0.0-20211212060815-1f8e8a94692b h1:dOljX6avnQNLO3ogaRlLfl52bbNiycYDyWOHVhsioxk= zgo.at/blackmail v0.0.0-20211212060815-1f8e8a94692b/go.mod h1:EWa/z/DNEeH3ss1/AyTEXuqFfcUs89Mr971ul8qT9+8= -zgo.at/errors v1.0.1-0.20210313142254-4e0fb19b1249/go.mod h1:POfgvh1LafF2NZJk6buGYCIhcHWuR/miB3nndyf3ozs= zgo.at/errors v1.1.0 h1:Pbii1NYBVmORykhsFd20NJfcCHqJWSuubhBQgmnOkPA= zgo.at/errors v1.1.0/go.mod h1:POfgvh1LafF2NZJk6buGYCIhcHWuR/miB3nndyf3ozs= zgo.at/follow v0.0.0-20211017230838-112008350298 h1:LVV0WlhCWFa/swHhJ9UT99TZ5Qr8wwFX3OvekZm0/s0= zgo.at/follow v0.0.0-20211017230838-112008350298/go.mod h1:PiuKBfdQxUV+p/Caa03VAKRxog7os3O/QvCjnDvOQu8= -zgo.at/gadget v0.0.0-20220215192223-d8b0d7a0f8e8 h1:vn3yJgOXo8GAexX9znTgffCbRcI3H7ekeSRtWIlWaj0= -zgo.at/gadget v0.0.0-20220215192223-d8b0d7a0f8e8/go.mod h1:1x0AKFOjKScVTzJh+V69Ku6hTwvEM56MlnKOtrjMwSo= +zgo.at/gadget v1.0.0 h1:aY+h6cRSY1KgjuNWb1fFzT8KWAGllhuYEcf18f1adWw= +zgo.at/gadget v1.0.0/go.mod h1:1x0AKFOjKScVTzJh+V69Ku6hTwvEM56MlnKOtrjMwSo= zgo.at/guru v1.1.0 h1:hvMLOzPnv7XApwJZgxvFxBA8wb6RGPUw9lz8kmq450g= zgo.at/guru v1.1.0/go.mod h1:eltnfk6QwmM7ic3OLzmGMjEChP2iLuYXERyliREiA00= -zgo.at/isbot v0.0.0-20220218084749-37964349899b h1:MTfMCAf92QR98OPL4epGzv2LcloV6OBdjpBIkwPHmGg= -zgo.at/isbot v0.0.0-20220218084749-37964349899b/go.mod h1:/w+LTWbHsV7G5fT41VnwM0kTdk1H/prynfMqaxcBWjA= +zgo.at/isbot v1.0.0 h1:wM+40WO2LudR5352eCAQlHQdWsdNVpngB8Oe1qlTpdM= +zgo.at/isbot v1.0.0/go.mod h1:/w+LTWbHsV7G5fT41VnwM0kTdk1H/prynfMqaxcBWjA= zgo.at/json v0.0.0-20200627042140-d5025253667f/go.mod h1:DUuNIRpNC7/cup+Gy0qhwQEjjlLFXXRZ04VnVv9bf3E= zgo.at/json v0.0.0-20211017213340-cc8bf51df08c h1:+1NJehERsfdFM/8hLp/StIgPOJjqqxoUhTonRfxI914= zgo.at/json v0.0.0-20211017213340-cc8bf51df08c/go.mod h1:DUuNIRpNC7/cup+Gy0qhwQEjjlLFXXRZ04VnVv9bf3E= +zgo.at/termtext v1.1.0 h1:fBwyR6BVw1DnOIGmRhlQwM3cePzoJtY9FHpc62TwCWU= +zgo.at/termtext v1.1.0/go.mod h1:P0jvULwo8z82ad7+WR6vg5vTy86dqvbOmR3bT3NlYvc= zgo.at/tz v0.0.0-20211017223207-006eae99adf6 h1:5YGaOhnrchO+rebbvxJ4+ZOLYygCLh5JDLJg6kCilyw= zgo.at/tz v0.0.0-20211017223207-006eae99adf6/go.mod h1:A/XeaYjeMGoXptRB3EcR80tgir37tJnzCb6itDaHPxo= -zgo.at/z18n v0.0.0-20211201221236-c1ccdacc3808 h1:M3ayjYZ0Qubr6ldGt64ONlx8m5SgsYNyEoYxRjOG1QU= -zgo.at/z18n v0.0.0-20211201221236-c1ccdacc3808/go.mod h1:7/jQw/L0ng1iFUikdkYC9meSdeUkhXYfbtdm5OB1KHA= -zgo.at/zcache v1.0.1-0.20210412145246-76039d792310 h1:lJ2j+bNqtRmn8TOJDZXqeaTuG856QzYGxXghRPw2iH8= -zgo.at/zcache v1.0.1-0.20210412145246-76039d792310/go.mod h1:xWQo2ha/bamTmx8CbfrZl9Nf8AoT5uNh2hWfbQi8TiE= -zgo.at/zdb v0.0.0-20220305202237-4742bea134e5 h1:qb5RS5aFvokpI8UZdFvT/w22kOErzU2PoEtJz30X9bc= -zgo.at/zdb v0.0.0-20220305202237-4742bea134e5/go.mod h1:btLfiemw1WfWa2aIz6htEWPTQfA3xAgixnD+Tuc9PsE= +zgo.at/z18n v0.0.0-20220606095325-513ddb98b28f h1:EFYfkKvD7X1Yka3NSL3vc+wooc3AWZIn5tlpxenVVS8= +zgo.at/z18n v0.0.0-20220606095325-513ddb98b28f/go.mod h1:7/jQw/L0ng1iFUikdkYC9meSdeUkhXYfbtdm5OB1KHA= +zgo.at/zcache v1.2.0 h1:++0dNWOrmUBa10WSja+eHx5bEO2PzZLRY6MJlBD47yk= +zgo.at/zcache v1.2.0/go.mod h1:xWQo2ha/bamTmx8CbfrZl9Nf8AoT5uNh2hWfbQi8TiE= +zgo.at/zdb v0.0.0-20220409200746-018582f47c20 h1:UiH9Z16+P9boCZ8hOit+if1ykiCqUJYUcSLUslplUGw= +zgo.at/zdb v0.0.0-20220409200746-018582f47c20/go.mod h1:Bx5jx4rDpa2WZvplVZsSJg4NzxZKdhmCrxjRvg43gvI= zgo.at/zhttp v0.0.0-20220306174538-ede1552bdf7c h1:VD7y4zGpHOH3hWfh9oGjU08IP7/posKrh22Ifn+qxLg= zgo.at/zhttp v0.0.0-20220306174538-ede1552bdf7c/go.mod h1:lURXM+k9Lcb0W3RSOL0nrnFnPBKC+5ibmb8LhjqL0Mo= -zgo.at/zli v0.0.0-20211017231103-84f8e371c324/go.mod h1:pWkBHZ5qoEmvSDbFYdQMAKaRMEuAtdUKb21k/OOYOJw= -zgo.at/zli v0.0.0-20211215141047-76dae1509b03 h1:x8eqGxlYcqFkwd7zk77uZ9JoEiS6cxSWQbqFb8PqoW4= -zgo.at/zli v0.0.0-20211215141047-76dae1509b03/go.mod h1:pWkBHZ5qoEmvSDbFYdQMAKaRMEuAtdUKb21k/OOYOJw= +zgo.at/zli v0.0.0-20220603144944-094944de19e6 h1:77OfhcwXWxJueAPgHlrBF4wAEO1PO7XFatN60b4zOG8= +zgo.at/zli v0.0.0-20220603144944-094944de19e6/go.mod h1:6nYv5thziHp9CMVzGbQV4qeA9hMJSj7uJ8WLgD4BtVs= zgo.at/zlog v0.0.0-20201213081304-1dc74ce06e5f/go.mod h1:YkLAQZjLsp1RqWHn8SJokHzXyYU+6FZjM4GNY64IKME= zgo.at/zlog v0.0.0-20211008102840-46c1167bf2a9 h1:4Ot1ETCZQjEjISFiE+SjhwykNvUTLJfyK/BCoJJidnk= zgo.at/zlog v0.0.0-20211008102840-46c1167bf2a9/go.mod h1:2Pa5cqKA/6S9FrMFeNowtHPd7JEzqwooLXcxU6Wk7Hc= @@ -135,10 +120,10 @@ zgo.at/zprof v0.0.0-20211217104121-c3c12596d8f0/go.mod h1:JqClLxeT9Uui3apqyN3U6K zgo.at/zstd v0.0.0-20210310054817-c39eb9b7df25/go.mod h1:bQqcOgaRPCBT7lZ52Ksg9GF1xwi0L97E3AyvW3oGJYE= zgo.at/zstd v0.0.0-20210320020631-01ce6df76a58/go.mod h1:sQqrTxBwKW0nlwcOg9RxXB8ikY+NBciJnJRPOq/gEuY= zgo.at/zstd v0.0.0-20210512041107-8951517febd3/go.mod h1:sQqrTxBwKW0nlwcOg9RxXB8ikY+NBciJnJRPOq/gEuY= -zgo.at/zstd v0.0.0-20211201154120-0e6864ea6110/go.mod h1:sQqrTxBwKW0nlwcOg9RxXB8ikY+NBciJnJRPOq/gEuY= -zgo.at/zstd v0.0.0-20211220090423-fa07dcab58f8/go.mod h1:sQqrTxBwKW0nlwcOg9RxXB8ikY+NBciJnJRPOq/gEuY= -zgo.at/zstd v0.0.0-20220306174247-aa79e904bd64 h1:HAVMPWihLj5efVqidp9roItAE1qLKKlJeyQA7OLMheY= zgo.at/zstd v0.0.0-20220306174247-aa79e904bd64/go.mod h1:sQqrTxBwKW0nlwcOg9RxXB8ikY+NBciJnJRPOq/gEuY= +zgo.at/zstd v0.0.0-20220409195454-fd5d3ef2d590/go.mod h1:sQqrTxBwKW0nlwcOg9RxXB8ikY+NBciJnJRPOq/gEuY= +zgo.at/zstd v0.0.0-20220606095932-df1f8a2ae661 h1:UME9B37TLF4J0/t2Wz/hilCgG/1xMuexuTP/NNEPKy4= +zgo.at/zstd v0.0.0-20220606095932-df1f8a2ae661/go.mod h1:KYkLDHZN6APaRYHlL+hpwBJW/g9w+MLmXi4MKE5YteY= zgo.at/zstripe v1.1.1-0.20210407063143-62ac9deebc08 h1:c5+QSfo9AQfeigy/GsUGu+cq5JHJ8qo9KiNRoLeqhX4= zgo.at/zstripe v1.1.1-0.20210407063143-62ac9deebc08/go.mod h1:bIBaT9rsnc+uWMSf+6UXjDHhlwxLgcU7jahxUMU+j+k= zgo.at/ztpl v0.0.0-20211017232908-7dce3dc79277/go.mod h1:mhjSF7+pfwMjNhDgmw9Ywr1CixzeVWuvMjF7gLJT8Uw= diff --git a/handlers/api_test.go b/handlers/api_test.go index 140a945cf..4f4483444 100644 --- a/handlers/api_test.go +++ b/handlers/api_test.go @@ -22,9 +22,9 @@ import ( "zgo.at/zstd/zbool" "zgo.at/zstd/zint" "zgo.at/zstd/zjson" - "zgo.at/zstd/zstring" "zgo.at/zstd/ztest" "zgo.at/zstd/ztime" + "zgo.at/zstd/ztype" "zgo.at/zvalidate" ) @@ -445,12 +445,12 @@ func TestAPISitesCreate(t *testing.T) { }{ {false, `{"code":"apitest"}`, 200, func(s *goatcounter.Site) { s.Code = "apitest" - s.Parent = zint.NewPtr64(1).P + s.Parent = ztype.Ptr(int64(1)) s.Plan = "child" }}, {true, `{"cname":"apitest.localhost"}`, 200, func(s *goatcounter.Site) { - s.Cname = zstring.NewPtr("apitest.localhost").P - s.Parent = zint.NewPtr64(1).P + s.Cname = ztype.Ptr("apitest.localhost") + s.Parent = ztype.Ptr(int64(1)) s.Plan = "child" s.CnameSetupAt = &now }}, @@ -458,12 +458,12 @@ func TestAPISitesCreate(t *testing.T) { // Ignore plan. {false, `{"code":"apitest","plan":"personal"}`, 200, func(s *goatcounter.Site) { s.Code = "apitest" - s.Parent = zint.NewPtr64(1).P + s.Parent = ztype.Ptr(int64(1)) s.Plan = "child" }}, {true, `{"cname":"apitest.localhost","plan":"personal"}`, 200, func(s *goatcounter.Site) { - s.Cname = zstring.NewPtr("apitest.localhost").P - s.Parent = zint.NewPtr64(1).P + s.Cname = ztype.Ptr("apitest.localhost") + s.Parent = ztype.Ptr(int64(1)) s.Plan = "child" s.CnameSetupAt = &now }}, @@ -522,12 +522,12 @@ func TestAPISitesUpdate(t *testing.T) { }{ {false, "PATCH", `{}`, 200, func(s *goatcounter.Site) { s.Code = "gctest" - s.Cname = zstring.NewPtr("gctest.localhost").P + s.Cname = ztype.Ptr("gctest.localhost") s.Plan = goatcounter.PlanFree }}, {false, "POST", `{}`, 200, func(s *goatcounter.Site) { s.Code = "gctest" - //s.Cname = zstring.NewPtr("gctest.localhost").P + //s.Cname = ztype.Ptr("gctest.localhost") s.Plan = goatcounter.PlanFree }}, } diff --git a/handlers/billing.go b/handlers/billing.go index 9bcff434a..2338c80b8 100644 --- a/handlers/billing.go +++ b/handlers/billing.go @@ -31,6 +31,7 @@ import ( "zgo.at/zstd/zjson" "zgo.at/zstd/zstring" "zgo.at/zstd/ztime" + "zgo.at/zstd/ztype" "zgo.at/zstripe" ) @@ -86,7 +87,7 @@ func (h billing) index(w http.ResponseWriter, r *http.Request) error { zhttp.Flash(w, T(r.Context(), "notify/payment-processing|The payment processor reported success, but we're still processing the payment")) zlog.Fields(zlog.F{ "siteID": account.ID, - "stripeID": zstring.Ptr{account.Stripe}.String(), + "stripeID": ztype.Ptr(account.Stripe), }).Errorf("stripe not processed") } else { bgrun.Run("email:subscription", func() { @@ -375,7 +376,7 @@ func (h billing) whSubscriptionUpdated(event zstripe.Event, w http.ResponseWrite site.Stripe = &s.Customer } site.Plan = plan - site.BillingAmount = zstring.NewPtr(fmt.Sprintf("%s %d", currency, amount)).P + site.BillingAmount = ztype.Ptr(fmt.Sprintf("%s %d", currency, amount)) if s.BillingCycleAnchor.IsZero() { site.BillingAnchor = nil } else { @@ -423,7 +424,7 @@ func (h billing) whCheckout(event zstripe.Event, w http.ResponseWriter, r *http. n := ztime.Now() site.Stripe = &s.Customer - site.BillingAmount = zstring.NewPtr(fmt.Sprintf("%s %d", strings.ToUpper(s.Currency), s.AmountTotal/100)).P + site.BillingAmount = ztype.Ptr(fmt.Sprintf("%s %d", strings.ToUpper(s.Currency), s.AmountTotal/100)) site.BillingAnchor = &n site.Plan = *site.PlanPending site.PlanPending = nil diff --git a/handlers/billing_test.go b/handlers/billing_test.go index 2603f09cb..9b3ebdf33 100644 --- a/handlers/billing_test.go +++ b/handlers/billing_test.go @@ -15,9 +15,9 @@ import ( "zgo.at/goatcounter/v2" "zgo.at/goatcounter/v2/gctest" "zgo.at/zdb" - "zgo.at/zstd/zstring" "zgo.at/zstd/ztest" "zgo.at/zstd/ztime" + "zgo.at/zstd/ztype" "zgo.at/zstripe" ) @@ -61,9 +61,9 @@ func TestSettingsBilling(t *testing.T) { "personal", &goatcounter.Site{ Plan: goatcounter.PlanPersonal, - Stripe: zstring.NewPtr("cus_asd").P, - BillingAmount: zstring.NewPtr("EUR 2").P, - BillingAnchor: tp(ztime.New("2020-06-18")), + Stripe: ztype.Ptr("cus_asd"), + BillingAmount: ztype.Ptr("EUR 2"), + BillingAnchor: tp(ztime.FromString("2020-06-18")), }, []string{ "Currently using the Personal plan; the limits for this are", @@ -78,9 +78,9 @@ func TestSettingsBilling(t *testing.T) { "starter subscription", &goatcounter.Site{ Plan: goatcounter.PlanStarter, - Stripe: zstring.NewPtr("cus_abc").P, - BillingAmount: zstring.NewPtr("EUR 5").P, - BillingAnchor: tp(ztime.New("2020-06-18")), + Stripe: ztype.Ptr("cus_abc"), + BillingAmount: ztype.Ptr("EUR 5"), + BillingAnchor: tp(ztime.FromString("2020-06-18")), }, []string{ "Currently using the Starter plan; the limits for this are", @@ -96,10 +96,10 @@ func TestSettingsBilling(t *testing.T) { "scheduled cancel", &goatcounter.Site{ Plan: goatcounter.PlanStarter, - Stripe: zstring.NewPtr("cus_abc").P, - BillingAmount: zstring.NewPtr("EUR 5").P, - BillingAnchor: tp(ztime.New("2020-06-18")), - PlanCancelAt: tp(ztime.New("2020-07-18")), + Stripe: ztype.Ptr("cus_abc"), + BillingAmount: ztype.Ptr("EUR 5"), + BillingAnchor: tp(ztime.FromString("2020-06-18")), + PlanCancelAt: tp(ztime.FromString("2020-07-18")), }, []string{ "Currently using the Starter plan; the limits for this are", @@ -115,7 +115,7 @@ func TestSettingsBilling(t *testing.T) { { "cancelled", &goatcounter.Site{ - Stripe: zstring.NewPtr("cus_abc").P, + Stripe: ztype.Ptr("cus_abc"), }, []string{ "Currently using the Free plan; the limits for this are", diff --git a/handlers/dashboard.go b/handlers/dashboard.go index 94426c211..be0714484 100644 --- a/handlers/dashboard.go +++ b/handlers/dashboard.go @@ -410,7 +410,7 @@ func timeRange(r string, tz *time.Location, sundayStartsWeek bool) ztime.Range { zlog.Field("rng", r).Error(errors.Errorf("timeRange: %w", err)) return timeRange("week", tz, sundayStartsWeek) } - rng.Start = ztime.Add(rng.Start, -days, ztime.Day) + rng.Start = ztime.AddPeriod(rng.Start, -days, ztime.Day) } return rng.UTC() } diff --git a/handlers/mw.go b/handlers/mw.go index 2fc0405db..63c57110d 100644 --- a/handlers/mw.go +++ b/handlers/mw.go @@ -17,6 +17,7 @@ import ( "zgo.at/goatcounter/v2/cron" "zgo.at/guru" "zgo.at/json" + "zgo.at/termtext" "zgo.at/z18n" "zgo.at/zdb" "zgo.at/zhttp" @@ -24,7 +25,6 @@ import ( "zgo.at/zlog" "zgo.at/zstd/znet" "zgo.at/zstd/zruntime" - "zgo.at/zstd/zstring" "zgo.at/zstd/ztime" ) @@ -170,11 +170,12 @@ func addctx(db zdb.DB, loadSite bool, dashTimeout int) func(http.Handler) http.H err = nil if r.URL.Path == "/" { - zlog.Printf(zstring.WordWrap(fmt.Sprintf(""+ + txt := fmt.Sprintf(""+ "accessing the site on domain %q, but the configured domain is %q; "+ "this will work fine as long as you only have one site, but you *need* to use the "+ "configured domain if you add a second site so GoatCounter will know which site to use.", - znet.RemovePort(r.Host), *s.Cname), strings.Repeat(" ", 25), 55)) + znet.RemovePort(r.Host), *s.Cname) + zlog.Printf(termtext.WordWrap(txt, 55, strings.Repeat(" ", 25))) } } if err2 == nil && len(sites) == 0 { diff --git a/handlers/settings_test.go b/handlers/settings_test.go index 1c1896a88..f37cef346 100644 --- a/handlers/settings_test.go +++ b/handlers/settings_test.go @@ -15,8 +15,7 @@ import ( "zgo.at/goatcounter/v2/bgrun" "zgo.at/goatcounter/v2/gctest" "zgo.at/zdb" - "zgo.at/zstd/zint" - "zgo.at/zstd/zstring" + "zgo.at/zstd/ztype" ) func TestSettingsTpl(t *testing.T) { @@ -121,8 +120,8 @@ func TestSettingsSitesAdd(t *testing.T) { name: "already exists for this account", setup: func(ctx context.Context, t *testing.T) { s := goatcounter.Site{ - Parent: zint.NewPtr64(1).P, - Cname: zstring.NewPtr("add.example.com").P, + Parent: ztype.Ptr(int64(1)), + Cname: ztype.Ptr("add.example.com"), Code: "add", Plan: goatcounter.PlanChild, } @@ -147,7 +146,7 @@ func TestSettingsSitesAdd(t *testing.T) { name: "already exists on other account", setup: func(ctx context.Context, t *testing.T) { s := goatcounter.Site{ - Cname: zstring.NewPtr("add.example.com").P, + Cname: ztype.Ptr("add.example.com"), Code: "add", Plan: goatcounter.PlanPersonal, } @@ -172,8 +171,8 @@ func TestSettingsSitesAdd(t *testing.T) { name: "undelete", setup: func(ctx context.Context, t *testing.T) { s := goatcounter.Site{ - Parent: zint.NewPtr64(1).P, - Cname: zstring.NewPtr("add.example.com").P, + Parent: ztype.Ptr(int64(1)), + Cname: ztype.Ptr("add.example.com"), Code: "add", Plan: goatcounter.PlanChild, } @@ -201,7 +200,7 @@ func TestSettingsSitesAdd(t *testing.T) { name: "undelete other account", setup: func(ctx context.Context, t *testing.T) { s := goatcounter.Site{ - Cname: zstring.NewPtr("add.example.com").P, + Cname: ztype.Ptr("add.example.com"), Code: "add", Plan: goatcounter.PlanPersonal, } @@ -246,8 +245,8 @@ func TestSettingsSitesRemove(t *testing.T) { name: "remove", setup: func(ctx context.Context, t *testing.T) { err := (&goatcounter.Site{ - Parent: zint.NewPtr64(1).P, - Cname: zstring.NewPtr("add.example.com").P, + Parent: ztype.Ptr(int64(1)), + Cname: ztype.Ptr("add.example.com"), Code: "add", Plan: goatcounter.PlanChild, }).Insert(ctx) @@ -283,7 +282,7 @@ func TestSettingsSitesRemove(t *testing.T) { name: "remove other account", setup: func(ctx context.Context, t *testing.T) { s := goatcounter.Site{ - Cname: zstring.NewPtr("add.example.com").P, + Cname: ztype.Ptr("add.example.com"), Code: "add", Plan: goatcounter.PlanPersonal, } diff --git a/hit_test.go b/hit_test.go index a2a020e65..9b7a9f92d 100644 --- a/hit_test.go +++ b/hit_test.go @@ -10,8 +10,8 @@ import ( . "zgo.at/goatcounter/v2" "zgo.at/goatcounter/v2/gctest" - "zgo.at/zstd/zstring" "zgo.at/zstd/ztest" + "zgo.at/zstd/ztype" ) func dayStat(days map[int]int) []int { @@ -79,9 +79,9 @@ func TestHitDefaultsRef(t *testing.T) { t.Fatalf("wrong Ref\nout: %#v\nwant: %#v\n", h.Ref, tt.wantRef) } - if (zstring.Ptr{h.RefScheme}).Val() != tt.wantScheme { + if ztype.Deref(h.RefScheme, "") != tt.wantScheme { t.Fatalf("wrong RefScheme\nout: %#v\nwant: %#v\n", - zstring.Ptr{h.RefScheme}.String(), tt.wantScheme) + ztype.Deref(h.RefScheme, ""), tt.wantScheme) } }) } diff --git a/logscan/logscan.go b/logscan/logscan.go index d2787bcc1..d171c33df 100644 --- a/logscan/logscan.go +++ b/logscan/logscan.go @@ -14,7 +14,7 @@ import ( "strings" "time" - "github.com/bmatcuk/doublestar/v3" + "github.com/bmatcuk/doublestar/v4" "zgo.at/errors" "zgo.at/follow" "zgo.at/zlog" diff --git a/site.go b/site.go index c1f1630f2..37c8f3725 100644 --- a/site.go +++ b/site.go @@ -744,24 +744,24 @@ func (s Site) BillingAnchorDay() int { func (s Site) NextInvoice() time.Time { if s.BillingAnchor == nil { - return ztime.Time{ztime.Now()}.Add(1, ztime.Month).StartOf(ztime.Month).Time + return ztime.Time{ztime.Now()}.AddPeriod(1, ztime.Month).StartOf(ztime.Month).Time } diff := ztime.NewRange(*s.BillingAnchor).To(ztime.Now()).Diff(ztime.Month) if ztime.Now().Day() > s.BillingAnchor.Day() { diff.Months++ } - n := ztime.Add(*s.BillingAnchor, diff.Months, ztime.Month) + n := ztime.AddPeriod(*s.BillingAnchor, diff.Months, ztime.Month) return ztime.StartOf(n, ztime.Day) } func (s Site) ThisBillingPeriod() ztime.Range { - return ztime.NewRange(ztime.Add(s.NextInvoice(), -1, ztime.Month)).To(ztime.Now()) + return ztime.NewRange(ztime.AddPeriod(s.NextInvoice(), -1, ztime.Month)).To(ztime.Now()) } func (s Site) PreviousBillingPeriod() ztime.Range { c := s.ThisBillingPeriod() - return ztime.NewRange(ztime.Add(c.Start, -1, ztime.Month)).To(ztime.EndOf(c.Start.AddDate(0, 0, -1), ztime.Day)) + return ztime.NewRange(ztime.AddPeriod(c.Start, -1, ztime.Month)).To(ztime.EndOf(c.Start.AddDate(0, 0, -1), ztime.Day)) } // Sites is a list of sites. @@ -973,8 +973,8 @@ func (a *AccountUsage) Get(ctx context.Context) error { return errors.Wrap(err, "AccountUsage.Get") } - a.ThisStart = ztime.Add(account.NextInvoice(), -1, ztime.Month) - a.PrevStart = ztime.Add(a.ThisStart, -1, ztime.Month) + a.ThisStart = ztime.AddPeriod(account.NextInvoice(), -1, ztime.Month) + a.PrevStart = ztime.AddPeriod(a.ThisStart, -1, ztime.Month) a.PrevEnd = ztime.EndOf(a.ThisStart.AddDate(0, 0, -1), ztime.Day) var query []string for _, s := range sites { diff --git a/user.go b/user.go index da938970f..80f8ed626 100644 --- a/user.go +++ b/user.go @@ -24,6 +24,7 @@ import ( "zgo.at/zstd/zcrypto" "zgo.at/zstd/zstring" "zgo.at/zstd/ztime" + "zgo.at/zstd/ztype" ) const totpSecretLen = 16 @@ -73,7 +74,7 @@ func (u *User) Defaults(ctx context.Context) { } if !u.EmailVerified { - u.EmailToken = zstring.NewPtr(zcrypto.Secret192()).P + u.EmailToken = ztype.Ptr[string](zcrypto.Secret192()) } u.Settings.Defaults(ctx) @@ -205,7 +206,7 @@ func (u *User) Update(ctx context.Context, emailChanged bool) error { if emailChanged && Config(ctx).GoatcounterCom { u.EmailVerified = false - u.EmailToken = zstring.NewPtr(zcrypto.Secret192()).P + u.EmailToken = ztype.Ptr(zcrypto.Secret192()) } account, err := GetAccount(ctx) @@ -365,7 +366,7 @@ func (u *User) ByTokenAndSite(ctx context.Context, token string) error { // RequestReset generates a new password reset key. func (u *User) RequestReset(ctx context.Context) error { // TODO: rename this, as it's now used for password resets. - u.LoginRequest = zstring.NewPtr(zcrypto.Secret128()).P + u.LoginRequest = ztype.Ptr(zcrypto.Secret128()) err := zdb.Exec(ctx, `update users set login_request=$1, reset_at=current_timestamp where user_id=$2 and site_id=$3`, *u.LoginRequest, u.ID, MustGetSite(ctx).IDOrParent()) @@ -373,7 +374,7 @@ func (u *User) RequestReset(ctx context.Context) error { } func (u *User) InviteToken(ctx context.Context) error { - u.LoginRequest = zstring.NewPtr("invite-" + zcrypto.Secret128()).P + u.LoginRequest = ztype.Ptr("invite-" + zcrypto.Secret128()) err := zdb.Exec(ctx, `update users set login_request=$1, reset_at=current_timestamp where user_id=$2 and site_id=$3`, *u.LoginRequest, u.ID, MustGetSite(ctx).IDOrParent()) @@ -412,7 +413,7 @@ func (u *User) DisableTOTP(ctx context.Context) error { // Login a user; create a new key, CSRF token, and reset the request date. func (u *User) Login(ctx context.Context) error { - u.Token = zstring.NewPtr(zcrypto.Secret256()).P + u.Token = ztype.Ptr(zcrypto.Secret256()) if u.LoginToken == nil || *u.LoginToken == "" { s := ztime.Now().Format("20060102") + "-" + zcrypto.Secret256() u.LoginToken = &s @@ -493,7 +494,7 @@ func (u User) EmailReportRange() ztime.Range { start, end = lastReport.StartOf(ztime.Day), lastReport.EndOf(ztime.Day) case EmailReportBiWeekly: - start, end = lastReport.StartOf(week), lastReport.EndOf(week).Add(1, week) + start, end = lastReport.StartOf(week), lastReport.EndOf(week).AddPeriod(1, week) case EmailReportMonthly: start, end = lastReport.StartOf(ztime.Month), lastReport.EndOf(ztime.Month) diff --git a/user_agent.go b/user_agent.go index e9ca1d2ac..1f0c9b37f 100644 --- a/user_agent.go +++ b/user_agent.go @@ -47,7 +47,7 @@ func (p *UserAgent) Update(ctx context.Context) error { var ( changed = false - ua = gadget.Parse(p.UserAgent) + ua = gadget.ParseUA(p.UserAgent) browser Browser system System ) @@ -86,12 +86,12 @@ func (p *UserAgent) Update(ctx context.Context) error { return errors.Wrap(err, "UserAgent.Update") } - cacheUA(ctx).Delete(gadget.Shorten(p.UserAgent)) + cacheUA(ctx).Delete(gadget.ShortenUA(p.UserAgent)) return nil } func (p *UserAgent) GetOrInsert(ctx context.Context) error { - shortUA := gadget.Shorten(p.UserAgent) + shortUA := gadget.ShortenUA(p.UserAgent) c, ok := cacheUA(ctx).Get(shortUA) if ok { @@ -117,7 +117,7 @@ func (p *UserAgent) GetOrInsert(ctx context.Context) error { } var ( - ua = gadget.Parse(p.UserAgent) + ua = gadget.ParseUA(p.UserAgent) browser Browser system System ) diff --git a/user_test.go b/user_test.go index 327e79cb1..038871523 100644 --- a/user_test.go +++ b/user_test.go @@ -30,7 +30,7 @@ func TestUserEmailReportRange(t *testing.T) { EmailReports: zint.Int(goatcounter.EmailReportDaily), Timezone: tz.UTC, }, - }, ztime.New("2019-06-18 00:00:00"), ztime.New("2019-06-18 23:59:59")}, + }, ztime.FromString("2019-06-18 00:00:00"), ztime.FromString("2019-06-18 23:59:59")}, {goatcounter.User{ LastReportAt: now, Settings: goatcounter.UserSettings{ @@ -38,7 +38,7 @@ func TestUserEmailReportRange(t *testing.T) { EmailReports: zint.Int(goatcounter.EmailReportWeekly), Timezone: tz.UTC, }, - }, ztime.New("2019-06-17 00:00:00"), ztime.New("2019-06-23 23:59:59")}, + }, ztime.FromString("2019-06-17 00:00:00"), ztime.FromString("2019-06-23 23:59:59")}, {goatcounter.User{ LastReportAt: now, Settings: goatcounter.UserSettings{ @@ -46,7 +46,7 @@ func TestUserEmailReportRange(t *testing.T) { EmailReports: zint.Int(goatcounter.EmailReportWeekly), Timezone: tz.UTC, }, - }, ztime.New("2019-06-16 00:00:00"), ztime.New("2019-06-22 23:59:59")}, + }, ztime.FromString("2019-06-16 00:00:00"), ztime.FromString("2019-06-22 23:59:59")}, {goatcounter.User{ LastReportAt: now, Settings: goatcounter.UserSettings{ @@ -54,7 +54,7 @@ func TestUserEmailReportRange(t *testing.T) { EmailReports: zint.Int(goatcounter.EmailReportBiWeekly), Timezone: tz.UTC, }, - }, ztime.New("2019-06-17 00:00:00"), ztime.New("2019-06-30 23:59:59")}, + }, ztime.FromString("2019-06-17 00:00:00"), ztime.FromString("2019-06-30 23:59:59")}, {goatcounter.User{ LastReportAt: now, Settings: goatcounter.UserSettings{ @@ -62,7 +62,7 @@ func TestUserEmailReportRange(t *testing.T) { EmailReports: zint.Int(goatcounter.EmailReportBiWeekly), Timezone: tz.UTC, }, - }, ztime.New("2019-06-16 00:00:00"), ztime.New("2019-06-29 23:59:59")}, + }, ztime.FromString("2019-06-16 00:00:00"), ztime.FromString("2019-06-29 23:59:59")}, {goatcounter.User{ LastReportAt: now, @@ -70,7 +70,7 @@ func TestUserEmailReportRange(t *testing.T) { EmailReports: zint.Int(goatcounter.EmailReportDaily), Timezone: wita, }, - }, ztime.New("2019-06-17 16:00:00"), ztime.New("2019-06-18 15:59:59")}, + }, ztime.FromString("2019-06-17 16:00:00"), ztime.FromString("2019-06-18 15:59:59")}, } for _, tt := range tests {