* Implemented new endpoints for sending various message types: - Audio - Sticker - Location - Contacts - Interactive messages - Template messages - Flow messages - Reactions - Marking messages as read * Added template management endpoints: - List templates - Upload templates - Delete templates * Introduced flow management endpoints: - List flows - Create flows - Get flow details - Upload flow assets - Publish flows - Delete flows * Added phone number management endpoints: - List phone numbers - Request verification code - Verify code * Enhanced media management with delete media endpoint. * Updated dependencies.
92 lines
2.5 KiB
Go
92 lines
2.5 KiB
Go
package handlers
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"git.warky.dev/wdevs/whatshooked/pkg/config"
|
|
"git.warky.dev/wdevs/whatshooked/pkg/hooks"
|
|
"git.warky.dev/wdevs/whatshooked/pkg/logging"
|
|
"git.warky.dev/wdevs/whatshooked/pkg/whatsapp"
|
|
"git.warky.dev/wdevs/whatshooked/pkg/whatsapp/businessapi"
|
|
)
|
|
|
|
// Handlers holds all HTTP handlers with their dependencies
|
|
type Handlers struct {
|
|
whatsappMgr *whatsapp.Manager
|
|
hookMgr *hooks.Manager
|
|
config *config.Config
|
|
configPath string
|
|
|
|
// Auth configuration
|
|
authConfig *AuthConfig
|
|
}
|
|
|
|
// AuthConfig configures authentication behavior
|
|
type AuthConfig struct {
|
|
// Validator is a custom auth validator function
|
|
// If nil, uses built-in auth (API key, basic auth)
|
|
Validator func(r *http.Request) bool
|
|
|
|
// Built-in auth settings
|
|
APIKey string
|
|
Username string
|
|
Password string
|
|
|
|
// Skip auth entirely (not recommended for production)
|
|
Disabled bool
|
|
}
|
|
|
|
// New creates a new Handlers instance
|
|
func New(mgr *whatsapp.Manager, hookMgr *hooks.Manager, cfg *config.Config, configPath string) *Handlers {
|
|
return &Handlers{
|
|
whatsappMgr: mgr,
|
|
hookMgr: hookMgr,
|
|
config: cfg,
|
|
configPath: configPath,
|
|
authConfig: &AuthConfig{
|
|
APIKey: cfg.Server.AuthKey,
|
|
Username: cfg.Server.Username,
|
|
Password: cfg.Server.Password,
|
|
},
|
|
}
|
|
}
|
|
|
|
// WithAuthConfig sets custom auth configuration
|
|
func (h *Handlers) WithAuthConfig(cfg *AuthConfig) *Handlers {
|
|
h.authConfig = cfg
|
|
return h
|
|
}
|
|
|
|
// getBusinessAPIClient looks up an account and asserts it is a Business API client.
|
|
// Returns a typed *businessapi.Client or an error with an appropriate message.
|
|
func (h *Handlers) getBusinessAPIClient(accountID string) (*businessapi.Client, error) {
|
|
if accountID == "" {
|
|
return nil, fmt.Errorf("account_id is required")
|
|
}
|
|
client, exists := h.whatsappMgr.GetClient(accountID)
|
|
if !exists {
|
|
return nil, fmt.Errorf("account %s not found", accountID)
|
|
}
|
|
baClient, ok := client.(*businessapi.Client)
|
|
if !ok {
|
|
return nil, fmt.Errorf("account %s is not a Business API account (type: %s)", accountID, client.GetType())
|
|
}
|
|
return baClient, nil
|
|
}
|
|
|
|
// writeJSON is a helper that writes JSON response and logs errors
|
|
func writeJSON(w http.ResponseWriter, v interface{}) {
|
|
if err := json.NewEncoder(w).Encode(v); err != nil {
|
|
logging.Error("Failed to encode JSON response", "error", err)
|
|
}
|
|
}
|
|
|
|
// writeBytes is a helper that writes bytes and logs errors
|
|
func writeBytes(w http.ResponseWriter, data []byte) {
|
|
if _, err := w.Write(data); err != nil {
|
|
logging.Error("Failed to write response", "error", err)
|
|
}
|
|
}
|