102 lines
4.7 KiB
JavaScript
102 lines
4.7 KiB
JavaScript
"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 QuickImportService_1;
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.QuickImportService = void 0;
|
|
const common_1 = require("@nestjs/common");
|
|
const download_image_1 = require("../common/utils/download-image");
|
|
const IMAGE_DEST_DIR = process.env.IMAGE_DEST_DIR || '/app/recipe-images';
|
|
const IMPORTER_SERVICE_URL = process.env.IMPORTER_SERVICE_URL || 'http://importer-api:3001';
|
|
let QuickImportService = QuickImportService_1 = class QuickImportService {
|
|
constructor() {
|
|
this.logger = new common_1.Logger(QuickImportService_1.name);
|
|
}
|
|
async importFromInput(input) {
|
|
const trimmed = input.trim();
|
|
this.logger.log(`Delegerar URL-import till microservice: ${trimmed}`);
|
|
if (!trimmed) {
|
|
throw new common_1.BadRequestException('Du måste ange en URL eller ladda upp en fil');
|
|
}
|
|
let response;
|
|
try {
|
|
response = await fetch(`${IMPORTER_SERVICE_URL}/api/quick-import`, {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({ input: trimmed }),
|
|
});
|
|
}
|
|
catch (err) {
|
|
this.logger.error(`Kunde inte nå importer-api: ${err}`);
|
|
throw new common_1.ServiceUnavailableException('Import-tjänsten är inte tillgänglig. Försök igen senare.');
|
|
}
|
|
const result = await this.handleImporterResponse(response);
|
|
return this.downloadImageIfNeeded(result);
|
|
}
|
|
async importFromUpload(file) {
|
|
this.logger.log(`Delegerar filuploading till microservice: ${file.originalname} (${file.mimetype})`);
|
|
const form = new FormData();
|
|
form.append('file', new Blob([new Uint8Array(file.buffer)], { type: file.mimetype }), file.originalname);
|
|
let response;
|
|
try {
|
|
response = await fetch(`${IMPORTER_SERVICE_URL}/api/quick-import`, {
|
|
method: 'POST',
|
|
body: form,
|
|
});
|
|
}
|
|
catch (err) {
|
|
this.logger.error(`Kunde inte nå importer-api: ${err}`);
|
|
throw new common_1.ServiceUnavailableException('Import-tjänsten är inte tillgänglig. Försök igen senare.');
|
|
}
|
|
const result = await this.handleImporterResponse(response);
|
|
return this.downloadImageIfNeeded(result);
|
|
}
|
|
async handleImporterResponse(response) {
|
|
if (!response.ok) {
|
|
let message = `Import-tjänsten svarade ${response.status}`;
|
|
try {
|
|
const body = (await response.json());
|
|
if (body.message)
|
|
message = body.message;
|
|
}
|
|
catch {
|
|
}
|
|
this.logger.error(`Importer-api fel: ${message}`);
|
|
if (response.status >= 400 && response.status < 500) {
|
|
throw new common_1.BadRequestException(message);
|
|
}
|
|
throw new common_1.ServiceUnavailableException(message);
|
|
}
|
|
return response.json();
|
|
}
|
|
async downloadImageIfNeeded(result) {
|
|
if (!result.imageUrl)
|
|
return result;
|
|
const imageUrl = result.imageUrl;
|
|
if (!imageUrl.startsWith('http://') && !imageUrl.startsWith('https://')) {
|
|
return result;
|
|
}
|
|
this.logger.log(`Laddar ner receptbild: ${imageUrl}`);
|
|
try {
|
|
const localPath = await (0, download_image_1.downloadAndOptimizeImage)(imageUrl, IMAGE_DEST_DIR);
|
|
this.logger.log(`Bild sparad lokalt: ${localPath}`);
|
|
return { ...result, imageUrl: localPath };
|
|
}
|
|
catch (imgErr) {
|
|
this.logger.warn(`Kunde inte ladda ner bild: ${imgErr} (källa: ${imageUrl})`);
|
|
return {
|
|
...result,
|
|
imageWarning: result.imageWarning ?? 'Receptbild kunde inte laddas ner lokalt; extern URL används.',
|
|
};
|
|
}
|
|
}
|
|
};
|
|
exports.QuickImportService = QuickImportService;
|
|
exports.QuickImportService = QuickImportService = QuickImportService_1 = __decorate([
|
|
(0, common_1.Injectable)()
|
|
], QuickImportService);
|
|
//# sourceMappingURL=quick-import.service.js.map
|