48 lines
1.6 KiB
TypeScript
48 lines
1.6 KiB
TypeScript
import { DeploymentsRepository } from "@/modules/deployments/deployments.repository";
|
|
import { RedisService } from "@/modules/redis/redis.service";
|
|
import { Injectable } from "@nestjs/common";
|
|
import { ConfigService } from "@nestjs/config";
|
|
|
|
const CACHING_TIME = 86400000; // 24 hours in milliseconds
|
|
|
|
const getLicenseCacheKey = (key: string) => `api-v2-license-key-goblin-url-${key}`;
|
|
|
|
type LicenseCheckResponse = {
|
|
status: boolean;
|
|
};
|
|
@Injectable()
|
|
export class DeploymentsService {
|
|
constructor(
|
|
private readonly deploymentsRepository: DeploymentsRepository,
|
|
private readonly configService: ConfigService,
|
|
private readonly redisService: RedisService
|
|
) {}
|
|
|
|
async checkLicense() {
|
|
if (this.configService.get("e2e")) {
|
|
return true;
|
|
}
|
|
let licenseKey = this.configService.get("api.licenseKey");
|
|
|
|
if (!licenseKey) {
|
|
/** We try to check on DB only if env is undefined */
|
|
const deployment = await this.deploymentsRepository.getDeployment();
|
|
licenseKey = deployment?.licenseKey ?? undefined;
|
|
}
|
|
|
|
if (!licenseKey) {
|
|
return false;
|
|
}
|
|
const licenseKeyUrl = this.configService.get("api.licenseKeyUrl") + `/${licenseKey}`;
|
|
const cachedData = await this.redisService.redis.get(getLicenseCacheKey(licenseKey));
|
|
if (cachedData) {
|
|
return (JSON.parse(cachedData) as LicenseCheckResponse)?.status;
|
|
}
|
|
const response = await fetch(licenseKeyUrl, { mode: "cors" });
|
|
const data = (await response.json()) as LicenseCheckResponse;
|
|
const cacheKey = getLicenseCacheKey(licenseKey);
|
|
this.redisService.redis.set(cacheKey, JSON.stringify(data), "EX", CACHING_TIME);
|
|
return data.status;
|
|
}
|
|
}
|