This commit is contained in:
2026-03-04 18:23:00 +03:00
parent b81df5866b
commit 205d9cf8b0
15 changed files with 439 additions and 165 deletions

View File

@@ -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
}