75 lines
2.7 KiB
Go
75 lines
2.7 KiB
Go
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
|
|
}
|