MCPcopy Create free account
hub / github.com/bytebase/bytebase / BatchGetDatabases

Method BatchGetDatabases

backend/api/v1/database_service.go:77–132  ·  view source on GitHub ↗
(ctx context.Context, req *connect.Request[v1pb.BatchGetDatabasesRequest])

Source from the content-addressed store, hash-verified

75}
76
77func (s *DatabaseService) BatchGetDatabases(ctx context.Context, req *connect.Request[v1pb.BatchGetDatabasesRequest]) (*connect.Response[v1pb.BatchGetDatabasesResponse], error) {
78 user, ok := GetUserFromContext(ctx)
79 if !ok {
80 return nil, connect.NewError(connect.CodeInternal, errors.Errorf("user not found"))
81 }
82
83 // Parse parent to extract project ID filter if specified.
84 var projectIDFilter *string
85 if strings.HasPrefix(req.Msg.Parent, common.ProjectNamePrefix) {
86 projectID, err := common.GetProjectID(req.Msg.Parent)
87 if err != nil {
88 return nil, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("invalid parent %q", req.Msg.Parent))
89 }
90 projectIDFilter = new(projectID)
91 }
92 // For instances/{instance} or "-" (wildcard), no project filter is applied.
93 databases := make([]*v1pb.Database, 0, len(req.Msg.Names))
94 for _, name := range req.Msg.Names {
95 instanceID, databaseName, err := common.GetInstanceDatabaseID(name)
96 if err != nil {
97 return nil, connect.NewError(connect.CodeInvalidArgument, errors.Wrapf(err, "failed to parse %q", name))
98 }
99 databaseMessage, err := s.store.GetDatabase(ctx, &store.FindDatabaseMessage{
100 Workspace: common.GetWorkspaceIDFromContext(ctx),
101 InstanceID: &instanceID,
102 DatabaseName: &databaseName,
103 ShowDeleted: true,
104 })
105 if err != nil {
106 return nil, connect.NewError(connect.CodeInternal, errors.Wrapf(err, "failed to get database"))
107 }
108 if databaseMessage == nil {
109 // Ignore deleted database.
110 continue
111 }
112 // If parent specifies a project, validate database belongs to that project.
113 if projectIDFilter != nil && databaseMessage.ProjectID != *projectIDFilter {
114 // Ignore database not in the specified project.
115 continue
116 }
117 ok, err := s.iamManager.CheckPermission(ctx, permission.DatabasesGet, user, common.GetWorkspaceIDFromContext(ctx), databaseMessage.ProjectID)
118 if err != nil {
119 return nil, connect.NewError(connect.CodeInternal, errors.Errorf("failed to check permission with error: %v", err.Error()))
120 }
121 if !ok {
122 // Ignore no permission database.
123 continue
124 }
125 database, err := s.convertToDatabase(ctx, databaseMessage)
126 if err != nil {
127 return nil, connect.NewError(connect.CodeInternal, errors.Wrapf(err, "failed to convert database"))
128 }
129 databases = append(databases, database)
130 }
131 return connect.NewResponse(&v1pb.BatchGetDatabasesResponse{Databases: databases}), nil
132}
133
134func getVariableAndValueFromExpr(expr celast.Expr) (string, any) {

Callers

nothing calls this directly

Calls 9

convertToDatabaseMethod · 0.95
GetProjectIDFunction · 0.92
GetInstanceDatabaseIDFunction · 0.92
GetUserFromContextFunction · 0.85
ErrorfMethod · 0.80
CheckPermissionMethod · 0.80
GetDatabaseMethod · 0.65
ErrorMethod · 0.45

Tested by

no test coverage detected