fix(workbench): complete profile and channel flows
This commit is contained in:
@@ -2,6 +2,7 @@ package projects
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"net/url"
|
||||
"strings"
|
||||
|
||||
"gorm.io/gorm"
|
||||
@@ -64,8 +65,40 @@ var (
|
||||
ErrProjectNameRequired = errors.New("project name is required")
|
||||
ErrProjectIdentifierRequired = errors.New("project identifier is required")
|
||||
ErrProjectIdentifierConflict = errors.New("project identifier already exists")
|
||||
ErrChannelTitleRequired = errors.New("channel title is required")
|
||||
ErrChannelURLRequired = errors.New("channel url is required")
|
||||
ErrChannelURLInvalid = errors.New("channel url must use http or https")
|
||||
)
|
||||
|
||||
func (s *Service) CreateProjectChannel(ownerID, projectID uint, input CreateProjectChannelInput) (*models.SaProjectChannel, error) {
|
||||
if err := ensureProjectOwner(ownerID, projectID); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
title := strings.TrimSpace(input.Title)
|
||||
if title == "" {
|
||||
return nil, ErrChannelTitleRequired
|
||||
}
|
||||
address := strings.TrimSpace(input.URL)
|
||||
if address == "" {
|
||||
return nil, ErrChannelURLRequired
|
||||
}
|
||||
parsedURL, err := url.ParseRequestURI(address)
|
||||
if err != nil || (parsedURL.Scheme != "http" && parsedURL.Scheme != "https") || parsedURL.Host == "" {
|
||||
return nil, ErrChannelURLInvalid
|
||||
}
|
||||
icon := strings.TrimSpace(input.Icon)
|
||||
if icon == "" {
|
||||
icon = "link"
|
||||
}
|
||||
var previous models.SaProjectChannel
|
||||
_ = models.DBService.Where("project_id = ?", projectID).Order("sort_order DESC").First(&previous).Error
|
||||
channel := &models.SaProjectChannel{ProjectID: projectID, Title: title, Icon: icon, URL: address, SortOrder: previous.SortOrder + 1}
|
||||
if err := models.DBService.Create(channel).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return channel, nil
|
||||
}
|
||||
|
||||
// projectWriteError 将 Postgres/SQLite 经 Gorm 翻译后的唯一约束错误收敛为稳定业务冲突。
|
||||
func projectWriteError(err error) error {
|
||||
if errors.Is(err, gorm.ErrDuplicatedKey) {
|
||||
|
||||
Reference in New Issue
Block a user