main
Backend Deploy 🚀 / build-and-deploy (push) Has been cancelled

This commit is contained in:
Harun CAN
2026-05-01 00:45:33 +02:00
parent 1775ac1aa1
commit 5184db32cc
33 changed files with 1852 additions and 713 deletions
+85 -34
View File
@@ -26,12 +26,12 @@ import {
} from '@nestjs/swagger';
import { FileInterceptor } from '@nestjs/platform-express';
import { ProjectsService } from './projects.service';
import {
CreateProjectDto,
UpdateProjectDto,
CreateFromTweetDto,
CreateFromYoutubeDto,
CreateFromDocumentDto,
import {
CreateProjectDto,
UpdateProjectDto,
CreateFromTweetDto,
CreateFromYoutubeDto,
CreateFromDocumentDto,
CreateFromExtractedTextDto,
CreateFromTextDto,
} from './dto/project.dto';
@@ -138,7 +138,10 @@ export class ProjectsController {
@HttpCode(HttpStatus.OK)
@ApiOperation({ summary: 'AI ile senaryo üret (Gemini)' })
@ApiResponse({ status: 200, description: 'Senaryo üretildi ve kaydedildi' })
async generateScript(@Param('id', ParseUUIDPipe) id: string, @Req() req: any) {
async generateScript(
@Param('id', ParseUUIDPipe) id: string,
@Req() req: any,
) {
const userId = req.user?.id || req.user?.sub;
this.logger.log(`Senaryo üretimi başlatılıyor: ${id}`);
return this.projectsService.generateScript(userId, id);
@@ -167,10 +170,7 @@ export class ProjectsController {
@HttpCode(HttpStatus.OK)
@ApiOperation({ summary: 'Aktif render işlemini iptal et' })
@ApiResponse({ status: 200, description: 'Render işlemi iptal edildi' })
async cancelRender(
@Param('id', ParseUUIDPipe) id: string,
@Req() req: any,
) {
async cancelRender(@Param('id', ParseUUIDPipe) id: string, @Req() req: any) {
const userId = req.user?.id || req.user?.sub;
this.logger.log(`Render iptal isteği: ${id}`);
return this.projectsService.cancelRenderJob(userId, id);
@@ -182,9 +182,15 @@ export class ProjectsController {
*/
@Post('from-tweet')
@HttpCode(HttpStatus.CREATED)
@ApiOperation({ summary: 'X/Twitter tweet\'ten proje oluştur' })
@ApiResponse({ status: 201, description: 'Tweet\'ten proje oluşturuldu ve senaryo üretildi' })
@ApiResponse({ status: 400, description: 'Geçersiz tweet URL\'si veya tweet bulunamadı' })
@ApiOperation({ summary: "X/Twitter tweet'ten proje oluştur" })
@ApiResponse({
status: 201,
description: "Tweet'ten proje oluşturuldu ve senaryo üretildi",
})
@ApiResponse({
status: 400,
description: "Geçersiz tweet URL'si veya tweet bulunamadı",
})
async createFromTweet(@Body() dto: CreateFromTweetDto, @Req() req: any) {
const userId = req.user?.id || req.user?.sub;
this.logger.log(`Tweet'ten proje oluşturuluyor: ${dto.tweetUrl}`);
@@ -197,8 +203,14 @@ export class ProjectsController {
@Post('from-youtube')
@HttpCode(HttpStatus.CREATED)
@ApiOperation({ summary: 'YouTube videosundan proje oluştur' })
@ApiResponse({ status: 201, description: 'YouTube videosundan proje oluşturuldu ve senaryo üretildi' })
@ApiResponse({ status: 400, description: 'Geçersiz YouTube URL\'si veya video bulunamadı' })
@ApiResponse({
status: 201,
description: 'YouTube videosundan proje oluşturuldu ve senaryo üretildi',
})
@ApiResponse({
status: 400,
description: "Geçersiz YouTube URL'si veya video bulunamadı",
})
async createFromYoutube(@Body() dto: CreateFromYoutubeDto, @Req() req: any) {
const userId = req.user?.id || req.user?.sub;
this.logger.log(`YouTube'dan proje oluşturuluyor: ${dto.youtubeUrl}`);
@@ -211,7 +223,10 @@ export class ProjectsController {
@Post('from-text')
@HttpCode(HttpStatus.CREATED)
@ApiOperation({ summary: 'Serbest metinden proje oluştur' })
@ApiResponse({ status: 201, description: 'Metinden proje oluşturuldu ve senaryo üretildi' })
@ApiResponse({
status: 201,
description: 'Metinden proje oluşturuldu ve senaryo üretildi',
})
async createFromText(@Body() dto: CreateFromTextDto, @Req() req: any) {
const userId = req.user?.id || req.user?.sub;
this.logger.log(`Serbest metinden proje oluşturuluyor...`);
@@ -226,7 +241,10 @@ export class ProjectsController {
@UseInterceptors(FileInterceptor('file'))
@ApiConsumes('multipart/form-data')
@ApiOperation({ summary: 'Dosyadan/Dokümandan proje oluştur' })
@ApiResponse({ status: 201, description: 'Belgeden proje oluşturuldu ve senaryo üretildi' })
@ApiResponse({
status: 201,
description: 'Belgeden proje oluşturuldu ve senaryo üretildi',
})
async createFromDocument(
@UploadedFile() file: Express.Multer.File,
@Body() dto: CreateFromDocumentDto,
@@ -248,12 +266,14 @@ export class ProjectsController {
@UseInterceptors(FileInterceptor('file'))
@ApiConsumes('multipart/form-data')
@ApiOperation({ summary: 'Dosyadan metin çıkar ve konu önerileri al' })
@ApiResponse({ status: 200, description: 'Metin ve konular başarıyla çıkarıldı' })
async extractDocumentTopics(
@UploadedFile() file: Express.Multer.File,
@Req() req: any,
) {
this.logger.log(`Dosyadan metin ve konular çıkarılıyor: ${file?.originalname}`);
@ApiResponse({
status: 200,
description: 'Metin ve konular başarıyla çıkarıldı',
})
async extractDocumentTopics(@UploadedFile() file: Express.Multer.File) {
this.logger.log(
`Dosyadan metin ve konular çıkarılıyor: ${file?.originalname}`,
);
if (!file) {
throw new BadRequestException('Dosya yüklenmedi');
}
@@ -266,10 +286,18 @@ export class ProjectsController {
@Post('document-from-topic')
@HttpCode(HttpStatus.CREATED)
@ApiOperation({ summary: 'Seçilen konu ve metin ile proje oluştur' })
@ApiResponse({ status: 201, description: 'Seçilen konu baz alınarak proje oluşturuldu' })
async createFromTopic(@Body() dto: CreateFromExtractedTextDto, @Req() req: any) {
@ApiResponse({
status: 201,
description: 'Seçilen konu baz alınarak proje oluşturuldu',
})
async createFromTopic(
@Body() dto: CreateFromExtractedTextDto,
@Req() req: any,
) {
const userId = req.user?.id || req.user?.sub;
this.logger.log(`Metin ve konu üzerinden proje oluşturuluyor. Konu: ${dto.topic}`);
this.logger.log(
`Metin ve konu üzerinden proje oluşturuluyor. Konu: ${dto.topic}`,
);
return this.projectsService.createFromExtractedText(userId, dto);
}
@@ -282,7 +310,13 @@ export class ProjectsController {
async updateScene(
@Param('id', ParseUUIDPipe) id: string,
@Param('sceneId', ParseUUIDPipe) sceneId: string,
@Body() body: { narrationText?: string; visualPrompt?: string; subtitleText?: string; duration?: number },
@Body()
body: {
narrationText?: string;
visualPrompt?: string;
subtitleText?: string;
duration?: number;
},
@Req() req: any,
) {
const userId = req.user?.id || req.user?.sub;
@@ -326,7 +360,10 @@ export class ProjectsController {
@Post(':id/generate-seo-titles')
@HttpCode(HttpStatus.OK)
@ApiOperation({ summary: 'AI ile 5 yeni SEO başlığı üret' })
@ApiResponse({ status: 200, description: 'SEO başlıkları başarıyla üretildi' })
@ApiResponse({
status: 200,
description: 'SEO başlıkları başarıyla üretildi',
})
async generateSeoTitles(
@Param('id', ParseUUIDPipe) id: string,
@Req() req: any,
@@ -361,15 +398,22 @@ export class ProjectsController {
*/
@Post(':id/translate')
@HttpCode(HttpStatus.CREATED)
@ApiOperation({ summary: 'Projeyi farklı bir dile çevir ve kopyasını oluştur' })
@ApiResponse({ status: 201, description: 'Proje çevirisi başarıyla tamamlandı' })
@ApiOperation({
summary: 'Projeyi farklı bir dile çevir ve kopyasını oluştur',
})
@ApiResponse({
status: 201,
description: 'Proje çevirisi başarıyla tamamlandı',
})
async translateProject(
@Param('id', ParseUUIDPipe) id: string,
@Body('targetLanguage') targetLanguage: string,
@Req() req: any,
) {
if (!targetLanguage) {
throw new BadRequestException('Hedef dil (targetLanguage) belirtilmelidir.');
throw new BadRequestException(
'Hedef dil (targetLanguage) belirtilmelidir.',
);
}
const userId = req.user?.id || req.user?.sub;
this.logger.log(`Proje çevirisi isteniyor: ${id} -> ${targetLanguage}`);
@@ -392,7 +436,12 @@ export class ProjectsController {
) {
const userId = req.user?.id || req.user?.sub;
this.logger.log(`Sahne görseli üretiliyor: ${sceneId} (proje: ${id})`);
return this.projectsService.generateSceneImage(userId, id, sceneId, body?.customPrompt);
return this.projectsService.generateSceneImage(
userId,
id,
sceneId,
body?.customPrompt,
);
}
/**
@@ -408,7 +457,9 @@ export class ProjectsController {
@Req() req: any,
) {
const userId = req.user?.id || req.user?.sub;
this.logger.log(`Sahne görseli upscale ediliyor: ${sceneId} (proje: ${id})`);
this.logger.log(
`Sahne görseli upscale ediliyor: ${sceneId} (proje: ${id})`,
);
return this.projectsService.upscaleSceneImage(userId, id, sceneId);
}
}