diff --git a/cmd/api/main.go b/cmd/api/main.go index 6d43dd0..54da959 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -64,12 +64,12 @@ func main() { contactStore := store.NewContactStore(db.Pool) messageStore := store.NewMessageStore(db.Pool) schStore := store.NewScheduledMessageStore(db.Pool) - schMsgEvent := store.NewScheduledMessageEventStore(db.Pool) + schMsgEventStore := store.NewScheduledMessageEventStore(db.Pool) contactHandler := handler.NewContactHandler(contactStore) messageHandler := handler.NewMessageHandler(messageStore) scheduledMessageHandler := handler.NewScheduledMessageHandler(schStore) - scheduledMessageEventHandler := handler.NewScheduledMessageEventHandler(schMsgEvent) + scheduledMessageEventHandler := handler.NewScheduledMessageEventHandler(schMsgEventStore) router := chi.NewRouter() diff --git a/cmd/api/main_test.go b/cmd/api/main_test.go index 944ec5d..76b1601 100644 --- a/cmd/api/main_test.go +++ b/cmd/api/main_test.go @@ -4,6 +4,7 @@ import ( "context" "flag" "fmt" + "net/http" "os" "path" "testing" @@ -15,6 +16,8 @@ import ( "git.kundeng.us/phoenix/textsender-api/internal/db" "git.kundeng.us/phoenix/textsender-api/internal/handler" "git.kundeng.us/phoenix/textsender-api/internal/handler/endpoint" + mdlware "git.kundeng.us/phoenix/textsender-api/internal/middleware" + "git.kundeng.us/phoenix/textsender-api/internal/services" "git.kundeng.us/phoenix/textsender-api/internal/store" ) @@ -23,25 +26,51 @@ var testRouter *mux.Router func TestMain(m *testing.M) { cfg := load() - db, err := db.NewDatabase(cfg.GetDBConnString()) + database, err := db.NewDatabase(cfg.GetDBConnString()) if err != nil { fmt.Println(err.Error()) panic("Failed to initialize database") } - defer db.Close() + defer database.Close() ctx := context.Background() - err = db.ResetDatabase(ctx) - if err != nil { - fmt.Println(err.Error()) - panic("Failed to initialize database") + + if cfg.ResetDB { + if err = database.ResetDatabase(ctx); err != nil { + fmt.Println(err.Error()) + panic("Failed to initialize database") + } + } else { + if exists, err := db.TableExists(ctx, database.Pool, "contacts "); err == nil && !exists { + fmt.Println("Resetting database") + err = database.ResetDatabase(ctx) + if err != nil { + fmt.Printf("Error:%v", err) + } + } else { + fmt.Printf("Error:%v", err) + } } - contactStore := store.NewContactStore(db.Pool) + jwtService := services.NewJWTService(cfg.JWTSecret) + + contactStore := store.NewContactStore(database.Pool) + messageStore := store.NewMessageStore(db.Pool) + schStore := store.NewScheduledMessageStore(db.Pool) + schMsgEventStore := store.NewScheduledMessageEventStore(db.Pool) + contactHandler := handler.NewContactHandler(contactStore) + messageHandler := handler.NewMessageHandler(messageStore) + scheduledMessageHandler := handler.NewScheduledMessageHandler(schStore) + scheduledMessageEventHandler := handler.NewScheduledMessageEventHandler(schMsgEventStore) testRouter = mux.NewRouter() testRouter.HandleFunc(endpoint.ADD_CONTACT_ENDPOINT, contactHandler.AddContact).Methods("POST") + testRouter.Handle(endpoint.GET_CONTACT, mdlware.AuthMiddleware(jwtService)(http.HandlerFunc(contactHandler.GetContact))) + testRouter.Handle(endpoint.ADD_MESSAGE, mdlware.AuthMiddleware(jwtService)(http.HandlerFunc(messageHandler.AddMessage))) + testRouter.Handle(endpoint.GET_MESSAGE, mdlware.AuthMiddleware(jwtService)(http.HandlerFunc(messageHandler.GetMessage))) + testRouter.Handle(endpoint.ScheduleMessageEndpoint, mdlware.AuthMiddleware(jwtService)(http.HandlerFunc(scheduledMessageHandler.AddScheduledMessage))) + testRouter.Handle(endpoint.AddEventToScheduledMessageEndpoint, mdlware.AuthMiddleware(jwtService)(http.HandlerFunc(scheduledMessageEventHandler.AddScheduledMessageEvent))) code := m.Run() os.Exit(code) diff --git a/internal/handler/contact_test.go b/internal/handler/contact_test.go index 445aa81..9504cf9 100644 --- a/internal/handler/contact_test.go +++ b/internal/handler/contact_test.go @@ -15,6 +15,7 @@ import ( "git.kundeng.us/phoenix/textsender-api/internal/db" "git.kundeng.us/phoenix/textsender-api/internal/handler/endpoint" + "git.kundeng.us/phoenix/textsender-api/internal/store/mock" ) type Request struct { @@ -23,7 +24,7 @@ type Request struct { } func TestCreateContactWithMock(t *testing.T) { - mockstore := NewMockContactStore() + mockstore := mock.NewMockContactStore() handler := NewContactHandler(mockstore) testUserId := uuid.New() @@ -47,7 +48,7 @@ func TestCreateContactWithMock(t *testing.T) { } func TestGetContactWithMock(t *testing.T) { - mockstore := NewMockContactStore() + mockstore := mock.NewMockContactStore() testUserId := uuid.New() testCon := contact.Contact{PhoneNumber: "+12335403383", UserId: testUserId} diff --git a/internal/handler/message_test.go b/internal/handler/message_test.go index 60ac9b2..6478b82 100644 --- a/internal/handler/message_test.go +++ b/internal/handler/message_test.go @@ -13,6 +13,7 @@ import ( "github.com/stretchr/testify/assert" "git.kundeng.us/phoenix/textsender-api/internal/handler/endpoint" + "git.kundeng.us/phoenix/textsender-api/internal/store/mock" ) type CreateMessageRequest struct { @@ -21,7 +22,7 @@ type CreateMessageRequest struct { } func TestCreateMessageWithMock(t *testing.T) { - mockStore := NewMockMessageStore() + mockStore := mock.NewMockMessageStore() handler := NewMessageHandler(mockStore) testUserId := uuid.New() @@ -45,7 +46,7 @@ func TestCreateMessageWithMock(t *testing.T) { } func TestGetMessageWithMock(t *testing.T) { - mockstore := NewMockMessageStore() + mockstore := mock.NewMockMessageStore() testUserId := uuid.New() testCon := message.Message{Content: "Who is the one that benefits?", UserId: testUserId} diff --git a/internal/handler/scheduled_message_event_test.go b/internal/handler/scheduled_message_event_test.go index 8b55181..eb8d906 100644 --- a/internal/handler/scheduled_message_event_test.go +++ b/internal/handler/scheduled_message_event_test.go @@ -15,6 +15,7 @@ import ( "github.com/stretchr/testify/assert" "git.kundeng.us/phoenix/textsender-api/internal/handler/endpoint" + "git.kundeng.us/phoenix/textsender-api/internal/store/mock" ) type CreateScheduledMessageEventRequest struct { @@ -26,10 +27,11 @@ type CreateScheduledMessageEventRequest struct { func TestCreateScheduledMessageEventWithMock(t *testing.T) { now := time.Now() - mockStore := NewMockScheduledMessageEventStore() - contactStore := NewMockContactStore() - messageStore := NewMockMessageStore() - schMsgStore := NewMockScheduledMessageStore() + mockStore := mock.NewMockScheduledMessageEventStore() + contactStore := mock.NewMockContactStore() + messageStore := mock.NewMockMessageStore() + schMsgStore := mock.NewMockScheduledMessageStore() + handler := NewScheduledMessageEventHandler(mockStore) recipientId := uuid.New() @@ -50,7 +52,7 @@ func TestCreateScheduledMessageEventWithMock(t *testing.T) { schMsg := scheduling.ScheduledMessage{} schMsg.Id = scheduledMessageId schMsg.UserId = testUserId - schMsg.Scheduled = now.Add(20*time.Minute) + schMsg.Scheduled = now.Add(20 * time.Minute) ctx := t.Context() diff --git a/internal/handler/scheduled_message_test.go b/internal/handler/scheduled_message_test.go index 2e5ffa3..115c633 100644 --- a/internal/handler/scheduled_message_test.go +++ b/internal/handler/scheduled_message_test.go @@ -13,6 +13,7 @@ import ( "github.com/stretchr/testify/assert" "git.kundeng.us/phoenix/textsender-api/internal/handler/endpoint" + "git.kundeng.us/phoenix/textsender-api/internal/store/mock" ) type CreateScheduledMessageRequest struct { @@ -23,7 +24,7 @@ type CreateScheduledMessageRequest struct { func TestCreateScheduledMessageWithMock(t *testing.T) { now := time.Now() - mockStore := NewMockScheduledMessageStore() + mockStore := mock.NewMockScheduledMessageStore() handler := NewScheduledMessageHandler(mockStore) testUserId := uuid.New() diff --git a/internal/handler/mock_store_test.go b/internal/store/mock/mock_store.go similarity index 96% rename from internal/handler/mock_store_test.go rename to internal/store/mock/mock_store.go index 417159e..93200d1 100644 --- a/internal/handler/mock_store_test.go +++ b/internal/store/mock/mock_store.go @@ -1,10 +1,11 @@ -package handler +package mock import ( "context" "errors" "fmt" "sync" + "time" "github.com/google/uuid" @@ -272,12 +273,12 @@ func (m *MockScheduledMessageEventStore) CreateScheduledMessageEvent(ctx context event.Id = uuid.New() } - if exists, err := m.Exists(ctx, event); err != nil { - return err - } else if exists { + key := ScheduledMessageEventKey{RecipientId: event.RecipientId, MessageId: event.MessageId, ScheduledMessageId: event.ScheduledMessageId} + + if _, exists := m.ScheduledMessageEventsByKey[key]; exists { return fmt.Errorf("Already exists") } else { - key := ScheduledMessageEventKey{RecipientId: event.RecipientId, MessageId: event.MessageId, ScheduledMessageId: event.ScheduledMessageId} + event.Created = time.Now() m.ScheduledMessageEvents[event.Id] = event m.ScheduledMessageEventsByKey[key] = event return nil diff --git a/migrations/schema.sql b/migrations/schema.sql index 5e0cefe..534509c 100644 --- a/migrations/schema.sql +++ b/migrations/schema.sql @@ -2,19 +2,19 @@ CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; DROP TABLE IF EXISTS contacts CASCADE; -CREATE TABLE contacts ( +CREATE TABLE IF NOT EXISTS contacts ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), phone_number TEXT NOT NULL, user_id UUID NOT NULL ); -CREATE TABLE messages ( +CREATE TABLE IF NOT EXISTS messages ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), content TEXT NOT NULL, user_id UUID NOT NULL ); -CREATE TABLE scheduled_messages ( +CREATE TABLE IF NOT EXISTS scheduled_messages ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), scheduled timestamptz NOT NULL, created timestamptz DEFAULT now(), @@ -22,7 +22,7 @@ CREATE TABLE scheduled_messages ( user_id UUID NOT NULL ); -CREATE TABLE scheduled_message_events ( +CREATE TABLE IF NOT EXISTS scheduled_message_events ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), recipient_id UUID NOT NULL, message_id UUID NOT NULL,