Files
schedtxt_api/internal/handler/message_event_response.go
T

101 lines
3.0 KiB
Go

package handler
import (
"net/http"
"time"
"git.kundeng.us/phoenix/textsender-models/tx0/message"
"git.kundeng.us/phoenix/textsender-models/tx0/types"
"github.com/google/uuid"
"git.kundeng.us/phoenix/textsender-api/internal/app"
"git.kundeng.us/phoenix/textsender-api/internal/store"
)
type EventResponseHandler struct {
App *app.App
MessageEventResponseStore store.MessageEventResponseStore
}
func NewEventResponseHandler(apiApp *app.App, str store.MessageEventResponseStore) *EventResponseHandler {
return &EventResponseHandler{App: apiApp, MessageEventResponseStore: str}
}
type RecordEventRequest struct {
ScheduledMessageEventId uuid.UUID `json:"scheduled_message_event_id"`
Response types.JSONB `json:"response"`
UserId uuid.UUID `json:"user_id"`
Sent *time.Time `json:"sent,omitempty"`
Status string `json:"status"`
ContactId *uuid.UUID `json:"contact_id"`
MessageId *uuid.UUID `json:"message_id"`
}
type RecordEventResponse struct {
Message string `json:"message"`
Data []*message.MessageEventResponse `json:"data"`
}
func (e *EventResponseHandler) RecordResponse(w http.ResponseWriter, r *http.Request) {
var req RecordEventRequest
if err := ExtractFromRequest(r, &req); err != nil {
http.Error(w, "Invalid JSON: "+err.Error(), http.StatusBadRequest)
}
defer r.Body.Close()
var statusCode int
var rp message.MessageEventResponse
var resp RecordEventResponse
if req.Sent == nil {
statusCode = http.StatusBadRequest
resp.Message = "Sent time is empty"
} else if req.UserId == uuid.Nil {
statusCode = http.StatusBadRequest
resp.Message = "User Id is empty"
} else if len(req.Response) == 0 {
statusCode = http.StatusBadRequest
resp.Message = "Response is empty"
} else if req.ScheduledMessageEventId == uuid.Nil {
statusCode = http.StatusBadRequest
resp.Message = "Scheduled message event Id is empty"
} else {
rp.ScheduledMessageEventId = req.ScheduledMessageEventId
rp.Response = req.Response
rp.UserId = req.UserId
rp.Sent = *req.Sent
if req.Status == message.Message_Event_Response_Status_Instant {
rp.Status = req.Status
rp.MessageId = req.MessageId
rp.ContactId = req.ContactId
} else if req.Status == message.Message_Event_Response_Status_Scheduled {
rp.Status = req.Status
}
ctx := r.Context()
if err := e.MessageEventResponseStore.Create(ctx, &rp); err != nil {
resp.Message = err.Error()
statusCode = http.StatusInternalServerError
} else {
statusCode = http.StatusCreated
resp.Message = "Successful"
resp.Data = append(resp.Data, &rp)
}
}
RespondWithJSON(w, statusCode, &resp)
}
type GetMessageEventResponseFetchedResponse struct {
Message string `json:"message"`
Data []*message.MessageEventResponse `json:"data"`
}
func (e *EventResponseHandler) Fetch(w http.ResponseWriter, r *http.Request) {
var statusCode int
var resp GetMessageEventResponseFetchedResponse
RespondWithJSON(w, statusCode, &resp)
}