package app import ( "encoding/json" "errors" "os" ) type User struct { ID int `json:"id"` Username string `json:"username"` Password string `json:"password"` } type Provider struct { Users []User `json:"users"` LastUserID int `json:"last_user_id"` path string } // NewProvider создаёт новый провайдер с пустыми данными (файл не трогает) func NewProvider() *Provider { return &Provider{ Users: make([]User, 0), LastUserID: 0, path: "./provider.json", } } // LoadProvider загружает данные из файла, если файла нет — возвращает новый провайдер func LoadProvider() (*Provider, error) { data, err := os.ReadFile("./provider.json") if err != nil { if os.IsNotExist(err) { // файл не существует, возвращаем новый провайдер return NewProvider(), nil } return nil, err } p := &Provider{path: "./provider.json"} if err := json.Unmarshal(data, p); err != nil { return nil, err } return p, nil } // Save сохраняет текущее состояние в файл func (p *Provider) Save() error { data, err := json.MarshalIndent(p, "", " ") // для читаемости if err != nil { return err } return os.WriteFile(p.path, data, 0644) } func (p *Provider) AddUser(username, password string) error { p.LastUserID++ p.Users = append(p.Users, User{ ID: p.LastUserID, Username: username, Password: password, }) return p.Save() } func (p *Provider) GetById(id int) (User, error) { for _, user := range p.Users { if user.ID == id { return user, nil } } return User{}, errors.New("user not found") } func (p *Provider) GetUser(password string) (User, error) { for _, user := range p.Users { if user.Password == password { return user, nil } } return User{}, errors.New("user not found") } func (p *Provider) DeleteUser(id int) error { index := -1 for i, user := range p.Users { if user.ID == id { index = i break } } if index == -1 { return errors.New("user not found") } p.Users = append(p.Users[:index], p.Users[index+1:]...) return p.Save() }