first commit
This commit is contained in:
95
internal/services/contact_service.go
Normal file
95
internal/services/contact_service.go
Normal file
@@ -0,0 +1,95 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user