phone.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package store
  2. import (
  3. "context"
  4. "database/sql"
  5. "errors"
  6. "fmt"
  7. "strings"
  8. "time"
  9. )
  10. func (s *Store) UpsertPhoneAssociation(ctx context.Context, value PhoneAssociation) error {
  11. value.ICCID = strings.TrimSpace(value.ICCID)
  12. value.DeviceID = strings.TrimSpace(value.DeviceID)
  13. value.Number = strings.TrimSpace(value.Number)
  14. value.Source = strings.TrimSpace(value.Source)
  15. if value.ICCID == "" || value.Number == "" || value.Source == "" {
  16. return errors.New("phone association ICCID, number, and source are required")
  17. }
  18. now := time.Now().UTC()
  19. createdAt := value.CreatedAt
  20. if createdAt.IsZero() {
  21. createdAt = now
  22. }
  23. updatedAt := value.UpdatedAt
  24. if updatedAt.IsZero() {
  25. updatedAt = now
  26. }
  27. _, err := s.db.ExecContext(ctx, `
  28. INSERT INTO phone_associations (
  29. iccid, device_id, number, source, created_at, updated_at
  30. ) VALUES (?, ?, ?, ?, ?, ?)
  31. ON CONFLICT(iccid) DO UPDATE SET
  32. device_id = excluded.device_id,
  33. number = excluded.number,
  34. source = excluded.source,
  35. updated_at = excluded.updated_at
  36. `,
  37. value.ICCID,
  38. value.DeviceID,
  39. value.Number,
  40. value.Source,
  41. createdAt.Unix(),
  42. updatedAt.Unix(),
  43. )
  44. if err != nil {
  45. return fmt.Errorf("upsert phone association for ICCID %q: %w", value.ICCID, err)
  46. }
  47. return nil
  48. }
  49. func (s *Store) PhoneAssociation(
  50. ctx context.Context,
  51. iccid string,
  52. ) (PhoneAssociation, error) {
  53. var value PhoneAssociation
  54. var createdAt, updatedAt int64
  55. err := s.db.QueryRowContext(ctx, `
  56. SELECT iccid, device_id, number, source, created_at, updated_at
  57. FROM phone_associations
  58. WHERE iccid = ?
  59. `, strings.TrimSpace(iccid)).Scan(
  60. &value.ICCID,
  61. &value.DeviceID,
  62. &value.Number,
  63. &value.Source,
  64. &createdAt,
  65. &updatedAt,
  66. )
  67. if errors.Is(err, sql.ErrNoRows) {
  68. return PhoneAssociation{}, ErrNotFound
  69. }
  70. if err != nil {
  71. return PhoneAssociation{}, err
  72. }
  73. value.CreatedAt = time.Unix(createdAt, 0).UTC()
  74. value.UpdatedAt = time.Unix(updatedAt, 0).UTC()
  75. return value, nil
  76. }