(ctx context.Context, req *adminv1.CreateReportRequest)
| 173 | } |
| 174 | |
| 175 | func (s *Server) CreateReport(ctx context.Context, req *adminv1.CreateReportRequest) (*adminv1.CreateReportResponse, error) { |
| 176 | observability.AddRequestAttributes(ctx, |
| 177 | attribute.String("args.organization", req.Org), |
| 178 | attribute.String("args.project", req.Project), |
| 179 | ) |
| 180 | |
| 181 | proj, err := s.admin.DB.FindProjectByName(ctx, req.Org, req.Project) |
| 182 | if err != nil { |
| 183 | return nil, err |
| 184 | } |
| 185 | |
| 186 | claims := auth.GetClaims(ctx) |
| 187 | permissions := claims.ProjectPermissions(ctx, proj.OrganizationID, proj.ID) |
| 188 | if !permissions.CreateReports { |
| 189 | return nil, status.Error(codes.PermissionDenied, "does not have permission to read project repo") |
| 190 | } |
| 191 | |
| 192 | if claims.OwnerType() != auth.OwnerTypeUser { |
| 193 | return nil, status.Error(codes.PermissionDenied, "only users can create reports") |
| 194 | } |
| 195 | |
| 196 | if proj.PrimaryDeploymentID == nil { |
| 197 | return nil, status.Error(codes.FailedPrecondition, "project does not have a production deployment") |
| 198 | } |
| 199 | |
| 200 | depl, err := s.admin.DB.FindDeployment(ctx, *proj.PrimaryDeploymentID) |
| 201 | if err != nil { |
| 202 | return nil, err |
| 203 | } |
| 204 | |
| 205 | name, err := s.generateReportName(ctx, depl, req.Options.DisplayName) |
| 206 | if err != nil { |
| 207 | return nil, err |
| 208 | } |
| 209 | |
| 210 | data, err := s.yamlForManagedReport(req.Options, claims.OwnerID()) |
| 211 | if err != nil { |
| 212 | return nil, status.Errorf(codes.InvalidArgument, "failed to generate report YAML: %s", err.Error()) |
| 213 | } |
| 214 | |
| 215 | err = s.admin.DB.UpsertVirtualFile(ctx, &database.InsertVirtualFileOptions{ |
| 216 | ProjectID: proj.ID, |
| 217 | Environment: "prod", |
| 218 | Path: virtualFilePathForManagedReport(name), |
| 219 | Data: data, |
| 220 | }) |
| 221 | if err != nil { |
| 222 | return nil, fmt.Errorf("failed to insert virtual file: %w", err) |
| 223 | } |
| 224 | |
| 225 | err = s.admin.TriggerParserAndAwaitResource(ctx, depl, name, runtime.ResourceKindReport) |
| 226 | if err != nil { |
| 227 | return nil, fmt.Errorf("failed to reconcile report: %w", err) |
| 228 | } |
| 229 | |
| 230 | return &adminv1.CreateReportResponse{ |
| 231 | Name: name, |
| 232 | }, nil |
nothing calls this directly
no test coverage detected