Files
admin/backend/app/base_modules/FileManager/controller/file_manager_controller.ts
T
2026-06-25 15:53:49 +03:00

151 lines
5.0 KiB
TypeScript
Executable File

import { HttpContext } from '@adonisjs/core/http'
import listValidator from '#base_modules/FileManager/validator/list_validator'
import uploadFileValidator from '#base_modules/FileManager/validator/upload_file_validator'
import createDirectoryValidator from '#base_modules/FileManager/validator/create_directory_validator'
import renameEntryValidator from '#base_modules/FileManager/validator/rename_entry_validator'
import duplicateEntriesValidator from '#base_modules/FileManager/validator/duplicate_entries_validator'
import FileMangerPolicy from '#base_modules/FileManager/policy/file_manager_policy'
import { Entry, FileEntry, FolderEntry } from '#base_modules/FileManager/types/entries'
import getValidatedPathFromRequest from '#base_modules/FileManager/helpers/get_validated_path_from_request'
import FileManagerService from '#base_modules/FileManager/services/file_manager_service'
export default class FileManagerController {
private fileManagerService = new FileManagerService()
async index({ request, response, bouncer }: HttpContext) {
await bouncer.with(FileMangerPolicy).authorize('viewList')
const path = await getValidatedPathFromRequest(request)
const query = request.all()
const params = await listValidator.validate({
filterBy: query?.filterBy ?? 'all',
sortBy: query?.sortBy ?? 'name',
sortOrder: query?.sortOrder ?? 'asc',
maxResults: query?.maxResults,
paginationToken: query?.paginationToken,
})
const entries = await this.fileManagerService.listDirectory(path, params)
const payload: {
data: Entry[]
meta: {
nextPaginationToken: string | null
}
} = {
data: entries.data,
meta: entries.meta,
}
return response.ok(payload)
}
async show({ request, response, bouncer }: HttpContext) {
await bouncer.with(FileMangerPolicy).authorize('view')
const path = await getValidatedPathFromRequest(request)
const result = await this.fileManagerService.getFileEntryWithPreview(path)
const payload: { data: FileEntry & { content?: string } } = {
data: result,
}
return response.ok(payload)
}
public async raw({ request, response, bouncer }: HttpContext) {
await bouncer.with(FileMangerPolicy).authorize('view')
const path = await getValidatedPathFromRequest(request)
const { stream, contentType, size, name } = await this.fileManagerService.getFileStream(path)
if (contentType) response.header('Content-Type', contentType)
if (size !== undefined) response.header('Content-Length', String(size))
response.header('Content-Disposition', `inline; filename="${encodeURIComponent(name)}"`)
return response.stream(stream)
}
async createFolder({ request, response, bouncer }: HttpContext) {
await bouncer.with(FileMangerPolicy).authorize('create')
const { name, path } = await createDirectoryValidator.validate(request.all())
const result = await this.fileManagerService.createDirectory(path, name)
const payload: { data: FolderEntry } = {
data: result,
}
return response.created(payload)
}
async destroy({ request, response, bouncer }: HttpContext) {
await bouncer.with(FileMangerPolicy).authorize('delete')
const path = await getValidatedPathFromRequest(request)
await this.fileManagerService.deleteEntry(path)
return response.noContent()
}
async rename({ request, response, bouncer }: HttpContext) {
await bouncer.with(FileMangerPolicy).authorize('update')
const { name, path } = await renameEntryValidator.validate(request.all())
const entry = await this.fileManagerService.moveEntry(path, name)
const payload: { data: Entry } = { data: entry }
return response.ok(payload)
}
async upload({ request, response, bouncer }: HttpContext) {
await bouncer.with(FileMangerPolicy).authorize('create')
const { file, path } = await uploadFileValidator.validate(request.all())
const entry = await this.fileManagerService.writeFile(path, file)
const payload: { data: Entry } = { data: entry }
return response.created(payload)
}
async duplicate({ request, response, bouncer }: HttpContext) {
await bouncer.with(FileMangerPolicy).authorize('create')
const { paths } = await duplicateEntriesValidator.validate(request.all())
const results = await this.fileManagerService.copyEntries(paths)
const payload: { data: Entry[] } = { data: results }
return response.created(payload)
}
async search({ request, response, bouncer }: HttpContext) {
await bouncer.with(FileMangerPolicy).authorize('viewList')
const query = request.input('q', '')
if (!query.trim()) {
return response.badRequest({ message: 'Search query is required' })
}
const abortController = new AbortController()
request.request.on('close', () => abortController.abort())
const results = await this.fileManagerService.search('/', query, abortController.signal)
const payload: { data: Entry[] } = { data: results }
return response.ok(payload)
}
}