Fix project selection and add project settings UI

This commit is contained in:
Mikhail Chusavitin
2026-02-13 12:51:53 +03:00
parent 857ec7a0e5
commit 4e1a46bd71
7 changed files with 191 additions and 22 deletions

View File

@@ -16,8 +16,9 @@ import (
)
var (
ErrProjectNotFound = errors.New("project not found")
ErrProjectForbidden = errors.New("access to project forbidden")
ErrProjectNotFound = errors.New("project not found")
ErrProjectForbidden = errors.New("access to project forbidden")
ErrProjectNameExists = errors.New("project name already exists")
)
type ProjectService struct {
@@ -49,6 +50,9 @@ func (s *ProjectService) Create(ownerUsername string, req *CreateProjectRequest)
if name == "" {
return nil, fmt.Errorf("project name is required")
}
if err := s.ensureUniqueProjectName("", name); err != nil {
return nil, err
}
now := time.Now()
localProject := &localdb.LocalProject{
@@ -81,6 +85,9 @@ func (s *ProjectService) Update(projectUUID, ownerUsername string, req *UpdatePr
if name == "" {
return nil, fmt.Errorf("project name is required")
}
if err := s.ensureUniqueProjectName(projectUUID, name); err != nil {
return nil, err
}
localProject.Name = name
if req.TrackerURL != nil {
@@ -99,6 +106,32 @@ func (s *ProjectService) Update(projectUUID, ownerUsername string, req *UpdatePr
return localdb.LocalToProject(localProject), nil
}
func (s *ProjectService) ensureUniqueProjectName(excludeUUID, name string) error {
normalized := normalizeProjectName(name)
if normalized == "" {
return fmt.Errorf("project name is required")
}
projects, err := s.localDB.GetAllProjects(true)
if err != nil {
return err
}
for i := range projects {
project := projects[i]
if excludeUUID != "" && project.UUID == excludeUUID {
continue
}
if normalizeProjectName(project.Name) == normalized {
return ErrProjectNameExists
}
}
return nil
}
func normalizeProjectName(name string) string {
return strings.ToLower(strings.TrimSpace(name))
}
func (s *ProjectService) Archive(projectUUID, ownerUsername string) error {
return s.setProjectActive(projectUUID, ownerUsername, false)
}