package services import ( "context" "database/sql" "errors" "evening_detective/internal/models" _ "github.com/mattn/go-sqlite3" ) type Repository struct { db *sql.DB } func NewRepository() (*Repository, error) { db, err := sql.Open("sqlite3", "store.db") if err != nil { return nil, err } _, err = db.Exec("CREATE TABLE IF NOT EXISTS teams (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, password TEXT);") if err != nil { return nil, err } _, err = db.Exec("CREATE TABLE IF NOT EXISTS actions (id INTEGER PRIMARY KEY AUTOINCREMENT, place TEXT, teamId INTEGER);") if err != nil { return nil, err } // for tests // _, err = db.Exec("insert into teams (id, name, password) values (1, \"name\", \"pass\");") // if err != nil { // return nil, err // } return &Repository{db: db}, nil } func (r *Repository) GetTeams(ctx context.Context) ([]*models.Team, error) { rows, err := r.db.Query("select id, name, password from teams") if err != nil { panic(err) } defer rows.Close() teams := []*models.Team{} for rows.Next() { team := &models.Team{} err := rows.Scan(&team.ID, &team.Name, &team.Password) if err != nil { return nil, err } teams = append(teams, team) } return teams, nil } func (r *Repository) AddTeams(ctx context.Context, teams []*models.Team) ([]*models.Team, error) { for _, team := range teams { result, err := r.db.Exec("insert into teams (name, password) values ($1, $2)", team.Name, team.Password) if err != nil { return nil, err } team.ID, err = result.LastInsertId() if err != nil { return nil, err } } return teams, nil } func (r *Repository) GetActions(ctx context.Context, teamId int64) ([]*models.Action, error) { rows, err := r.db.Query("select id, place from actions where teamId = $1", teamId) if err != nil { panic(err) } defer rows.Close() actions := []*models.Action{} for rows.Next() { team := &models.Action{} err := rows.Scan(&team.ID, &team.Place) if err != nil { return nil, err } actions = append(actions, team) } return actions, nil } func (r *Repository) AddActions(ctx context.Context, actions []*models.Action) error { for _, action := range actions { _, err := r.db.Exec("insert into actions (place, teamId) values ($1, $2)", action.Place, action.TeamID) if err != nil { return err } } return nil } func (r *Repository) GetTeam(ctx context.Context, teamId any, password any) (*models.Team, error) { rows, err := r.db.Query("select id, name from teams where id = $1 and password = $2", teamId, password) if err != nil { return nil, err } defer rows.Close() teams := []*models.Team{} for rows.Next() { team := &models.Team{} err := rows.Scan(&team.ID, &team.Name) if err != nil { return nil, err } teams = append(teams, team) } if len(teams) != 1 { return nil, errors.New("bad result") } return teams[0], nil }