update module export data csv

This commit is contained in:
2024-11-30 09:38:23 +07:00
parent b75213da15
commit 37aa7842fd
8 changed files with 382 additions and 23 deletions

View File

@ -9,6 +9,8 @@ import { Paging } from "../types/paging";
import CommonHelper from "../helpers/common";
import { ActivityType } from "../types/action";
import { UserActivity } from "../entity/user_activity";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
const log: Logger<ILogObj> = new Logger({ name: '[UserActivityController]', type: 'pretty' });
@ -17,9 +19,6 @@ export class UserActivityController {
/*
#swagger.tags = ['User Activity']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
@ -51,6 +50,11 @@ export class UserActivityController {
'@enum': ['ASC', 'DESC']
}
}
#swagger.parameters['token'] = {
in: 'query',
required: true,
type: 'string'
}
*/
try {
@ -61,6 +65,7 @@ export class UserActivityController {
with_deleted: Joi.bool().required().label('With Deleted'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
token: Joi.string().required().label('Token'),
});
const param: Paging = await schema.validateAsync(req.query);
@ -73,8 +78,8 @@ export class UserActivityController {
let whereVal: any = {};
if (param.filter) {
whereAttr = '(module like :filter_like or username like :filter_like or email = :filter) and ';
whereVal['filter'] = param.filter
whereAttr = '(module like :filter_like or description like :filter_like) and ';
// whereVal['filter'] = param.filter
whereVal['filter_like'] = '%' + param.filter + '%'
}
@ -108,6 +113,115 @@ export class UserActivityController {
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['User Activity']
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
#swagger.parameters['token'] = {
in: 'query',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
token: Joi.string().required().label('Token'),
});
const param: Paging = await schema.validateAsync(req.query);
const repo = OrmHelper.DB.getRepository(UserActivity);
let whereAttr = '';
let whereVal: any = {};
if (param.filter) {
whereAttr = '(module like :filter_like or description like :filter_like) and ';
// whereVal['filter'] = param.filter
whereVal['filter_like'] = '%' + param.filter + '%'
}
whereAttr += 'id_user = :id_user'
whereVal['id_user'] = req.auth.data.id;
const filename = "user_activity.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: UserActivity): any => ({
...row,
action: CommonHelper.getKeyEnum(ActivityType, row.action),
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: number) => {
const offset = (page - 1) * limit
const data = await repo.createQueryBuilder()
.where(whereAttr, whereVal)
.select([
'module',
'description',
'action',
'url',
'created_at'])
.orderBy(param.order_field, param.order_direction)
.offset(offset)
.limit(limit).getRawMany();
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['User Activity']