Creating import&export excel

This commit is contained in:
2026-09-15 17:33:05 +03:30
parent 9ae176bec0
commit 44f9849d0e
26 changed files with 3682 additions and 474 deletions
@@ -7,32 +7,43 @@ import {
Patch,
Post,
Query,
Res,
StreamableFile,
UploadedFile,
UseGuards,
UseInterceptors,
} from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import { memoryStorage } from 'multer';
import type { Response } from 'express';
import { JwtAuthGuard } from '../auth/jwt-auth.guard';
import { CurrentUser } from '../auth/current-user.decorator';
import type { Actor } from '../common/record-scope';
import { ActivitiesService } from './activities.service';
import { ActivitiesExcelService } from './activities-excel.service';
import {
CreateActivityDto,
ListActivitiesQueryDto,
UpdateActivityDto,
} from './dto';
type AuthUser = { organizationId: string; userId: string; role: string };
import { brand } from '@mento/shared';
@Controller('activities')
@UseGuards(JwtAuthGuard)
export class ActivitiesController {
constructor(private readonly activitiesService: ActivitiesService) {}
constructor(
private readonly activitiesService: ActivitiesService,
private readonly excelService: ActivitiesExcelService,
) {}
@Get('summary')
summary(@CurrentUser() user: AuthUser) {
summary(@CurrentUser() user: Actor) {
return this.activitiesService.summary(user.organizationId, user);
}
@Get()
list(
@CurrentUser() user: AuthUser,
@CurrentUser() user: Actor,
@Query() query: ListActivitiesQueryDto,
) {
return this.activitiesService.list(
@@ -54,13 +65,41 @@ export class ActivitiesController {
);
}
@Get('export')
async export(
@CurrentUser() user: Actor,
@Res({ passthrough: true }) res: Response,
) {
const buffer = await this.excelService.export(user);
res.set({
'Content-Type':
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'Content-Disposition': `attachment; filename="${brand.filePrefix}-activities.xlsx"`,
});
return new StreamableFile(buffer);
}
@Post('import')
@UseInterceptors(
FileInterceptor('file', {
storage: memoryStorage(),
limits: { fileSize: 15_000_000 },
}),
)
import(
@CurrentUser() user: Actor,
@UploadedFile() file: Express.Multer.File,
) {
return this.excelService.import(user, file);
}
@Get(':id')
get(@CurrentUser() user: AuthUser, @Param('id') id: string) {
get(@CurrentUser() user: Actor, @Param('id') id: string) {
return this.activitiesService.get(user.organizationId, id, user);
}
@Post()
create(@CurrentUser() user: AuthUser, @Body() dto: CreateActivityDto) {
create(@CurrentUser() user: Actor, @Body() dto: CreateActivityDto) {
return this.activitiesService.create(
user.organizationId,
user.userId,
@@ -71,7 +110,7 @@ export class ActivitiesController {
@Patch(':id')
update(
@CurrentUser() user: AuthUser,
@CurrentUser() user: Actor,
@Param('id') id: string,
@Body() dto: UpdateActivityDto,
) {
@@ -79,12 +118,12 @@ export class ActivitiesController {
}
@Patch(':id/complete')
complete(@CurrentUser() user: AuthUser, @Param('id') id: string) {
complete(@CurrentUser() user: Actor, @Param('id') id: string) {
return this.activitiesService.complete(user.organizationId, id, user);
}
@Delete(':id')
async remove(@CurrentUser() user: AuthUser, @Param('id') id: string) {
async remove(@CurrentUser() user: Actor, @Param('id') id: string) {
await this.activitiesService.remove(user.organizationId, id, user);
return { ok: true };
}