diff --git a/packages/api/test/user.spec.js b/packages/api/test/user.spec.js index 4769ed2807..7f2ec48b8c 100644 --- a/packages/api/test/user.spec.js +++ b/packages/api/test/user.spec.js @@ -29,7 +29,7 @@ describe('GET /user/account', () => { assert(res.ok) const data = await res.json() assert.strictEqual(data.usedStorage.uploaded, 32000) - assert.strictEqual(data.usedStorage.pinned, 10000) + assert.strictEqual(data.usedStorage.psaPinned, 10000) }) }) diff --git a/packages/db/db-client-types.ts b/packages/db/db-client-types.ts index fb17ab57f2..9f1eee6cef 100644 --- a/packages/db/db-client-types.ts +++ b/packages/db/db-client-types.ts @@ -334,5 +334,5 @@ export type NameItem = { export type UsedStorage = { uploaded: number, - pinned: number -} \ No newline at end of file + psaPinned: number +} diff --git a/packages/db/index.d.ts b/packages/db/index.d.ts index a886df079b..d4052d17ca 100644 --- a/packages/db/index.d.ts +++ b/packages/db/index.d.ts @@ -28,6 +28,7 @@ import type { ContentInput, ListPsaPinRequestOptions, ListPsaPinRequestResults, + UsedStorage } from './db-client-types' export { gql } @@ -38,7 +39,7 @@ export class DBClient { getMetricsValue (key: string): Promise<{ total: number }> upsertUser (user: UpsertUserInput): Promise getUser (issuer: string): Promise - getUsedStorage (userId: number): Promise<{ uploaded: number, pinned: number }> + getUsedStorage (userId: number): Promise createUpload (data: CreateUploadInput): Promise getUpload (cid: string, userId: number): Promise listUploads (userId: number, opts?: ListUploadsOptions): Promise diff --git a/packages/db/index.js b/packages/db/index.js index cfda02c5c4..cf1ce4c09c 100644 --- a/packages/db/index.js +++ b/packages/db/index.js @@ -197,7 +197,7 @@ export class DBClient { * @returns {Promise} */ async getUsedStorage (userId) { - /** @type {{ data: { uploaded: string, pinned: string }, error: PostgrestError }} */ + /** @type {{ data: { uploaded: string, psa_pinned: string }, error: PostgrestError }} */ const { data, error } = await this._client.rpc('user_used_storage', { query_user_id: userId }).single() if (error) { @@ -206,7 +206,7 @@ export class DBClient { return { uploaded: parseTextToNumber(data.uploaded), - pinned: parseTextToNumber(data.pinned) + psaPinned: parseTextToNumber(data.psa_pinned) } } diff --git a/packages/db/postgres/functions.sql b/packages/db/postgres/functions.sql index a9ae351678..bd5e6fc56f 100644 --- a/packages/db/postgres/functions.sql +++ b/packages/db/postgres/functions.sql @@ -269,14 +269,14 @@ BEGIN END $$; -CREATE TYPE used_storage AS (uploaded TEXT, pinned TEXT); +CREATE TYPE stored_bytes AS (uploaded TEXT, psa_pinned TEXT); CREATE OR REPLACE FUNCTION user_used_storage(query_user_id BIGINT) -RETURNS used_storage +RETURNS stored_bytes LANGUAGE plpgsql AS $$ -DECLARE used_storage used_storage; +DECLARE used_storage stored_bytes; BEGIN SELECT COALESCE(SUM(c.dag_size), 0) INTO used_storage.uploaded::TEXT @@ -300,7 +300,7 @@ BEGIN GROUP BY psa_pr.content_cid, c.dag_size ) AS pinned_content), 0) - INTO used_storage.pinned::TEXT; + INTO used_storage.psa_pinned::TEXT; return used_storage; END diff --git a/packages/db/postgres/migrations/008-user-used-storage-update.sql b/packages/db/postgres/migrations/008-user-used-storage-update.sql new file mode 100644 index 0000000000..de366865cd --- /dev/null +++ b/packages/db/postgres/migrations/008-user-used-storage-update.sql @@ -0,0 +1,39 @@ +DROP TYPE used_storage; +CREATE TYPE stored_bytes AS (uploaded TEXT, psa_pinned TEXT); + +DROP FUNCTION user_used_storage(bigint); + +CREATE OR REPLACE FUNCTION user_used_storage(query_user_id BIGINT) +RETURNS stored_bytes +LANGUAGE plpgsql +AS +$$ +DECLARE used_storage stored_bytes; +BEGIN + SELECT COALESCE(SUM(c.dag_size), 0) + INTO used_storage.uploaded::TEXT + FROM upload u + JOIN content c ON c.cid = u.content_cid + WHERE u.user_id = query_user_id::BIGINT + AND u.deleted_at is null; + + SELECT COALESCE(( + SELECT SUM(dag_size) + FROM ( + SELECT psa_pr.content_cid, + c.dag_size + FROM psa_pin_request psa_pr + JOIN content c ON c.cid = psa_pr.content_cid + JOIN pin p ON p.content_cid = psa_pr.content_cid + JOIN auth_key a ON a.id = psa_pr.auth_key_id + WHERE a.user_id = query_user_id::BIGINT + AND psa_pr.deleted_at is null + AND p.status = 'Pinned' + GROUP BY psa_pr.content_cid, + c.dag_size + ) AS pinned_content), 0) + INTO used_storage.psa_pinned::TEXT; + + return used_storage; +END +$$; diff --git a/packages/db/test/pinning.spec.js b/packages/db/test/pinning.spec.js index c148cf47db..94e689cd51 100644 --- a/packages/db/test/pinning.spec.js +++ b/packages/db/test/pinning.spec.js @@ -176,7 +176,7 @@ describe('Pin Request', () => { it('sums pinned size for unique CIDs in used storage', async () => { let usedStorage = await client.getUsedStorage(user._id) - assert.strictEqual(usedStorage.pinned, dagSize1, 'used storage for pinned') + assert.strictEqual(usedStorage.psaPinned, dagSize1, 'used storage for pinned') await client.createPsaPinRequest({ sourceCid: cids[1], @@ -189,7 +189,7 @@ describe('Pin Request', () => { }) usedStorage = await client.getUsedStorage(user._id) - assert.strictEqual(usedStorage.pinned, dagSize1 * 2, 'used storage for pinned') + assert.strictEqual(usedStorage.psaPinned, dagSize1 * 2, 'used storage for pinned') }) }) diff --git a/packages/db/test/user.spec.js b/packages/db/test/user.spec.js index f907dcf706..b328c92364 100644 --- a/packages/db/test/user.spec.js +++ b/packages/db/test/user.spec.js @@ -160,7 +160,7 @@ describe('user operations', () => { const emptyUsedStorage = await client.getUsedStorage(user._id) assert.strictEqual(emptyUsedStorage.uploaded, 0, 'empty used storage for uploaded') - assert.strictEqual(emptyUsedStorage.pinned, 0, 'empty used storage for pinned') + assert.strictEqual(emptyUsedStorage.psaPinned, 0, 'empty used storage for pinned') // Create Upload 1 const cid1 = 'bafybeiczsscdsbs7ffqz55asqdf3smv6klcw3gofszvwlyarci47fgf111' diff --git a/packages/website/components/account/storageManager/storageManager.js b/packages/website/components/account/storageManager/storageManager.js index 4402a4367d..dbe63ad265 100644 --- a/packages/website/components/account/storageManager/storageManager.js +++ b/packages/website/components/account/storageManager/storageManager.js @@ -39,7 +39,7 @@ const StorageManager = ({ className = '', content }) => { storageData: { data, isLoading }, } = useUser(); const uploaded = useMemo(() => data?.usedStorage?.uploaded || 0, [data]); - const pinned = useMemo(() => data?.usedStorage?.pinned || 0, [data]); + const psaPinned = useMemo(() => data?.usedStorage?.psaPinned || 0, [data]); const [componentInViewport, setComponentInViewport] = useState(false); const storageManagerRef = useRef(/** @type {HTMLDivElement | null} */ (null)); @@ -51,22 +51,22 @@ const StorageManager = ({ className = '', content }) => { maxSpaceLabel: content.tiers[0].max_space_label, unlockLabel: content.tiers[0].unlock_label, percentUploaded: (uploaded / tebibyte) * 100, - percentPinned: (pinned / tebibyte) * 100, + percentPinned: (psaPinned / tebibyte) * 100, }, [StorageTiers.TIER_2]: { maxSpaceLabel: content.tiers[1].max_space_label, unlockLabel: content.tiers[1].unlock_label, percentUploaded: (uploaded / (tebibyte * 10)) * 100, - percentPinned: (pinned / (tebibyte * 10)) * 100, + percentPinned: (psaPinned / (tebibyte * 10)) * 100, }, [StorageTiers.TIER_3]: { - maxSpaceLabel: `${Math.floor(uploaded + pinned / (tebibyte * 10) + 1) + content.tiers[2].max_space_label}`, + maxSpaceLabel: `${Math.floor(uploaded + psaPinned / (tebibyte * 10) + 1) + content.tiers[2].max_space_label}`, // every increment of 10 changes the amount of space used percentUploaded: ((uploaded % (tebibyte * 10)) / (tebibyte * 10)) * 100, - percentPinned: ((pinned % (tebibyte * 10)) / (tebibyte * 10)) * 100, + percentPinned: ((psaPinned % (tebibyte * 10)) / (tebibyte * 10)) * 100, }, }[storageTier]), - [storageTier, uploaded, pinned, content.tiers] + [storageTier, uploaded, psaPinned, content.tiers] ); useEffect(() => { @@ -121,7 +121,7 @@ const StorageManager = ({ className = '', content }) => { {/* Used storage in GB */} {content.heading}:{' '} - {filesz(uploaded + pinned, { + {filesz(uploaded + psaPinned, { base: 2, standard: 'iec', })} @@ -150,7 +150,7 @@ const StorageManager = ({ className = '', content }) => { )} -
0 || pinned > 0 ? '' : 'no-margin')}> +
0 || psaPinned > 0 ? '' : 'no-margin')}> {uploaded > 0 ? (
{content.legend.uploaded}  @@ -160,10 +160,10 @@ const StorageManager = ({ className = '', content }) => { })}
) : null} - {pinned > 0 ? ( + {psaPinned > 0 ? (
{content.legend.pinned}  - {filesz(pinned, { + {filesz(psaPinned, { base: 2, standard: 'iec', })} diff --git a/packages/website/components/contexts/userContext.js b/packages/website/components/contexts/userContext.js index 08f3750c6a..207d0c22a2 100644 --- a/packages/website/components/contexts/userContext.js +++ b/packages/website/components/contexts/userContext.js @@ -14,7 +14,7 @@ import { useAuthorization } from './authorizationContext.js'; * @property {string} publicAddress * @property {string} created * @property {string} updated - * @property {import('react-query').UseQueryResult<{usedStorage: {uploaded: number, pinned: number}}>} storageData + * @property {import('react-query').UseQueryResult<{usedStorage: {uploaded: number, psaPinned: number}}>} storageData * @property {string} isLoadingStorage */