135 lines
3.1 KiB
Go
135 lines
3.1 KiB
Go
package services
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"gauth-central/internal/database"
|
|
"gauth-central/internal/models"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type MainMenuService struct{}
|
|
|
|
func NewMainMenuService() *MainMenuService {
|
|
return &MainMenuService{}
|
|
}
|
|
|
|
// CreateMainMenu creates a new main menu entry.
|
|
func (s *MainMenuService) CreateMainMenu(home string, about string, services string, resume string, portfolio string, contact string, isActive bool) (*models.MainMenu, error) {
|
|
item := models.MainMenu{
|
|
Home: home,
|
|
About: about,
|
|
Services: services,
|
|
Resume: resume,
|
|
Portfolio: portfolio,
|
|
Contact: contact,
|
|
IsActive: isActive,
|
|
}
|
|
|
|
if err := database.DB.Create(&item).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return s.GetMainMenuByID(item.ID.String())
|
|
}
|
|
|
|
// GetAllMainMenus retrieves all main menu entries. Use onlyActive to filter public data.
|
|
func (s *MainMenuService) GetAllMainMenus(onlyActive bool) ([]models.MainMenu, error) {
|
|
var items []models.MainMenu
|
|
query := database.DB.Order("created_at desc")
|
|
if onlyActive {
|
|
query = query.Where("is_active = ?", true)
|
|
}
|
|
|
|
if err := query.Find(&items).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return items, nil
|
|
}
|
|
|
|
// GetFirstActiveMainMenu returns the newest active main menu entry.
|
|
func (s *MainMenuService) GetFirstActiveMainMenu() (*models.MainMenu, error) {
|
|
var item models.MainMenu
|
|
if err := database.DB.Where("is_active = ?", true).Order("created_at desc").First(&item).Error; err != nil {
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return nil, errors.New("main menu not found")
|
|
}
|
|
return nil, err
|
|
}
|
|
return &item, nil
|
|
}
|
|
|
|
// GetMainMenuByID retrieves a main menu entry by ID.
|
|
func (s *MainMenuService) GetMainMenuByID(id string) (*models.MainMenu, error) {
|
|
var item models.MainMenu
|
|
if err := database.DB.Where("id = ?", id).First(&item).Error; err != nil {
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return nil, errors.New("main menu not found")
|
|
}
|
|
return nil, err
|
|
}
|
|
return &item, nil
|
|
}
|
|
|
|
// UpdateMainMenu updates an existing main menu entry.
|
|
func (s *MainMenuService) UpdateMainMenu(
|
|
id string,
|
|
home *string,
|
|
about *string,
|
|
services *string,
|
|
resume *string,
|
|
portfolio *string,
|
|
contact *string,
|
|
isActive *bool,
|
|
) (*models.MainMenu, error) {
|
|
item, err := s.GetMainMenuByID(id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
updates := map[string]interface{}{}
|
|
if home != nil {
|
|
updates["home"] = *home
|
|
}
|
|
if about != nil {
|
|
updates["about"] = *about
|
|
}
|
|
if services != nil {
|
|
updates["services"] = *services
|
|
}
|
|
if resume != nil {
|
|
updates["resume"] = *resume
|
|
}
|
|
if portfolio != nil {
|
|
updates["portfolio"] = *portfolio
|
|
}
|
|
if contact != nil {
|
|
updates["contact"] = *contact
|
|
}
|
|
if isActive != nil {
|
|
updates["is_active"] = *isActive
|
|
}
|
|
|
|
if len(updates) > 0 {
|
|
if err := database.DB.Model(item).Updates(updates).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
return s.GetMainMenuByID(id)
|
|
}
|
|
|
|
// DeleteMainMenu deletes a main menu entry by ID.
|
|
func (s *MainMenuService) DeleteMainMenu(id string) error {
|
|
result := database.DB.Delete(&models.MainMenu{}, "id = ?", id)
|
|
if result.Error != nil {
|
|
return result.Error
|
|
}
|
|
if result.RowsAffected == 0 {
|
|
return errors.New("main menu not found")
|
|
}
|
|
return nil
|
|
}
|