Add dependency injection

This commit is contained in:
Archer Fox
2025-03-10 22:20:06 +03:00
parent 91e54c1674
commit 699be23766
3 changed files with 55 additions and 31 deletions

View File

@@ -14,27 +14,41 @@ type Vault struct {
UpdatedAt time.Time `json:"updatedAt"` UpdatedAt time.Time `json:"updatedAt"`
} }
func NewVault() *Vault { type VaultWithDb struct {
file, err := files.FileRead("data.json") Vault
db files.JsonDb
}
func NewVault(db *files.JsonDb) *VaultWithDb {
file, err := db.Read()
if err != nil { if err != nil {
return &Vault{ return &VaultWithDb{
Vault: Vault{
Accounts: []Account{}, Accounts: []Account{},
UpdatedAt: time.Now(), UpdatedAt: time.Now(),
},
db: *db,
} }
} }
var vault Vault var vault Vault
err = json.Unmarshal(file, &vault) err = json.Unmarshal(file, &vault)
if err != nil { if err != nil {
color.Red("Не удалось разобрать файл data.json") color.Red("Не удалось разобрать файл data.json")
return &Vault{ return &VaultWithDb{
Vault: Vault{
Accounts: []Account{}, Accounts: []Account{},
UpdatedAt: time.Now(), 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.Accounts = append(vault.Accounts, acc)
vault.save() vault.save()
} }
@@ -47,7 +61,7 @@ func (vault *Vault) ToBytes() ([]byte, error) {
return file, nil return file, nil
} }
func (vault *Vault) FindAccountsByUrl(url string) []Account { func (vault *VaultWithDb) FindAccountsByUrl(url string) []Account {
var accounts []Account var accounts []Account
for _, account := range vault.Accounts { for _, account := range vault.Accounts {
isMatched := strings.Contains(account.Url, url) isMatched := strings.Contains(account.Url, url)
@@ -58,7 +72,7 @@ func (vault *Vault) FindAccountsByUrl(url string) []Account {
return accounts return accounts
} }
func (vault *Vault) DeleteAccountByUrl(url string) bool { func (vault *VaultWithDb) DeleteAccountByUrl(url string) bool {
var accounts []Account var accounts []Account
isDeleted := false isDeleted := false
for _, account := range vault.Accounts { for _, account := range vault.Accounts {
@@ -74,11 +88,11 @@ func (vault *Vault) DeleteAccountByUrl(url string) bool {
return isDeleted return isDeleted
} }
func (vault *Vault) save() { func (vault *VaultWithDb) save() {
vault.UpdatedAt = time.Now() vault.UpdatedAt = time.Now()
data, err := vault.ToBytes() data, err := vault.Vault.ToBytes()
if err != nil { if err != nil {
color.Red("Не удалось преобразовать") color.Red("Не удалось преобразовать")
} }
files.FileWrite(data, "data.json") vault.db.Write(data)
} }

View File

@@ -5,8 +5,26 @@ import (
"os" "os"
) )
func FileWrite(content []byte, name string) { type JsonDb struct {
file, err := os.Create(name) 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 { if err != nil {
fmt.Println(err) fmt.Println(err)
} }
@@ -19,11 +37,3 @@ func FileWrite(content []byte, name string) {
} }
fmt.Println("Файл успешно записан") fmt.Println("Файл успешно записан")
} }
func FileRead(name string) ([]byte, error) {
data, err := os.ReadFile(name)
if err != nil {
return nil, err
}
return data, nil
}

View File

@@ -3,13 +3,14 @@ package main
import ( import (
"fmt" "fmt"
"password/account" "password/account"
"password/files"
"github.com/fatih/color" "github.com/fatih/color"
) )
func main() { func main() {
fmt.Println("__Менеджер паролей__") fmt.Println("__Менеджер паролей__")
vault := account.NewVault() vault := account.NewVault(files.NewJsonDb("data.json"))
Menu: Menu:
for { for {
variant := getMenu() variant := getMenu()
@@ -37,7 +38,7 @@ func getMenu() int {
return variant return variant
} }
func findAccount(vault *account.Vault) { func findAccount(vault *account.VaultWithDb) {
url := account.PromptData("Введите URL для поиска: ") url := account.PromptData("Введите URL для поиска: ")
accounts := vault.FindAccountsByUrl(url) accounts := vault.FindAccountsByUrl(url)
if len(accounts) == 0 { 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 для поиска: ") url := account.PromptData("Введите URL для поиска: ")
isDeleted := vault.DeleteAccountByUrl(url) isDeleted := vault.DeleteAccountByUrl(url)
if isDeleted { if isDeleted {
@@ -58,16 +59,15 @@ func deleteAccount(vault *account.Vault) {
} }
} }
func createAccount(vault *account.Vault) { func createAccount(vault *account.VaultWithDb) {
login := account.PromptData("Введите логин: ") login := account.PromptData("Введите логин: ")
password := account.PromptData("Введите пароль: ") password := account.PromptData("Введите пароль: ")
url := account.PromptData("Введите URL: ") url := account.PromptData("Введите URL: ")
myAccount, err := account.NewAccount(login, password, url) myAccount, err := account.NewAccount(login, password, url)
if err != nil { if err != nil {
fmt.Println("ОШИБКА: Неверный формат URL") fmt.Println("ОШИБКА: Неверный формат URL или Login")
return return
} }
vault = account.NewVault()
vault.AddAccount(*myAccount) vault.AddAccount(*myAccount)
} }