Commit 22177d4d authored by nanahira's avatar nanahira

new api

parent 3917fb3c
Pipeline #2461 passed with stages
in 5 minutes and 18 seconds
......@@ -2258,6 +2258,15 @@
"unset-value": "^1.0.0"
}
},
"call-bind": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
"requires": {
"function-bind": "^1.1.1",
"get-intrinsic": "^1.0.2"
}
},
"callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
......@@ -3806,8 +3815,7 @@
"function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
},
"functional-red-black-tree": {
"version": "1.0.1",
......@@ -3874,6 +3882,16 @@
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
},
"get-intrinsic": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
"integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
"requires": {
"function-bind": "^1.1.1",
"has": "^1.0.3",
"has-symbols": "^1.0.1"
}
},
"get-package-type": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
......@@ -3998,7 +4016,6 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dev": true,
"requires": {
"function-bind": "^1.1.1"
}
......@@ -4023,6 +4040,11 @@
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
},
"has-symbols": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
"integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg=="
},
"has-unicode": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
......@@ -4388,10 +4410,11 @@
"dev": true
},
"is-nan": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.0.tgz",
"integrity": "sha512-z7bbREymOqt2CCaZVly8aC4ML3Xhfi0ekuOnjO2L8vKdl+CttdVoGZQhd4adMFAsxQ5VeRVwORs4tU8RH+HFtQ==",
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz",
"integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==",
"requires": {
"call-bind": "^1.0.0",
"define-properties": "^1.1.3"
}
},
......@@ -5468,9 +5491,9 @@
"integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
},
"moment-timezone": {
"version": "0.5.32",
"resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.32.tgz",
"integrity": "sha512-Z8QNyuQHQAmWucp8Knmgei8YNo28aLjJq6Ma+jy1ZSpSk5nyfRT8xgUbSQvD2+2UajISfenndwvFuH3NGS+nvA==",
"version": "0.5.33",
"resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.33.tgz",
"integrity": "sha512-PTc2vcT8K9J5/9rDEPe5czSIKgLoGsH8UNpA4qZTVw0Vd/Uz19geE9abbIOQKaAQFcnQ3v5YEXrbSc5BpshH+w==",
"requires": {
"moment": ">= 2.9.0"
}
......@@ -5732,13 +5755,13 @@
"dev": true
},
"node-schedule": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-1.3.2.tgz",
"integrity": "sha512-GIND2pHMHiReSZSvS6dpZcDH7pGPGFfWBIEud6S00Q8zEIzAs9ommdyRK1ZbQt8y1LyZsJYZgPnyi7gpU2lcdw==",
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-1.3.3.tgz",
"integrity": "sha512-uF9Ubn6luOPrcAYKfsXWimcJ1tPFtQ8I85wb4T3NgJQrXazEzojcFZVk46ZlLHby3eEJChgkV/0T689IsXh2Gw==",
"requires": {
"cron-parser": "^2.7.3",
"cron-parser": "^2.18.0",
"long-timeout": "0.1.1",
"sorted-array-functions": "^1.0.0"
"sorted-array-functions": "^1.3.0"
}
},
"nopt": {
......
......@@ -147,6 +147,14 @@ export class AppController {
res.status(response.code).json(response);
});
}
@Get('deckinfo')
async getDeckInfo(@Query() query, @Res() res: express.Response) {
if (!query.name) {
res.status(404).send('deck name is required!');
}
const result = await this.appService.getDeckInfo(query);
res.status(result.code).json(result);
}
@Get('download/:id')
downloadFile(@Param('id') filename: string, @Res() res: express.Response) {
if (!filename) {
......
......@@ -5,6 +5,7 @@ import {
EntityManager,
LessThan,
LessThanOrEqual,
Like,
MoreThanOrEqual,
} from 'typeorm';
import { UserInfo } from './entities/mycard/UserInfo';
......@@ -25,6 +26,10 @@ import { EloUtility } from './EloUtility';
import { Votes } from './entities/mycard/Votes';
import { VoteResult } from './entities/mycard/VoteResult';
import { promises as fs } from 'fs';
import { scheduleJob } from 'node-schedule';
import { DeckInfo } from './entities/mycard/DeckInfo';
import { DeckInfoHistory } from './entities/mycard/DeckInfoHistory';
import { DeckDemo } from './entities/mycard/DeckDemo';
const attrOffset = 1010;
const raceOffset = 1020;
......@@ -105,6 +110,38 @@ export class AppService {
chineseList: ChineseDirtyWords,
});
this.createUploadDirectory();
if (config.enableSchedule) {
scheduleJob('0 0 0 1 * *', async () => {
await this.monthlyJob();
});
}
}
private async monthlyJob() {
this.log.log(
`The scheduleJob run on first day of every month: ${moment().format(
'YYYY-MM-DD HH:mm',
)}`,
);
const time = moment().subtract(1, 'month');
const season = time.format('YYYY-MM');
const higher_limit = time.format('YYYY-MM-01 00:00:01');
const lower_limit = moment()
.subtract(1, 'day')
.format('YYYY-MM-DD 23:59:59');
const base = 1000;
try {
await this.mcdb.query(
'select monthly_user_historical_record($1::text, $2, $3::boolean, true)',
[season, base, false],
);
await this.mcdb.query('select collect_win_lose_rate($1, $2)', [
lower_limit,
higher_limit,
]);
} catch (e) {
this.log.error(`Failed to run monthly job: ${e.toString()}`);
}
}
private async createUploadDirectory() {
......@@ -1067,4 +1104,55 @@ export class AppService {
return { data: 'null' };
}
}
async getDeckInfo(query: any) {
const name: string = query.name;
const version = query.version;
let deck: any;
if (version) {
deck = await this.mcdb
.getRepository(DeckInfo)
.createQueryBuilder()
.where('name = :name', { name })
.andWhere('id = :id', { id: parseInt(version) })
.orderBy('start_time', 'DESC')
.getRawOne();
} else {
deck = await this.mcdb
.getRepository(DeckInfo)
.createQueryBuilder()
.where('name like :name', { name: `%${name}%` })
.orderBy('start_time', 'DESC')
.getRawOne();
}
if (!deck) {
return {
code: 404,
};
}
const resName = deck.name;
const history = await this.mcdb
.getRepository(DeckInfoHistory)
.createQueryBuilder()
.where('name = :name', { name: resName })
.orderBy('start_time', 'DESC')
.getRawMany();
const demo = (
await this.mcdb
.getRepository(DeckDemo)
.createQueryBuilder()
.where('name = :name', { name: resName })
.orderBy('create_time', 'DESC')
.getRawMany()
).map((row) => {
row.create_time = moment(row.create_time).format('YYYY-MM-DD');
return row;
});
return {
code: 200,
demo,
history,
data: deck,
};
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment