Jelajahi Sumber

updated controller and service for facial recognition

Dr-Swopt 1 bulan lalu
induk
melakukan
99ca7f3092

+ 11 - 4
src/face/face.controller.ts

@@ -1,4 +1,4 @@
-import { Controller, Post, Body } from '@nestjs/common';
+import { Controller, Post, Body, Get, Param, Delete } from '@nestjs/common';
 import { FaceService } from './face.service';
 
 @Controller('face')
@@ -7,7 +7,6 @@ export class FaceController {
 
   @Post('scan')
   async scan(@Body() body: { imageBase64: string }) {
-    console.log(`Scanning....`)
     const buffer = Buffer.from(body.imageBase64, 'base64');
     return this.faceService.recognizeFace(buffer);
   }
@@ -15,8 +14,16 @@ export class FaceController {
   @Post('enroll')
   async enroll(@Body() body: { imageBase64: string; name: string }) {
     const buffer = Buffer.from(body.imageBase64, 'base64');
-    const name = body.name; // <-- extract from body
-    return this.faceService.enrollFace(buffer, name);
+    return this.faceService.enrollFace(buffer, body.name);
   }
 
+  @Get('list')
+  async listEmployees() {
+    return this.faceService.getAllEmployees();
+  }
+
+  @Delete('delete/:name')
+  async deleteEmployee(@Param('name') name: string) {
+    return this.faceService.deleteEmployee(name);
+  }
 }

+ 43 - 2
src/face/face.service.ts

@@ -1,13 +1,18 @@
 import { Injectable, OnModuleInit, Inject } from '@nestjs/common';
 import { ClientGrpc } from '@nestjs/microservices';
 
+export interface Employee {
+  name: string;
+  photoUrl?: string;
+}
+
 @Injectable()
 export class FaceService implements OnModuleInit {
   private faceGrpc: any;
 
   constructor(
     @Inject('FACE_RECOGNITION_PACKAGE')
-    private readonly client: ClientGrpc,  // ✅ correct type
+    private readonly client: ClientGrpc,
   ) { }
 
   onModuleInit() {
@@ -15,10 +20,46 @@ export class FaceService implements OnModuleInit {
   }
 
   async recognizeFace(imageBuffer: Buffer) {
-    return this.faceGrpc.Recognize({ image: imageBuffer }).toPromise();
+    const res = await this.faceGrpc.Recognize({ image: imageBuffer }).toPromise();
+
+    let photoBase64: string | null = null;
+    if (res.image && res.image.length > 0) {
+      photoBase64 = `data:image/jpeg;base64,${Buffer.from(res.image).toString('base64')}`;
+    }
+
+    return {
+      name: res.name,
+      confidence: res.confidence,
+      photoUrl: photoBase64,
+    };
   }
 
   async enrollFace(imageBuffer: Buffer, name: string) {
     return this.faceGrpc.EnrollFace({ image: imageBuffer, name }).toPromise();
   }
+
+  async getAllEmployees(): Promise<Employee[]> {
+    // Get names + images from gRPC
+    const res = await this.faceGrpc.GetAllEmployees({}).toPromise();
+
+    // Map each employee to include base64 photo URL
+    return res.employees.map((emp: { name: string; image: Buffer }) => {
+      let photoUrl: string | null = null;
+      if (emp.image && emp.image.length > 0) {
+        photoUrl = `data:image/jpeg;base64,${Buffer.from(emp.image).toString('base64')}`;
+      }
+      return {
+        name: emp.name,
+        photoUrl,
+      };
+    });
+  }
+
+  async deleteEmployee(name: string): Promise<{ success: boolean; message: string }> {
+    const res = await this.faceGrpc.DeleteEmployee({ name }).toPromise();
+    return {
+      success: res.success,
+      message: res.message,
+    };
+  }
 }

+ 30 - 1
src/face/proto/face_recognition.proto

@@ -7,10 +7,11 @@ message FaceRequest {
   bytes image = 1;
 }
 
-// The response message containing recognition results
+// The response message containing recognition results, now includes image
 message FaceResponse {
   string name = 1;
   float confidence = 2;
+  bytes image = 3; // newly added: return matched employee image
 }
 
 // New messages for enrollment
@@ -24,8 +25,36 @@ message EnrollFaceResponse {
   string message = 2;
 }
 
+// Messages for getting all employees
+message Employee {
+  string name = 1;
+  bytes image = 2; // enrolled photo
+}
+
+message EmployeeListRequest {}
+
+message EmployeeListResponse {
+  repeated Employee employees = 1;
+}
+
+// Messages for deleting an employee
+message DeleteRequest {
+  string name = 1;
+}
+
+message DeleteEmployeeResponse {
+  bool success = 1;
+  string message = 2;
+}
+
 // The Face Recognition Service
 service FaceRecognitionService {
   rpc Recognize(FaceRequest) returns (FaceResponse);
   rpc EnrollFace(EnrollFaceRequest) returns (EnrollFaceResponse);
+
+  // Updated RPC to return employee name + photo
+  rpc GetAllEmployees(EmployeeListRequest) returns (EmployeeListResponse);
+
+  // Fixed to match the message name
+  rpc DeleteEmployee(DeleteRequest) returns (DeleteEmployeeResponse);
 }