Files
atahango/internal/services/contact_service.go
Beyhan Oğur bbbf76b184 first commit
2026-04-26 21:35:24 +03:00

96 lines
2.4 KiB
Go

package services
import (
"errors"
"fmt"
"gauth-central/internal/database"
"gauth-central/internal/models"
"gauth-central/pkg/utils"
"github.com/google/uuid"
"gorm.io/gorm"
)
type ContactService struct{}
func NewContactService() *ContactService {
return &ContactService{}
}
func (s *ContactService) CreateContact(name, email, subject, message, ip string, userID *string) (*models.Contact, error) {
var userUUID *uuid.UUID
if userID != nil {
parsedUUID, err := uuid.Parse(*userID)
if err == nil {
userUUID = &parsedUUID
}
}
contact := models.Contact{
Name: name,
Email: email,
Subject: subject,
Message: message,
IP: ip,
UserID: userUUID,
}
if err := database.DB.Create(&contact).Error; err != nil {
return nil, err
}
// Send email asynchronously (like Celery task)
go func() {
// In a real production app, you might want to use a proper task queue here
// For now, we'll just use a goroutine
err := utils.SendContactEmail(contact.Name, contact.Email, contact.Subject, contact.Message, contact.IP)
if err != nil {
fmt.Printf("Failed to send contact email: %v\n", err)
}
}()
return &contact, nil
}
// GetAllContacts retrieves all contact messages with pagination
func (s *ContactService) GetAllContacts(page, limit int) ([]models.Contact, int64, error) {
var contacts []models.Contact
var total int64
offset := (page - 1) * limit
if err := database.DB.Model(&models.Contact{}).Count(&total).Error; err != nil {
return nil, 0, err
}
if err := database.DB.Preload("User").Order("created_at desc").Limit(limit).Offset(offset).Find(&contacts).Error; err != nil {
return nil, 0, err
}
return contacts, total, nil
}
// GetContactByID retrieves a single contact message by ID
func (s *ContactService) GetContactByID(id string) (*models.Contact, error) {
var contact models.Contact
if err := database.DB.Preload("User").Where("id = ?", id).First(&contact).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, errors.New("contact not found")
}
return nil, err
}
return &contact, nil
}
// DeleteContact deletes a contact message by ID
func (s *ContactService) DeleteContact(id string) error {
result := database.DB.Delete(&models.Contact{}, "id = ?", id)
if result.Error != nil {
return result.Error
}
if result.RowsAffected == 0 {
return errors.New("contact not found")
}
return nil
}