entry_store.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package postgres
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "github.com/jackc/pgx/v5"
  7. )
  8. type EntryChannel struct {
  9. ID string
  10. ChannelCode string
  11. ChannelType string
  12. PlatformAppID *string
  13. DisplayName string
  14. Status string
  15. IsDefault bool
  16. TenantID string
  17. TenantCode string
  18. TenantName string
  19. }
  20. type FindEntryChannelParams struct {
  21. ChannelCode string
  22. ChannelType string
  23. PlatformAppID string
  24. TenantCode string
  25. }
  26. func (s *Store) FindEntryChannel(ctx context.Context, params FindEntryChannelParams) (*EntryChannel, error) {
  27. row := s.pool.QueryRow(ctx, `
  28. SELECT
  29. ec.id,
  30. ec.channel_code,
  31. ec.channel_type,
  32. ec.platform_app_id,
  33. ec.display_name,
  34. ec.status,
  35. ec.is_default,
  36. t.id,
  37. t.tenant_code,
  38. t.name
  39. FROM entry_channels ec
  40. JOIN tenants t ON t.id = ec.tenant_id
  41. WHERE ($1 = '' OR ec.channel_code = $1)
  42. AND ($2 = '' OR ec.channel_type = $2)
  43. AND ($3 = '' OR COALESCE(ec.platform_app_id, '') = $3)
  44. AND ($4 = '' OR t.tenant_code = $4)
  45. ORDER BY ec.is_default DESC, ec.created_at ASC
  46. LIMIT 1
  47. `, params.ChannelCode, params.ChannelType, params.PlatformAppID, params.TenantCode)
  48. var entry EntryChannel
  49. err := row.Scan(
  50. &entry.ID,
  51. &entry.ChannelCode,
  52. &entry.ChannelType,
  53. &entry.PlatformAppID,
  54. &entry.DisplayName,
  55. &entry.Status,
  56. &entry.IsDefault,
  57. &entry.TenantID,
  58. &entry.TenantCode,
  59. &entry.TenantName,
  60. )
  61. if errors.Is(err, pgx.ErrNoRows) {
  62. return nil, nil
  63. }
  64. if err != nil {
  65. return nil, fmt.Errorf("find entry channel: %w", err)
  66. }
  67. return &entry, nil
  68. }