From 721058b0a9644c55938f0b1a845487c361526035 Mon Sep 17 00:00:00 2001 From: Rogee Date: Thu, 28 Nov 2024 16:15:08 +0800 Subject: [PATCH] feat: connect to db --- backend/LICENSE | 0 backend/Makefile | 6 + backend/cmd/migrate.go | 40 ++++++ backend/cmd/serve.go | 61 +++++++++ backend/conf/config.go | 82 ++++++++++++ backend/config.prod.yaml | 6 + backend/config.yaml | 12 ++ backend/database/database.go | 59 +++++++++ .../migrations/20241128075611_init.sql | 9 ++ .../public/model/channel_messages.go | 25 ++++ .../public/model/channels.go | 24 ++++ .../public/table/channel_messages.go | 102 +++++++++++++++ .../public/table/channels.go | 99 +++++++++++++++ .../public/table/table_use_schema.go | 15 +++ backend/go.mod | 38 +++++- backend/go.sum | 117 +++++++++++++++--- backend/main.go | 50 ++++---- backend/middlewares.go | 17 --- mp.code-workspace | 5 +- 19 files changed, 706 insertions(+), 61 deletions(-) create mode 100644 backend/LICENSE create mode 100644 backend/Makefile create mode 100644 backend/cmd/migrate.go create mode 100644 backend/cmd/serve.go create mode 100644 backend/conf/config.go create mode 100644 backend/config.prod.yaml create mode 100644 backend/config.yaml create mode 100644 backend/database/database.go create mode 100644 backend/database/migrations/20241128075611_init.sql create mode 100644 backend/database/telegram_resource/public/model/channel_messages.go create mode 100644 backend/database/telegram_resource/public/model/channels.go create mode 100644 backend/database/telegram_resource/public/table/channel_messages.go create mode 100644 backend/database/telegram_resource/public/table/channels.go create mode 100644 backend/database/telegram_resource/public/table/table_use_schema.go delete mode 100644 backend/middlewares.go diff --git a/backend/LICENSE b/backend/LICENSE new file mode 100644 index 0000000..e69de29 diff --git a/backend/Makefile b/backend/Makefile new file mode 100644 index 0000000..5c8024a --- /dev/null +++ b/backend/Makefile @@ -0,0 +1,6 @@ +.PHONY: model +model: + rm -rf ./database/telegram_resource + jet -dsn=postgresql://postgres:xixi0202@10.1.1.3:5432/telegram_resource?sslmode=disable -path=./database + + gofumpt -w -l -extra ./database diff --git a/backend/cmd/migrate.go b/backend/cmd/migrate.go new file mode 100644 index 0000000..ea88d8a --- /dev/null +++ b/backend/cmd/migrate.go @@ -0,0 +1,40 @@ +package cmd + +import ( + "context" + + "git.ipao.vip/rogeecn/mp-qvyun/conf" + "git.ipao.vip/rogeecn/mp-qvyun/database" + "github.com/gofiber/fiber/v3/log" + "github.com/pkg/errors" + "github.com/pressly/goose/v3" + "github.com/spf13/cobra" +) + +func CommandMigrate(root *cobra.Command) { + cmd := &cobra.Command{ + Use: "migrate", + Short: "migrate", + RunE: commandMigrate, + } + root.AddCommand(cmd) +} + +func commandMigrate(cmd *cobra.Command, args []string) error { + if len(args) == 0 { + args = append(args, "up") + } + + db, err := database.GetDB(conf.C.Database) + if err != nil { + return errors.Wrap(err, "get db") + } + + action, args := args[0], args[1:] + log.Infof("migration action: %s args: %+v", action, args) + + goose.SetBaseFS(database.MigrationFS) + goose.SetTableName("migrations") + + return goose.RunContext(context.Background(), action, db, "migrations", args...) +} diff --git a/backend/cmd/serve.go b/backend/cmd/serve.go new file mode 100644 index 0000000..de66c69 --- /dev/null +++ b/backend/cmd/serve.go @@ -0,0 +1,61 @@ +package cmd + +import ( + "fmt" + + "git.ipao.vip/rogeecn/mp-qvyun/conf" + "git.ipao.vip/rogeecn/mp-qvyun/pkg/middlewares/fiberv3" + "git.ipao.vip/rogeecn/mp-qvyun/pkg/wechat" + "github.com/gofiber/fiber/v3" + "github.com/pkg/errors" + log "github.com/sirupsen/logrus" + "github.com/spf13/cobra" +) + +func CommandServe(root *cobra.Command) { + cmd := &cobra.Command{ + Use: "serve", + Short: "start http server", + RunE: commandServe, + } + root.AddCommand(cmd) +} + +func commandServe(cmd *cobra.Command, args []string) error { + wechatClient := wechat.New( + wechat.WithAppID(conf.C.Wechat.AppID), + wechat.WithAppSecret(conf.C.Wechat.AppSecret), + wechat.WithAESKey(conf.C.Wechat.AesKey), + wechat.WithToken(conf.C.Wechat.Token), + ) + + wechatMiddlewares := fiberv3.Init(wechatClient) + + // create a new fiber server + app := fiber.New() + app.Use(LogAll) + app.Use(wechatMiddlewares.Verify) + app.Use(wechatMiddlewares.AuthUserInfo) + app.Use(wechatMiddlewares.SilentAuth) + + app.Get("/", func(c fiber.Ctx) error { + return c.SendString("Hello World") + }) + + // listen on port 3000 + if err := app.Listen(fmt.Sprintf(":%d", conf.C.Port)); err != nil { + return errors.Wrap(err, "http server listen") + } + return nil +} + +func LogAll(c fiber.Ctx) error { + log.Info("------------------------------------------") + log.Infof("Request Method: %s", c.Method()) + log.Infof("Request Headers: %s", &c.Request().Header) + log.Infof("Request URL: %s", c.OriginalURL()) + log.Infof("Request Query: %+v", c.Queries()) + log.Infof("Request Body: %s", c.BodyRaw()) + log.Info("------------------------------------------") + return c.Next() +} diff --git a/backend/conf/config.go b/backend/conf/config.go new file mode 100644 index 0000000..8315a16 --- /dev/null +++ b/backend/conf/config.go @@ -0,0 +1,82 @@ +package conf + +import ( + "fmt" + + "github.com/pkg/errors" + log "github.com/sirupsen/logrus" + "github.com/spf13/viper" +) + +var C *Config + +// WechatAppID = "wx45745a8c51091ae0" +// WechatAppSecret = "2ab33bc79d9b47efa4abef19d66e1977" +// WechatToken = "W8Xhw5TivYBgY" +// WechatAesKey = "F6AqCxAV4W1eCrY6llJ2zapphKK49CQN3RgtPDrjhnI" +type Config struct { + Debug bool `mapstructure:"debug"` + Port uint `mapstructure:"port"` + Database Database `mapstructure:"database"` + Wechat Wechat `mapstructure:"wechat"` +} + +type Database struct { + Database string `mapstructure:"database"` + Username string `mapstructure:"username"` + Password string `mapstructure:"password"` + Host string `mapstructure:"host"` + Port uint `mapstructure:"port"` + SslMode string `mapstructure:"ssl_mode"` + TimeZone string `mapstructure:"time_zone"` +} + +func (m Database) DSN() string { + tpl := "host=%s port=%d user=%s password=%s dbname=%s sslmode=%s TimeZone=%s" + if m.Username == "" { + m.Username = "postgres" + } + + if m.Port == 0 { + m.Port = 5432 + } + + if m.SslMode == "" { + m.SslMode = "disable" + } + + if m.TimeZone == "" { + m.TimeZone = "Asia/Shanghai" + } + + return fmt.Sprintf(tpl, m.Host, m.Port, m.Username, m.Password, m.Database, m.SslMode, m.TimeZone) +} + +type Wechat struct { + AppID string `mapstructure:"app_id"` + AppSecret string `mapstructure:"app_secret"` + Token string `mapstructure:"token"` + AesKey string `mapstructure:"aes_key"` +} + +func Load(file string) error { + viper.SetConfigType("yaml") + if file != "" { + viper.SetConfigFile(file) + } else { + viper.SetConfigName("config") + viper.AddConfigPath(".") + } + + log.Infof("load config file") + if err := viper.ReadInConfig(); err != nil { + return errors.Wrap(err, "read config file") + } + log.Infof("use config file: %s", viper.ConfigFileUsed()) + + if err := viper.Unmarshal(&C); err != nil { + return errors.Wrap(err, "unmarshal config") + } + + return nil +} diff --git a/backend/config.prod.yaml b/backend/config.prod.yaml new file mode 100644 index 0000000..df9e9d5 --- /dev/null +++ b/backend/config.prod.yaml @@ -0,0 +1,6 @@ +port: 8000 +wechat: + app_id: wxf5bf0adeb99c2afd + app_secret: 3cf8fad4aa414f2b861399f111b22bb5 + token: W8Xhw5TivYBgY + aes_key: F6AqCxAV4W1eCrY6llJ2zapphKK49CQN3RgtPDrjhnI diff --git a/backend/config.yaml b/backend/config.yaml new file mode 100644 index 0000000..fbb3731 --- /dev/null +++ b/backend/config.yaml @@ -0,0 +1,12 @@ +debug: true +port: 8000 +database: + host: 10.1.1.3 + database: qvyun + password: xixi0202 + +wechat: + app_id: wx45745a8c51091ae0 + app_secret: 2ab33bc79d9b47efa4abef19d66e1977 + token: W8Xhw5TivYBgY + aes_key: F6AqCxAV4W1eCrY6llJ2zapphKK49CQN3RgtPDrjhnI diff --git a/backend/database/database.go b/backend/database/database.go new file mode 100644 index 0000000..193e392 --- /dev/null +++ b/backend/database/database.go @@ -0,0 +1,59 @@ +package database + +import ( + "database/sql" + "embed" + "sync" + + "git.ipao.vip/rogeecn/mp-qvyun/conf" + "github.com/gofiber/fiber/v3/log" + _ "github.com/lib/pq" + "github.com/pkg/errors" +) + +//go:embed migrations/* +var MigrationFS embed.FS + +var ( + mutex sync.Mutex + db *sql.DB +) + +func Close() error { + if db == nil { + return nil + } + return db.Close() +} + +func GetDB(config conf.Database) (*sql.DB, error) { + mutex.Lock() + defer mutex.Unlock() + + if db != nil { + return db, nil + } + + once := sync.OnceValues(func() (*sql.DB, error) { + log.Debugf("connect postgres with dsn: '%s'", config.DSN()) + db, err := sql.Open("postgres", config.DSN()) + if err != nil { + return nil, errors.Wrap(err, "connect database") + } + + if err := db.Ping(); err != nil { + db.Close() + return nil, errors.Wrap(err, "ping database") + } + + return db, err + }) + + var err error + db, err = once() + if err != nil { + return nil, err + } + + return db, err +} diff --git a/backend/database/migrations/20241128075611_init.sql b/backend/database/migrations/20241128075611_init.sql new file mode 100644 index 0000000..b9c449e --- /dev/null +++ b/backend/database/migrations/20241128075611_init.sql @@ -0,0 +1,9 @@ +-- +goose Up +-- +goose StatementBegin +SELECT 'up SQL query'; +-- +goose StatementEnd + +-- +goose Down +-- +goose StatementBegin +SELECT 'down SQL query'; +-- +goose StatementEnd diff --git a/backend/database/telegram_resource/public/model/channel_messages.go b/backend/database/telegram_resource/public/model/channel_messages.go new file mode 100644 index 0000000..dfeb625 --- /dev/null +++ b/backend/database/telegram_resource/public/model/channel_messages.go @@ -0,0 +1,25 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package model + +import ( + "time" +) + +type ChannelMessages struct { + ID int64 `sql:"primary_key"` + ChannelID int64 + UUID int64 + Content *string + Media string + PublishedAt time.Time + CreatedAt time.Time + GroupID int64 + Published bool + Favorite bool +} diff --git a/backend/database/telegram_resource/public/model/channels.go b/backend/database/telegram_resource/public/model/channels.go new file mode 100644 index 0000000..5379a80 --- /dev/null +++ b/backend/database/telegram_resource/public/model/channels.go @@ -0,0 +1,24 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package model + +import ( + "time" +) + +type Channels struct { + ID int64 `sql:"primary_key"` + UUID int64 + Username string + Title string + CreatedAt *time.Time + UpdatedAt *time.Time + Offset int64 + MinID int64 + ExportMedia bool +} diff --git a/backend/database/telegram_resource/public/table/channel_messages.go b/backend/database/telegram_resource/public/table/channel_messages.go new file mode 100644 index 0000000..98a769d --- /dev/null +++ b/backend/database/telegram_resource/public/table/channel_messages.go @@ -0,0 +1,102 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package table + +import ( + "github.com/go-jet/jet/v2/postgres" +) + +var ChannelMessages = newChannelMessagesTable("public", "channel_messages", "") + +type channelMessagesTable struct { + postgres.Table + + // Columns + ID postgres.ColumnInteger + ChannelID postgres.ColumnInteger + UUID postgres.ColumnInteger + Content postgres.ColumnString + Media postgres.ColumnString + PublishedAt postgres.ColumnTimestampz + CreatedAt postgres.ColumnTimestampz + GroupID postgres.ColumnInteger + Published postgres.ColumnBool + Favorite postgres.ColumnBool + + AllColumns postgres.ColumnList + MutableColumns postgres.ColumnList +} + +type ChannelMessagesTable struct { + channelMessagesTable + + EXCLUDED channelMessagesTable +} + +// AS creates new ChannelMessagesTable with assigned alias +func (a ChannelMessagesTable) AS(alias string) *ChannelMessagesTable { + return newChannelMessagesTable(a.SchemaName(), a.TableName(), alias) +} + +// Schema creates new ChannelMessagesTable with assigned schema name +func (a ChannelMessagesTable) FromSchema(schemaName string) *ChannelMessagesTable { + return newChannelMessagesTable(schemaName, a.TableName(), a.Alias()) +} + +// WithPrefix creates new ChannelMessagesTable with assigned table prefix +func (a ChannelMessagesTable) WithPrefix(prefix string) *ChannelMessagesTable { + return newChannelMessagesTable(a.SchemaName(), prefix+a.TableName(), a.TableName()) +} + +// WithSuffix creates new ChannelMessagesTable with assigned table suffix +func (a ChannelMessagesTable) WithSuffix(suffix string) *ChannelMessagesTable { + return newChannelMessagesTable(a.SchemaName(), a.TableName()+suffix, a.TableName()) +} + +func newChannelMessagesTable(schemaName, tableName, alias string) *ChannelMessagesTable { + return &ChannelMessagesTable{ + channelMessagesTable: newChannelMessagesTableImpl(schemaName, tableName, alias), + EXCLUDED: newChannelMessagesTableImpl("", "excluded", ""), + } +} + +func newChannelMessagesTableImpl(schemaName, tableName, alias string) channelMessagesTable { + var ( + IDColumn = postgres.IntegerColumn("id") + ChannelIDColumn = postgres.IntegerColumn("channel_id") + UUIDColumn = postgres.IntegerColumn("uuid") + ContentColumn = postgres.StringColumn("content") + MediaColumn = postgres.StringColumn("media") + PublishedAtColumn = postgres.TimestampzColumn("published_at") + CreatedAtColumn = postgres.TimestampzColumn("created_at") + GroupIDColumn = postgres.IntegerColumn("group_id") + PublishedColumn = postgres.BoolColumn("published") + FavoriteColumn = postgres.BoolColumn("favorite") + allColumns = postgres.ColumnList{IDColumn, ChannelIDColumn, UUIDColumn, ContentColumn, MediaColumn, PublishedAtColumn, CreatedAtColumn, GroupIDColumn, PublishedColumn, FavoriteColumn} + mutableColumns = postgres.ColumnList{ChannelIDColumn, UUIDColumn, ContentColumn, MediaColumn, PublishedAtColumn, CreatedAtColumn, GroupIDColumn, PublishedColumn, FavoriteColumn} + ) + + return channelMessagesTable{ + Table: postgres.NewTable(schemaName, tableName, alias, allColumns...), + + //Columns + ID: IDColumn, + ChannelID: ChannelIDColumn, + UUID: UUIDColumn, + Content: ContentColumn, + Media: MediaColumn, + PublishedAt: PublishedAtColumn, + CreatedAt: CreatedAtColumn, + GroupID: GroupIDColumn, + Published: PublishedColumn, + Favorite: FavoriteColumn, + + AllColumns: allColumns, + MutableColumns: mutableColumns, + } +} diff --git a/backend/database/telegram_resource/public/table/channels.go b/backend/database/telegram_resource/public/table/channels.go new file mode 100644 index 0000000..1249b99 --- /dev/null +++ b/backend/database/telegram_resource/public/table/channels.go @@ -0,0 +1,99 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package table + +import ( + "github.com/go-jet/jet/v2/postgres" +) + +var Channels = newChannelsTable("public", "channels", "") + +type channelsTable struct { + postgres.Table + + // Columns + ID postgres.ColumnInteger + UUID postgres.ColumnInteger + Username postgres.ColumnString + Title postgres.ColumnString + CreatedAt postgres.ColumnTimestampz + UpdatedAt postgres.ColumnTimestampz + Offset postgres.ColumnInteger + MinID postgres.ColumnInteger + ExportMedia postgres.ColumnBool + + AllColumns postgres.ColumnList + MutableColumns postgres.ColumnList +} + +type ChannelsTable struct { + channelsTable + + EXCLUDED channelsTable +} + +// AS creates new ChannelsTable with assigned alias +func (a ChannelsTable) AS(alias string) *ChannelsTable { + return newChannelsTable(a.SchemaName(), a.TableName(), alias) +} + +// Schema creates new ChannelsTable with assigned schema name +func (a ChannelsTable) FromSchema(schemaName string) *ChannelsTable { + return newChannelsTable(schemaName, a.TableName(), a.Alias()) +} + +// WithPrefix creates new ChannelsTable with assigned table prefix +func (a ChannelsTable) WithPrefix(prefix string) *ChannelsTable { + return newChannelsTable(a.SchemaName(), prefix+a.TableName(), a.TableName()) +} + +// WithSuffix creates new ChannelsTable with assigned table suffix +func (a ChannelsTable) WithSuffix(suffix string) *ChannelsTable { + return newChannelsTable(a.SchemaName(), a.TableName()+suffix, a.TableName()) +} + +func newChannelsTable(schemaName, tableName, alias string) *ChannelsTable { + return &ChannelsTable{ + channelsTable: newChannelsTableImpl(schemaName, tableName, alias), + EXCLUDED: newChannelsTableImpl("", "excluded", ""), + } +} + +func newChannelsTableImpl(schemaName, tableName, alias string) channelsTable { + var ( + IDColumn = postgres.IntegerColumn("id") + UUIDColumn = postgres.IntegerColumn("uuid") + UsernameColumn = postgres.StringColumn("username") + TitleColumn = postgres.StringColumn("title") + CreatedAtColumn = postgres.TimestampzColumn("created_at") + UpdatedAtColumn = postgres.TimestampzColumn("updated_at") + OffsetColumn = postgres.IntegerColumn("offset") + MinIDColumn = postgres.IntegerColumn("min_id") + ExportMediaColumn = postgres.BoolColumn("export_media") + allColumns = postgres.ColumnList{IDColumn, UUIDColumn, UsernameColumn, TitleColumn, CreatedAtColumn, UpdatedAtColumn, OffsetColumn, MinIDColumn, ExportMediaColumn} + mutableColumns = postgres.ColumnList{UUIDColumn, UsernameColumn, TitleColumn, CreatedAtColumn, UpdatedAtColumn, OffsetColumn, MinIDColumn, ExportMediaColumn} + ) + + return channelsTable{ + Table: postgres.NewTable(schemaName, tableName, alias, allColumns...), + + //Columns + ID: IDColumn, + UUID: UUIDColumn, + Username: UsernameColumn, + Title: TitleColumn, + CreatedAt: CreatedAtColumn, + UpdatedAt: UpdatedAtColumn, + Offset: OffsetColumn, + MinID: MinIDColumn, + ExportMedia: ExportMediaColumn, + + AllColumns: allColumns, + MutableColumns: mutableColumns, + } +} diff --git a/backend/database/telegram_resource/public/table/table_use_schema.go b/backend/database/telegram_resource/public/table/table_use_schema.go new file mode 100644 index 0000000..b254913 --- /dev/null +++ b/backend/database/telegram_resource/public/table/table_use_schema.go @@ -0,0 +1,15 @@ +// +// Code generated by go-jet DO NOT EDIT. +// +// WARNING: Changes to this file may cause incorrect behavior +// and will be lost if the code is regenerated +// + +package table + +// UseSchema sets a new schema name for all generated table SQL builder types. It is recommended to invoke +// this method only once at the beginning of the program. +func UseSchema(schema string) { + ChannelMessages = ChannelMessages.FromSchema(schema) + Channels = Channels.FromSchema(schema) +} diff --git a/backend/go.mod b/backend/go.mod index c2db2c2..7401c73 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -3,16 +3,23 @@ module git.ipao.vip/rogeecn/mp-qvyun go 1.23.2 require ( + github.com/go-jet/jet/v2 v2.12.0 github.com/gofiber/fiber/v3 v3.0.0-beta.3 github.com/imroc/req/v3 v3.48.0 + github.com/lib/pq v1.10.9 github.com/pkg/errors v0.9.1 + github.com/pressly/goose/v3 v3.23.0 github.com/sirupsen/logrus v1.9.3 github.com/smartystreets/goconvey v1.8.1 + github.com/spf13/cobra v1.8.1 + github.com/spf13/viper v1.19.0 ) require ( - github.com/andybalholm/brotli v1.1.0 // indirect + github.com/andybalholm/brotli v1.1.1 // indirect github.com/cloudflare/circl v1.4.0 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/gofiber/utils/v2 v2.0.0-beta.4 // indirect github.com/google/pprof v0.0.0-20240910150728-a0b0bb1d4134 // indirect @@ -20,25 +27,44 @@ require ( github.com/gopherjs/gopherjs v1.17.2 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jtolds/gls v4.20.0+incompatible // indirect github.com/klauspost/compress v1.17.9 // indirect + github.com/magiconair/properties v1.8.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mfridman/interpolate v0.0.2 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/onsi/ginkgo/v2 v2.20.2 // indirect + github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/quic-go/qpack v0.5.1 // indirect github.com/quic-go/quic-go v0.47.0 // indirect github.com/refraction-networking/utls v1.6.7 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/sethvargo/go-retry v0.3.0 // indirect github.com/smarty/assertions v1.15.0 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.6.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/stretchr/testify v1.9.0 // indirect + github.com/subosito/gotenv v1.6.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.55.0 // indirect github.com/valyala/tcplisten v1.0.0 // indirect go.uber.org/mock v0.4.0 // indirect - golang.org/x/crypto v0.27.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/crypto v0.28.0 // indirect golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect golang.org/x/mod v0.21.0 // indirect - golang.org/x/net v0.29.0 // indirect - golang.org/x/sync v0.8.0 // indirect - golang.org/x/sys v0.25.0 // indirect - golang.org/x/text v0.18.0 // indirect + golang.org/x/net v0.30.0 // indirect + golang.org/x/sync v0.9.0 // indirect + golang.org/x/sys v0.26.0 // indirect + golang.org/x/text v0.19.0 // indirect golang.org/x/tools v0.25.0 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/backend/go.sum b/backend/go.sum index 946e667..8259202 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -1,10 +1,20 @@ -github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= -github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= +github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= +github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= github.com/cloudflare/circl v1.4.0 h1:BV7h5MgrktNzytKmWjpOtdYrf0lkkbF8YMlBGPhJQrY= github.com/cloudflare/circl v1.4.0/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/go-jet/jet/v2 v2.12.0 h1:z2JfvBAZgsfxlQz6NXBYdZTXc7ep3jhbszTLtETv1JE= +github.com/go-jet/jet/v2 v2.12.0/go.mod h1:ufQVRQeI1mbcO5R8uCEVcVf3Foej9kReBdwDx7YMWUM= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= @@ -26,66 +36,127 @@ github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/imroc/req/v3 v3.48.0 h1:IYuMGetuwLzOOTzDCquDqs912WNwpsPK0TBXWPIvoqg= github.com/imroc/req/v3 v3.48.0/go.mod h1:weam9gmyb00QnOtu6HXSnk44dNFkIUQb5QdMx13FeUU= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6BbAxPY= +github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= +github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/onsi/ginkgo/v2 v2.20.2 h1:7NVCeyIWROIAheY21RLS+3j2bb52W0W82tkberYytp4= github.com/onsi/ginkgo/v2 v2.20.2/go.mod h1:K9gyxPIlb+aIvnZ8bd9Ak+YP18w3APlR+5coaZoE2ag= github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -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/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pressly/goose/v3 v3.23.0 h1:57hqKos8izGek4v6D5+OXBa+Y4Rq8MU//+MmnevdpVA= +github.com/pressly/goose/v3 v3.23.0/go.mod h1:rpx+D9GX/+stXmzKa+uh1DkjPnNVMdiOCV9iLdle4N8= github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= github.com/quic-go/quic-go v0.47.0 h1:yXs3v7r2bm1wmPTYNLKAAJTHMYkPEsfYJmTazXrCZ7Y= github.com/quic-go/quic-go v0.47.0/go.mod h1:3bCapYsJvXGZcipOHuu7plYtaV6tnF+z7wIFsU0WK9E= github.com/refraction-networking/utls v1.6.7 h1:zVJ7sP1dJx/WtVuITug3qYUq034cDq9B2MR1K67ULZM= github.com/refraction-networking/utls v1.6.7/go.mod h1:BC3O4vQzye5hqpmDTWUqi4P5DDhzJfkV1tdqtawQIH0= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/sethvargo/go-retry v0.3.0 h1:EEt31A35QhrcRZtrYFDTBg91cqZVnFL2navjDrah2SE= +github.com/sethvargo/go-retry v0.3.0/go.mod h1:mNX17F0C/HguQMyMyJxcnU471gOZGxCLyYaFyAZraas= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smarty/assertions v1.15.0 h1:cR//PqUBUiQRakZWqBiFFQ9wb8emQGDb0HeGdqGByCY= github.com/smarty/assertions v1.15.0/go.mod h1:yABtdzeQs6l1brC900WlRNwj6ZR55d7B+E8C6HtKdec= github.com/smartystreets/goconvey v1.8.1 h1:qGjIddxOk4grTu9JPOU31tVfq3cNdBlNa5sSznIX1xY= github.com/smartystreets/goconvey v1.8.1/go.mod h1:+/u4qLyY6x1jReYOp7GOM2FSt8aP9CzCZL03bI28W60= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= +github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= +github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.55.0 h1:Zkefzgt6a7+bVKHnu/YaYSOPfNYNisSVBo/unVCf8k8= github.com/valyala/fasthttp v1.55.0/go.mod h1:NkY9JtkrpPKmgwV3HTaS2HWaJss9RSIsRVfcxxoHiOM= github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= +github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= -golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= -golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= +golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk= golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY= golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= -golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= -golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ= +golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= -golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= -golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.25.0 h1:oFU9pkj/iJgs+0DT+VMHrx+oBKs/LJMV+Uvg78sl+fE= @@ -93,6 +164,24 @@ golang.org/x/tools v0.25.0/go.mod h1:/vtpO8WL1N9cQC3FN5zPqb//fRXskFHbLKk4OW1Q7rg google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= +modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= +modernc.org/libc v1.55.3 h1:AzcW1mhlPNrRtjS5sS+eW2ISCgSOLLNyFzRh/V3Qj/U= +modernc.org/libc v1.55.3/go.mod h1:qFXepLhz+JjFThQ4kzwzOjA/y/artDeg+pcYnY+Q83w= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E= +modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU= +modernc.org/sqlite v1.34.1 h1:u3Yi6M0N8t9yKRDwhXcyp1eS5/ErhPTBggxWFuR6Hfk= +modernc.org/sqlite v1.34.1/go.mod h1:pXV2xHxhzXZsgT/RtTFAPY6JJDEvOTcTdwADQCCWD4k= +modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= diff --git a/backend/main.go b/backend/main.go index 5e2f9cf..6311f51 100644 --- a/backend/main.go +++ b/backend/main.go @@ -1,39 +1,43 @@ +/* +Copyright © 2024 NAME HERE +*/ package main import ( - "git.ipao.vip/rogeecn/mp-qvyun/pkg/middlewares/fiberv3" - "git.ipao.vip/rogeecn/mp-qvyun/pkg/wechat" - "github.com/gofiber/fiber/v3" - log "github.com/sirupsen/logrus" + "log" + + "git.ipao.vip/rogeecn/mp-qvyun/cmd" + "git.ipao.vip/rogeecn/mp-qvyun/conf" + "github.com/spf13/cobra" ) func init() { - log.SetLevel(log.DebugLevel) } func main() { - wechatClient := wechat.New( - wechat.WithAppID(WechatAppID), - wechat.WithAppSecret(WechatAppSecret), - wechat.WithAESKey(WechatAesKey), - wechat.WithToken(WechatToken), - ) + rootCmd := &cobra.Command{ + Use: "qvyun", + PersistentPreRunE: func(cmd *cobra.Command, args []string) error { + if err := conf.Load(cmd.Flag("config").Value.String()); err != nil { + return err + } - wechatMiddlewares := fiberv3.Init(wechatClient) + if cmd.Flag("debug").Value.String() == "true" { + conf.C.Debug = true + } - // create a new fiber server - app := fiber.New() - app.Use(LogAll) - app.Use(wechatMiddlewares.Verify) - app.Use(wechatMiddlewares.AuthUserInfo) - app.Use(wechatMiddlewares.SilentAuth) + return nil + }, + } - app.Get("/", func(c fiber.Ctx) error { - return c.SendString("Hello World") - }) + rootCmd.PersistentFlags().StringP("config", "C", "", "config file") + rootCmd.PersistentFlags().BoolP("debug", "D", false, "debug mode") - // listen on port 3000 - if err := app.Listen(":3000"); err != nil { + cmd.CommandServe(rootCmd) + cmd.CommandMigrate(rootCmd) + + err := rootCmd.Execute() + if err != nil { log.Fatal(err) } } diff --git a/backend/middlewares.go b/backend/middlewares.go deleted file mode 100644 index 0aee68c..0000000 --- a/backend/middlewares.go +++ /dev/null @@ -1,17 +0,0 @@ -package main - -import ( - "github.com/gofiber/fiber/v3" - "github.com/gofiber/fiber/v3/log" -) - -func LogAll(c fiber.Ctx) error { - log.Info("------------------------------------------") - log.Infof("Request Method: %s", c.Method()) - log.Infof("Request Headers: %s", &c.Request().Header) - log.Infof("Request URL: %s", c.OriginalURL()) - log.Infof("Request Query: %+v", c.Queries()) - log.Infof("Request Body: %s", c.BodyRaw()) - log.Info("------------------------------------------") - return c.Next() -} diff --git a/mp.code-workspace b/mp.code-workspace index 35261dd..427b7d5 100644 --- a/mp.code-workspace +++ b/mp.code-workspace @@ -8,6 +8,9 @@ } ], "settings": { - "vue3snippets.enable-compile-vue-file-on-did-save-code": true + "vue3snippets.enable-compile-vue-file-on-did-save-code": true, + "cSpell.words": [ + "qvyun" + ] } } \ No newline at end of file