tsk-44: Record when message was sent (#48)

Closes #44

Reviewed-on: phoenix/textsender-api#48
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
This commit is contained in:
phoenix
2025-12-01 21:29:31 +00:00
committed by phoenix
parent 34262cda68
commit fddf0f7f87
13 changed files with 308 additions and 44 deletions
@@ -0,0 +1,30 @@
package store
import (
"context"
"git.kundeng.us/phoenix/textsender-models/tx0/message"
"github.com/jackc/pgx/v5/pgxpool"
)
type MessageEventResponseStore interface {
Create(ctx context.Context, mer *message.MessageEventResponse) error
}
type PGMessageEventResponseStore struct {
db *pgxpool.Pool
}
func NewMessageEventResponseStore(db *pgxpool.Pool) *PGMessageEventResponseStore {
return &PGMessageEventResponseStore{db: db}
}
func (m *PGMessageEventResponseStore) Create(ctx context.Context, mer *message.MessageEventResponse) error {
query := `
INSERT INTO message_event_responses (scheduled_message_event_id, response, user_id, sent)
VALUES ($1, $2, $3, $4)
RETURNING id
`
return m.db.QueryRow(ctx, query, mer.ScheduledMessageEventId, mer.Response, mer.UserId, mer.Sent).Scan(&mer.Id)
}
@@ -0,0 +1,59 @@
package mock
import (
"context"
"fmt"
"sync"
"time"
"git.kundeng.us/phoenix/textsender-models/tx0/message"
"github.com/google/uuid"
)
type MessageEventResponseKey struct {
ScheduledMessageEventId uuid.UUID
UserId uuid.UUID
}
type MockMessageEventResponseStore struct {
MessageEventResponses map[uuid.UUID]*message.MessageEventResponse
MessageEventResponsesByKey map[MessageEventResponseKey]*message.MessageEventResponse
mu sync.RWMutex
Error error
}
func NewMockMessageEventResponseStore() *MockMessageEventResponseStore {
return &MockMessageEventResponseStore{
MessageEventResponses: make(map[uuid.UUID]*message.MessageEventResponse),
MessageEventResponsesByKey: make(map[MessageEventResponseKey]*message.MessageEventResponse),
}
}
func (m *MockMessageEventResponseStore) Create(ctx context.Context, mer *message.MessageEventResponse) error {
m.mu.Lock()
defer m.mu.Unlock()
if m.Error != nil {
return m.Error
}
if mer.Id == uuid.Nil {
mer.Id = uuid.New()
}
if len(mer.Response) == 0 {
return fmt.Errorf("Response is empty")
} else if mer.ScheduledMessageEventId == uuid.Nil {
return fmt.Errorf("Scheduled message event Id is nil")
} else if mer.UserId == uuid.Nil {
return fmt.Errorf("User Id is nil")
} else {
key := MessageEventResponseKey{ScheduledMessageEventId: mer.ScheduledMessageEventId, UserId: mer.UserId}
sent := time.Now()
mer.Sent = sent
m.MessageEventResponses[mer.Id] = mer
m.MessageEventResponsesByKey[key] = mer
return nil
}
}