From 3e190e23aed150d817f883bb764fda76a8e244e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Miko=C5=82ajczyk?= Date: Wed, 11 Mar 2026 09:35:19 +0100 Subject: [PATCH 1/3] wip - initial code for paralell downloader --- cmd/ksef/commands/authorization/logout.go | 2 +- cmd/ksef/commands/certificates/prepare_csr.go | 2 +- cmd/ksef/commands/certificates/push_csr.go | 2 +- cmd/ksef/commands/client/constructor.go | 3 +- cmd/ksef/commands/invoices/download.go | 21 ++- .../commands/invoices/download_paralell.go | 132 ++++++++++++++++++ cmd/ksef/commands/invoices/import.go | 2 +- cmd/ksef/commands/invoices/sync.go | 2 +- cmd/ksef/commands/invoices/upload.go | 2 +- .../invoicesdb/invoicesdb_get_all_nips.go | 34 +++++ 10 files changed, 193 insertions(+), 9 deletions(-) create mode 100644 cmd/ksef/commands/invoices/download_paralell.go create mode 100644 internal/invoicesdb/invoicesdb_get_all_nips.go diff --git a/cmd/ksef/commands/authorization/logout.go b/cmd/ksef/commands/authorization/logout.go index 4b614ee..f8aebaa 100644 --- a/cmd/ksef/commands/authorization/logout.go +++ b/cmd/ksef/commands/authorization/logout.go @@ -25,7 +25,7 @@ func logout(cmd *cobra.Command, _ []string) error { vip := viper.GetViper() vip.Set(auth.FlagExitAfterPersistingToken, "true") - cli, err := client.InitClient(cmd) + cli, err := client.InitClient(cmd, vip) if err != nil { return err } diff --git a/cmd/ksef/commands/certificates/prepare_csr.go b/cmd/ksef/commands/certificates/prepare_csr.go index ce03f60..725fe95 100644 --- a/cmd/ksef/commands/certificates/prepare_csr.go +++ b/cmd/ksef/commands/certificates/prepare_csr.go @@ -38,7 +38,7 @@ func init() { func sendCsrs(cmd *cobra.Command, _ []string) error { envId := runtime.GetEnvironmentId(viper.GetViper()) nip, _ := cmd.Flags().GetString(flags.FlagNameNIP) - if cli, err = client.InitClient(cmd); err != nil { + if cli, err = client.InitClient(cmd, viper.GetViper()); err != nil { return err } certsManager, err := cli.Certificates(envId) diff --git a/cmd/ksef/commands/certificates/push_csr.go b/cmd/ksef/commands/certificates/push_csr.go index ed86533..e393e2c 100644 --- a/cmd/ksef/commands/certificates/push_csr.go +++ b/cmd/ksef/commands/certificates/push_csr.go @@ -23,7 +23,7 @@ func init() { } func syncEnrollments(cmd *cobra.Command, _ []string) error { - if cli, err = client.InitClient(cmd); err != nil { + if cli, err = client.InitClient(cmd, viper.GetViper()); err != nil { return err } certsManager, err := cli.Certificates(runtime.GetEnvironmentId(viper.GetViper())) diff --git a/cmd/ksef/commands/client/constructor.go b/cmd/ksef/commands/client/constructor.go index 956cf5e..430fcf2 100644 --- a/cmd/ksef/commands/client/constructor.go +++ b/cmd/ksef/commands/client/constructor.go @@ -9,8 +9,7 @@ import ( "github.com/spf13/viper" ) -func InitClient(cmd *cobra.Command, initializers ...v2.InitializerFunc) (*v2.APIClient, error) { - vip := viper.GetViper() +func InitClient(cmd *cobra.Command, vip *viper.Viper, initializers ...v2.InitializerFunc) (*v2.APIClient, error) { var err error var cli *v2.APIClient diff --git a/cmd/ksef/commands/invoices/download.go b/cmd/ksef/commands/invoices/download.go index 4f41e71..6c478fc 100644 --- a/cmd/ksef/commands/invoices/download.go +++ b/cmd/ksef/commands/invoices/download.go @@ -11,6 +11,11 @@ import ( "github.com/spf13/viper" ) +const ( + flagNameWorkersLong = "workers" + flagNameWorkersShort = "w" +) + var downloadCommand = &cobra.Command{ Use: "download", Short: "pobierz nowe faktury z KSeF", @@ -22,12 +27,17 @@ func init() { flags.NIP(flagSet) downloaderconfig.DownloaderFlags(flagSet, "") runtime.CertProfileFlag(flagSet) + flagSet.IntP(flagNameWorkersLong, flagNameWorkersShort, 0, "Ilość workerów (domyślnie 0; wartość > 0 oznacza ilość współbieżnych wątków pobierających faktury dla wszystkich zarejestrowanych numerów NIP)") InvoicesCommand.AddCommand(downloadCommand) } func downloadRun(cmd *cobra.Command, _ []string) error { vip := viper.GetViper() + workers := vip.GetInt(flagNameWorkersLong) + if workers > 0 { + return downloadRunParalell(cmd, vip, workers) + } if err := runtime.CheckNIPIsSet(vip); err != nil { return err } @@ -37,7 +47,7 @@ func downloadRun(cmd *cobra.Command, _ []string) error { return err } - ksefClient, err := client.InitClient(cmd) + ksefClient, err := client.InitClient(cmd, vip) if err != nil { return err } @@ -55,3 +65,12 @@ func downloadRun(cmd *cobra.Command, _ []string) error { return invoicesDB.DownloadInvoices(cmd.Context(), vip, downloaderConfig) } + +func cloneViper(src *viper.Viper) *viper.Viper { + newViper := viper.New() + for _, key := range src.AllKeys() { + newViper.Set(key, src.Get(key)) + } + + return newViper +} diff --git a/cmd/ksef/commands/invoices/download_paralell.go b/cmd/ksef/commands/invoices/download_paralell.go new file mode 100644 index 0000000..38bc0f9 --- /dev/null +++ b/cmd/ksef/commands/invoices/download_paralell.go @@ -0,0 +1,132 @@ +package invoices + +import ( + "ksef/cmd/ksef/commands/client" + "ksef/internal/client/v2/types/invoices" + "ksef/internal/invoicesdb" + downloaderconfig "ksef/internal/invoicesdb/downloader/config" + "ksef/internal/logging" + "ksef/internal/runtime" + "sync" + + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +type downloadError struct { + NIP string + err error +} + +func downloadRunParalell(cmd *cobra.Command, baseViper *viper.Viper, numWorkers int) error { + // let's collect NIP's + nipNumbers, err := invoicesdb.GetAllNIPs(baseViper) + if err != nil { + return err + } + + downloaderConfig, err := downloaderconfig.GetDownloaderConfig(baseViper, "") + if err != nil { + return err + } + + // now let's determine if there is less nip's to process than number of + // declared workers. if so - let's decrement it to not waste resources + if len(nipNumbers) < numWorkers { + numWorkers = len(nipNumbers) + } + + // start the workers + var wg sync.WaitGroup + wg.Add(numWorkers) + nipChannel := make(chan string, len(nipNumbers)) + errChannel := make(chan downloadError) + + for range numWorkers { + go downloadWorker(cmd, &wg, baseViper, downloaderConfig, nipChannel, errChannel) + } + + // start the error listening function + var errors []downloadError + go func() { + for err := range errChannel { + errors = append(errors, err) + } + }() + + // pass nip numbers to the workers + for _, nip := range nipNumbers { + nipChannel <- nip + } + + // now we can close the channel. the worker will detect this as a signal that + // there are no more incoming NIP's and that it can return + close(nipChannel) + + // now we can wait for the workers to finish their work + logging.DownloadLogger.Info("Oczekiwanie na zakończenie pobierania faktur") + wg.Wait() + close(errChannel) + + if len(errors) > 0 { + logging.DownloadLogger.Info("Podczas pobierania wystąpiły następujące błędy") + for _, err := range errors { + logging.DownloadLogger.Error("Błąd pobierania", "NIP", err.NIP, "error", err) + } + } + + return nil +} + +func downloadWorker( + cmd *cobra.Command, + wg *sync.WaitGroup, + baseViper *viper.Viper, + downloaderConfig invoices.DownloadParams, + nipChannel <-chan string, + errorsChannel chan<- downloadError, +) { + defer wg.Done() + + for nip := range nipChannel { + vip := cloneViper(baseViper) + runtime.SetNIP(vip, nip) + + if err := doDownload(cmd, vip, nip, downloaderConfig); err != nil { + errorsChannel <- downloadError{ + NIP: nip, + err: err, + } + } + } +} + +// this may seem weird, but it's actually easier to make this function look "almost" natural +// and return the error. This way, the "inner" function can focus on the actual logic of downloading invoices +// whereas the wrapper (i.e. worker in the worker pool) can focus on dealing with error channel and so on. +// from the perspective of this function - there's nothing magical - it just instantiates the KSeFClient +// and uses defer to close it. +func doDownload( + cmd *cobra.Command, + vip *viper.Viper, + nip string, + downloaderConfig invoices.DownloadParams, +) error { + ksefClient, err := client.InitClient(cmd, vip) + if err != nil { + return err + } + defer ksefClient.Close() + + invoicesDB, err := invoicesdb.OpenForNIP( + nip, vip, invoicesdb.WithKSeFClient(ksefClient), + ) + if err != nil { + return err + } + + logging.DownloadLogger.Info("calling invoicesDB.DownloadInvoices", "nip", nip) + err = invoicesDB.DownloadInvoices(cmd.Context(), vip, downloaderConfig) + logging.DownloadLogger.Info("result", "err", err, "nip", nip) + return err +} diff --git a/cmd/ksef/commands/invoices/import.go b/cmd/ksef/commands/invoices/import.go index 41d330b..34b3644 100644 --- a/cmd/ksef/commands/invoices/import.go +++ b/cmd/ksef/commands/invoices/import.go @@ -40,7 +40,7 @@ func init() { func importRun(cmd *cobra.Command, args []string) error { vip := viper.GetViper() - ksefClient, err := client.InitClient(cmd, v2.WithoutTokenManager()) + ksefClient, err := client.InitClient(cmd, vip, v2.WithoutTokenManager()) if err != nil { return errors.Join(errClientInit, err) } diff --git a/cmd/ksef/commands/invoices/sync.go b/cmd/ksef/commands/invoices/sync.go index 077377e..412cdb3 100644 --- a/cmd/ksef/commands/invoices/sync.go +++ b/cmd/ksef/commands/invoices/sync.go @@ -36,7 +36,7 @@ func syncInvoicesRun(cmd *cobra.Command, args []string) error { return err } - ksefClient, err := client.InitClient(cmd) + ksefClient, err := client.InitClient(cmd, vip) if err != nil { return err } diff --git a/cmd/ksef/commands/invoices/upload.go b/cmd/ksef/commands/invoices/upload.go index f7a9f3c..257dc6b 100644 --- a/cmd/ksef/commands/invoices/upload.go +++ b/cmd/ksef/commands/invoices/upload.go @@ -32,7 +32,7 @@ func uploadInvoicesRun(cmd *cobra.Command, _ []string) error { if err := runtime.CheckNIPIsSet(vip); err != nil { return err } - ksefClient, err := client.InitClient(cmd) + ksefClient, err := client.InitClient(cmd, vip) if err != nil { return err } diff --git a/internal/invoicesdb/invoicesdb_get_all_nips.go b/internal/invoicesdb/invoicesdb_get_all_nips.go new file mode 100644 index 0000000..8847339 --- /dev/null +++ b/internal/invoicesdb/invoicesdb_get_all_nips.go @@ -0,0 +1,34 @@ +package invoicesdb + +import ( + "ksef/internal/invoicesdb/config" + "ksef/internal/runtime" + "os" + "path/filepath" + + "github.com/spf13/viper" +) + +func GetAllNIPs(vip *viper.Viper) ([]string, error) { + cfg := config.GetInvoicesDBConfig(vip) + environmentId := runtime.GetEnvironmentId(vip) + + var nips []string + root := filepath.Join( + cfg.Root, + environmentId, + ) + + entries, err := os.ReadDir(root) + if err != nil { + return nil, err + } + + for _, entry := range entries { + if entry.IsDir() { + nips = append(nips, entry.Name()) + } + } + + return nips, err +} From 0e17ea58bd8a6e93b65ea2dd4bd14518cdb3ae0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Miko=C5=82ajczyk?= Date: Wed, 11 Mar 2026 11:41:17 +0100 Subject: [PATCH 2/3] initialize download invoice types if user did not pass any --- cmd/ksef/commands/invoices/download_paralell.go | 5 +---- internal/invoicesdb/downloader/config/config.go | 9 +++++++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/cmd/ksef/commands/invoices/download_paralell.go b/cmd/ksef/commands/invoices/download_paralell.go index 38bc0f9..da6fcb7 100644 --- a/cmd/ksef/commands/invoices/download_paralell.go +++ b/cmd/ksef/commands/invoices/download_paralell.go @@ -125,8 +125,5 @@ func doDownload( return err } - logging.DownloadLogger.Info("calling invoicesDB.DownloadInvoices", "nip", nip) - err = invoicesDB.DownloadInvoices(cmd.Context(), vip, downloaderConfig) - logging.DownloadLogger.Info("result", "err", err, "nip", nip) - return err + return invoicesDB.DownloadInvoices(cmd.Context(), vip, downloaderConfig) } diff --git a/internal/invoicesdb/downloader/config/config.go b/internal/invoicesdb/downloader/config/config.go index 26c61a0..5f8236f 100644 --- a/internal/invoicesdb/downloader/config/config.go +++ b/internal/invoicesdb/downloader/config/config.go @@ -73,6 +73,15 @@ func GetDownloaderConfig(vip *viper.Viper, prefix string) (params invoices.Downl params.Incremental = vip.GetBool(prefixedFlag(prefix, flagIncremental)) params.PDF = vip.GetBool(prefixedFlag(prefix, flagPDF)) params.SubjectTypes = subjectTypes + if params.SubjectTypes == nil { + // if no invoice types were selected - initialize to all possible values. + // otherwise, it will be initialized to what the user selected. + params.SubjectTypes = []invoices.SubjectType{ + invoices.SubjectTypeRecipient, + invoices.SubjectTypePayer, + invoices.SubjectTypeAuthorized, + } + } params.PageSize = vip.GetInt(prefixedFlag(prefix, flagPageSize)) dateRangeType := vip.GetString(prefixedFlag(prefix, flagDateType)) params.DateType = invoices.DateRangeType(dateRangeType) From 4c55d9065a74efb32487a51046e5505441ff16b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Miko=C5=82ajczyk?= Date: Wed, 11 Mar 2026 12:32:21 +0100 Subject: [PATCH 3/3] implement #37 --- cmd/ksef/commands/authorization/logout.go | 11 ++++++++++- cmd/ksef/commands/authorization/sessions/list.go | 10 ++++++++++ cmd/ksef/commands/certificates/prepare_csr.go | 11 ++++++++++- cmd/ksef/commands/certificates/push_csr.go | 11 ++++++++++- cmd/ksef/commands/client/constructor.go | 4 +++- cmd/ksef/commands/invoices/download.go | 11 ++++++++++- cmd/ksef/commands/invoices/download_paralell.go | 16 +++++++++++++--- cmd/ksef/commands/invoices/import.go | 12 +++++++++++- cmd/ksef/commands/invoices/sync.go | 11 ++++++++++- cmd/ksef/commands/invoices/upload.go | 12 +++++++++++- internal/client/v2/auth/token_manager.go | 6 +----- internal/client/v2/client_init.go | 10 +++++++++- 12 files changed, 108 insertions(+), 17 deletions(-) diff --git a/cmd/ksef/commands/authorization/logout.go b/cmd/ksef/commands/authorization/logout.go index f8aebaa..b4ae666 100644 --- a/cmd/ksef/commands/authorization/logout.go +++ b/cmd/ksef/commands/authorization/logout.go @@ -4,6 +4,8 @@ import ( "ksef/cmd/ksef/commands/client" "ksef/cmd/ksef/flags" "ksef/internal/client/v2/auth" + kr "ksef/internal/keyring" + "ksef/internal/logging" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -25,7 +27,14 @@ func logout(cmd *cobra.Command, _ []string) error { vip := viper.GetViper() vip.Set(auth.FlagExitAfterPersistingToken, "true") - cli, err := client.InitClient(cmd, vip) + keyring, err := kr.NewKeyring(vip) + if err != nil { + logging.SeiLogger.Error("błąd inicjalizacji keyringu", "err", err) + return err + } + defer keyring.Close() + + cli, err := client.InitClient(cmd, vip, keyring) if err != nil { return err } diff --git a/cmd/ksef/commands/authorization/sessions/list.go b/cmd/ksef/commands/authorization/sessions/list.go index e178c3b..da949bc 100644 --- a/cmd/ksef/commands/authorization/sessions/list.go +++ b/cmd/ksef/commands/authorization/sessions/list.go @@ -4,6 +4,8 @@ import ( "fmt" "ksef/cmd/ksef/flags" "ksef/internal/client/v2/auth" + kr "ksef/internal/keyring" + "ksef/internal/logging" "github.com/alexeyco/simpletable" "github.com/spf13/cobra" @@ -32,10 +34,18 @@ func getSessions(cmd *cobra.Command, _ []string) error { vip := viper.GetViper() + keyring, err := kr.NewKeyring(vip) + if err != nil { + logging.SeiLogger.Error("błąd inicjalizacji keyringu", "err", err) + return err + } + defer keyring.Close() + tokenManager, err = auth.NewTokenManager( cmd.Context(), vip, nil, + keyring, ) if err != nil { return err diff --git a/cmd/ksef/commands/certificates/prepare_csr.go b/cmd/ksef/commands/certificates/prepare_csr.go index 725fe95..db14f8d 100644 --- a/cmd/ksef/commands/certificates/prepare_csr.go +++ b/cmd/ksef/commands/certificates/prepare_csr.go @@ -4,6 +4,7 @@ import ( "ksef/cmd/ksef/commands/client" "ksef/cmd/ksef/flags" "ksef/internal/certsdb" + kr "ksef/internal/keyring" "ksef/internal/logging" "ksef/internal/runtime" @@ -38,7 +39,15 @@ func init() { func sendCsrs(cmd *cobra.Command, _ []string) error { envId := runtime.GetEnvironmentId(viper.GetViper()) nip, _ := cmd.Flags().GetString(flags.FlagNameNIP) - if cli, err = client.InitClient(cmd, viper.GetViper()); err != nil { + + keyring, err := kr.NewKeyring(viper.GetViper()) + if err != nil { + logging.SeiLogger.Error("unable to initialize keyring", "err", err) + return err + } + defer keyring.Close() + + if cli, err = client.InitClient(cmd, viper.GetViper(), keyring); err != nil { return err } certsManager, err := cli.Certificates(envId) diff --git a/cmd/ksef/commands/certificates/push_csr.go b/cmd/ksef/commands/certificates/push_csr.go index e393e2c..d997b23 100644 --- a/cmd/ksef/commands/certificates/push_csr.go +++ b/cmd/ksef/commands/certificates/push_csr.go @@ -3,6 +3,8 @@ package certificates import ( "ksef/cmd/ksef/commands/client" "ksef/cmd/ksef/flags" + kr "ksef/internal/keyring" + "ksef/internal/logging" "ksef/internal/runtime" "github.com/spf13/cobra" @@ -23,7 +25,14 @@ func init() { } func syncEnrollments(cmd *cobra.Command, _ []string) error { - if cli, err = client.InitClient(cmd, viper.GetViper()); err != nil { + keyring, err := kr.NewKeyring(viper.GetViper()) + if err != nil { + logging.SeiLogger.Error("błąd inicjalizacji keyringu", "err", err) + return err + } + defer keyring.Close() + + if cli, err = client.InitClient(cmd, viper.GetViper(), keyring); err != nil { return err } certsManager, err := cli.Certificates(runtime.GetEnvironmentId(viper.GetViper())) diff --git a/cmd/ksef/commands/client/constructor.go b/cmd/ksef/commands/client/constructor.go index 430fcf2..41fc9cd 100644 --- a/cmd/ksef/commands/client/constructor.go +++ b/cmd/ksef/commands/client/constructor.go @@ -4,12 +4,13 @@ import ( "ksef/internal/certsdb" v2 "ksef/internal/client/v2" "ksef/internal/client/v2/auth/token" + kr "ksef/internal/keyring" "github.com/spf13/cobra" "github.com/spf13/viper" ) -func InitClient(cmd *cobra.Command, vip *viper.Viper, initializers ...v2.InitializerFunc) (*v2.APIClient, error) { +func InitClient(cmd *cobra.Command, vip *viper.Viper, keyring kr.Keyring, initializers ...v2.InitializerFunc) (*v2.APIClient, error) { var err error var cli *v2.APIClient @@ -24,6 +25,7 @@ func InitClient(cmd *cobra.Command, vip *viper.Viper, initializers ...v2.Initial } clientInitializers := []v2.InitializerFunc{ + v2.WithKeyring(keyring), v2.WithAuthValidator( token.NewAuthHandler( vip, diff --git a/cmd/ksef/commands/invoices/download.go b/cmd/ksef/commands/invoices/download.go index 6c478fc..b954968 100644 --- a/cmd/ksef/commands/invoices/download.go +++ b/cmd/ksef/commands/invoices/download.go @@ -5,6 +5,8 @@ import ( "ksef/cmd/ksef/flags" "ksef/internal/invoicesdb" downloaderconfig "ksef/internal/invoicesdb/downloader/config" + kr "ksef/internal/keyring" + "ksef/internal/logging" "ksef/internal/runtime" "github.com/spf13/cobra" @@ -47,7 +49,14 @@ func downloadRun(cmd *cobra.Command, _ []string) error { return err } - ksefClient, err := client.InitClient(cmd, vip) + keyring, err := kr.NewKeyring(vip) + if err != nil { + logging.SeiLogger.Error("błąd inicjalizacji keyringu", "err", err) + return err + } + defer keyring.Close() + + ksefClient, err := client.InitClient(cmd, vip, keyring) if err != nil { return err } diff --git a/cmd/ksef/commands/invoices/download_paralell.go b/cmd/ksef/commands/invoices/download_paralell.go index da6fcb7..c3c4129 100644 --- a/cmd/ksef/commands/invoices/download_paralell.go +++ b/cmd/ksef/commands/invoices/download_paralell.go @@ -5,6 +5,7 @@ import ( "ksef/internal/client/v2/types/invoices" "ksef/internal/invoicesdb" downloaderconfig "ksef/internal/invoicesdb/downloader/config" + kr "ksef/internal/keyring" "ksef/internal/logging" "ksef/internal/runtime" "sync" @@ -30,6 +31,13 @@ func downloadRunParalell(cmd *cobra.Command, baseViper *viper.Viper, numWorkers return err } + keyring, err := kr.NewKeyring(baseViper) + if err != nil { + logging.SeiLogger.Error("błąd inicjalizacji keyringu", "err", err) + return err + } + defer keyring.Close() + // now let's determine if there is less nip's to process than number of // declared workers. if so - let's decrement it to not waste resources if len(nipNumbers) < numWorkers { @@ -43,7 +51,7 @@ func downloadRunParalell(cmd *cobra.Command, baseViper *viper.Viper, numWorkers errChannel := make(chan downloadError) for range numWorkers { - go downloadWorker(cmd, &wg, baseViper, downloaderConfig, nipChannel, errChannel) + go downloadWorker(cmd, &wg, baseViper, downloaderConfig, keyring, nipChannel, errChannel) } // start the error listening function @@ -83,6 +91,7 @@ func downloadWorker( wg *sync.WaitGroup, baseViper *viper.Viper, downloaderConfig invoices.DownloadParams, + keyring kr.Keyring, nipChannel <-chan string, errorsChannel chan<- downloadError, ) { @@ -92,7 +101,7 @@ func downloadWorker( vip := cloneViper(baseViper) runtime.SetNIP(vip, nip) - if err := doDownload(cmd, vip, nip, downloaderConfig); err != nil { + if err := doDownload(cmd, vip, nip, downloaderConfig, keyring); err != nil { errorsChannel <- downloadError{ NIP: nip, err: err, @@ -111,8 +120,9 @@ func doDownload( vip *viper.Viper, nip string, downloaderConfig invoices.DownloadParams, + keyring kr.Keyring, ) error { - ksefClient, err := client.InitClient(cmd, vip) + ksefClient, err := client.InitClient(cmd, vip, keyring) if err != nil { return err } diff --git a/cmd/ksef/commands/invoices/import.go b/cmd/ksef/commands/invoices/import.go index 34b3644..31d0092 100644 --- a/cmd/ksef/commands/invoices/import.go +++ b/cmd/ksef/commands/invoices/import.go @@ -8,6 +8,8 @@ import ( invoicesdbconfig "ksef/internal/invoicesdb/config" statuscheckerconfig "ksef/internal/invoicesdb/status-checker/config" uploaderconfig "ksef/internal/invoicesdb/uploader/config" + kr "ksef/internal/keyring" + "ksef/internal/logging" "ksef/internal/runtime" inputprocessors "ksef/internal/sei/input_processors" @@ -40,7 +42,15 @@ func init() { func importRun(cmd *cobra.Command, args []string) error { vip := viper.GetViper() - ksefClient, err := client.InitClient(cmd, vip, v2.WithoutTokenManager()) + + keyring, err := kr.NewKeyring(vip) + if err != nil { + logging.SeiLogger.Error("błąd inicjalizacji keyringu", "err", err) + return err + } + defer keyring.Close() + + ksefClient, err := client.InitClient(cmd, vip, keyring, v2.WithoutTokenManager()) if err != nil { return errors.Join(errClientInit, err) } diff --git a/cmd/ksef/commands/invoices/sync.go b/cmd/ksef/commands/invoices/sync.go index 412cdb3..c06981f 100644 --- a/cmd/ksef/commands/invoices/sync.go +++ b/cmd/ksef/commands/invoices/sync.go @@ -5,6 +5,8 @@ import ( "ksef/cmd/ksef/flags" "ksef/internal/invoicesdb" "ksef/internal/invoicesdb/config" + kr "ksef/internal/keyring" + "ksef/internal/logging" "ksef/internal/runtime" "github.com/spf13/cobra" @@ -36,7 +38,14 @@ func syncInvoicesRun(cmd *cobra.Command, args []string) error { return err } - ksefClient, err := client.InitClient(cmd, vip) + keyring, err := kr.NewKeyring(vip) + if err != nil { + logging.SeiLogger.Error("błąd inicjalizacji keyringu", "err", err) + return err + } + defer keyring.Close() + + ksefClient, err := client.InitClient(cmd, vip, keyring) if err != nil { return err } diff --git a/cmd/ksef/commands/invoices/upload.go b/cmd/ksef/commands/invoices/upload.go index 257dc6b..41295cb 100644 --- a/cmd/ksef/commands/invoices/upload.go +++ b/cmd/ksef/commands/invoices/upload.go @@ -6,6 +6,8 @@ import ( "ksef/internal/invoicesdb" statuscheckerconfig "ksef/internal/invoicesdb/status-checker/config" uploaderconfig "ksef/internal/invoicesdb/uploader/config" + kr "ksef/internal/keyring" + "ksef/internal/logging" "ksef/internal/runtime" "github.com/spf13/cobra" @@ -32,7 +34,15 @@ func uploadInvoicesRun(cmd *cobra.Command, _ []string) error { if err := runtime.CheckNIPIsSet(vip); err != nil { return err } - ksefClient, err := client.InitClient(cmd, vip) + + keyring, err := kr.NewKeyring(vip) + if err != nil { + logging.SeiLogger.Error("błąd inicjalizacji keyringu", "err", err) + return err + } + defer keyring.Close() + + ksefClient, err := client.InitClient(cmd, vip, keyring) if err != nil { return err } diff --git a/internal/client/v2/auth/token_manager.go b/internal/client/v2/auth/token_manager.go index d4286e0..03c1769 100644 --- a/internal/client/v2/auth/token_manager.go +++ b/internal/client/v2/auth/token_manager.go @@ -56,6 +56,7 @@ func NewTokenManager( ctx context.Context, vip *viper.Viper, challengeValidator validator.AuthChallengeValidator, + keyring keyring.Keyring, ) (*TokenManager, error) { environment := runtime.GetEnvironment(vip) httpClient := http.NewClient(environment.API) @@ -66,11 +67,6 @@ func NewTokenManager( } } - keyring, err := keyring.NewKeyring(vip) - if err != nil { - logging.AuthLogger.Error("unable to initialize keyring", "err", err) - return nil, err - } certsDB, err := certsdb.OpenOrCreate(vip) if err != nil { return nil, err diff --git a/internal/client/v2/client_init.go b/internal/client/v2/client_init.go index af40e03..9eb5720 100644 --- a/internal/client/v2/client_init.go +++ b/internal/client/v2/client_init.go @@ -9,6 +9,7 @@ import ( ratelimits "ksef/internal/client/v2/rate-limits" "ksef/internal/http" httpClient "ksef/internal/http" + kr "ksef/internal/keyring" "ksef/internal/logging" "ksef/internal/runtime" @@ -28,6 +29,7 @@ type APIClient struct { runTokenManager bool tokenManagerStarted bool vip *viper.Viper + keyring kr.Keyring } type InitializerFunc func(c *APIClient) @@ -51,7 +53,7 @@ func NewClient(ctx context.Context, vip *viper.Viper, options ...InitializerFunc if client.authChallengeValidator != nil { var err error - if client.tokenManager, err = auth.NewTokenManager(ctx, vip, client.authChallengeValidator); err != nil { + if client.tokenManager, err = auth.NewTokenManager(ctx, vip, client.authChallengeValidator, client.keyring); err != nil { return nil, err } if client.runTokenManager { @@ -100,6 +102,12 @@ func WithCertificatesDB(certsDB *certsdb.CertificatesDB) func(client *APIClient) } } +func WithKeyring(keyring kr.Keyring) func(client *APIClient) { + return func(client *APIClient) { + client.keyring = keyring + } +} + func WithoutTokenManager() func(client *APIClient) { return func(client *APIClient) { client.runTokenManager = false