Wire in agent to the reporter texting system
Also rework the so the platform absorbs all the business logic that was going in the wrong place.
This commit is contained in:
parent
a68b8781e7
commit
9914274d42
14 changed files with 86 additions and 76 deletions
|
|
@ -1,55 +0,0 @@
|
|||
package text
|
||||
|
||||
import (
|
||||
"crypto/sha256"
|
||||
"database/sql"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"github.com/Gleipnir-Technology/bob/types/pgtypes"
|
||||
"github.com/Gleipnir-Technology/nidus-sync/db/enums"
|
||||
)
|
||||
|
||||
func convertToPGData(data map[string]string) pgtypes.HStore {
|
||||
result := pgtypes.HStore{}
|
||||
for k, v := range data {
|
||||
result[k] = sql.Null[string]{V: v, Valid: true}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func generatePublicId(t enums.CommsMessagetypeemail, m map[string]string) string {
|
||||
if m == nil || len(m) == 0 {
|
||||
// Return hash of empty string for empty maps
|
||||
emptyHash := sha256.Sum256([]byte(""))
|
||||
return hex.EncodeToString(emptyHash[:])
|
||||
}
|
||||
|
||||
// Get and sort keys for deterministic ordering
|
||||
keys := make([]string, 0, len(m))
|
||||
for k := range m {
|
||||
keys = append(keys, k)
|
||||
}
|
||||
sort.Strings(keys)
|
||||
|
||||
// Build a string with all key-value pairs
|
||||
var sb strings.Builder
|
||||
// Add type first
|
||||
sb.WriteString(fmt.Sprintf("type:%s,", t))
|
||||
for _, k := range keys {
|
||||
sb.WriteString(k)
|
||||
sb.WriteString(":") // Separator between key and value
|
||||
sb.WriteString(m[k])
|
||||
sb.WriteString(",") // Separator between pairs
|
||||
}
|
||||
|
||||
// Compute SHA-256 hash
|
||||
hasher := sha256.New()
|
||||
hasher.Write([]byte(sb.String()))
|
||||
hashBytes := hasher.Sum(nil)
|
||||
|
||||
// Convert to hex string and return
|
||||
return hex.EncodeToString(hashBytes)
|
||||
}
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
package text
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/rs/zerolog/log"
|
||||
)
|
||||
|
||||
type MessageType int
|
||||
|
||||
const (
|
||||
ReportSubscription MessageType = iota
|
||||
)
|
||||
|
||||
type Job interface {
|
||||
content() string
|
||||
destination() string
|
||||
messageType() MessageType
|
||||
messageTypeName() string
|
||||
source() string
|
||||
}
|
||||
|
||||
func Handle(ctx context.Context, job Job) {
|
||||
var err error
|
||||
switch job.messageType() {
|
||||
case ReportSubscription:
|
||||
err = sendReportSubscription(ctx, job)
|
||||
}
|
||||
if err != nil {
|
||||
log.Error().Err(err).Str("dest", job.destination()).Str("type", string(job.messageTypeName())).Msg("Error processing email")
|
||||
return
|
||||
}
|
||||
/*
|
||||
case enums.CommsMessagetypeemailReportStatusScheduled:
|
||||
case enums.CommsMessagetypeemailReportStatusComplete:
|
||||
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
package text
|
||||
|
||||
import (
|
||||
"github.com/rs/zerolog/log"
|
||||
)
|
||||
|
||||
func SendTextFromLLM(content string) {
|
||||
log.Info().Str("content", content).Msg("Pretend I sent a message")
|
||||
}
|
||||
|
|
@ -1,75 +0,0 @@
|
|||
package text
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
//"github.com/Gleipnir-Technology/nidus-sync/db/enums"
|
||||
//"github.com/Gleipnir-Technology/nidus-sync/platform"
|
||||
"github.com/nyaruka/phonenumbers"
|
||||
//"github.com/rs/zerolog/log"
|
||||
)
|
||||
|
||||
func NewJobReportSubscriptionConfirmation(
|
||||
destination E164,
|
||||
report_id string,
|
||||
source E164) jobReportSubscription {
|
||||
return jobReportSubscription{
|
||||
dst: destination,
|
||||
reportID: report_id,
|
||||
src: source,
|
||||
}
|
||||
}
|
||||
|
||||
type jobReportSubscription struct {
|
||||
dst E164
|
||||
reportID string
|
||||
src E164
|
||||
}
|
||||
|
||||
func (j jobReportSubscription) content() string {
|
||||
return fmt.Sprintf("Thanks for submitting mosquito report %s. Text for any questions. We'll send you updates as we get them.", j.reportID)
|
||||
}
|
||||
func (j jobReportSubscription) destination() string {
|
||||
return phonenumbers.Format(&j.dst, phonenumbers.E164)
|
||||
}
|
||||
func (j jobReportSubscription) messageType() MessageType {
|
||||
return ReportSubscription
|
||||
}
|
||||
func (j jobReportSubscription) messageTypeName() string {
|
||||
return "report-subscription"
|
||||
}
|
||||
func (j jobReportSubscription) source() string {
|
||||
return phonenumbers.Format(&j.src, phonenumbers.E164)
|
||||
}
|
||||
|
||||
func sendReportSubscription(ctx context.Context, job Job) error {
|
||||
/*
|
||||
j, ok := job.(jobReportSubscription)
|
||||
if !ok {
|
||||
return fmt.Errorf("job is not for report subscription confirmation")
|
||||
}
|
||||
|
||||
sub, err := isSubscribed(ctx, job.destination())
|
||||
if err != nil {
|
||||
return fmt.Errorf("Failed to check if subscribed: %w", err)
|
||||
}
|
||||
if !sub {
|
||||
err = sendText(ctx, j.source(), j.destination(), j.content(), enums.CommsTextoriginWebsiteAction, false)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Failed to send report subscription confirmation: %w", err)
|
||||
}
|
||||
} else {
|
||||
err = delayMessage(ctx, j.source(), j.destination(), j.content(), enums.CommsTextjobtypeReportConfirmation)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Failed to delay report subscription message: %w", err)
|
||||
}
|
||||
err := ensureInitialText(ctx, j.source(), j.destination())
|
||||
if err != nil {
|
||||
return fmt.Errorf("Failed to ensure initial text has been sent: %w", err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
*/
|
||||
return nil
|
||||
}
|
||||
|
|
@ -6,18 +6,11 @@ import (
|
|||
"fmt"
|
||||
|
||||
"github.com/Gleipnir-Technology/nidus-sync/config"
|
||||
"github.com/nyaruka/phonenumbers"
|
||||
"github.com/rs/zerolog/log"
|
||||
"github.com/twilio/twilio-go"
|
||||
twilioApi "github.com/twilio/twilio-go/rest/api/v2010"
|
||||
)
|
||||
|
||||
type E164 = phonenumbers.PhoneNumber
|
||||
|
||||
func ParsePhoneNumber(input string) (*E164, error) {
|
||||
return phonenumbers.Parse(input, "US")
|
||||
}
|
||||
|
||||
func SendText(ctx context.Context, source string, destination string, message string) (string, error) {
|
||||
client := twilio.NewRestClient()
|
||||
|
||||
|
|
@ -31,11 +24,11 @@ func SendText(ctx context.Context, source string, destination string, message st
|
|||
if err != nil {
|
||||
return "", fmt.Errorf("Failed to create message to %s: %w", destination, err)
|
||||
}
|
||||
//log.Info().Str("dest", destination).Str("sid", *resp.Body).Msg("Text message response")
|
||||
if resp.Sid == nil {
|
||||
log.Warn().Str("src", source).Str("dst", destination).Msg("Text message sid is nil")
|
||||
return "", nil
|
||||
}
|
||||
log.Info().Str("src", source).Str("dst", destination).Str("message", message).Str("sid", *resp.Sid).Msg("Created text message")
|
||||
return *resp.Sid, nil
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue