Spaces:
Sleeping
Sleeping
| import { | |
| Controller, | |
| Get, | |
| Post, | |
| Put, | |
| Delete, | |
| Param, | |
| Body, | |
| UseGuards, | |
| HttpCode, | |
| HttpStatus, | |
| ParseIntPipe, | |
| } from '@nestjs/common'; | |
| import { | |
| ApiTags, | |
| ApiOperation, | |
| ApiResponse, | |
| ApiBearerAuth, | |
| ApiParam, | |
| ApiBody, | |
| } from '@nestjs/swagger'; | |
| import { FolderService } from './folder.service'; | |
| import { CreateFolderDto } from './dto/create-folder.dto'; | |
| import { UpdateFolderDto } from './dto/update-folder.dto'; | |
| import { FolderResponseDto } from './dto/folder-response.dto'; | |
| import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; | |
| import { CurrentUser } from '../../common/decorators/current-user.decorator'; | |
| import { User } from '../auth/entities/user.entity'; | |
| ('📂 Folders') | |
| ('api/files/folders') | |
| (JwtAuthGuard) | |
| ('JWT-auth') | |
| export class FolderController { | |
| constructor(private readonly folderService: FolderService) {} | |
| () | |
| (HttpStatus.CREATED) | |
| ({ | |
| summary: 'Create folder', | |
| description: ` | |
| ## Create New Folder | |
| Creates a new folder for organizing files. | |
| ### Access Control | |
| - **Authentication Required**: ✅ Yes (Bearer Token) | |
| - **Roles Required**: Any authenticated user | |
| ### Notes | |
| - Folders can be nested inside other folders | |
| - Root folders have no parent | |
| `, | |
| }) | |
| ({ type: CreateFolderDto }) | |
| ({ status: 201, description: 'Folder created successfully' }) | |
| ({ status: 400, description: 'Invalid input data' }) | |
| ({ status: 401, description: 'Unauthorized' }) | |
| async create( | |
| () createFolderDto: CreateFolderDto, | |
| () user: User, | |
| ): Promise<FolderResponseDto> { | |
| return this.folderService.create(createFolderDto, user.userId); | |
| } | |
| (':folderId') | |
| ({ | |
| summary: 'Get folder by ID', | |
| description: ` | |
| ## Get Folder Details | |
| Retrieves information about a specific folder. | |
| ### Access Control | |
| - **Authentication Required**: ✅ Yes (Bearer Token) | |
| - **Roles Required**: Any authenticated user with access | |
| `, | |
| }) | |
| ({ name: 'folderId', description: 'Folder ID', type: Number }) | |
| ({ status: 200, description: 'Folder details' }) | |
| ({ status: 401, description: 'Unauthorized' }) | |
| ({ status: 404, description: 'Folder not found' }) | |
| async findById( | |
| ('folderId', ParseIntPipe) folderId: number, | |
| ): Promise<FolderResponseDto> { | |
| return this.folderService.findById(folderId); | |
| } | |
| (':folderId/children') | |
| ({ | |
| summary: 'Get folder contents', | |
| description: ` | |
| ## Get Folder Children | |
| Retrieves all folders and files within a folder. | |
| ### Access Control | |
| - **Authentication Required**: ✅ Yes (Bearer Token) | |
| - **Roles Required**: Any authenticated user with access | |
| ### Response | |
| Returns separate arrays for subfolders and files. | |
| `, | |
| }) | |
| ({ name: 'folderId', description: 'Folder ID', type: Number }) | |
| ({ status: 200, description: 'Folder contents' }) | |
| ({ status: 401, description: 'Unauthorized' }) | |
| ({ status: 404, description: 'Folder not found' }) | |
| async getChildren( | |
| ('folderId', ParseIntPipe) folderId: number, | |
| ): Promise<{ folders: FolderResponseDto[]; files: any[] }> { | |
| return this.folderService.getChildren(folderId); | |
| } | |
| (':folderId/tree') | |
| ({ | |
| summary: 'Get folder tree', | |
| description: ` | |
| ## Get Folder Tree Structure | |
| Retrieves the folder with its complete nested hierarchy. | |
| ### Access Control | |
| - **Authentication Required**: ✅ Yes (Bearer Token) | |
| - **Roles Required**: Any authenticated user with access | |
| ### Response | |
| Returns folder with nested children recursively. | |
| `, | |
| }) | |
| ({ name: 'folderId', description: 'Folder ID', type: Number }) | |
| ({ status: 200, description: 'Folder tree' }) | |
| ({ status: 401, description: 'Unauthorized' }) | |
| ({ status: 404, description: 'Folder not found' }) | |
| async getFolderTree( | |
| ('folderId', ParseIntPipe) folderId: number, | |
| ): Promise<FolderResponseDto> { | |
| return this.folderService.getFolderTree(folderId); | |
| } | |
| (':folderId') | |
| ({ | |
| summary: 'Update folder', | |
| description: ` | |
| ## Update Folder | |
| Updates folder name or moves it to a different parent. | |
| ### Access Control | |
| - **Authentication Required**: ✅ Yes (Bearer Token) | |
| - **Roles Required**: Folder owner or admin | |
| `, | |
| }) | |
| ({ name: 'folderId', description: 'Folder ID', type: Number }) | |
| ({ type: UpdateFolderDto }) | |
| ({ status: 200, description: 'Folder updated' }) | |
| ({ status: 400, description: 'Invalid input data' }) | |
| ({ status: 401, description: 'Unauthorized' }) | |
| ({ status: 404, description: 'Folder not found' }) | |
| async update( | |
| ('folderId', ParseIntPipe) folderId: number, | |
| () updateFolderDto: UpdateFolderDto, | |
| ): Promise<FolderResponseDto> { | |
| return this.folderService.update(folderId, updateFolderDto); | |
| } | |
| (':folderId') | |
| (HttpStatus.NO_CONTENT) | |
| ({ | |
| summary: 'Delete folder', | |
| description: ` | |
| ## Delete Folder | |
| Deletes a folder and all its contents. | |
| ### Access Control | |
| - **Authentication Required**: ✅ Yes (Bearer Token) | |
| - **Roles Required**: Folder owner or admin | |
| ### ⚠️ Warning | |
| This recursively deletes all subfolders and files within! | |
| `, | |
| }) | |
| ({ name: 'folderId', description: 'Folder ID', type: Number }) | |
| ({ status: 204, description: 'Folder deleted' }) | |
| ({ status: 401, description: 'Unauthorized' }) | |
| ({ status: 403, description: 'Forbidden' }) | |
| ({ status: 404, description: 'Folder not found' }) | |
| async delete( | |
| ('folderId', ParseIntPipe) folderId: number, | |
| ): Promise<void> { | |
| return this.folderService.delete(folderId); | |
| } | |
| } | |