mirror of
https://github.com/docmost/docmost.git
synced 2026-05-13 11:44:07 +08:00
6d024fc3de
* refactor imports - WIP * Add readstream * WIP * fix attachmentId render * fix attachmentId render * turndown video tag * feat: add stream upload support and improve file handling - Add stream upload functionality to storage drivers\n- Improve ZIP file extraction with better encoding handling\n- Fix attachment ID rendering issues\n- Add AWS S3 upload stream support\n- Update dependencies for better compatibility * WIP * notion formatter * move embed parser to editor-ext package * import embeds * utility files * cleanup * Switch from happy-dom to cheerio * Refine code * WIP * bug fixes and UI * sync * WIP * sync * keep import modal mounted * Show modal during upload * WIP * WIP
80 lines
2.1 KiB
TypeScript
80 lines
2.1 KiB
TypeScript
import {
|
|
Body,
|
|
Controller,
|
|
ForbiddenException,
|
|
HttpCode,
|
|
HttpStatus,
|
|
NotFoundException,
|
|
Post,
|
|
UseGuards,
|
|
} from '@nestjs/common';
|
|
import SpaceAbilityFactory from '../../core/casl/abilities/space-ability.factory';
|
|
import { JwtAuthGuard } from '../../common/guards/jwt-auth.guard';
|
|
import { User } from '@docmost/db/types/entity.types';
|
|
import {
|
|
SpaceCaslAction,
|
|
SpaceCaslSubject,
|
|
} from '../../core/casl/interfaces/space-ability.type';
|
|
import { InjectKysely } from 'nestjs-kysely';
|
|
import { KyselyDB } from '@docmost/db/types/kysely.types';
|
|
import { AuthUser } from '../../common/decorators/auth-user.decorator';
|
|
import { FileTaskIdDto } from './dto/file-task-dto';
|
|
import { SpaceMemberRepo } from '@docmost/db/repos/space/space-member.repo';
|
|
|
|
@Controller('file-tasks')
|
|
export class FileTaskController {
|
|
constructor(
|
|
private readonly spaceMemberRepo: SpaceMemberRepo,
|
|
private readonly spaceAbility: SpaceAbilityFactory,
|
|
@InjectKysely() private readonly db: KyselyDB,
|
|
) {}
|
|
|
|
@UseGuards(JwtAuthGuard)
|
|
@HttpCode(HttpStatus.OK)
|
|
@Post()
|
|
async getFileTasks(@AuthUser() user: User) {
|
|
const userSpaceIds = await this.spaceMemberRepo.getUserSpaceIds(user.id);
|
|
|
|
if (!userSpaceIds || userSpaceIds.length === 0) {
|
|
return [];
|
|
}
|
|
|
|
const fileTasks = await this.db
|
|
.selectFrom('fileTasks')
|
|
.selectAll()
|
|
.where('spaceId', 'in', userSpaceIds)
|
|
.execute();
|
|
|
|
if (!fileTasks) {
|
|
throw new NotFoundException('File task not found');
|
|
}
|
|
|
|
return fileTasks;
|
|
}
|
|
|
|
@UseGuards(JwtAuthGuard)
|
|
@HttpCode(HttpStatus.OK)
|
|
@Post('info')
|
|
async getFileTask(@Body() dto: FileTaskIdDto, @AuthUser() user: User) {
|
|
const fileTask = await this.db
|
|
.selectFrom('fileTasks')
|
|
.selectAll()
|
|
.where('id', '=', dto.fileTaskId)
|
|
.executeTakeFirst();
|
|
|
|
if (!fileTask || !fileTask.spaceId) {
|
|
throw new NotFoundException('File task not found');
|
|
}
|
|
|
|
const ability = await this.spaceAbility.createForUser(
|
|
user,
|
|
fileTask.spaceId,
|
|
);
|
|
if (ability.cannot(SpaceCaslAction.Read, SpaceCaslSubject.Page)) {
|
|
throw new ForbiddenException();
|
|
}
|
|
|
|
return fileTask;
|
|
}
|
|
}
|