package store import ( "context" "fmt" "git.kundeng.us/phoenix/textsender-models/tx0/message" "github.com/google/uuid" "github.com/jackc/pgx/v5" "github.com/jackc/pgx/v5/pgxpool" ) type MessageStore interface { GetMessageByID(ctx context.Context, id uuid.UUID) (*message.Message, error) CreateMessage(ctx context.Context, msg *message.Message) error GetAllMessages(ctx context.Context) ([]*message.Message, error) MessageExists(ctx context.Context, msg *message.Message) (bool, error) } type PGMessageStore struct { db *pgxpool.Pool } func NewMessageStore(db *pgxpool.Pool) *PGMessageStore { return &PGMessageStore{db: db} } func (m *PGMessageStore) CreateMessage(ctx context.Context, msg *message.Message) error { query := ` INSERT INTO messages (content, user_id) VALUES ($1, $2) RETURNING id ` return m.db.QueryRow(ctx, query, msg.Content, msg.UserId).Scan( &msg.Id, ) } func (m *PGMessageStore) MessageExists(ctx context.Context, msg *message.Message) (bool, error) { query := `SELECT EXISTS(SELECT 1 FROM messages WHERE content = $1 AND user_id = $2)` var exists bool err := m.db.QueryRow(ctx, query, msg.Content, msg.UserId).Scan(&exists) if err != nil { return false, fmt.Errorf("checking if message exists: %w", err) } else { return exists, nil } } func (m *PGMessageStore) GetAllMessages(ctx context.Context) ([]*message.Message, error) { query := `SELECT id, content, user_id FROM messages` rows, err := m.db.Query(ctx, query) if err != nil { return nil, fmt.Errorf("querying all messages: %w", err) } defer rows.Close() var messages []*message.Message for rows.Next() { var msg message.Message if err := rows.Scan( &msg.Id, &msg.Content, &msg.UserId, ); err != nil { return nil, fmt.Errorf("scanning message row: %w", err) } messages = append(messages, &msg) } if err := rows.Err(); err != nil { return nil, fmt.Errorf("iterating message rows: %w", err) } return messages, nil } func (m *PGMessageStore) GetMessageByID(ctx context.Context, id uuid.UUID) (*message.Message, error) { query := `SELECT id, content, user_id FROM messages WHERE id = $1` var msg message.Message err := m.db.QueryRow(ctx, query, id).Scan( &msg.Id, &msg.Content, &msg.UserId, ) if err == pgx.ErrNoRows { return nil, nil } if err != nil { return nil, fmt.Errorf("getting message by ID: %w", err) } return &msg, nil }