CreateProject creates a project.
(ctx context.Context, req *connect.Request[v1pb.CreateProjectRequest])
| 207 | |
| 208 | // CreateProject creates a project. |
| 209 | func (s *ProjectService) CreateProject(ctx context.Context, req *connect.Request[v1pb.CreateProjectRequest]) (*connect.Response[v1pb.Project], error) { |
| 210 | if !isValidResourceID(req.Msg.ProjectId) { |
| 211 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("invalid project ID %v", req.Msg.ProjectId)) |
| 212 | } |
| 213 | if req.Msg.ProjectId == "default" || strings.HasPrefix(req.Msg.ProjectId, "default-") { |
| 214 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("project ID %q is reserved", req.Msg.ProjectId)) |
| 215 | } |
| 216 | |
| 217 | if req.Msg.Project != nil && req.Msg.Project.Labels != nil { |
| 218 | if err := validateLabels(req.Msg.Project.Labels); err != nil { |
| 219 | return nil, connect.NewError(connect.CodeInvalidArgument, err) |
| 220 | } |
| 221 | } |
| 222 | if req.Msg.Project != nil { |
| 223 | if err := validateIssueLabels(req.Msg.Project.IssueLabels); err != nil { |
| 224 | return nil, connect.NewError(connect.CodeInvalidArgument, err) |
| 225 | } |
| 226 | } |
| 227 | |
| 228 | projectMessage := convertToProjectMessage(req.Msg.ProjectId, req.Msg.Project) |
| 229 | |
| 230 | workspaceID := common.GetWorkspaceIDFromContext(ctx) |
| 231 | projectMessage.Workspace = workspaceID |
| 232 | |
| 233 | setting, err := s.store.GetDataClassificationSetting(ctx, workspaceID) |
| 234 | if err != nil { |
| 235 | slog.Error("failed to find classification setting", log.BBError(err)) |
| 236 | } |
| 237 | if setting != nil && len(setting.Configs) != 0 { |
| 238 | projectMessage.Setting.DataClassificationConfigId = setting.Configs[0].Id |
| 239 | } |
| 240 | |
| 241 | user, ok := GetUserFromContext(ctx) |
| 242 | if !ok { |
| 243 | return nil, connect.NewError(connect.CodeInternal, errors.Errorf("user not found")) |
| 244 | } |
| 245 | project, err := s.store.CreateProject(ctx, |
| 246 | projectMessage, |
| 247 | user, |
| 248 | ) |
| 249 | if err != nil { |
| 250 | if strings.Contains(err.Error(), "duplicate key") { |
| 251 | return nil, connect.NewError(connect.CodeAlreadyExists, errors.Errorf("project ID %q already exists", req.Msg.ProjectId)) |
| 252 | } |
| 253 | return nil, connect.NewError(connect.CodeInternal, err) |
| 254 | } |
| 255 | return connect.NewResponse(convertToProject(project)), nil |
| 256 | } |
| 257 | |
| 258 | // UpdateProject updates a project. |
| 259 | func (s *ProjectService) UpdateProject(ctx context.Context, req *connect.Request[v1pb.UpdateProjectRequest]) (*connect.Response[v1pb.Project], error) { |
no test coverage detected