104 lines
2.4 KiB
Go
104 lines
2.4 KiB
Go
package services
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"gauth-central/internal/database"
|
|
"gauth-central/internal/models"
|
|
|
|
"github.com/google/uuid"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type ExperienceService struct{}
|
|
|
|
func NewExperienceService() *ExperienceService {
|
|
return &ExperienceService{}
|
|
}
|
|
|
|
func (s *ExperienceService) GetAllExperiences(resumeID *string, onlyActive bool) ([]models.Experience, error) {
|
|
var items []models.Experience
|
|
query := database.DB.Order("created_at desc")
|
|
|
|
if resumeID != nil {
|
|
query = query.Where("resume_id = ?", *resumeID)
|
|
}
|
|
|
|
if onlyActive {
|
|
query = query.Where("is_active = ?", true)
|
|
}
|
|
|
|
if err := query.Find(&items).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
func (s *ExperienceService) GetExperienceByID(id string) (*models.Experience, error) {
|
|
var item models.Experience
|
|
if err := database.DB.Where("id = ?", id).First(&item).Error; err != nil {
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return nil, errors.New("experience not found")
|
|
}
|
|
return nil, err
|
|
}
|
|
return &item, nil
|
|
}
|
|
|
|
func (s *ExperienceService) CreateExperience(betweenYears, title, content string, resumeID *uuid.UUID, isActive bool) (*models.Experience, error) {
|
|
item := models.Experience{
|
|
BetweenYears: betweenYears,
|
|
Title: title,
|
|
Content: content,
|
|
ResumeID: resumeID,
|
|
IsActive: isActive,
|
|
}
|
|
|
|
if err := database.DB.Create(&item).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
return &item, nil
|
|
}
|
|
|
|
func (s *ExperienceService) UpdateExperience(id string, betweenYears, title, content *string, resumeID *uuid.UUID, isActive *bool) (*models.Experience, error) {
|
|
item, err := s.GetExperienceByID(id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
updates := map[string]interface{}{}
|
|
if betweenYears != nil {
|
|
updates["between_years"] = *betweenYears
|
|
}
|
|
if title != nil {
|
|
updates["title"] = *title
|
|
}
|
|
if content != nil {
|
|
updates["content"] = *content
|
|
}
|
|
if resumeID != nil {
|
|
updates["resume_id"] = *resumeID
|
|
}
|
|
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.GetExperienceByID(id)
|
|
}
|
|
|
|
func (s *ExperienceService) DeleteExperience(id string) error {
|
|
result := database.DB.Delete(&models.Experience{}, "id = ?", id)
|
|
if result.Error != nil {
|
|
return result.Error
|
|
}
|
|
if result.RowsAffected == 0 {
|
|
return errors.New("experience not found")
|
|
}
|
|
return nil
|
|
}
|