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

Method SearchProjects

backend/api/v1/project_service.go:134–206  ·  view source on GitHub ↗

SearchProjects searches all projects on which the user has bb.projects.get permission.

(ctx context.Context, req *connect.Request[v1pb.SearchProjectsRequest])

Source from the content-addressed store, hash-verified

132
133// SearchProjects searches all projects on which the user has bb.projects.get permission.
134func (s *ProjectService) SearchProjects(ctx context.Context, req *connect.Request[v1pb.SearchProjectsRequest]) (*connect.Response[v1pb.SearchProjectsResponse], error) {
135 user, ok := GetUserFromContext(ctx)
136 if !ok {
137 return nil, connect.NewError(connect.CodeInternal, errors.Errorf("user not found"))
138 }
139
140 offset, err := parseLimitAndOffset(&pageSize{
141 token: req.Msg.PageToken,
142 limit: int(req.Msg.PageSize),
143 maximum: 1000,
144 })
145 if err != nil {
146 return nil, err
147 }
148 limitPlusOne := offset.limit + 1
149
150 find := &store.FindProjectMessage{
151 Workspace: common.GetWorkspaceIDFromContext(ctx),
152 ShowDeleted: req.Msg.ShowDeleted,
153 Limit: &limitPlusOne,
154 Offset: &offset.offset,
155 }
156 filterQ, err := store.GetListProjectFilter(common.GetWorkspaceIDFromContext(ctx), req.Msg.Filter)
157 if err != nil {
158 return nil, connect.NewError(connect.CodeInvalidArgument, err)
159 }
160 find.FilterQ = filterQ
161
162 orderByKeys, err := store.GetProjectOrders(req.Msg.OrderBy)
163 if err != nil {
164 return nil, connect.NewError(connect.CodeInvalidArgument, err)
165 }
166 find.OrderByKeys = orderByKeys
167
168 projects, err := s.store.ListProjects(ctx, find)
169 if err != nil {
170 return nil, connect.NewError(connect.CodeInternal, err)
171 }
172
173 nextPageToken := ""
174 if len(projects) == limitPlusOne {
175 projects = projects[:offset.limit]
176 if nextPageToken, err = offset.getNextPageToken(); err != nil {
177 return nil, connect.NewError(connect.CodeInternal, errors.Wrapf(err, "failed to marshal next page token"))
178 }
179 }
180
181 ok, err = s.iamManager.CheckPermission(ctx, permission.ProjectsGet, user, common.GetWorkspaceIDFromContext(ctx))
182 if err != nil {
183 return nil, connect.NewError(connect.CodeInternal, errors.Wrapf(err, "failed to check permission"))
184 }
185 if !ok {
186 var ps []*store.ProjectMessage
187 for _, project := range projects {
188 ok, err := s.iamManager.CheckPermission(ctx, permission.ProjectsGet, user, common.GetWorkspaceIDFromContext(ctx), project.ResourceID)
189 if err != nil {
190 return nil, connect.NewError(connect.CodeInternal, errors.Wrapf(err, "failed to check permission for project %q", project.ResourceID))
191 }

Callers

nothing calls this directly

Calls 10

GetListProjectFilterFunction · 0.92
GetProjectOrdersFunction · 0.92
GetUserFromContextFunction · 0.85
parseLimitAndOffsetFunction · 0.85
convertToProjectFunction · 0.85
ErrorfMethod · 0.80
getNextPageTokenMethod · 0.80
CheckPermissionMethod · 0.80
ListProjectsMethod · 0.65

Tested by

no test coverage detected