Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add validation pipes in message #17

Merged
merged 4 commits into from
Sep 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 4 additions & 5 deletions src/controllers/message/MessageController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,10 @@ import { DidExchangeState, utils } from '@credo-ts/core'
import { Body, Controller, HttpException, HttpStatus, Logger, Post } from '@nestjs/common'
import { ApiBody, ApiTags } from '@nestjs/swagger'

import { IBaseMessage } from '../../model'
import { BaseMessage } from '../../model'
import { AgentService } from '../../services/AgentService'
import { ServiceAgent } from '../../utils/ServiceAgent'

import { MessageDto } from './MessageDto'
import { MessageServiceFactory } from './services/MessageServiceFactory'

@ApiTags('message')
Expand All @@ -24,7 +23,7 @@ export class MessageController {

@Post('/')
@ApiBody({
type: MessageDto,
type: BaseMessage,
examples: {
text: {
summary: 'Text message',
Expand All @@ -48,7 +47,7 @@ export class MessageController {
},
},
})
public async sendMessage(@Body() message: IBaseMessage): Promise<{ id: string }> {
public async sendMessage(@Body() message: BaseMessage): Promise<{ id: string }> {
try {
const agent = await this.agentService.getAgent()
await this.checkForDuplicateId(agent, message)
Expand Down Expand Up @@ -79,7 +78,7 @@ export class MessageController {
}
}

private async checkForDuplicateId(agent: ServiceAgent, message: IBaseMessage): Promise<void> {
private async checkForDuplicateId(agent: ServiceAgent, message: BaseMessage): Promise<void> {
const records = message.id
? await agent.genericRecords.findAllByQuery({
messageId: message.id,
Expand Down
47 changes: 0 additions & 47 deletions src/controllers/message/MessageDto.ts

This file was deleted.

1 change: 0 additions & 1 deletion src/controllers/message/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
export * from './MessageController'
export * from './MessageDto'
export * from './MessageService'
export * from './services/CoreMessageService'
export * from './services/MessageServiceFactory'
Expand Down
5 changes: 4 additions & 1 deletion src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import 'reflect-metadata'
import type { ServerConfig } from './utils/ServerConfig'

import { KeyDerivationMethod, LogLevel } from '@credo-ts/core'
import { VersioningType } from '@nestjs/common'
import { ValidationPipe, VersioningType } from '@nestjs/common'
import { NestFactory } from '@nestjs/core'
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'

Expand Down Expand Up @@ -42,6 +42,9 @@ export const startAdminServer = async (agent: ServiceAgent, serverConfig: Server
const document = SwaggerModule.createDocument(app, config)
SwaggerModule.setup('api', app, document)

// Dto
app.useGlobalPipes(new ValidationPipe())

// Port expose
await app.listen(serverConfig.port)
}
Expand Down
37 changes: 35 additions & 2 deletions src/model/messages/BaseMessage.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
import { JsonTransformer } from '@credo-ts/core'
import { ApiProperty } from '@nestjs/swagger'
import { Expose } from 'class-transformer'
import { IsEnum, IsUUID, IsOptional, IsString, IsNotEmpty } from 'class-validator'
import { v4 as uuid } from 'uuid'

import { MessageType } from './MessageType'

export interface BaseMessageOptions {
id?: string
threadId?: string
Expand All @@ -11,7 +15,7 @@ export interface BaseMessageOptions {

export interface IBaseMessage {
id?: string
readonly type: string
readonly type: MessageType
connectionId: string
timestamp?: Date
threadId?: string
Expand All @@ -21,18 +25,47 @@ export class BaseMessage implements IBaseMessage {
public constructor() {}

@Expose()
@ApiProperty({
description: 'Optional unique identifier',
example: '73e93a8b-e67a-437b-971f-c6c958d14546',
})
@IsUUID()
@IsOptional()
public id!: string

@Expose()
public readonly type!: string
@ApiProperty({
description: 'Message type',
example: 'text',
})
@IsEnum(MessageType)
public readonly type!: MessageType

@Expose()
@ApiProperty({
description: 'Connection identifier',
example: '73e93a8b-e67a-437b-971f-c6c958d14546',
})
public connectionId!: string

@Expose()
@ApiProperty({
description: 'Optional timestamp',
example: '2024-03-11T14:03:50.607Z',
})
@IsString()
@IsOptional()
@IsNotEmpty()
public timestamp!: Date

@Expose()
@ApiProperty({
description: 'Thread identifier (if the message comes as a response from another flow)',
example: '73e93a8b-e67a-437b-971f-c6c958d14546',
})
@IsString()
@IsOptional()
@IsNotEmpty()
public threadId?: string

public generateId() {
Expand Down
3 changes: 2 additions & 1 deletion src/model/messages/ContextualMenuRequest.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { BaseMessage, BaseMessageOptions } from './BaseMessage'
import { MessageType } from './MessageType'

export interface ContextualMenuRequestMessageOptions extends BaseMessageOptions {}

Expand All @@ -15,5 +16,5 @@ export class ContextualMenuRequestMessage extends BaseMessage {
}

public readonly type = ContextualMenuRequestMessage.type
public static readonly type = 'contextual-menu-request'
public static readonly type = MessageType.ContextualMenuRequestMessage
}
3 changes: 2 additions & 1 deletion src/model/messages/ContextualMenuSelect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Expose } from 'class-transformer'
import { IsString, IsOptional } from 'class-validator'

import { BaseMessage, BaseMessageOptions } from './BaseMessage'
import { MessageType } from './MessageType'

export interface ContextualMenuSelectMessageOptions extends BaseMessageOptions {
selectionId?: string
Expand All @@ -21,7 +22,7 @@ export class ContextualMenuSelectMessage extends BaseMessage {
}

public readonly type = ContextualMenuSelectMessage.type
public static readonly type = 'contextual-menu-select'
public static readonly type = MessageType.ContextualMenuSelectMessage

@Expose()
@IsString()
Expand Down
3 changes: 2 additions & 1 deletion src/model/messages/ContextualMenuUpdate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Expose, Type } from 'class-transformer'
import { IsString, IsArray, IsInstance, IsOptional, ValidateNested } from 'class-validator'

import { BaseMessage, BaseMessageOptions } from './BaseMessage'
import { MessageType } from './MessageType'

export interface ContextualMenuItemOptions {
id: string
Expand Down Expand Up @@ -53,7 +54,7 @@ export class ContextualMenuUpdateMessage extends BaseMessage {
}

public readonly type = ContextualMenuUpdateMessage.type
public static readonly type = 'contextual-menu-update'
public static readonly type = MessageType.ContextualMenuUpdateMessage

@Expose()
@IsString()
Expand Down
3 changes: 2 additions & 1 deletion src/model/messages/CredentialIssuanceMessage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Expose, Type } from 'class-transformer'
import { IsOptional, IsString, IsArray, IsInstance, ValidateNested } from 'class-validator'

import { BaseMessage, BaseMessageOptions } from './BaseMessage'
import { MessageType } from './MessageType'

export interface ClaimOptions {
name: string
Expand Down Expand Up @@ -52,7 +53,7 @@ export class CredentialIssuanceMessage extends BaseMessage {
}

public readonly type = CredentialIssuanceMessage.type
public static readonly type = 'credential-issuance'
public static readonly type = MessageType.CredentialIssuanceMessage

@Expose()
@IsString()
Expand Down
3 changes: 2 additions & 1 deletion src/model/messages/CredentialReceptionMessage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { Expose } from 'class-transformer'
import { IsString } from 'class-validator'

import { BaseMessage, BaseMessageOptions } from './BaseMessage'
import { MessageType } from './MessageType'

export interface CredentialReceptionMessageOptions extends BaseMessageOptions {
state: CredentialState
Expand All @@ -22,7 +23,7 @@ export class CredentialReceptionMessage extends BaseMessage {
}

public readonly type = CredentialReceptionMessage.type
public static readonly type = 'credential-reception'
public static readonly type = MessageType.CredentialReceptionMessage

@Expose()
@IsString()
Expand Down
3 changes: 2 additions & 1 deletion src/model/messages/CredentialRequestMessage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { IsOptional, IsString, IsArray, IsInstance, ValidateNested } from 'class

import { BaseMessage, BaseMessageOptions } from './BaseMessage'
import { Claim, ClaimOptions } from './CredentialIssuanceMessage'
import { MessageType } from './MessageType'

export interface CredentialRequestMessageOptions extends BaseMessageOptions {
credentialDefinitionId: string
Expand All @@ -24,7 +25,7 @@ export class CredentialRequestMessage extends BaseMessage {
}

public readonly type = CredentialRequestMessage.type
public static readonly type = 'credential-request'
public static readonly type = MessageType.CredentialRequestMessage

@Expose()
@IsString()
Expand Down
3 changes: 2 additions & 1 deletion src/model/messages/IdentityProofRequestMessage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Expose, Type } from 'class-transformer'
import { IsString, IsArray, IsInstance, ValidateNested } from 'class-validator'

import { BaseMessage, BaseMessageOptions } from './BaseMessage'
import { MessageType } from './MessageType'

export interface RequestedProofItemOptions {
id: string
Expand Down Expand Up @@ -43,7 +44,7 @@ export class IdentityProofRequestMessage extends BaseMessage {
}

public readonly type = IdentityProofRequestMessage.type
public static readonly type = 'identity-proof-request'
public static readonly type = MessageType.IdentityProofRequestMessage

@Expose()
@Type(() => RequestedProofItem)
Expand Down
3 changes: 2 additions & 1 deletion src/model/messages/IdentityProofResultMessage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Expose, Type } from 'class-transformer'
import { IsString, IsArray, IsInstance, ValidateNested } from 'class-validator'

import { BaseMessage, BaseMessageOptions } from './BaseMessage'
import { MessageType } from './MessageType'

export interface ProofItemResultOptions {
id: string
Expand Down Expand Up @@ -43,7 +44,7 @@ export class IdentityProofResultMessage extends BaseMessage {
}

public readonly type = IdentityProofResultMessage.type
public static readonly type = 'identity-proof-result'
public static readonly type = MessageType.IdentityProofResultMessage

@Expose()
@Type(() => ProofItemResult)
Expand Down
3 changes: 2 additions & 1 deletion src/model/messages/IdentityProofSubmitMessage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Expose, Type } from 'class-transformer'
import { IsString, IsArray, IsInstance, ValidateNested } from 'class-validator'

import { BaseMessage, BaseMessageOptions } from './BaseMessage'
import { MessageType } from './MessageType'

export interface SubmittedProofItemOptions {
id: string
Expand Down Expand Up @@ -43,7 +44,7 @@ export class IdentityProofSubmitMessage extends BaseMessage {
}

public readonly type = IdentityProofSubmitMessage.type
public static readonly type = 'identity-proof-submit'
public static readonly type = MessageType.IdentityProofSubmitMessage

@Expose()
@Type(() => SubmittedProofItem)
Expand Down
3 changes: 2 additions & 1 deletion src/model/messages/InvitationMessage.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { IsString, IsOptional } from 'class-validator'

import { BaseMessage, BaseMessageOptions } from './BaseMessage'
import { MessageType } from './MessageType'

export interface InvitationMessageOptions extends BaseMessageOptions {
label?: string
Expand All @@ -24,7 +25,7 @@ export class InvitationMessage extends BaseMessage {
}

public readonly type = InvitationMessage.type
public static readonly type = 'invitation'
public static readonly type = MessageType.InvitationMessage

@IsString()
@IsOptional()
Expand Down
3 changes: 2 additions & 1 deletion src/model/messages/MediaMessage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { Type } from 'class-transformer'
import { IsOptional, IsArray, IsInstance, IsString, ValidateNested } from 'class-validator'

import { BaseMessage } from './BaseMessage'
import { MessageType } from './MessageType'

export interface CipheringInfo {
algorithm: string
Expand Down Expand Up @@ -127,7 +128,7 @@ export class MediaMessage extends BaseMessage {
}

public readonly type = MediaMessage.type
public static readonly type = 'media'
public static readonly type = MessageType.MediaMessage

@IsOptional()
@IsString()
Expand Down
3 changes: 2 additions & 1 deletion src/model/messages/MenuDisplayMessage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Expose, Type } from 'class-transformer'
import { IsString, IsArray, IsInstance, IsOptional, ValidateNested } from 'class-validator'

import { BaseMessage, BaseMessageOptions } from './BaseMessage'
import { MessageType } from './MessageType'

// TODO: define action types in protocol
type Action = string
Expand Down Expand Up @@ -54,7 +55,7 @@ export class MenuDisplayMessage extends BaseMessage {
}

public readonly type = MenuDisplayMessage.type
public static readonly type = 'menu-display'
public static readonly type = MessageType.MenuDisplayMessage

@Expose()
@IsString()
Expand Down
3 changes: 2 additions & 1 deletion src/model/messages/MenuSelectMessage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Expose, Type } from 'class-transformer'
import { IsArray, IsInstance, ValidateNested } from 'class-validator'

import { BaseMessage, BaseMessageOptions } from './BaseMessage'
import { MessageType } from './MessageType'

export interface MenuSelectMessageOptions extends BaseMessageOptions {
menuItems: MenuItemSelectionOptions[]
Expand Down Expand Up @@ -35,7 +36,7 @@ export class MenuSelectMessage extends BaseMessage {
}

public readonly type = MenuSelectMessage.type
public static readonly type = 'menu-select'
public static readonly type = MessageType.MenuSelectMessage

@Expose()
@Type(() => MenuItemSelection)
Expand Down
Loading