Update backend to use firebase-admin SDK for FCM

This commit is contained in:
Hamza-Ayed
2026-07-19 16:21:43 +03:00
parent 978a7489e6
commit 959e2fa758
76 changed files with 4693 additions and 116 deletions
+42 -2
View File
@@ -1,6 +1,8 @@
import { Body, Controller, Get, Param, Patch, Post, Query, UseGuards } from '@nestjs/common';
import { Body, Controller, Get, Param, Patch, Post, Query, UploadedFile, UseGuards, UseInterceptors } from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import { ApiBearerAuth, ApiTags } from '@nestjs/swagger';
import { TripsService, RequestTripDto } from './trips.service';
import { TripAudioService } from './trip-audio.service';
import { TripStatus } from './entities/trip.entity';
import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard';
import { RolesGuard } from '../auth/guards/roles.guard';
@@ -12,7 +14,10 @@ import { CurrentUser, AuthUser } from '../auth/decorators/current-user.decorator
@UseGuards(JwtAuthGuard)
@Controller('trips')
export class TripsController {
constructor(private readonly trips: TripsService) {}
constructor(
private readonly trips: TripsService,
private readonly audio: TripAudioService,
) {}
/** سرد رحلات المستأجر — للوحة الأدمن، بترشيح الحالة (docs/22 — N4). */
@UseGuards(RolesGuard)
@@ -70,4 +75,39 @@ export class TripsController {
const actor = user.role === 'driver' ? 'driver' : 'rider';
return this.trips.cancel(user.tenantId, id, actor, user.userId);
}
// ---- التسجيل الصوتي (R2) ----
/** رفع مقطع صوتي مرتبط بالرحلة. */
@Post(':id/audio')
@UseInterceptors(FileInterceptor('file', { limits: { fileSize: 50 * 1024 * 1024 } }))
uploadAudio(
@CurrentUser() user: AuthUser,
@Param('id') id: string,
@UploadedFile() file: any,
@Body('duration_sec') durationSec?: string,
@Body('destination_name') destName?: string,
) {
const role = user.role === 'driver' ? 'driver' as const : 'rider' as const;
return this.audio.upload(user.tenantId, id, user.userId, role, file, {
duration_sec: durationSec ? parseInt(durationSec, 10) : undefined,
destination_name: destName,
});
}
/** كل المقاطع الصوتية للرحلة. */
@Get(':id/audio')
listAudio(@CurrentUser() user: AuthUser, @Param('id') id: string) {
return this.audio.listByTrip(user.tenantId, id);
}
/** رابط تحميل مقطع صوتي. */
@Get(':id/audio/:audioId')
getAudioUrl(
@CurrentUser() user: AuthUser,
@Param('id') id: string,
@Param('audioId') audioId: string,
) {
return this.audio.getDownloadUrl(user.tenantId, audioId);
}
}