From 699be23766e39564a31bdd8c4d1c18b0835ad1d9 Mon Sep 17 00:00:00 2001 From: Archer Fox Date: Mon, 10 Mar 2025 22:20:06 +0300 Subject: [PATCH] Add dependency injection --- go-demo-4/account/vault.go | 44 +++++++++++++++++++++++++------------- go-demo-4/files/files.go | 30 +++++++++++++++++--------- go-demo-4/main.go | 12 +++++------ 3 files changed, 55 insertions(+), 31 deletions(-) diff --git a/go-demo-4/account/vault.go b/go-demo-4/account/vault.go index d15b303..dbc25dd 100644 --- a/go-demo-4/account/vault.go +++ b/go-demo-4/account/vault.go @@ -14,27 +14,41 @@ type Vault struct { UpdatedAt time.Time `json:"updatedAt"` } -func NewVault() *Vault { - file, err := files.FileRead("data.json") +type VaultWithDb struct { + Vault + db files.JsonDb +} + +func NewVault(db *files.JsonDb) *VaultWithDb { + file, err := db.Read() if err != nil { - return &Vault{ - Accounts: []Account{}, - UpdatedAt: time.Now(), + return &VaultWithDb{ + Vault: Vault{ + Accounts: []Account{}, + UpdatedAt: time.Now(), + }, + db: *db, } } var vault Vault err = json.Unmarshal(file, &vault) if err != nil { color.Red("Не удалось разобрать файл data.json") - return &Vault{ - Accounts: []Account{}, - UpdatedAt: time.Now(), + return &VaultWithDb{ + Vault: Vault{ + Accounts: []Account{}, + UpdatedAt: time.Now(), + }, + db: *db, } } - return &vault + return &VaultWithDb{ + Vault: vault, + db: *db, + } } -func (vault *Vault) AddAccount(acc Account) { +func (vault *VaultWithDb) AddAccount(acc Account) { vault.Accounts = append(vault.Accounts, acc) vault.save() } @@ -47,7 +61,7 @@ func (vault *Vault) ToBytes() ([]byte, error) { return file, nil } -func (vault *Vault) FindAccountsByUrl(url string) []Account { +func (vault *VaultWithDb) FindAccountsByUrl(url string) []Account { var accounts []Account for _, account := range vault.Accounts { isMatched := strings.Contains(account.Url, url) @@ -58,7 +72,7 @@ func (vault *Vault) FindAccountsByUrl(url string) []Account { return accounts } -func (vault *Vault) DeleteAccountByUrl(url string) bool { +func (vault *VaultWithDb) DeleteAccountByUrl(url string) bool { var accounts []Account isDeleted := false for _, account := range vault.Accounts { @@ -74,11 +88,11 @@ func (vault *Vault) DeleteAccountByUrl(url string) bool { return isDeleted } -func (vault *Vault) save() { +func (vault *VaultWithDb) save() { vault.UpdatedAt = time.Now() - data, err := vault.ToBytes() + data, err := vault.Vault.ToBytes() if err != nil { color.Red("Не удалось преобразовать") } - files.FileWrite(data, "data.json") + vault.db.Write(data) } diff --git a/go-demo-4/files/files.go b/go-demo-4/files/files.go index 7878b65..a885220 100644 --- a/go-demo-4/files/files.go +++ b/go-demo-4/files/files.go @@ -5,8 +5,26 @@ import ( "os" ) -func FileWrite(content []byte, name string) { - file, err := os.Create(name) +type JsonDb struct { + filename string +} + +func NewJsonDb(name string) *JsonDb { + return &JsonDb{ + filename: name, + } +} + +func (db *JsonDb) Read() ([]byte, error) { + data, err := os.ReadFile(db.filename) + if err != nil { + return nil, err + } + return data, nil +} + +func (db *JsonDb) Write(content []byte) { + file, err := os.Create(db.filename) if err != nil { fmt.Println(err) } @@ -19,11 +37,3 @@ func FileWrite(content []byte, name string) { } fmt.Println("Файл успешно записан") } - -func FileRead(name string) ([]byte, error) { - data, err := os.ReadFile(name) - if err != nil { - return nil, err - } - return data, nil -} diff --git a/go-demo-4/main.go b/go-demo-4/main.go index 55a9687..20df5e9 100644 --- a/go-demo-4/main.go +++ b/go-demo-4/main.go @@ -3,13 +3,14 @@ package main import ( "fmt" "password/account" + "password/files" "github.com/fatih/color" ) func main() { fmt.Println("__Менеджер паролей__") - vault := account.NewVault() + vault := account.NewVault(files.NewJsonDb("data.json")) Menu: for { variant := getMenu() @@ -37,7 +38,7 @@ func getMenu() int { return variant } -func findAccount(vault *account.Vault) { +func findAccount(vault *account.VaultWithDb) { url := account.PromptData("Введите URL для поиска: ") accounts := vault.FindAccountsByUrl(url) if len(accounts) == 0 { @@ -48,7 +49,7 @@ func findAccount(vault *account.Vault) { } } -func deleteAccount(vault *account.Vault) { +func deleteAccount(vault *account.VaultWithDb) { url := account.PromptData("Введите URL для поиска: ") isDeleted := vault.DeleteAccountByUrl(url) if isDeleted { @@ -58,16 +59,15 @@ func deleteAccount(vault *account.Vault) { } } -func createAccount(vault *account.Vault) { +func createAccount(vault *account.VaultWithDb) { login := account.PromptData("Введите логин: ") password := account.PromptData("Введите пароль: ") url := account.PromptData("Введите URL: ") myAccount, err := account.NewAccount(login, password, url) if err != nil { - fmt.Println("ОШИБКА: Неверный формат URL") + fmt.Println("ОШИБКА: Неверный формат URL или Login") return } - vault = account.NewVault() vault.AddAccount(*myAccount) }