ListDatabases lists all databases.
(ctx context.Context, req *connect.Request[v1pb.ListDatabasesRequest])
| 174 | |
| 175 | // ListDatabases lists all databases. |
| 176 | func (s *DatabaseService) ListDatabases(ctx context.Context, req *connect.Request[v1pb.ListDatabasesRequest]) (*connect.Response[v1pb.ListDatabasesResponse], error) { |
| 177 | user, ok := GetUserFromContext(ctx) |
| 178 | if !ok { |
| 179 | return nil, connect.NewError(connect.CodeInternal, errors.Errorf("user not found")) |
| 180 | } |
| 181 | |
| 182 | offset, err := parseLimitAndOffset(&pageSize{ |
| 183 | token: req.Msg.PageToken, |
| 184 | limit: int(req.Msg.PageSize), |
| 185 | maximum: 1000, |
| 186 | }) |
| 187 | if err != nil { |
| 188 | return nil, err |
| 189 | } |
| 190 | limitPlusOne := offset.limit + 1 |
| 191 | |
| 192 | find := &store.FindDatabaseMessage{ |
| 193 | Workspace: common.GetWorkspaceIDFromContext(ctx), |
| 194 | Limit: &limitPlusOne, |
| 195 | Offset: &offset.offset, |
| 196 | ShowDeleted: req.Msg.ShowDeleted, |
| 197 | } |
| 198 | |
| 199 | orderByKeys, err := store.GetDatabaseOrders(req.Msg.OrderBy) |
| 200 | if err != nil { |
| 201 | return nil, connect.NewError(connect.CodeInvalidArgument, err) |
| 202 | } |
| 203 | find.OrderByKeys = orderByKeys |
| 204 | |
| 205 | filterQ, err := store.GetListDatabaseFilter(common.GetWorkspaceIDFromContext(ctx), req.Msg.Filter) |
| 206 | if err != nil { |
| 207 | return nil, connect.NewError(connect.CodeInvalidArgument, err) |
| 208 | } |
| 209 | find.FilterQ = filterQ |
| 210 | |
| 211 | switch { |
| 212 | case strings.HasPrefix(req.Msg.Parent, common.ProjectNamePrefix): |
| 213 | p, err := common.GetProjectID(req.Msg.Parent) |
| 214 | if err != nil { |
| 215 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("invalid parent %q", req.Msg.Parent)) |
| 216 | } |
| 217 | ok, err := s.iamManager.CheckPermission(ctx, permission.ProjectsGet, user, common.GetWorkspaceIDFromContext(ctx), p) |
| 218 | if err != nil { |
| 219 | return nil, connect.NewError(connect.CodeInternal, errors.Errorf("failed to check permission with error: %v", err.Error())) |
| 220 | } |
| 221 | if !ok { |
| 222 | return nil, connect.NewError(connect.CodePermissionDenied, errors.Errorf("user does not have permission %q in %q", permission.ProjectsGet, req.Msg.Parent)) |
| 223 | } |
| 224 | find.ProjectID = &p |
| 225 | case strings.HasPrefix(req.Msg.Parent, common.WorkspacePrefix): |
| 226 | ok, err := s.iamManager.CheckPermission(ctx, permission.DatabasesList, user, common.GetWorkspaceIDFromContext(ctx)) |
| 227 | if err != nil { |
| 228 | return nil, connect.NewError(connect.CodeInternal, errors.Errorf("failed to check permission with error: %v", err.Error())) |
| 229 | } |
| 230 | if !ok { |
| 231 | return nil, connect.NewError(connect.CodePermissionDenied, errors.Errorf("user does not have permission %q", permission.DatabasesList)) |
| 232 | } |
| 233 | case strings.HasPrefix(req.Msg.Parent, common.InstanceNamePrefix): |
nothing calls this directly
no test coverage detected