68 lines
1.9 KiB
Go
68 lines
1.9 KiB
Go
package service
|
||
|
||
import (
|
||
"context"
|
||
|
||
"github.com/google/uuid"
|
||
"github.com/topfans/backend/services/aiChatService/model"
|
||
"github.com/topfans/backend/services/aiChatService/repository"
|
||
)
|
||
|
||
// PersonaService 人设服务
|
||
type PersonaService struct {
|
||
personaRepo repository.PersonaRepository
|
||
}
|
||
|
||
// NewPersonaService 创建人设服务
|
||
func NewPersonaService(personaRepo repository.PersonaRepository) *PersonaService {
|
||
return &PersonaService{
|
||
personaRepo: personaRepo,
|
||
}
|
||
}
|
||
|
||
// GetPersonas 获取用户的所有人设
|
||
func (s *PersonaService) GetPersonas(ctx context.Context, userID int64) ([]model.PersonaInfo, error) {
|
||
personas, err := s.personaRepo.GetByUserID(ctx, userID)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
infos := make([]model.PersonaInfo, len(personas))
|
||
for i, p := range personas {
|
||
infos[i] = p.ToPersonaInfo()
|
||
}
|
||
return infos, nil
|
||
}
|
||
|
||
// GetPersona 获取指定人设
|
||
func (s *PersonaService) GetPersona(ctx context.Context, personaID string) (*model.Persona, error) {
|
||
id, err := uuid.Parse(personaID)
|
||
if err != nil {
|
||
return nil, model.ErrInvalidRequest
|
||
}
|
||
return s.personaRepo.GetByID(ctx, id)
|
||
}
|
||
|
||
// GetDefaultPersona 获取用户默认人设
|
||
func (s *PersonaService) GetDefaultPersona(ctx context.Context, userID int64) (*model.Persona, error) {
|
||
return s.personaRepo.GetDefaultByUserID(ctx, userID)
|
||
}
|
||
|
||
// GetPersonaOrDefault 获取人设,如果 personaID 为空则获取默认人设
|
||
func (s *PersonaService) GetPersonaOrDefault(ctx context.Context, userID int64, personaID string) (*model.Persona, error) {
|
||
// 如果指定了 personaID,优先使用指定人设
|
||
if personaID != "" {
|
||
id, err := uuid.Parse(personaID)
|
||
if err != nil {
|
||
return nil, model.ErrInvalidRequest
|
||
}
|
||
persona, err := s.personaRepo.GetByID(ctx, id)
|
||
if err == nil {
|
||
return persona, nil
|
||
}
|
||
// 如果人设不存在,fallback 到默认人设
|
||
}
|
||
|
||
// 获取或创建默认人设
|
||
return s.personaRepo.EnsureDefaultPersona(ctx, userID)
|
||
} |