From 4c6dfa4217820a9f9d7e65245f7817168e150776 Mon Sep 17 00:00:00 2001 From: Alexander Goussas Date: Sat, 25 Apr 2026 22:25:15 -0500 Subject: [PATCH] refactor: replace pg database with in memory db --- go.mod | 5 ----- services/member_service.go | 43 +++++++++++++++--------------------- services/rotation_service.go | 19 ++++++++-------- 3 files changed, 27 insertions(+), 40 deletions(-) diff --git a/go.mod b/go.mod index 8c867ac..ca58022 100644 --- a/go.mod +++ b/go.mod @@ -3,9 +3,4 @@ module github.com/aloussase/squad-rotation-bot 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 ) diff --git a/services/member_service.go b/services/member_service.go index 087f480..9f76b52 100644 --- a/services/member_service.go +++ b/services/member_service.go @@ -1,10 +1,9 @@ package services import ( - "context" + "sync" "github.com/aloussase/squad-rotation-bot/entities" - "github.com/jackc/pgx/v5" ) type MemberService interface { @@ -16,40 +15,34 @@ 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 } diff --git a/services/rotation_service.go b/services/rotation_service.go index 7854d9f..7398753 100644 --- a/services/rotation_service.go +++ b/services/rotation_service.go @@ -1,12 +1,11 @@ package services import ( - "context" "fmt" "slices" + "sync" "github.com/aloussase/squad-rotation-bot/entities" - "github.com/jackc/pgx/v5" ) type RotationService interface { @@ -15,12 +14,13 @@ 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, } } @@ -29,12 +29,11 @@ func (rs *rotationServiceImpl) ChooseNextInRotation(members []entities.SquadMemb 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 { -- 2.43.0