UNPKG

@lxdhub/dbsync

Version:

Display, search and copy LXD-images using a web interface.

124 lines 5.98 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var __param = (this && this.__param) || function (paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); } }; Object.defineProperty(exports, "__esModule", { value: true }); const db_1 = require("@lxdhub/db"); const common_1 = require("@nestjs/common"); const aigle_1 = require("aigle"); const image_1 = require("../image"); const lxd_1 = require("../lxd"); const typeorm_1 = require("@nestjs/typeorm"); const typeorm_2 = require("typeorm"); let ImageAvailabilityService = class ImageAvailabilityService { constructor(repository, remoteRepository, imageRepository, imageService, dbSyncSettings, lxdService) { this.repository = repository; this.remoteRepository = remoteRepository; this.imageRepository = imageRepository; this.imageService = imageService; this.dbSyncSettings = dbSyncSettings; this.lxdService = lxdService; this.logger = new common_1.Logger('ImageAvailabilityService'); } async fillUpImageAvailablities() { const remotes = await this.remoteRepository.find(); const images = await this.imageRepository.find(); for (const remote of remotes) { for (const image of images) { await this.getOrCreate(image, remote, false); } } } async markAsUnavailable(fingerprints, remote) { const imageAvailabilities = await this.repository .find({ relations: ['image', 'remote'], where: { remote: { id: remote.id }, available: true, } }); const notAvailableImages = imageAvailabilities.filter(ai => fingerprints.indexOf(ai.image.fingerprint) === -1); if (notAvailableImages.length === 0) { return; } this.logger.log(`${notAvailableImages.length} images have been removed on the remote "${remote.name}"`); await Promise.all(notAvailableImages.map(async (imageAvailability) => { imageAvailability.available = false; this.logger.log(`Updating Image Availability to false #${imageAvailability.id} on remote #${remote.id}`); return await this.repository.save(imageAvailability); })); } async updateOrCreate(image, remote, available = true) { const imageAvailability = await this.get(image, remote); if (imageAvailability) { imageAvailability.available = available; return await this.repository.save(imageAvailability); } else { return await this.create(image, remote, available); } } async getOrCreate(image, remote, available = true) { const iA = await this.get(image, remote); if (!iA) { return await this.create(image, remote, available); } return iA; } async create(image, remote, available = true) { this.logger.log(`Creating Image Availability image#${image.id} remote#${remote.id} -> ${available}`); const newImageAvailability = new db_1.ImageAvailability(); newImageAvailability.available = available; newImageAvailability.image = image; newImageAvailability.remote = remote; return await this.repository.save(newImageAvailability); } async get(image, remote) { return await this.repository.createQueryBuilder('iA') .leftJoin('iA.image', 'image') .leftJoin('iA.remote', 'remote') .where('image.id = :imageId AND remote.id = :remoteId', { imageId: image.id, remoteId: remote.id }) .getOne(); } async synchronize() { this.logger.log('-> Starting image-availability synchronization'); await aigle_1.default .resolve(this.dbSyncSettings.lxdhubConfig.remotes) .forEachSeries(async (remote) => { const images = await this.lxdService.getRemoteImages(remote); const localRemote = await this.remoteRepository.findOne({ name: remote.name, serverUrl: remote.url }); await aigle_1.default .resolve(images) .forEachSeries(async (remoteImage) => { const image = await this.imageService.getImage(remoteImage); return await this.updateOrCreate(image, localRemote); }); await this.markAsUnavailable(images.map(image => image.fingerprint), localRemote); }); await this.fillUpImageAvailablities(); this.logger.log('-> Finished image-availability synchronization'); } }; ImageAvailabilityService = __decorate([ common_1.Injectable(), __param(0, typeorm_1.InjectRepository(db_1.ImageAvailability)), __param(1, typeorm_1.InjectRepository(db_1.Remote)), __param(2, typeorm_1.InjectRepository(db_1.Image)), __param(4, common_1.Inject('LXDHubDbSyncSettings')), __metadata("design:paramtypes", [typeorm_2.Repository, typeorm_2.Repository, typeorm_2.Repository, image_1.ImageService, Object, lxd_1.LXDService]) ], ImageAvailabilityService); exports.ImageAvailabilityService = ImageAvailabilityService; //# sourceMappingURL=image-availability.service.js.map