package projects import ( "errors" "strings" "senlinai-agent/backend/internal/models" ) type Service struct { } type Dashboard struct { ProjectID uint `json:"project_id"` PendingInboxCount int64 `json:"pending_inbox_count"` OpenTaskCount int64 `json:"open_task_count"` RecentNoteCount int64 `json:"recent_note_count"` RecentSessionCount int64 `json:"recent_session_count"` } func NewService() *Service { return &Service{} } func (s *Service) CreateProject(ownerID uint, name string, description string) (*models.SenlinAgentProject, error) { name = strings.TrimSpace(name) if name == "" { return nil, errors.New("project name is required") } project := &models.SenlinAgentProject{OwnerID: ownerID, Name: name, Description: description} return project, models.DBService.Create(project).Error } func (s *Service) ListProjects(ownerID uint) ([]models.SenlinAgentProject, error) { var projects []models.SenlinAgentProject err := models.DBService.Where("owner_id = ?", ownerID).Order("updated_at desc").Find(&projects).Error return projects, err } func (s *Service) CreateTag(projectID uint, name string) (*models.SenlinAgentTag, error) { name = strings.TrimSpace(name) if name == "" { return nil, errors.New("tag name is required") } tag := &models.SenlinAgentTag{ProjectID: projectID, Name: name} return tag, models.DBService.Create(tag).Error } func (s *Service) ListTags(projectID uint) ([]models.SenlinAgentTag, error) { var tags []models.SenlinAgentTag err := models.DBService.Where("project_id = ?", projectID).Order("name asc").Find(&tags).Error return tags, err } func (s *Service) Dashboard(ownerID uint, projectID uint) (Dashboard, error) { var project models.SenlinAgentProject if err := models.DBService.Where("id = ? AND owner_id = ?", projectID, ownerID).First(&project).Error; err != nil { return Dashboard{}, err } dashboard := Dashboard{ProjectID: projectID} if err := models.DBService.Model(&models.SenlinAgentInboxItem{}).Where("project_id = ? AND status = ?", projectID, "open").Count(&dashboard.PendingInboxCount).Error; err != nil { return dashboard, err } if err := models.DBService.Model(&models.SenlinAgentTask{}).Where("project_id = ? AND status <> ?", projectID, "done").Count(&dashboard.OpenTaskCount).Error; err != nil { return dashboard, err } if err := models.DBService.Model(&models.SenlinAgentNote{}).Where("project_id = ?", projectID).Count(&dashboard.RecentNoteCount).Error; err != nil { return dashboard, err } if err := models.DBService.Model(&models.SenlinAgentAISession{}).Where("project_id = ?", projectID).Count(&dashboard.RecentSessionCount).Error; err != nil { return dashboard, err } return dashboard, nil }