From 0c6808624997fa01d0c1e6c734551129d041c4f2 Mon Sep 17 00:00:00 2001 From: "Jingwei.Zhang" Date: Tue, 21 Dec 2021 17:19:35 +0800 Subject: [PATCH] feat: Support ceph rgw swift 1. Add format=json when request swift container && object list 2. Remove delimiter when params has path prop Change-Id: I53e978d44d077337ff555a1aa50489638df37970 --- src/client/swift/index.js | 25 ++++---- .../containers/Container/Detail/index.jsx | 4 +- .../storage/containers/Container/index.jsx | 4 +- src/stores/swift/container.js | 9 +++ src/stores/swift/object.js | 59 ++++++++----------- 5 files changed, 47 insertions(+), 54 deletions(-) diff --git a/src/client/swift/index.js b/src/client/swift/index.js index 67ff24aa..7342bd04 100644 --- a/src/client/swift/index.js +++ b/src/client/swift/index.js @@ -29,6 +29,11 @@ class SwiftClient extends Base { return url ? `${prefix}/${url}` : prefix; }; + getEncodeUrl = (url) => { + const tmp = url.split('/'); + return tmp.map((t) => encodeURIComponent(t)).join('/'); + }; + get resources() { return [ { @@ -44,19 +49,19 @@ class SwiftClient extends Base { { key: 'create', generate: (name) => { - return this.request.put(encodeURIComponent(name)); + return this.request.put(this.getEncodeUrl(name)); }, }, { key: 'showMetadata', generate: (name) => { - return this.request.head(encodeURIComponent(name)); + return this.request.head(this.getEncodeUrl(name)); }, }, { key: 'updateMetadata', generate: (name, headers) => { - return this.request.post(encodeURIComponent(name), null, null, { + return this.request.post(this.getEncodeUrl(name), null, null, { headers, }); }, @@ -64,27 +69,21 @@ class SwiftClient extends Base { { key: 'uploadFile', generate: (container, name, content, conf) => { - const url = `${encodeURIComponent( - container - )}/${encodeURIComponent(name)}`; + const url = this.getEncodeUrl(`${container}/${name}`); return this.request.put(url, content, null, conf); }, }, { key: 'createFolder', generate: (container, name) => { - const url = `${encodeURIComponent( - container - )}/${encodeURIComponent(name)}`; + const url = this.getEncodeUrl(`${container}/${name}`); return this.request.put(url); }, }, { key: 'showObjectMetadata', generate: (container, objectName) => { - const url = `${encodeURIComponent( - container - )}/${encodeURIComponent(objectName)}`; + const url = this.getEncodeUrl(`${container}/${objectName}`); return this.request.head(url); }, }, @@ -93,7 +92,7 @@ class SwiftClient extends Base { generate: (fromContaier, fromName, toContainer, toName) => { const url = `${fromContaier}/${fromName}`; const headers = { - Destination: encodeURIComponent(`${toContainer}/${toName}`), + Destination: this.getEncodeUrl(`${toContainer}/${toName}`), }; return this.request.copy(url, null, { headers }); }, diff --git a/src/pages/storage/containers/Container/Detail/index.jsx b/src/pages/storage/containers/Container/Detail/index.jsx index 963ea0aa..aabb53c6 100644 --- a/src/pages/storage/containers/Container/Detail/index.jsx +++ b/src/pages/storage/containers/Container/Detail/index.jsx @@ -17,7 +17,7 @@ import { observer, inject } from 'mobx-react'; import { Popover, Col, Row, Skeleton } from 'antd'; import Base from 'containers/List'; import globalObjectStore, { ObjectStore } from 'stores/swift/object'; -import { toLocalTimeFilter, bytesFitler } from 'utils/index'; +import { bytesFitler } from 'utils/index'; import { allCanReadPolicy } from 'resources/policy'; import { toJS } from 'mobx'; import { isEqual } from 'lodash'; @@ -182,7 +182,6 @@ export default class ContainerObject extends Base { { title: t('Name'), dataIndex: 'shortName', - stringify: (name, record) => name || record.id, render: (name, record) => { const { type, container } = record; if (type === 'folder') { @@ -212,7 +211,6 @@ export default class ContainerObject extends Base { dataIndex: 'last_modified', isHideable: true, valueRender: 'sinceTime', - stringify: (value) => toLocalTimeFilter(value), }, { title: t('Detail Info'), diff --git a/src/pages/storage/containers/Container/index.jsx b/src/pages/storage/containers/Container/index.jsx index 56d65348..098ab757 100644 --- a/src/pages/storage/containers/Container/index.jsx +++ b/src/pages/storage/containers/Container/index.jsx @@ -17,7 +17,7 @@ import { observer, inject } from 'mobx-react'; import { Popover, Col, Row, Skeleton } from 'antd'; import Base from 'containers/List'; import globalContainerStore, { ContainerStore } from 'stores/swift/container'; -import { toLocalTimeFilter, bytesFitler } from 'utils/index'; +import { bytesFitler } from 'utils/index'; import { allCanChangePolicy } from 'resources/policy'; import { getStrFromTimestamp } from 'utils/time'; import { swiftEndpoint } from 'client/client/constants'; @@ -130,7 +130,6 @@ export default class Container extends Base { this.getLinkRender('containerDetail', name || record.id, { id: record.id, }), - stringify: (name, record) => name || record.id, }, { title: t('Size'), @@ -142,7 +141,6 @@ export default class Container extends Base { dataIndex: 'last_modified', isHideable: true, valueRender: 'sinceTime', - stringify: (value) => toLocalTimeFilter(value), }, { title: t('Detail Info'), diff --git a/src/stores/swift/container.js b/src/stores/swift/container.js index dc1fa2d6..8cc3e5dd 100644 --- a/src/stores/swift/container.js +++ b/src/stores/swift/container.js @@ -25,6 +25,15 @@ export class ContainerStore extends Base { return ''; } + get paramsFunc() { + return (params) => { + return { + ...params, + format: 'json', + }; + }; + } + get mapper() { return (data) => ({ ...data, diff --git a/src/stores/swift/object.js b/src/stores/swift/object.js index 9e0f1dd4..c09b91ca 100644 --- a/src/stores/swift/object.js +++ b/src/stores/swift/object.js @@ -67,50 +67,38 @@ export class ObjectStore extends Base { get paramsFunc() { return (params) => { - const { current, container, folder, search = '', ...rest } = params; - return { - path: `${folder}${search}`, - delimiter: `/`, + const { current, container, folder, search = '', path, ...rest } = params; + const realPath = path || (folder || search ? `${folder}${search}` : ''); + const newParams = { + format: 'json', ...rest, }; + if (realPath) { + newParams.path = realPath; + } else { + newParams.delimiter = '/'; + } + return newParams; }; } - getShortName = (name, folder) => name.substring((folder || '').length); - - getItemType = (it) => { - if (it.subdir) { - return 'folder'; - } - const { name } = it; - if (name[name.length - 1] === '/') { - return 'folder'; - } - return 'file'; + getShortName = (item, folder) => { + const { name, subdir } = item; + const lName = subdir || name; + return lName.substring((folder || '').length) || lName; }; - async listDidFetch(items, _, filters) { + isFolder = (item) => item.subdir || item.name.slice(-1) === '/'; + + getItemType = (it) => { + return this.isFolder(it) ? 'folder' : 'file'; + }; + + async listDidFetch(items) { if (items.length === 0) { return items; } - - const { container } = filters; - const needFetch = items.some((it) => it.subdir); - if (!needFetch) { - return this.updateData(items); - } - const result = await this.client.list(container); - const newItems = items.map((it) => { - if (it.subdir) { - const item = result.find((r) => r.name === it.subdir) || {}; - return { - ...it, - ...item, - }; - } - return { ...it }; - }); - return this.updateData(newItems); + return this.updateData(items); } async detailFetchByClient(resourceParams) { @@ -141,7 +129,8 @@ export class ObjectStore extends Base { folder, type: this.getItemType(it), hasCopy, - shortName: it.name && this.getShortName(it.name, folder), + shortName: this.getShortName(it, folder), + name: it.subdir || it.name, }; }); };