package service import ( "database/sql" "time" "github.com/daniil/homelab-api/internal/model" "github.com/daniil/homelab-api/internal/repository" ) type TaskService struct { taskRepo *repository.TaskRepository } func NewTaskService(taskRepo *repository.TaskRepository) *TaskService { return &TaskService{taskRepo: taskRepo} } func (s *TaskService) Create(userID int64, req *model.CreateTaskRequest) (*model.Task, error) { task := &model.Task{ UserID: userID, Title: req.Title, Description: req.Description, Icon: defaultString(req.Icon, "📋"), Color: defaultString(req.Color, "#6B7280"), Priority: req.Priority, } if req.DueDate != nil && *req.DueDate != "" { parsed, err := time.Parse("2006-01-02", *req.DueDate) if err == nil { task.DueDate = sql.NullTime{Time: parsed, Valid: true} } } if req.ReminderTime != nil && *req.ReminderTime != "" { task.ReminderTime = sql.NullString{String: *req.ReminderTime, Valid: true} } if err := s.taskRepo.Create(task); err != nil { return nil, err } task.ProcessForJSON() return task, nil } func (s *TaskService) Get(id, userID int64) (*model.Task, error) { return s.taskRepo.GetByID(id, userID) } func (s *TaskService) List(userID int64, completed *bool) ([]model.Task, error) { tasks, err := s.taskRepo.ListByUser(userID, completed) if err != nil { return nil, err } if tasks == nil { tasks = []model.Task{} } return tasks, nil } func (s *TaskService) GetTodayTasks(userID int64) ([]model.Task, error) { tasks, err := s.taskRepo.GetTodayTasks(userID) if err != nil { return nil, err } if tasks == nil { tasks = []model.Task{} } return tasks, nil } func (s *TaskService) Update(id, userID int64, req *model.UpdateTaskRequest) (*model.Task, error) { task, err := s.taskRepo.GetByID(id, userID) if err != nil { return nil, err } if req.Title != nil { task.Title = *req.Title } if req.Description != nil { task.Description = *req.Description } if req.Icon != nil { task.Icon = *req.Icon } if req.Color != nil { task.Color = *req.Color } if req.Priority != nil { task.Priority = *req.Priority } if req.DueDate != nil { if *req.DueDate == "" { task.DueDate = sql.NullTime{Valid: false} } else { parsed, err := time.Parse("2006-01-02", *req.DueDate) if err == nil { task.DueDate = sql.NullTime{Time: parsed, Valid: true} } } } if req.ReminderTime != nil { if *req.ReminderTime == "" { task.ReminderTime = sql.NullString{Valid: false} } else { task.ReminderTime = sql.NullString{String: *req.ReminderTime, Valid: true} } } if err := s.taskRepo.Update(task); err != nil { return nil, err } task.ProcessForJSON() return task, nil } func (s *TaskService) Delete(id, userID int64) error { return s.taskRepo.Delete(id, userID) } func (s *TaskService) Complete(id, userID int64) (*model.Task, error) { if err := s.taskRepo.Complete(id, userID); err != nil { return nil, err } return s.taskRepo.GetByID(id, userID) } func (s *TaskService) Uncomplete(id, userID int64) (*model.Task, error) { if err := s.taskRepo.Uncomplete(id, userID); err != nil { return nil, err } return s.taskRepo.GetByID(id, userID) }