2025-11-05 15:06:07 +00:00
|
|
|
package services
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
"attune-heart-therapy/internal/models"
|
|
|
|
|
|
|
|
|
|
"github.com/stripe/stripe-go/v76"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// UserService handles user-related operations
|
|
|
|
|
type UserService interface {
|
|
|
|
|
Register(req RegisterRequest) (*models.User, error)
|
|
|
|
|
Login(email, password string) (*models.User, string, error) // returns user and JWT token
|
|
|
|
|
GetProfile(userID uint) (*models.User, error)
|
|
|
|
|
UpdateProfile(userID uint, req UpdateProfileRequest) (*models.User, error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// BookingService handles booking operations
|
|
|
|
|
type BookingService interface {
|
|
|
|
|
GetAvailableSlots(date time.Time) ([]models.Schedule, error)
|
|
|
|
|
CreateBooking(userID uint, req BookingRequest) (*models.Booking, error)
|
|
|
|
|
GetUserBookings(userID uint) ([]models.Booking, error)
|
|
|
|
|
CancelBooking(userID, bookingID uint) error
|
|
|
|
|
RescheduleBooking(userID, bookingID uint, newScheduleID uint) error
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// PaymentService handles Stripe integration
|
|
|
|
|
type PaymentService interface {
|
|
|
|
|
CreatePaymentIntent(amount float64, currency string) (*stripe.PaymentIntent, error)
|
|
|
|
|
ConfirmPayment(paymentIntentID string) (*stripe.PaymentIntent, error)
|
|
|
|
|
HandleWebhook(payload []byte, signature string) error
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// NotificationService handles email notifications
|
|
|
|
|
type NotificationService interface {
|
|
|
|
|
SendWelcomeEmail(user *models.User) error
|
|
|
|
|
SendPaymentNotification(user *models.User, booking *models.Booking, success bool) error
|
|
|
|
|
SendMeetingInfo(user *models.User, booking *models.Booking) error
|
|
|
|
|
SendReminder(user *models.User, booking *models.Booking) error
|
|
|
|
|
ScheduleReminder(bookingID uint, reminderTime time.Time) error
|
2025-11-05 16:35:36 +00:00
|
|
|
ProcessPendingNotifications() error
|
2025-11-05 15:06:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// JitsiService handles video conference integration
|
|
|
|
|
type JitsiService interface {
|
|
|
|
|
CreateMeeting(bookingID uint, scheduledAt time.Time) (*JitsiMeeting, error)
|
|
|
|
|
GetMeetingURL(roomID string) string
|
|
|
|
|
DeleteMeeting(roomID string) error
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// JitsiMeeting represents a Jitsi meeting
|
|
|
|
|
type JitsiMeeting struct {
|
|
|
|
|
RoomID string `json:"room_id"`
|
|
|
|
|
RoomURL string `json:"room_url"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Request/Response DTOs
|
|
|
|
|
type RegisterRequest struct {
|
|
|
|
|
FirstName string `json:"first_name" binding:"required"`
|
|
|
|
|
LastName string `json:"last_name" binding:"required"`
|
|
|
|
|
Email string `json:"email" binding:"required,email"`
|
|
|
|
|
Phone string `json:"phone"`
|
|
|
|
|
Location string `json:"location"`
|
|
|
|
|
DateOfBirth time.Time `json:"date_of_birth"`
|
|
|
|
|
Password string `json:"password" binding:"required,min=6"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type UpdateProfileRequest struct {
|
|
|
|
|
FirstName string `json:"first_name"`
|
|
|
|
|
LastName string `json:"last_name"`
|
|
|
|
|
Phone string `json:"phone"`
|
|
|
|
|
Location string `json:"location"`
|
|
|
|
|
DateOfBirth time.Time `json:"date_of_birth"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type BookingRequest struct {
|
|
|
|
|
ScheduleID uint `json:"schedule_id" binding:"required"`
|
|
|
|
|
Notes string `json:"notes"`
|
|
|
|
|
Amount float64 `json:"amount" binding:"required"`
|
|
|
|
|
}
|
2025-11-05 15:30:53 +00:00
|
|
|
|
|
|
|
|
// Payment DTOs
|
|
|
|
|
type CreatePaymentIntentRequest struct {
|
|
|
|
|
Amount float64 `json:"amount" binding:"required,gt=0"`
|
|
|
|
|
Currency string `json:"currency"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type ConfirmPaymentRequest struct {
|
|
|
|
|
PaymentIntentID string `json:"payment_intent_id" binding:"required"`
|
|
|
|
|
}
|