97 lines
2.2 KiB
Go
97 lines
2.2 KiB
Go
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()
|
||
}
|