imk/backend/imk-backend/src/admin/admin.controller.ts
2024-11-11 18:24:06 +01:00

134 lines
3.6 KiB
TypeScript

import {
Controller,
Get,
Post,
Body,
Param,
Put,
UseInterceptors,
UploadedFile,
ParseIntPipe,
UseGuards,
BadRequestException,
} from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import { AdminService } from './admin.service';
import { UpdateDocumentDto } from '../dto/update-document.dto';
import { AdminGuard } from '../auth/admin.guard';
import { JwtAuthGuard } from '../auth/jwt-auth.guard';
import { CreateUserDto } from '../dto/create-user.dto';
import { S3Service } from 'src/s3/s3.service';
import { PrismaService } from 'src/prisma/prisma.service';
@Controller('admin')
@UseGuards(JwtAuthGuard, AdminGuard)
export class AdminController {
constructor(
private readonly adminService: AdminService,
private readonly s3Service: S3Service,
private readonly prisma: PrismaService,
) {}
@Get('documents')
getAllDocuments() {
return this.adminService.getAllDocuments();
}
@Put('documents/:id')
@UseInterceptors(FileInterceptor('file'))
updateDocument(
@Param('id', ParseIntPipe) id: number,
@Body() updateDocumentDto: UpdateDocumentDto,
@UploadedFile() file?: Express.Multer.File,
) {
return this.adminService.updateDocument(id, updateDocumentDto, file);
}
@Post('documents')
@UseInterceptors(FileInterceptor('file'))
async uploadDocument(
@UploadedFile() file: Express.Multer.File,
@Body('title') title: string,
@Body('sharedWithId') sharedWithId: string, // Accept as string first
@Body('uploadedById') uploadedById: string // Accept as string first
) {
if (!sharedWithId || !uploadedById) {
throw new BadRequestException('sharedWithId and uploadedById are required');
}
// Parse the string values to numbers
const parsedSharedWithId = parseInt(sharedWithId, 10);
const parsedUploadedById = parseInt(uploadedById, 10);
// Validate that the parsing was successful
if (isNaN(parsedSharedWithId) || isNaN(parsedUploadedById)) {
throw new BadRequestException('sharedWithId and uploadedById must be valid numbers');
}
const document = await this.adminService.uploadDocument(
file,
title,
parsedSharedWithId,
parsedUploadedById
);
return document;
}
@Get('users')
getAllUsers() {
return this.adminService.getAllUsers();
}
// @Post('test-document')
// async testDocumentCreation() {
// try {
// const document = await this.prisma.document.create({
// data: {
// title: 'Test Document',
// s3Key: 'test-key',
// status: 'completed',
// sharedWith: {
// connect: { id: 2 } // ID of 'pero' user
// }
// },
// });
// return document;
// } catch (error) {
// console.error('Test document creation error:', error);
// throw error;
// }
// }
@Post('users')
async createUser(@Body() createUserDto: CreateUserDto) {
return this.adminService.createUser(createUserDto);
}
@Post('documents/:id/share')
async shareDocument(
@Param('id') id: string,
@Body() { userId }: { userId: number },
) {
return this.adminService.shareDocument(+id, userId);
}
@Put('documents/:id/status')
async updateDocumentStatus(
@Param('id') id: string,
@Body() { status }: { status: string },
) {
return this.adminService.updateDocumentStatus(+id, status);
}
// @Get('test-s3-connection')
// async testS3Connection() {
// const isConnected = await this.s3Service.testConnection();
// if (isConnected) {
// return { message: 'Successfully connected to S3' };
// } else {
// return { message: 'Failed to connect to S3' };
// }
// }
}