feat: Goa GEL Blockchain e-Licensing Platform - Full Stack Implementation

Complete implementation of the Goa Government e-Licensing platform with:

Backend:
- NestJS API with JWT authentication
- PostgreSQL database with Knex ORM
- Redis caching and session management
- MinIO document storage
- Hyperledger Besu blockchain integration
- Multi-department workflow system
- Comprehensive API tests (266/282 passing)

Frontend:
- Angular 21 with standalone components
- Angular Material + TailwindCSS UI
- Visual workflow builder
- Document upload with progress tracking
- Blockchain explorer integration
- Role-based dashboards (Admin, Department, Citizen)
- E2E tests with Playwright (37 tests)

Infrastructure:
- Docker Compose orchestration
- Blockscout blockchain explorer
- Development and production configurations
This commit is contained in:
Mahi
2026-02-07 10:23:29 -04:00
commit 80566bf0a2
441 changed files with 102418 additions and 0 deletions

View File

@@ -0,0 +1,72 @@
import { ApiProperty } from '@nestjs/swagger';
export class DocumentResponseDto {
@ApiProperty({
description: 'Document ID (UUID)',
})
id: string;
@ApiProperty({
description: 'Request ID (UUID)',
})
requestId: string;
@ApiProperty({
description: 'Document type',
example: 'FIRE_SAFETY_CERTIFICATE',
})
docType: string;
@ApiProperty({
description: 'Original filename',
})
originalFilename: string;
@ApiProperty({
description: 'Current version number',
})
currentVersion: number;
@ApiProperty({
description: 'SHA-256 hash of current version',
})
currentHash: string;
@ApiProperty({
description: 'SHA-256 hash of current version (alias)',
required: false,
})
fileHash?: string;
@ApiProperty({
description: 'MinIO bucket name',
})
minioBucket: string;
@ApiProperty({
description: 'Whether document is active',
})
isActive: boolean;
@ApiProperty({
description: 'Number of times the document has been downloaded',
required: false,
})
downloadCount?: number;
@ApiProperty({
description: 'Timestamp of last download',
required: false,
})
lastDownloadedAt?: Date;
@ApiProperty({
description: 'Document creation timestamp',
})
createdAt: Date;
@ApiProperty({
description: 'Document last update timestamp',
})
updatedAt: Date;
}