Skip to content

Commit

Permalink
Merge pull request #840 from merico-dev/820-dashboard-content-draft-s…
Browse files Browse the repository at this point in the history
…upport

820 dashboard content draft support
  • Loading branch information
GerilLeto authored May 17, 2023
2 parents b3696fb + d63b36e commit 4e23389
Show file tree
Hide file tree
Showing 213 changed files with 5,590 additions and 2,490 deletions.
1 change: 1 addition & 0 deletions api/jest-e2e.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ module.exports = {
...defaultConfig,
coverageDirectory: './coverage-e2e/',
globalSetup: '<rootDir>/tests/e2e/jest.setup.ts',
setupFilesAfterEnv: ['<rootDir>/tests/e2e/jest.mock.ts'],
testRegex: '(/tests/e2e/.*(test|spec|e2e))\\.(jsx?|tsx?)$',
roots: ['<rootDir>/tests/e2e/'],
testSequencer: './test.sequencer.js',
Expand Down
2 changes: 1 addition & 1 deletion api/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@devtable/api",
"version": "8.61.2",
"version": "8.62.2",
"description": "",
"main": "index.js",
"scripts": {
Expand Down
33 changes: 8 additions & 25 deletions api/src/api_models/dashboard.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { ApiModel, ApiModelProperty, SwaggerDefinitionConstant } from 'swagger-express-ts';
import { IsObject, Length, IsString, IsOptional, ValidateNested, IsUUID, IsBoolean, IsIn } from 'class-validator';
import { ApiModel, ApiModelProperty } from 'swagger-express-ts';
import { Length, IsString, IsOptional, ValidateNested, IsUUID, IsBoolean, IsIn, ValidateIf } from 'class-validator';
import { Type } from 'class-transformer';
import { Authentication, FilterObject, PaginationRequest, PaginationResponse, SortRequest } from './base';
import { PermissionResource } from './dashboard_permission';
Expand All @@ -11,50 +11,41 @@ import { PermissionResource } from './dashboard_permission';
export class Dashboard {
@ApiModelProperty({
description: 'Dashboard ID in uuid format',
required: false,
})
id: string;

@ApiModelProperty({
description: 'Name of the dashboard',
required: true,
})
name: string;

@ApiModelProperty({
description: 'content of the dashboard stored in json object format',
required: true,
type: SwaggerDefinitionConstant.JSON,
description: 'dashboard content ID in uuid format',
})
content: object | null;
content_id: string | null;

@ApiModelProperty({
description: 'whether the dashboard is removed or not',
required: false,
})
is_removed: boolean;

@ApiModelProperty({
description: 'whether the dashboard is preset or not',
required: false,
})
is_preset: boolean;

@ApiModelProperty({
description: 'Dashboard group',
required: false,
})
group: string;

@ApiModelProperty({
description: 'Create time',
required: false,
})
create_time: Date;

@ApiModelProperty({
description: 'Time of last update',
required: false,
})
update_time: Date;

Expand Down Expand Up @@ -214,14 +205,6 @@ export class DashboardCreateRequest {
})
name: string;

@IsObject()
@ApiModelProperty({
description: 'content of the dashboard stored in json object format',
required: true,
type: SwaggerDefinitionConstant.JSON,
})
content: Record<string, any>;

@IsString()
@ApiModelProperty({
description: 'Dashboard group',
Expand Down Expand Up @@ -262,13 +245,13 @@ export class DashboardUpdateRequest {
name?: string;

@IsOptional()
@IsObject()
@IsUUID()
@ValidateIf((_object, value) => value !== null)
@ApiModelProperty({
description: 'content of the dashboard stored in json object format',
description: 'dashboard content ID in uuid format',
required: false,
type: SwaggerDefinitionConstant.JSON,
})
content?: Record<string, any>;
content_id?: string | null;

@IsOptional()
@IsBoolean()
Expand Down
259 changes: 259 additions & 0 deletions api/src/api_models/dashboard_content.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,259 @@
import { ApiModel, ApiModelProperty, SwaggerDefinitionConstant } from 'swagger-express-ts';
import { IsObject, Length, IsString, IsOptional, ValidateNested, IsUUID, IsIn } from 'class-validator';
import { Type } from 'class-transformer';
import { Authentication, FilterObject, PaginationRequest, PaginationResponse, SortRequest } from './base';

@ApiModel({
description: 'Dashboard content entity',
name: 'DashboardContent',
})
export class DashboardContent {
@ApiModelProperty({
description: 'Dashboard content ID in uuid format',
})
id: string;

@ApiModelProperty({
description: 'Dashboard ID in uuid format',
})
dashboard_id: string;

@ApiModelProperty({
description: 'Name of the dashboard content',
})
name: string;

@ApiModelProperty({
description: 'content of the dashboard stored in json object format',
type: SwaggerDefinitionConstant.JSON,
})
content: object | null;

@ApiModelProperty({
description: 'Create time',
})
create_time: Date;

@ApiModelProperty({
description: 'Time of last update',
})
update_time: Date;
}

@ApiModel({
description: 'Dashboard content filter object',
name: 'DashboardContentFilterObject',
})
export class DashboardContentFilterObject {
@IsOptional()
@Type(() => FilterObject)
@ValidateNested({ each: true })
@ApiModelProperty({
description: 'Filter based on name',
required: false,
model: 'FilterObject',
})
name?: FilterObject;
}

@ApiModel({
description: 'Dashboard content sort object',
name: 'DashboardContentSortObject',
})
export class DashboardContentSortObject implements SortRequest {
@IsIn(['name', 'create_time', 'update_time'])
@ApiModelProperty({
description: 'Field for sorting',
required: true,
enum: ['name', 'create_time', 'update_time'],
})
field: 'name' | 'create_time' | 'update_time';

@IsIn(['ASC', 'DESC'])
@ApiModelProperty({
description: 'Sort order',
required: true,
enum: ['ASC', 'DESC'],
})
order: 'ASC' | 'DESC';

constructor(data: any) {
Object.assign(this, data);
}
}

@ApiModel({
description: 'Dashboard content list request object',
name: 'DashboardContentListRequest',
})
export class DashboardContentListRequest {
@IsUUID()
@ApiModelProperty({
description: 'Dashboard ID in uuid format',
required: true,
})
dashboard_id: string;

@IsOptional()
@Type(() => DashboardContentFilterObject)
@ValidateNested({ each: true })
@ApiModelProperty({
description: 'Dashboard content filter object',
required: false,
model: 'DashboardContentFilterObject',
})
filter?: DashboardContentFilterObject;

@Type(() => DashboardContentSortObject)
@ValidateNested({ each: true })
@ApiModelProperty({
description: 'Dashboard content sort object',
required: true,
model: 'DashboardContentSortObject',
})
sort: DashboardContentSortObject[] = [new DashboardContentSortObject({ field: 'create_time', order: 'ASC' })];

@Type(() => PaginationRequest)
@ValidateNested({ each: true })
@ApiModelProperty({
description: 'Pagination object',
required: true,
model: 'PaginationRequest',
})
pagination: PaginationRequest = new PaginationRequest({ page: 1, pagesize: 20 });

@IsOptional()
@Type(() => Authentication)
@ValidateNested({ each: true })
@ApiModelProperty({
description: 'authentication object for use with app_id / app_secret',
required: false,
model: 'Authentication',
})
authentication?: Authentication;
}

@ApiModel({
description: 'dashboard content pagination response object',
name: 'DashboardContentPaginationResponse',
})
export class DashboardContentPaginationResponse implements PaginationResponse<DashboardContent> {
@ApiModelProperty({
description: 'Total number results',
})
total: number;

@ApiModelProperty({
description: 'Current offset of results',
})
offset: number;

@ApiModelProperty({
description: 'Dashboard content list',
model: 'DashboardContent',
})
data: DashboardContent[];
}

@ApiModel({
description: 'dashboard content create request object',
name: 'DashboardContentCreateRequest',
})
export class DashboardContentCreateRequest {
@IsUUID()
@ApiModelProperty({
description: 'Dashboard ID in uuid format',
required: true,
})
dashboard_id: string;

@IsString()
@Length(1, 250)
@ApiModelProperty({
description: 'Name of the dashboard content',
required: true,
})
name: string;

@IsObject()
@ApiModelProperty({
description: 'content stored in json object format',
required: true,
type: SwaggerDefinitionConstant.JSON,
})
content: Record<string, any>;

@IsOptional()
@Type(() => Authentication)
@ValidateNested({ each: true })
@ApiModelProperty({
description: 'authentication object for use with app_id / app_secret',
required: false,
model: 'Authentication',
})
authentication?: Authentication;
}

@ApiModel({
description: 'dashboard content update request object',
name: 'DashboardContentUpdateRequest',
})
export class DashboardContentUpdateRequest {
@IsUUID()
@ApiModelProperty({
description: 'Dashboard content ID in uuid format',
required: true,
})
id: string;

@IsOptional()
@IsString()
@Length(1, 250)
@ApiModelProperty({
description: 'Name of the dashboard content',
required: false,
})
name?: string;

@IsOptional()
@IsObject()
@ApiModelProperty({
description: 'content of the dashboard stored in json object format',
required: false,
type: SwaggerDefinitionConstant.JSON,
})
content?: Record<string, any>;

@IsOptional()
@Type(() => Authentication)
@ValidateNested({ each: true })
@ApiModelProperty({
description: 'authentication object for use with app_id / app_secret',
required: false,
model: 'Authentication',
})
authentication?: Authentication;
}

@ApiModel({
description: 'Dashboard content ID request',
name: 'DashboardContentIDRequest',
})
export class DashboardContentIDRequest {
@IsUUID()
@ApiModelProperty({
description: 'Dashboard content ID in uuid format',
required: true,
})
id: string;

@IsOptional()
@Type(() => Authentication)
@ValidateNested({ each: true })
@ApiModelProperty({
description: 'authentication object for use with app_id / app_secret',
required: false,
model: 'Authentication',
})
authentication?: Authentication;
}
Loading

0 comments on commit 4e23389

Please sign in to comment.