test
This commit is contained in:
108
app/provider.go
108
app/provider.go
@@ -1,9 +1,7 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"os"
|
||||
"github.com/vinovest/sqlx"
|
||||
)
|
||||
|
||||
type User struct {
|
||||
@@ -11,86 +9,46 @@ type User struct {
|
||||
Username string `json:"username"`
|
||||
Password string `json:"password"`
|
||||
}
|
||||
type Provider struct {
|
||||
Users []User `json:"users"`
|
||||
LastUserID int `json:"last_user_id"`
|
||||
path string
|
||||
type UserUsage struct {
|
||||
UserID int `json:"user_id" db:"user_id"`
|
||||
Recv int64 `json:"recv" db:"recv"`
|
||||
Sent int64 `json:"sent" db:"sent"`
|
||||
}
|
||||
|
||||
// NewProvider создаёт новый провайдер с пустыми данными (файл не трогает)
|
||||
func NewProvider() *Provider {
|
||||
return &Provider{
|
||||
Users: make([]User, 0),
|
||||
LastUserID: 0,
|
||||
path: "./provider.json",
|
||||
}
|
||||
type UserRepository struct {
|
||||
db *sqlx.DB
|
||||
}
|
||||
|
||||
// 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
|
||||
func NewUserRepository(db *sqlx.DB) *UserRepository {
|
||||
return &UserRepository{db}
|
||||
}
|
||||
|
||||
// Save сохраняет текущее состояние в файл
|
||||
func (p *Provider) Save() error {
|
||||
data, err := json.MarshalIndent(p, "", " ") // для читаемости
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return os.WriteFile(p.path, data, 0644)
|
||||
func (rep UserRepository) AddUser(username, password string) (User, error) {
|
||||
sql := "INSERT INTO users (username, password) VALUES (?, ?) RETURNING *;"
|
||||
sql = rep.db.Rebind(sql)
|
||||
var user User
|
||||
err := db.Get(&user, sql, username, password)
|
||||
return user, err
|
||||
}
|
||||
|
||||
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 (rep UserRepository) GetById(id int) (User, error) {
|
||||
var user User
|
||||
sql := "SELECT * FROM users WHERE id=?;"
|
||||
sql = rep.db.Rebind(sql)
|
||||
err := rep.db.Get(&user, sql, id)
|
||||
return user, err
|
||||
}
|
||||
func (rep UserRepository) GetUsers() ([]User, error) {
|
||||
users := make([]User, 0)
|
||||
sql := "SELECT * FROM users;"
|
||||
sql = rep.db.Rebind(sql)
|
||||
err := rep.db.Select(&users, sql)
|
||||
return users, err
|
||||
}
|
||||
|
||||
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()
|
||||
func (rep UserRepository) DeleteUser(id int) error {
|
||||
sql := "DELETE FROM users WHERE id=?;"
|
||||
sql = rep.db.Rebind(sql)
|
||||
_, err := rep.db.Exec(sql, id)
|
||||
return err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user