go 1.25.1
require (
- github.com/jackc/pgpassfile v1.0.0 // indirect
- github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
- github.com/jackc/pgx/v5 v5.7.6 // indirect
- golang.org/x/crypto v0.37.0 // indirect
- golang.org/x/text v0.24.0 // indirect
)
package services
import (
- "context"
+ "sync"
"github.com/aloussase/squad-rotation-bot/entities"
- "github.com/jackc/pgx/v5"
)
type MemberService interface {
}
type memberServiceImpl struct {
- conn *pgx.Conn
+ mu sync.Mutex
+ members []entities.SquadMember
}
// Create / Create a new instance of MemberService.
-func Create(conn *pgx.Conn) MemberService {
+func Create() MemberService {
return &memberServiceImpl{
- conn: conn,
+ members: make([]entities.SquadMember, 0),
}
}
func (ms *memberServiceImpl) CreateMember(name, avatarUrl string) error {
- query := "insert into squad_members (full_name, avatar_url) values ($1, $2)"
- _, err := ms.conn.Exec(context.Background(), query, name, avatarUrl)
- return err
-}
+ ms.mu.Lock()
+ defer ms.mu.Unlock()
-func (ms *memberServiceImpl) ListMembers() ([]entities.SquadMember, error) {
- query := "select (id, full_name, avatar_url) from squad_members"
- rows, err := ms.conn.Query(context.Background(), query)
- if err != nil {
- return nil, err
- }
+ nextId := len(ms.members) + 1
- defer rows.Close()
+ newMember := entities.SquadMember{
+ ID: nextId,
+ FullName: name,
+ AvatarUrl: &avatarUrl,
+ }
- members, err := pgx.CollectRows(rows, func(row pgx.CollectableRow) (entities.SquadMember, error) {
- var member entities.SquadMember
- err := row.Scan(&member)
- return member, err
- })
+ ms.members = append(ms.members, newMember)
- if err != nil {
- return nil, err
- }
+ return nil
+}
- return members, nil
+func (ms *memberServiceImpl) ListMembers() ([]entities.SquadMember, error) {
+ return ms.members, nil
}
package services
import (
- "context"
"fmt"
"slices"
+ "sync"
"github.com/aloussase/squad-rotation-bot/entities"
- "github.com/jackc/pgx/v5"
)
type RotationService interface {
}
type rotationServiceImpl struct {
- conn *pgx.Conn
+ mu sync.Mutex
+ counter int
}
-func CreateRotationService(conn *pgx.Conn) RotationService {
+func CreateRotationService() RotationService {
return &rotationServiceImpl{
- conn: conn,
+ counter: 1,
}
}
return entities.SquadMember{}, fmt.Errorf("list of members if empty")
}
- var next int
+ rs.mu.Lock()
+ defer rs.mu.Unlock()
- err := rs.conn.QueryRow(context.Background(), "select nextval('squad_rotation')").Scan(&next)
- if err != nil {
- return entities.SquadMember{}, err
- }
+ next := rs.counter
+ rs.counter += 1
// Sort the members to ensure a deterministic pick.
sortedMembers := slices.SortedFunc(slices.Values(members), func(a, b entities.SquadMember) int {