Files
threetwo-core-service/services/api.service.ts
2021-09-12 01:01:42 -07:00

169 lines
3.9 KiB
TypeScript

import { Service, ServiceBroker, Context } from "moleculer";
import ApiGateway from "moleculer-web";
import { extractCoverFromFile } from "../utils/uncompression.utils";
import { map } from "lodash";
const IO = require("socket.io")();
import Comic from "../models/comic.model";
import {
IExtractComicBookCoverErrorResponse,
IExtractedComicBookCoverFile,
} from "threetwo-ui-typings";
import { logger } from "../utils/logger.utils";
export default class ApiService extends Service {
public constructor(broker: ServiceBroker) {
super(broker);
// @ts-ignore
this.parseServiceSchema({
name: "api",
mixins: [ApiGateway],
// More info about settings: https://moleculer.services/docs/0.14/moleculer-web.html
settings: {
port: process.env.PORT || 3000,
routes: [
{
path: "/api",
whitelist: ["**"],
cors: {
origin: "*",
methods: [
"GET",
"OPTIONS",
"POST",
"PUT",
"DELETE",
],
allowedHeaders: ["*"],
exposedHeaders: [],
credentials: false,
maxAge: 3600,
},
use: [],
mergeParams: true,
authentication: false,
authorization: false,
autoAliases: true,
aliases: {},
callingOptions: {},
bodyParsers: {
json: {
strict: false,
limit: "1MB",
},
urlencoded: {
extended: true,
limit: "1MB",
},
},
mappingPolicy: "all", // Available values: "all", "restrict"
logging: true,
},
{
path: "/userdata",
use: [ApiGateway.serveStatic("userdata")],
},
{
path: "/comics",
use: [ApiGateway.serveStatic("comics")],
},
],
log4XXResponses: false,
logRequestParams: null,
logResponseData: null,
assets: {
folder: "public",
// Options to `server-static` module
options: {},
},
},
events: {
"**"(payload, sender, event) {
if (this.io)
this.io.emit("event", {
sender,
event,
payload,
});
},
},
methods: {},
started(): any {
// Create a Socket.IO instance, passing it our server
this.io = IO.listen(this.server);
// Add a connect listener
this.io.on("connection", (client) => {
this.logger.info("Client connected via websocket!");
client.on(
"importComicsToDB",
async ({ action, params, opts }, done) => {
this.logger.info(
"Received request from client! Action:",
action,
", Params:",
params
);
const { extractionOptions, walkedFolders } = params;
map(walkedFolders, async (folder, idx) => {
let comicExists = await Comic.exists({
"rawFileDetails.name": `${folder.name}`,
});
if (!comicExists) {
let comicBookCoverMetadata:
| IExtractedComicBookCoverFile
| IExtractComicBookCoverErrorResponse
| IExtractedComicBookCoverFile[] = await extractCoverFromFile(
extractionOptions,
folder
);
const dbImportResult =
await this.broker.call(
"import.rawImportToDB",
{
importStatus: {
isImported: true,
tagged: false,
matchedResult: {
score: "0",
},
},
rawFileDetails:
comicBookCoverMetadata,
sourcedMetadata: {
comicvine: {},
},
},
{}
);
client.emit("comicBookCoverMetadata", {
comicBookCoverMetadata,
dbImportResult,
});
} else {
logger.info(
`Comic: \"${folder.name}\" already exists in the database`
);
client.emit("comicBookExists", {
name: folder.name,
});
}
});
}
);
client.on("disconnect", () => {
this.logger.info("Client disconnected");
});
});
},
});
}
}