From ee8ec47a4fc966c2183bcffcaa30c494c10b7725 Mon Sep 17 00:00:00 2001 From: DarkSky Date: Wed, 17 Jan 2024 12:36:21 +0000 Subject: [PATCH] feat: use `SafeInt` replace `Float` (#5613) --- packages/backend/server/package.json | 1 + .../backend/server/src/modules/users/types.ts | 9 +++++---- .../src/modules/workspaces/resolvers/blob.ts | 4 ++-- .../server/src/modules/workspaces/types.ts | 4 ++-- packages/backend/server/src/schema.gql | 15 ++++++++++----- packages/backend/server/tests/utils/blobs.ts | 2 +- packages/frontend/graphql/codegen.yml | 3 ++- .../graphql/src/graphql/blob-check-size.gql | 2 +- packages/frontend/graphql/src/graphql/index.ts | 2 +- packages/frontend/graphql/src/schema.ts | 4 +++- yarn.lock | 12 ++++++++++++ 11 files changed, 40 insertions(+), 18 deletions(-) diff --git a/packages/backend/server/package.json b/packages/backend/server/package.json index cffb49d4d..059f34ba7 100644 --- a/packages/backend/server/package.json +++ b/packages/backend/server/package.json @@ -63,6 +63,7 @@ "file-type": "^19.0.0", "get-stream": "^8.0.1", "graphql": "^16.8.1", + "graphql-scalars": "^1.22.4", "graphql-type-json": "^0.3.2", "graphql-upload": "^16.0.2", "ioredis": "^5.3.2", diff --git a/packages/backend/server/src/modules/users/types.ts b/packages/backend/server/src/modules/users/types.ts index 0da51645a..eb41b3161 100644 --- a/packages/backend/server/src/modules/users/types.ts +++ b/packages/backend/server/src/modules/users/types.ts @@ -1,5 +1,6 @@ -import { createUnionType, Field, Float, ID, ObjectType } from '@nestjs/graphql'; +import { createUnionType, Field, ID, ObjectType } from '@nestjs/graphql'; import type { User } from '@prisma/client'; +import { SafeIntResolver } from 'graphql-scalars'; @ObjectType('UserQuotaHumanReadable') export class UserQuotaHumanReadableType { @@ -24,13 +25,13 @@ export class UserQuotaType { @Field({ name: 'name' }) name!: string; - @Field(() => Float, { name: 'blobLimit' }) + @Field(() => SafeIntResolver, { name: 'blobLimit' }) blobLimit!: number; - @Field(() => Float, { name: 'storageQuota' }) + @Field(() => SafeIntResolver, { name: 'storageQuota' }) storageQuota!: number; - @Field(() => Float, { name: 'historyPeriod' }) + @Field(() => SafeIntResolver, { name: 'historyPeriod' }) historyPeriod!: number; @Field({ name: 'memberLimit' }) diff --git a/packages/backend/server/src/modules/workspaces/resolvers/blob.ts b/packages/backend/server/src/modules/workspaces/resolvers/blob.ts index f1d960d74..7f3cba8b1 100644 --- a/packages/backend/server/src/modules/workspaces/resolvers/blob.ts +++ b/packages/backend/server/src/modules/workspaces/resolvers/blob.ts @@ -1,7 +1,6 @@ import { HttpStatus, Logger, UseGuards } from '@nestjs/common'; import { Args, - Float, Int, Mutation, Parent, @@ -10,6 +9,7 @@ import { Resolver, } from '@nestjs/graphql'; import { GraphQLError } from 'graphql'; +import { SafeIntResolver } from 'graphql-scalars'; import GraphQLUpload from 'graphql-upload/GraphQLUpload.mjs'; import { @@ -100,7 +100,7 @@ export class WorkspaceBlobResolver { async checkBlobSize( @CurrentUser() user: UserType, @Args('workspaceId') workspaceId: string, - @Args('size', { type: () => Float }) blobSize: number + @Args('size', { type: () => SafeIntResolver }) blobSize: number ) { const canWrite = await this.permissions.tryCheckWorkspace( workspaceId, diff --git a/packages/backend/server/src/modules/workspaces/types.ts b/packages/backend/server/src/modules/workspaces/types.ts index c3492f423..e959a1d1f 100644 --- a/packages/backend/server/src/modules/workspaces/types.ts +++ b/packages/backend/server/src/modules/workspaces/types.ts @@ -1,6 +1,5 @@ import { Field, - Float, ID, InputType, ObjectType, @@ -10,6 +9,7 @@ import { registerEnumType, } from '@nestjs/graphql'; import type { Workspace } from '@prisma/client'; +import { SafeIntResolver } from 'graphql-scalars'; import { UserType } from '../users/types'; @@ -78,7 +78,7 @@ export class InvitationWorkspaceType { @ObjectType() export class WorkspaceBlobSizes { - @Field(() => Float) + @Field(() => SafeIntResolver) size!: number; } diff --git a/packages/backend/server/src/schema.gql b/packages/backend/server/src/schema.gql index c630dd064..b6af02d7b 100644 --- a/packages/backend/server/src/schema.gql +++ b/packages/backend/server/src/schema.gql @@ -23,13 +23,18 @@ type UserQuotaHumanReadable { type UserQuota { name: String! - blobLimit: Float! - storageQuota: Float! - historyPeriod: Float! + blobLimit: SafeInt! + storageQuota: SafeInt! + historyPeriod: SafeInt! memberLimit: Int! humanReadable: UserQuotaHumanReadable! } +""" +The `SafeInt` scalar type represents non-fractional signed whole numeric values that are considered safe as defined by the ECMAScript specification. +""" +scalar SafeInt @specifiedBy(url: "https://www.ecma-international.org/ecma-262/#sec-number.issafeinteger") + type UserType { id: ID! @@ -172,7 +177,7 @@ type InvitationWorkspaceType { } type WorkspaceBlobSizes { - size: Float! + size: SafeInt! } type InvitationType { @@ -309,7 +314,7 @@ type Query { """List blobs of workspace""" listBlobs(workspaceId: String!): [String!]! @deprecated(reason: "use `workspace.blobs` instead") collectAllBlobSizes: WorkspaceBlobSizes! @deprecated(reason: "use `user.storageUsage` instead") - checkBlobSize(workspaceId: String!, size: Float!): WorkspaceBlobSizes! @deprecated(reason: "no more needed") + checkBlobSize(workspaceId: String!, size: SafeInt!): WorkspaceBlobSizes! @deprecated(reason: "no more needed") """Get current user""" currentUser: UserType diff --git a/packages/backend/server/tests/utils/blobs.ts b/packages/backend/server/tests/utils/blobs.ts index 5d1379763..514fbeee4 100644 --- a/packages/backend/server/tests/utils/blobs.ts +++ b/packages/backend/server/tests/utils/blobs.ts @@ -74,7 +74,7 @@ export async function checkBlobSize( .post(gql) .auth(token, { type: 'bearer' }) .send({ - query: `query checkBlobSize($workspaceId: String!, $size: Float!) { + query: `query checkBlobSize($workspaceId: String!, $size: SafeInt!) { checkBlobSize(workspaceId: $workspaceId, size: $size) { size } diff --git a/packages/frontend/graphql/codegen.yml b/packages/frontend/graphql/codegen.yml index c362371cf..6faebf03a 100644 --- a/packages/frontend/graphql/codegen.yml +++ b/packages/frontend/graphql/codegen.yml @@ -16,8 +16,9 @@ config: Decimal: number UUID: string ID: string - JSON: any + JSON: string Upload: File + SafeInt: number overwrite: true schema: ../../backend/server/src/schema.gql documents: ./src/**/*.gql diff --git a/packages/frontend/graphql/src/graphql/blob-check-size.gql b/packages/frontend/graphql/src/graphql/blob-check-size.gql index be76a0a1a..db122f8df 100644 --- a/packages/frontend/graphql/src/graphql/blob-check-size.gql +++ b/packages/frontend/graphql/src/graphql/blob-check-size.gql @@ -1,4 +1,4 @@ -query checkBlobSizes($workspaceId: String!, $size: Float!) { +query checkBlobSizes($workspaceId: String!, $size: SafeInt!) { checkBlobSize(workspaceId: $workspaceId, size: $size) { size } diff --git a/packages/frontend/graphql/src/graphql/index.ts b/packages/frontend/graphql/src/graphql/index.ts index a4b85368b..f35778253 100644 --- a/packages/frontend/graphql/src/graphql/index.ts +++ b/packages/frontend/graphql/src/graphql/index.ts @@ -13,7 +13,7 @@ export const checkBlobSizesQuery = { definitionName: 'checkBlobSize', containsFile: false, query: ` -query checkBlobSizes($workspaceId: String!, $size: Float!) { +query checkBlobSizes($workspaceId: String!, $size: SafeInt!) { checkBlobSize(workspaceId: $workspaceId, size: $size) { size } diff --git a/packages/frontend/graphql/src/schema.ts b/packages/frontend/graphql/src/schema.ts index 557a10dce..fb9ad9bea 100644 --- a/packages/frontend/graphql/src/schema.ts +++ b/packages/frontend/graphql/src/schema.ts @@ -28,6 +28,8 @@ export interface Scalars { Float: { input: number; output: number }; /** A date-time string at UTC, such as 2019-12-03T09:54:33Z, compliant with the date-time format. */ DateTime: { input: string; output: string }; + /** The `SafeInt` scalar type represents non-fractional signed whole numeric values that are considered safe as defined by the ECMAScript specification. */ + SafeInt: { input: number; output: number }; /** The `Upload` scalar type represents a file upload. */ Upload: { input: File; output: File }; } @@ -93,7 +95,7 @@ export interface UpdateWorkspaceInput { export type CheckBlobSizesQueryVariables = Exact<{ workspaceId: Scalars['String']['input']; - size: Scalars['Float']['input']; + size: Scalars['SafeInt']['input']; }>; export type CheckBlobSizesQuery = { diff --git a/yarn.lock b/yarn.lock index 1f9e6e321..e57f9801d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -689,6 +689,7 @@ __metadata: file-type: "npm:^19.0.0" get-stream: "npm:^8.0.1" graphql: "npm:^16.8.1" + graphql-scalars: "npm:^1.22.4" graphql-type-json: "npm:^0.3.2" graphql-upload: "npm:^16.0.2" ioredis: "npm:^5.3.2" @@ -21878,6 +21879,17 @@ __metadata: languageName: node linkType: hard +"graphql-scalars@npm:^1.22.4": + version: 1.22.4 + resolution: "graphql-scalars@npm:1.22.4" + dependencies: + tslib: "npm:^2.5.0" + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + checksum: 110c1fa29d7564d9967c974de2df08c99d7ed43af98097e5a5729f952c064b21f66a9f5a68143c50eeac6a4ce14f0999aed2ce8f043d02331d133b0c59a9c1ec + languageName: node + linkType: hard + "graphql-tag@npm:2.12.6, graphql-tag@npm:^2.11.0": version: 2.12.6 resolution: "graphql-tag@npm:2.12.6"