codeant-ai-for-open-source[bot] commented on code in PR #45550:
URL: https://github.com/apache/superset/pull/45550#discussion_r4342837297
##########
docs/static/resources/openapi.json:
##########
@@ -26581,6 +26581,870 @@
]
}
},
+ "/api/v1/extensions/": {
+ "get": {
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "count": {
+ "type": "integer"
+ },
+ "message": {
+ "type": "string"
+ },
+ "result": {
+ "items": {
+ "properties": {
+ "remoteEntry": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "status": {
+ "enum": [
+ "loaded",
+ "not_loaded"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "description": "List of all enabled extensions"
+ },
+ "400": {
+ "$ref": "#/components/responses/400"
+ },
+ "401": {
+ "$ref": "#/components/responses/401"
+ },
+ "422": {
+ "$ref": "#/components/responses/422"
+ },
+ "500": {
+ "$ref": "#/components/responses/500"
+ }
+ },
+ "security": [
+ {
+ "jwt": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "summary": "List all enabled extensions.",
+ "tags": [
+ "ExtensionsRestApi"
+ ]
+ }
+ },
+ "/api/v1/extensions/_info": {
+ "get": {
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string"
+ },
+ "permissions": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "status": {
+ "description": "`not_loaded` when extensions are enabled
for this request but were not loaded at server startup",
+ "enum": [
+ "loaded",
+ "not_loaded"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "description": "API info"
+ }
+ },
+ "security": [
+ {
+ "jwt": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "summary": "Get API info",
+ "tags": [
+ "ExtensionsRestApi"
+ ]
+ }
+ },
+ "/api/v1/extensions/{publisher}/{name}": {
+ "get": {
+ "parameters": [
+ {
+ "in": "path",
+ "name": "publisher",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "name",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "result": {
+ "items": {
+ "properties": {
+ "remoteEntry": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ }
Review Comment:
**Suggestion:** The endpoint returns `result` as one extension object, but
this schema declares an array; generated clients will deserialize the response
incorrectly.
**Assessment:** ๐ `Major` ยท ๐ `Occurrence: Sometimes` ยท ๐ท๏ธ `Api mismatch`
[](https://docs.codeant.ai/cli/resolve-pr-comments-skill)
[](https://app.codeant.ai/fix-in-ide?tool=cursor&prompt_id=a55694d59fb7469e8880e6d04a8874ef&service=github&base_url=https%3A%2F%2Fgithub.com&org=apache&repo=apache%2Fsuperset)
[](https://app.codeant.ai/fix-in-ide?tool=vscode-claude&prompt_id=a55694d59fb7469e8880e6d04a8874ef&service=github&base_url=https%3A%2F%2Fgithub.com&org=apache&repo=apache%2Fsuperset)
<details>
<summary><b>Prompt for AI Agent ๐ค </b></summary>
```mdx
This is a comment left during a code review.
**Path:** docs/static/resources/openapi.json
**Line:** 26723:26733
**Comment:**
*Api Mismatch: The endpoint returns `result` as one extension object,
but this schema declares an array; generated clients will deserialize the
response incorrectly.
Validate the correctness of the flagged issue. If correct, How can I resolve
this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask
user if the user wants to fix the rest of the comments as well. if said yes,
then fetch all the comments validate the correctness and implement a minimal fix
```
</details>
<a
href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F45550&comment_hash=0b94d74276295dd9558aa3ace78d505d42b6f2984abd0447e7ac9a8ad59a46e4&reaction=like'>๐</a>
| <a
href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F45550&comment_hash=0b94d74276295dd9558aa3ace78d505d42b6f2984abd0447e7ac9a8ad59a46e4&reaction=dislike'>๐</a>
##########
docs/static/resources/openapi.json:
##########
@@ -26581,6 +26581,870 @@
]
}
},
+ "/api/v1/extensions/": {
+ "get": {
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "count": {
+ "type": "integer"
+ },
+ "message": {
+ "type": "string"
+ },
+ "result": {
+ "items": {
+ "properties": {
+ "remoteEntry": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "status": {
+ "enum": [
+ "loaded",
+ "not_loaded"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "description": "List of all enabled extensions"
+ },
+ "400": {
+ "$ref": "#/components/responses/400"
+ },
+ "401": {
+ "$ref": "#/components/responses/401"
+ },
+ "422": {
+ "$ref": "#/components/responses/422"
+ },
+ "500": {
+ "$ref": "#/components/responses/500"
+ }
+ },
+ "security": [
+ {
+ "jwt": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "summary": "List all enabled extensions.",
+ "tags": [
+ "ExtensionsRestApi"
+ ]
+ }
+ },
+ "/api/v1/extensions/_info": {
+ "get": {
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string"
+ },
+ "permissions": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "status": {
+ "description": "`not_loaded` when extensions are enabled
for this request but were not loaded at server startup",
+ "enum": [
+ "loaded",
+ "not_loaded"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "description": "API info"
+ }
+ },
+ "security": [
+ {
+ "jwt": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "summary": "Get API info",
+ "tags": [
+ "ExtensionsRestApi"
+ ]
+ }
+ },
+ "/api/v1/extensions/{publisher}/{name}": {
+ "get": {
+ "parameters": [
+ {
+ "in": "path",
+ "name": "publisher",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "name",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "result": {
+ "items": {
+ "properties": {
+ "remoteEntry": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "description": "Extension details"
+ },
+ "400": {
+ "$ref": "#/components/responses/400"
+ },
+ "401": {
+ "$ref": "#/components/responses/401"
+ },
+ "422": {
+ "$ref": "#/components/responses/422"
+ },
+ "500": {
+ "$ref": "#/components/responses/500"
+ }
+ },
+ "security": [
+ {
+ "jwt": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "summary": "Get an extension by its publisher and name.",
+ "tags": [
+ "ExtensionsRestApi"
+ ]
+ }
+ },
+ "/api/v1/extensions/{publisher}/{name}/storage/ephemeral/{key}": {
+ "delete": {
+ "parameters": [
+ {
+ "description": "Extension publisher",
+ "in": "path",
+ "name": "publisher",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Extension name",
+ "in": "path",
+ "name": "name",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Storage key",
+ "in": "path",
+ "name": "key",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "If true, delete from shared state",
+ "in": "query",
+ "name": "shared",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Value deleted successfully"
+ },
+ "404": {
+ "description": "Extension not found"
+ }
+ },
+ "security": [
+ {
+ "jwt": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "summary": "Delete a value from ephemeral state",
+ "tags": [
+ "ExtensionStorageRestApi"
+ ]
+ },
+ "get": {
+ "parameters": [
+ {
+ "description": "Extension publisher",
+ "in": "path",
+ "name": "publisher",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Extension name",
+ "in": "path",
+ "name": "name",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Storage key",
+ "in": "path",
+ "name": "key",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "If true, read from shared state visible to all
users",
+ "in": "query",
+ "name": "shared",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "codec": {
+ "description": "Name of the codec 'result' was encoded
with, e.g. `json` (default) or `binary`",
+ "type": "string"
+ },
+ "isBinary": {
+ "description": "Whether the stored value is binary data",
+ "type": "boolean"
+ },
+ "result": {
+ "description": "The stored value. When 'isBinary' is
true, this is a base64 string that must be decoded to get the actual value."
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "description": "Value retrieved successfully"
+ },
+ "400": {
+ "description": "Value was stored with a codec unavailable over the
API"
+ },
+ "404": {
+ "description": "Extension not found"
+ }
+ },
+ "security": [
+ {
+ "jwt": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "summary": "Get a value from ephemeral state",
+ "tags": [
+ "ExtensionStorageRestApi"
+ ]
+ },
+ "put": {
+ "parameters": [
+ {
+ "description": "Extension publisher",
+ "in": "path",
+ "name": "publisher",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Extension name",
+ "in": "path",
+ "name": "name",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Storage key",
+ "in": "path",
+ "name": "key",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "If true, store as shared state visible to all
users",
+ "in": "query",
+ "name": "shared",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "codec": {
+ "description": "Name of the codec used to encode 'value',
e.g. `json` (default). Must be one of the codecs allowed over the REST API.",
+ "type": "string"
+ },
+ "isBinary": {
+ "description": "Whether 'value' is binary data",
+ "type": "boolean"
+ },
+ "ttl": {
+ "description": "Time-to-live in seconds (must be a
positive integer not exceeding MAX_TTL)",
+ "type": "integer"
+ },
+ "value": {
+ "description": "The value to store (must not exceed
MAX_VALUE_SIZE bytes once encoded with 'codec'). When 'isBinary' is true, this
must be a base64 string, decoded before being handed to 'codec'."
+ }
+ },
+ "required": [
+ "value",
+ "ttl"
+ ],
+ "type": "object"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Value stored successfully"
+ },
+ "400": {
+ "description": "Invalid request body, or codec not allowed over
the API"
+ },
+ "404": {
+ "description": "Extension not found"
+ }
+ },
+ "security": [
+ {
+ "jwt": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "summary": "Set a value in ephemeral state",
+ "tags": [
+ "ExtensionStorageRestApi"
+ ]
+ }
+ },
+ "/api/v1/extensions/{publisher}/{name}/storage/persistent": {
+ "get": {
+ "parameters": [
+ {
+ "description": "Extension publisher",
+ "in": "path",
+ "name": "publisher",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Extension name",
+ "in": "path",
+ "name": "name",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "If true, list shared state visible to all users",
+ "in": "query",
+ "name": "shared",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ }
+ },
+ {
+ "description": "Filter by resource type",
+ "in": "query",
+ "name": "resource_type",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Filter by resource UUID (requires resource_type)",
+ "in": "query",
+ "name": "resource_uuid",
+ "required": false,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Zero-indexed page number. Defaults to 0.",
+ "in": "query",
+ "name": "page",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "description": "Number of entries per page. Defaults to 10. There
is no fixed ceiling, but a page whose combined value size exceeds
MAX_LIST_PAYLOAD_SIZE is rejected \u2014 reduce page_size and retry if that
happens.",
+ "in": "query",
+ "name": "page_size",
+ "required": false,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "count": {
+ "description": "Total number of entries matching the
given scope/filters, across all pages",
+ "type": "integer"
+ },
+ "result": {
+ "items": {
+ "properties": {
+ "codec": {
+ "type": "string"
+ },
+ "isBinary": {
+ "description": "Whether the stored value is binary
data",
+ "type": "boolean"
+ },
+ "key": {
+ "type": "string"
+ },
+ "value": {
+ "description": "The stored value, or null if its
codec cannot be read over the REST API. When 'isBinary' is true, this is a
base64 string that must be decoded to get the actual value."
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "description": "Entries retrieved successfully"
+ },
+ "400": {
+ "description": "The requested page's combined value size exceeds
MAX_LIST_PAYLOAD_SIZE"
+ },
+ "404": {
+ "description": "Extension not found"
+ }
+ },
+ "security": [
+ {
+ "jwt": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "summary": "List entries in persistent state",
+ "tags": [
+ "ExtensionStorageRestApi"
+ ]
+ }
+ },
+ "/api/v1/extensions/{publisher}/{name}/storage/persistent/{key}": {
+ "delete": {
+ "parameters": [
+ {
+ "description": "Extension publisher",
+ "in": "path",
+ "name": "publisher",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Extension name",
+ "in": "path",
+ "name": "name",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Storage key",
+ "in": "path",
+ "name": "key",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "If true, delete from shared state",
+ "in": "query",
+ "name": "shared",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Value deleted successfully"
+ },
+ "404": {
+ "description": "Extension not found"
+ }
+ },
+ "security": [
+ {
+ "jwt": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "summary": "Delete a value from persistent state",
+ "tags": [
+ "ExtensionStorageRestApi"
+ ]
+ },
+ "get": {
+ "parameters": [
+ {
+ "description": "Extension publisher",
+ "in": "path",
+ "name": "publisher",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Extension name",
+ "in": "path",
+ "name": "name",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Storage key",
+ "in": "path",
+ "name": "key",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "If true, read from shared state visible to all
users",
+ "in": "query",
+ "name": "shared",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "codec": {
+ "description": "Name of the codec 'result' was encoded
with, e.g. `json` (default) or `binary`",
+ "type": "string"
+ },
+ "isBinary": {
+ "description": "Whether the stored value is binary data",
+ "type": "boolean"
+ },
+ "result": {
+ "description": "The stored value. When 'isBinary' is
true, this is a base64 string that must be decoded to get the actual value."
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "description": "Value retrieved successfully"
+ },
+ "400": {
+ "description": "Value was stored with a codec unavailable over the
API"
+ },
+ "404": {
+ "description": "Extension not found"
+ }
+ },
+ "security": [
+ {
+ "jwt": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "summary": "Get a value from persistent state",
+ "tags": [
+ "ExtensionStorageRestApi"
+ ]
+ },
+ "put": {
+ "parameters": [
+ {
+ "description": "Extension publisher",
+ "in": "path",
+ "name": "publisher",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Extension name",
+ "in": "path",
+ "name": "name",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Storage key",
+ "in": "path",
+ "name": "key",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "If true, store as shared state visible to all
users",
+ "in": "query",
+ "name": "shared",
+ "required": false,
+ "schema": {
+ "type": "boolean"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "codec": {
+ "description": "Name of the codec used to encode 'value',
e.g. `json` (default). Must be one of the codecs allowed over the REST API.",
+ "type": "string"
+ },
+ "encrypt": {
+ "description": "If true, the value is encrypted at rest",
+ "type": "boolean"
+ },
+ "isBinary": {
+ "description": "Whether 'value' is binary data",
+ "type": "boolean"
+ },
+ "value": {
+ "description": "The value to store. When 'isBinary' is
true, this must be a base64 string, decoded before being handed to 'codec'."
+ }
+ },
+ "required": [
+ "value"
+ ],
+ "type": "object"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Value stored successfully"
+ },
+ "400": {
+ "description": "Invalid request body, codec not allowed over the
API, or value exceeds MAX_VALUE_SIZE"
+ },
+ "404": {
+ "description": "Extension not found"
+ },
+ "413": {
+ "description": "Extension persistent storage quota exceeded"
+ }
+ },
+ "security": [
+ {
+ "jwt": []
+ },
+ {
+ "api_key": []
+ }
+ ],
+ "summary": "Set a value in persistent state",
+ "tags": [
+ "ExtensionStorageRestApi"
+ ]
+ }
+ },
+ "/api/v1/extensions/{publisher}/{name}/{file}": {
+ "get": {
+ "parameters": [
+ {
+ "description": "publisher of the extension",
+ "in": "path",
+ "name": "publisher",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "technical name of the extension",
+ "in": "path",
+ "name": "name",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "name of the requested chunk",
+ "in": "path",
+ "name": "file",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ }
Review Comment:
**Suggestion:** The chunk endpoint serves file bytes with a guessed MIME
type, not a JSON message object, so generated clients will parse the bundle
incorrectly.
**Assessment:** ๐ `Major` ยท ๐ `Occurrence: Rarely` ยท ๐ท๏ธ `Api mismatch`
[](https://docs.codeant.ai/cli/resolve-pr-comments-skill)
[](https://app.codeant.ai/fix-in-ide?tool=cursor&prompt_id=77c38b1acafa4ccb9535be48d72826f7&service=github&base_url=https%3A%2F%2Fgithub.com&org=apache&repo=apache%2Fsuperset)
[](https://app.codeant.ai/fix-in-ide?tool=vscode-claude&prompt_id=77c38b1acafa4ccb9535be48d72826f7&service=github&base_url=https%3A%2F%2Fgithub.com&org=apache&repo=apache%2Fsuperset)
<details>
<summary><b>Prompt for AI Agent ๐ค </b></summary>
```mdx
This is a comment left during a code review.
**Path:** docs/static/resources/openapi.json
**Line:** 27408:27417
**Comment:**
*Api Mismatch: The chunk endpoint serves file bytes with a guessed MIME
type, not a JSON message object, so generated clients will parse the bundle
incorrectly.
Validate the correctness of the flagged issue. If correct, How can I resolve
this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask
user if the user wants to fix the rest of the comments as well. if said yes,
then fetch all the comments validate the correctness and implement a minimal fix
```
</details>
<a
href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F45550&comment_hash=59fba4fa9beeaec9a2ea295d4b732fb7f68fe6cab80a09c6ce5f099dbe3898fa&reaction=like'>๐</a>
| <a
href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F45550&comment_hash=59fba4fa9beeaec9a2ea295d4b732fb7f68fe6cab80a09c6ce5f099dbe3898fa&reaction=dislike'>๐</a>
##########
superset-frontend/src/extensions/ExtensionsList.tsx:
##########
@@ -40,15 +61,56 @@ const ExtensionsList:
FunctionComponent<ExtensionsListProps> = ({
addDangerToast,
addSuccessToast,
}) => {
- const {
- state: { loading, resourceCount, resourceCollection },
- fetchData,
- refreshData,
- } = useListViewResource<Extension>(
- 'extensions',
- t('Extensions'),
- addDangerToast,
- );
+ // The rows and the load status come from the same list response, so the
+ // restart notice always describes the list on screen, even when requests
+ // reach different servers during a rolling restart.
+ const [{ loading, collection, count, notLoaded }, setState] =
+ useState<ExtensionsListState>({
+ loading: true,
+ collection: [],
+ count: 0,
+ notLoaded: false,
+ });
+ const addDangerToastRef = useRef(addDangerToast);
+ addDangerToastRef.current = addDangerToast;
+ const latestRequestIdRef = useRef(0);
+
+ // The endpoint returns every servable extension in one page and ignores
+ // paging and sorting parameters.
+ const fetchData = useCallback(() => {
+ const requestId = latestRequestIdRef.current + 1;
+ latestRequestIdRef.current = requestId;
+ const isLatest = () => latestRequestIdRef.current === requestId;
+ setState(current => ({ ...current, loading: true }));
+ return SupersetClient.get({ endpoint: '/api/v1/extensions/' })
Review Comment:
**Suggestion:** The Name column is sortable, but this fetch ignores
`sortBy`; `ListView` uses manual sorting, so clicks refetch the same order
without reordering rows.
**Assessment:** ๐ `Major` ยท ๐ `Occurrence: Sometimes` ยท ๐ท๏ธ `Logic error`
[](https://docs.codeant.ai/cli/resolve-pr-comments-skill)
[](https://app.codeant.ai/fix-in-ide?tool=cursor&prompt_id=ac9e74ba2a9b4cef9a94c8ba139c5ef1&service=github&base_url=https%3A%2F%2Fgithub.com&org=apache&repo=apache%2Fsuperset)
[](https://app.codeant.ai/fix-in-ide?tool=vscode-claude&prompt_id=ac9e74ba2a9b4cef9a94c8ba139c5ef1&service=github&base_url=https%3A%2F%2Fgithub.com&org=apache&repo=apache%2Fsuperset)
<details>
<summary><b>Prompt for AI Agent ๐ค </b></summary>
```mdx
This is a comment left during a code review.
**Path:** superset-frontend/src/extensions/ExtensionsList.tsx
**Line:** 85:85
**Comment:**
*Logic Error: The Name column is sortable, but this fetch ignores
`sortBy`; `ListView` uses manual sorting, so clicks refetch the same order
without reordering rows.
Validate the correctness of the flagged issue. If correct, How can I resolve
this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask
user if the user wants to fix the rest of the comments as well. if said yes,
then fetch all the comments validate the correctness and implement a minimal fix
```
</details>
<a
href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F45550&comment_hash=ca2e1d27cd1fb1994eaed55737eda2536d5df1a72f5d5eeb0b72d317b9b3a65d&reaction=like'>๐</a>
| <a
href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F45550&comment_hash=ca2e1d27cd1fb1994eaed55737eda2536d5df1a72f5d5eeb0b72d317b9b3a65d&reaction=dislike'>๐</a>
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]