From 34e421a1bc15d3cce63e41b8bfc40692bce3b7b6 Mon Sep 17 00:00:00 2001 From: Innei Date: Tue, 7 Sep 2021 19:08:30 +0800 Subject: [PATCH] feat: cron task --- paw.paw | Bin 61970 -> 64670 bytes src/common/decorator/auth.decorator.ts | 4 +- src/common/guard/auth.guard.ts | 18 ++++ src/common/middlewares/analyze.middleware.ts | 12 +-- src/modules/analyze/analyze.controller.ts | 26 ++--- src/modules/analyze/analyze.service.ts | 8 +- src/modules/auth/roles.guard.ts | 1 + src/modules/post/post.controller.ts | 6 +- src/processors/helper/helper.cron.service.ts | 104 ++++++++++++++++++- src/processors/helper/helper.http.service.ts | 2 +- src/processors/helper/helper.module.ts | 5 +- 11 files changed, 148 insertions(+), 38 deletions(-) create mode 100644 src/common/guard/auth.guard.ts diff --git a/paw.paw b/paw.paw index d99bb97363036a5780077faea19ab808573a79f2..6354ae72edf9082a8f6cdb06e91d37398479a059 100644 GIT binary patch delta 26790 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 + if (typeof request.user !== 'undefined') { + return true + } + + return super.canActivate(context) + } +} diff --git a/src/common/middlewares/analyze.middleware.ts b/src/common/middlewares/analyze.middleware.ts index 3d65e3bb..8de4423a 100644 --- a/src/common/middlewares/analyze.middleware.ts +++ b/src/common/middlewares/analyze.middleware.ts @@ -105,15 +105,9 @@ export class AnalyzeMiddleware implements NestMiddleware { } // ip access in redis const client = this.cacheService.getClient() - const fromRedisIps = await client.get( - getRedisKey(RedisKeys.Access, 'ips'), - ) - const ips = fromRedisIps ? JSON.parse(fromRedisIps) : [] - if (!ips.includes(ip)) { - await client.set( - getRedisKey(RedisKeys.Access, 'ips'), - JSON.stringify([...ips, ip]), - ) + + const count = await client.sadd(getRedisKey(RedisKeys.Access, 'ips')) + if (count) { // record uv to db process.nextTick(async () => { const uvRecord = await this.options.findOne({ name: 'uv' }) diff --git a/src/modules/analyze/analyze.controller.ts b/src/modules/analyze/analyze.controller.ts index 9735b3fe..2e4316b6 100644 --- a/src/modules/analyze/analyze.controller.ts +++ b/src/modules/analyze/analyze.controller.ts @@ -122,10 +122,10 @@ export class AnalyzeController { }) .reverse() - const paths = await this.service.getRangeOfTopPathVisitor() - - const total = await this.service.getCallTime() - + const [paths, total] = await Promise.all([ + this.service.getRangeOfTopPathVisitor(), + this.service.getCallTime(), + ]) return { today: dayData.flat(1), weeks: weekData.flat(1), @@ -140,21 +140,15 @@ export class AnalyzeController { @Get('/like') async getTodayLikedArticle() { const client = this.cacheService.getClient() - const keys = await client.keys(getRedisKey(RedisKeys.Like, '*mx_like*')) - return await Promise.all( + const keys = await client.keys(getRedisKey(RedisKeys.Like, '*')) + + return Promise.all( keys.map(async (key) => { const id = key.split('_').pop() - const json = await client.get(id) + return { - [id]: ( - JSON.parse(json) as { - ip: string - created: string - }[] - ).sort( - (a, b) => - new Date(a.created).getTime() - new Date(b.created).getTime(), - ), + id, + ips: await client.smembers(getRedisKey(RedisKeys.Like, id)), } }), ) diff --git a/src/modules/analyze/analyze.service.ts b/src/modules/analyze/analyze.service.ts index 0ab72c51..55279463 100644 --- a/src/modules/analyze/analyze.service.ts +++ b/src/modules/analyze/analyze.service.ts @@ -285,8 +285,10 @@ export class AnalyzeService { async getTodayAccessIp(): Promise { const redis = this.cacheService.getClient() - const fromRedisIps = await redis.get(getRedisKey(RedisKeys.Access, 'ips')) - const ips = fromRedisIps ? JSON.parse(fromRedisIps) : [] - return ips + const fromRedisIps = await redis.smembers( + getRedisKey(RedisKeys.Access, 'ips'), + ) + + return fromRedisIps } } diff --git a/src/modules/auth/roles.guard.ts b/src/modules/auth/roles.guard.ts index 56167d05..854603b5 100644 --- a/src/modules/auth/roles.guard.ts +++ b/src/modules/auth/roles.guard.ts @@ -20,6 +20,7 @@ declare interface Request { export class RolesGuard extends AuthGuard('jwt') implements CanActivate { async canActivate(context: ExecutionContext): Promise { const request: Request = context.switchToHttp().getRequest() + let isMaster = false if (request.headers['authorization']) { try { diff --git a/src/modules/post/post.controller.ts b/src/modules/post/post.controller.ts index bbb1f733..f5d663cd 100644 --- a/src/modules/post/post.controller.ts +++ b/src/modules/post/post.controller.ts @@ -135,7 +135,7 @@ export class PostController { return await this.postService.updateById(params.id, body) } - @Delete(':id') + @Delete('/:id') @Auth() @HttpCode(204) async deletePost(@Param() params: MongoIdDto) { @@ -145,7 +145,7 @@ export class PostController { return } - @Get('search') + @Get('/search') @Paginator async searchPost(@Query() query: SearchDto, @IsMaster() isMaster: boolean) { const { keyword, page, size } = query @@ -167,7 +167,7 @@ export class PostController { ) } - @Get('_thumbs-up') + @Get('/_thumbs-up') @HttpCode(204) async thumbsUpArticle( @Query() query: MongoIdDto, diff --git a/src/processors/helper/helper.cron.service.ts b/src/processors/helper/helper.cron.service.ts index 8819ff04..3f27ad65 100644 --- a/src/processors/helper/helper.cron.service.ts +++ b/src/processors/helper/helper.cron.service.ts @@ -1,24 +1,38 @@ -import { Injectable, Logger } from '@nestjs/common' +import { forwardRef, Inject, Injectable, Logger } from '@nestjs/common' import { Cron, CronExpression } from '@nestjs/schedule' import COS from 'cos-nodejs-sdk-v5' import dayjs from 'dayjs' -import { existsSync, readFileSync, writeFileSync } from 'fs' +import { existsSync, readFileSync, rmSync, writeFileSync } from 'fs' import mkdirp from 'mkdirp' +import { InjectModel } from 'nestjs-typegoose' import { join } from 'path' import { $, cd } from 'zx' +import { RedisKeys } from '~/constants/cache.constant' import { BACKUP_DIR, LOCAL_BOT_LIST_DATA_FILE_PATH, + TEMP_DIR, } from '~/constants/path.constant' +import { AggregateService } from '~/modules/aggregate/aggregate.service' +import { AnalyzeModel } from '~/modules/analyze/analyze.model' import { ConfigsService } from '~/modules/configs/configs.service' import { isDev } from '~/utils/index.util' +import { getRedisKey } from '~/utils/redis.util' +import { CacheService } from '../cache/cache.service' import { HttpService } from './helper.http.service' + @Injectable() export class CronService { private logger: Logger constructor( private readonly http: HttpService, private readonly configs: ConfigsService, + @InjectModel(AnalyzeModel) + private readonly analyzeModel: MongooseModel, + private readonly cacheService: CacheService, + + @Inject(forwardRef(() => AggregateService)) + private readonly aggregateService: AggregateService, ) { this.logger = new Logger(CronService.name) } @@ -117,6 +131,92 @@ export class CronService { return readFileSync(join(backupDirPath, 'backup-' + dateDir + '.zip')) } + @Cron(CronExpression.EVERY_1ST_DAY_OF_MONTH_AT_MIDNIGHT, { + name: 'clear_access', + }) + async cleanAccessRecord() { + const now = new Date().getTime() + const cleanDate = new Date(now - 7 * 60 * 60 * 24 * 1000) + + await this.analyzeModel.deleteMany({ + created: { + $lte: cleanDate, + }, + }) + } + /** + * @description 每天凌晨删除缓存 + */ + @Cron(CronExpression.EVERY_DAY_AT_MIDNIGHT, { name: 'reset_ua' }) + async resetIPAccess() { + await this.cacheService + .getClient() + .del(getRedisKey(RedisKeys.Access, 'ips')) + } + + /** + * @description 每天凌晨删除缓存 + */ + @Cron(CronExpression.EVERY_DAY_AT_MIDNIGHT, { name: 'reset_like_article' }) + async resetLikedOrReadArticleRecord() { + const redis = this.cacheService.getClient() + + await Promise.all( + [ + redis.keys(getRedisKey(RedisKeys.Like, '*')), + redis.keys(getRedisKey(RedisKeys.Read, '*')), + ].map(async (keys) => { + return keys.then((keys) => keys.map((key) => redis.del(key))) + }), + ) + } + + @Cron(CronExpression.EVERY_DAY_AT_3AM) + cleanTempDirectory() { + rmSync(TEMP_DIR, { recursive: true }) + mkdirp.sync(TEMP_DIR) + } + + @Cron(CronExpression.EVERY_DAY_AT_3AM) + pushToBaiduSearch() { + return new Promise(async (resolve, reject) => { + const configs = this.configs.get('baiduSearchOptions') + if (configs.enable) { + const token = configs.token + if (!token) { + this.logger.error('[BaiduSearchPushTask] token 为空') + return reject('token is empty') + } + const siteUrl = this.configs.get('url').webUrl + + const pushUrls = await this.aggregateService.getSiteMapContent() + const urls = pushUrls + .map((item) => { + return item.url + }) + .join('\n') + + try { + const res = await this.http.axiosRef.post( + `http://data.zz.baidu.com/urls?site=${siteUrl}&token=${token}`, + urls, + { + headers: { + 'Content-Type': 'text/plain', + }, + }, + ) + this.logger.log(`提交结果: ${JSON.stringify(res.data)}`) + return resolve(res.data) + } catch (e) { + this.logger.error('百度推送错误: ' + e.message) + return reject(e) + } + } + return resolve(null) + }) + } + private get nowStr() { return dayjs().format('YYYY-MM-DD-HH:mm:ss') } diff --git a/src/processors/helper/helper.http.service.ts b/src/processors/helper/helper.http.service.ts index 30dfed73..92dd888b 100644 --- a/src/processors/helper/helper.http.service.ts +++ b/src/processors/helper/helper.http.service.ts @@ -4,7 +4,7 @@ import axios from 'axios' import { AXIOS_CONFIG } from '~/app.config' @Injectable() export class HttpService { - http: AxiosInstance + private http: AxiosInstance constructor() { this.http = axios.create(AXIOS_CONFIG) } diff --git a/src/processors/helper/helper.module.ts b/src/processors/helper/helper.module.ts index 7c776fef..10a63dc8 100644 --- a/src/processors/helper/helper.module.ts +++ b/src/processors/helper/helper.module.ts @@ -1,5 +1,6 @@ -import { Global, Module, Provider } from '@nestjs/common' +import { forwardRef, Global, Module, Provider } from '@nestjs/common' import { ScheduleModule } from '@nestjs/schedule' +import { AggregateModule } from '~/modules/aggregate/aggregate.module' import { CountingService } from './helper.counting.service' import { CronService } from './helper.cron.service' import { EmailService } from './helper.email.service' @@ -17,7 +18,7 @@ const providers: Provider[] = [ ] @Module({ - imports: [ScheduleModule.forRoot()], + imports: [ScheduleModule.forRoot(), forwardRef(() => AggregateModule)], providers: providers, exports: providers, })