Skip to content

Commit ced6d94

Browse files
committed
update status module
1 parent 881c83c commit ced6d94

File tree

5 files changed

+115
-14
lines changed

5 files changed

+115
-14
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { ApiProperty } from '@nestjs/swagger';
2+
import { IsNumber, IsString, IsArray } from 'class-validator';
3+
4+
import { RegistrationStatus } from '../schema/status.schema';
5+
6+
export class RegistrationStatusList {
7+
@ApiProperty({
8+
description: 'totalCount',
9+
example: 12,
10+
})
11+
@IsNumber()
12+
totalCount: number;
13+
14+
@ApiProperty({
15+
description: 'data',
16+
type: RegistrationStatus,
17+
example: [],
18+
isArray: true,
19+
})
20+
@IsString()
21+
@IsArray()
22+
data: Array<RegistrationStatus[]>;
23+
}

src/status/repository/status.repository.ts

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Inject, Injectable } from '@nestjs/common';
22
import { FilterQuery, Model, ProjectionType, QueryOptions } from 'mongoose';
33
import { RegistrationStatusDocument } from '../schema/status.schema';
44
import { skip } from 'rxjs';
5+
import { RegistrationStatusList } from '../dto/registration-status.response.dto';
56

67
@Injectable()
78
export class TxnStatusRepository {
@@ -14,11 +15,20 @@ export class TxnStatusRepository {
1415
registrationStatus: FilterQuery<RegistrationStatusDocument>,
1516
projection?: ProjectionType<RegistrationStatusDocument>,
1617
option?: QueryOptions<RegistrationStatusDocument>,
17-
) {
18-
return this.registatiationStatusModel.find(
19-
registrationStatus,
20-
projection,
21-
option,
22-
);
18+
): Promise<any> {
19+
return this.registatiationStatusModel.aggregate([
20+
{ $match: { ...registrationStatus } }, // Apply the query filter
21+
{
22+
$facet: {
23+
totalCount: [{ $count: 'total' }],
24+
25+
data: [
26+
{ $project: { _id: 0 } },
27+
{ $skip: Number(option.skip) }, // Apply the skip (pagination)
28+
{ $limit: Number(option.limit) }, // Apply the limit (pagination)
29+
],
30+
},
31+
},
32+
]);
2333
}
2434
}

src/status/status.controller.ts

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,23 @@ import {
55
UseGuards,
66
Query,
77
UseFilters,
8+
UseInterceptors,
89
} from '@nestjs/common';
910
import { StatusService } from './status.service';
1011

11-
import { ApiBearerAuth, ApiParam, ApiQuery, ApiTags } from '@nestjs/swagger';
12+
import {
13+
ApiBearerAuth,
14+
ApiParam,
15+
ApiQuery,
16+
ApiResponse,
17+
ApiTags,
18+
} from '@nestjs/swagger';
1219
import { AuthGuard } from '@nestjs/passport';
1320
import { PaginationDto } from 'src/utils/pagination.dto';
1421
import { AllExceptionsFilter } from 'src/utils/utils';
22+
import { RegistrationStatus } from './schema/status.schema';
23+
import { RegistrationStatusList } from './dto/registration-status.response.dto';
24+
import { RegistrationStatusInterceptor } from './transformer/staus-response.interceptor';
1525
@UseFilters(AllExceptionsFilter)
1626
@ApiTags('Status')
1727
@ApiBearerAuth('Authorization')
@@ -21,6 +31,10 @@ export class StatusController {
2131
constructor(private readonly statusService: StatusService) {}
2232

2333
@Get('ssi/:id')
34+
@ApiResponse({
35+
description: 'List of the txns',
36+
type: RegistrationStatusList,
37+
})
2438
@ApiQuery({
2539
name: 'page',
2640
description: 'Page value',
@@ -35,11 +49,19 @@ export class StatusController {
3549
name: 'id',
3650
description: 'Enter didId or vcId or schemaId',
3751
})
38-
getStatus(@Param('id') id: string, @Query() pagination: PaginationDto) {
52+
@UseInterceptors(RegistrationStatusInterceptor)
53+
getStatus(
54+
@Param('id') id: string,
55+
@Query() pagination: PaginationDto,
56+
): Promise<RegistrationStatusList> {
3957
return this.statusService.findBySsiId(id, pagination);
4058
}
4159

4260
@Get('transaction/:transactionHash')
61+
@ApiResponse({
62+
description: 'List of the txns',
63+
type: RegistrationStatusList,
64+
})
4365
@ApiQuery({
4466
name: 'page',
4567
description: 'Page value',
@@ -54,10 +76,11 @@ export class StatusController {
5476
name: 'transactionHash',
5577
description: 'Enter transactionHash',
5678
})
79+
@UseInterceptors(RegistrationStatusInterceptor)
5780
getStatusByTransactionHash(
5881
@Param('transactionHash') transactionHash: string,
5982
@Query() pagination: PaginationDto,
60-
) {
83+
): Promise<RegistrationStatusList> {
6184
return this.statusService.findByTxnId(transactionHash, pagination);
6285
}
6386
}

src/status/status.service.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
11
import { Injectable } from '@nestjs/common';
22
import { TxnStatusRepository } from './repository/status.repository';
3+
import { RegistrationStatusList } from './dto/registration-status.response.dto';
34

45
@Injectable()
56
export class StatusService {
67
constructor(private readonly txnStatusRepository: TxnStatusRepository) {}
7-
findBySsiId(id: string, option) {
8+
findBySsiId(id: string, option): Promise<RegistrationStatusList> {
89
const skip = (option.page - 1) * option.limit;
910
option['skip'] = skip;
10-
return this.txnStatusRepository.find({
11-
id,
12-
});
11+
return this.txnStatusRepository.find(
12+
{
13+
id,
14+
},
15+
{},
16+
option,
17+
);
1318
}
1419

15-
findByTxnId(id: string, option) {
20+
findByTxnId(id: string, option): Promise<RegistrationStatusList> {
1621
const skip = (option.page - 1) * option.limit;
1722
option['skip'] = skip;
1823
return this.txnStatusRepository.find(
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import {
2+
Injectable,
3+
NestInterceptor,
4+
ExecutionContext,
5+
CallHandler,
6+
} from '@nestjs/common';
7+
import { Observable } from 'rxjs';
8+
import { map } from 'rxjs/operators';
9+
import { RegistrationStatus } from '../schema/status.schema';
10+
export interface Response {
11+
totalCount: number;
12+
data: Array<RegistrationStatus>;
13+
}
14+
@Injectable()
15+
export class RegistrationStatusInterceptor implements NestInterceptor {
16+
intercept(
17+
context: ExecutionContext,
18+
next: CallHandler,
19+
): Observable<Response> {
20+
return next.handle().pipe(
21+
map((data) => {
22+
const modifiedResponse = {
23+
totalCount:
24+
data[0]['totalCount'].length > 0
25+
? data[0]['totalCount'][0].total
26+
: 0,
27+
data: this.mapData(data[0]['data']),
28+
};
29+
return modifiedResponse;
30+
}),
31+
);
32+
}
33+
mapData(data) {
34+
return data.map((data) => {
35+
data.message = JSON.parse(data.message);
36+
37+
return data;
38+
});
39+
}
40+
}

0 commit comments

Comments
 (0)