UNPKG

qrcode-framework

Version:

158 lines 15.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const Common_1 = require("../common/Common"); const ErrorCode_1 = require("../common/ErrorCode"); const BaseService_1 = require("../core/BaseService"); const model_1 = require("../model"); const recommendation_1 = require("../model/recommendation"); const NumberUtil_1 = require("../util/NumberUtil"); class RecommendService extends BaseService_1.default { async getRecommendsByGroup(groupId, pageSize, pageNumber, options) { const limit = pageSize || 100; const offset = pageNumber ? (pageNumber - 1) * limit : 0; const platform = options ? options.platform : undefined; const version = options ? options.version : undefined; const tag = options ? options.tag : undefined; let result; // 如果是主推荐内容 if (NumberUtil_1.isEqual(groupId, 1)) { result = await this.getMaterialRecommends(offset, limit, platform, version, tag); } if (NumberUtil_1.isEqual(groupId, 2)) { result = await this.getBannerRecommends(offset, limit, platform, version); } if (NumberUtil_1.isEqual(groupId, 3)) { result = await this.getADRecommends(offset, limit, platform, version); } return result; } async getRecommendation(id, platform, version) { const r = await recommendation_1.RView.findOne({ where: { rid: id, }, }); if (!r) { throw new ErrorCode_1.HttpError({ message: '当前推荐不存在', errorCode: ErrorCode_1.ERROR_CODE.COMMON.NOT_FOUND, status: 404, }); } let extra = null; switch (r.rType) { case model_1.R_TYPE.PICTURE: extra = await this.ctx.service.pictureService.getById(r.meta.id); break; case model_1.R_TYPE.MATERIAL: extra = await this.ctx.service.materialService.getMaterialGroup(r.meta.id, platform, version); break; case model_1.R_TYPE.MODEL: extra = await this.ctx.service.htmlModelService.getModelById(r.meta.id); break; default: break; } const result = r.toJSON(); Object.assign(result.meta, { extra }); return result; } async getMaterialRecommends(offset, size, platform, version, tag) { const currentKey = `${Common_1.REDIS_KEY.MAIN_RECOMMEND}_${platform}_${version}_${tag}`; if (!await this.ctx.app.redis.exists(currentKey)) { await this.addMRToRedis(platform, version, tag); } return await this.getRecommends(offset, size, currentKey); } async getBannerRecommends(offset, size, platform, version) { const currentKey = `${Common_1.REDIS_KEY.BANNER_RECOMMEND}_${platform}_${version}`; if (!await this.ctx.app.redis.exists(currentKey)) { await this.addBannerToRedis(platform, version); } return await this.getRecommends(offset, size, currentKey); } async getADRecommends(offset, size, platform, version) { const currentKey = `${Common_1.REDIS_KEY.AD_RECOMMEND}_${platform}_${version}`; if (!await this.ctx.app.redis.exists(currentKey)) { await this.addADToRedis(platform, version); } return await this.getRecommends(offset, size, currentKey); } async getRecommends(offset, size, key) { const rArray = await this.ctx.app.redis.zrevrangebyscore(key, '+inf', 0, 'LIMIT', offset + '', size + ''); const count = await this.ctx.app.redis.zcard(key); return { rows: rArray.map((r) => { return recommendation_1.RView.fromDBScheme(JSON.parse(r)); }), count, }; } async addMRToRedis(platform, version, tag) { const versionWhere = platform === Common_1.PLATFORM.IOS ? `(ios_version is null or ios_version <= '${version}')` : `(android_version is null or android_version <= '${version}')`; const tagWhere = tag && parseInt(tag, 10) > 0 ? `and find_in_set(${tag}, tags) > 0` : null; const result = await global.sequelize.query(` SELECT * FROM r_view where gid = 1 and ${versionWhere} ${tagWhere || ''} and (start_at is null or start_at <= now()) and (end_at is null or end_at >= now()); `); const arg = this.convertRecommends(result[0]); const key = `${Common_1.REDIS_KEY.MAIN_RECOMMEND}_${platform}_${version}_${tag}`; await this.ctx.app.redis.zadd(key, ...arg.default); await this.ctx.app.redis.expire(key, 60 * 60 * 24); } async addBannerToRedis(platform, version) { const versionWhere = platform === Common_1.PLATFORM.IOS ? `(ios_version is null or ios_version <= '${version}')` : `(android_version is null or android_version <= '${version}')`; const result = await global.sequelize.query(` SELECT * FROM r_view where gid = 2 and ${versionWhere} and (start_at is null or start_at <= now()) and (end_at is null or end_at >= now()); `); const arg = this.convertRecommends(result[0]); await this.ctx.app.redis.zadd(`${Common_1.REDIS_KEY.BANNER_RECOMMEND}_${platform}_${version}`, ...arg.default); await this.ctx.app.redis.expire(`${Common_1.REDIS_KEY.BANNER_RECOMMEND}_${platform}_${version}`, 60 * 60 * 24); } async addADToRedis(platform, version) { const versionWhere = platform === Common_1.PLATFORM.IOS ? `(ios_version is null or ios_version <= '${version}')` : `(android_version is null or android_version <= '${version}')`; const result = await global.sequelize.query(` SELECT * FROM r_view where gid = 3 and ${versionWhere} and (start_at is null or start_at <= now()) and (end_at is null or end_at >= now()); `); const arg = this.convertRecommends(result[0]); await this.ctx.app.redis.zadd(`${Common_1.REDIS_KEY.AD_RECOMMEND}_${platform}_${version}`, ...arg.default); await this.ctx.app.redis.expire(`${Common_1.REDIS_KEY.AD_RECOMMEND}_${platform}_${version}`, 60 * 60 * 24); } convertRecommends(rArray) { const args = []; rArray.forEach((r) => { const obj = JSON.stringify(r); args.push(this.getScore(r.level)); args.push(obj); }); return { default: args, }; } getScore(level) { return level * 1000 + Math.random() * 100; } } exports.default = RecommendService; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjb21tZW5kU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIlJlY29tbWVuZFNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2Q0FBcUQ7QUFDckQsbURBQTBEO0FBQzFELHFEQUE4QztBQUM5QyxvQ0FFa0I7QUFDbEIsNERBQThDO0FBQzlDLG1EQUEyQztBQUUzQyxNQUFxQixnQkFBaUIsU0FBUSxxQkFBVztJQUM5QyxLQUFLLENBQUMsb0JBQW9CLENBQUMsT0FBZSxFQUFFLFFBQWlCLEVBQUUsVUFBbUIsRUFDdkQsT0FBMEQ7UUFDeEYsTUFBTSxLQUFLLEdBQUcsUUFBUSxJQUFJLEdBQUcsQ0FBQztRQUM5QixNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3hELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3RELE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlDLElBQUksTUFBTSxDQUFDO1FBQ1gsV0FBVztRQUNYLElBQUksb0JBQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUU7WUFDckIsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztTQUNwRjtRQUNELElBQUksb0JBQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVB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