igara/syonet_seven

View on GitHub
nodejs/api/src/resolvers/google/scraping.ts

Summary

Maintainability
A
1 hr
Test Coverage
import "reflect-metadata";
import {
  Resolver,
  Mutation,
  Query,
  ObjectType,
  Field,
  Ctx,
  Arg,
} from "type-graphql";
import { Auth } from "@api/models/typeorm/entities/auth";
import * as googleapis from "@api/libs/googleapis";
// @ts-ignore
import Inliner from "inliner";
import { getTimeStamp } from "@api/libs/datetime";

type Context = {
  user?: number;
};

@ObjectType()
class ExecScraping {
  @Field()
  html: string;
}

@ObjectType()
class SaveScrapingHTML {
  @Field()
  fileID: string;
  @Field()
  directoryID: string;
  @Field()
  html: string;
  @Field()
  url: string;
  @Field()
  title: string;
}

@Resolver()
export class ScrapingResolver {
  @Query(() => ExecScraping, { nullable: true })
  async execScraping(@Arg("url") url: string): Promise<ExecScraping> {
    const inliner = () => {
      return new Promise<string>(
        (resolve) =>
          new Inliner(url, (_: any, html: string) => {
            resolve(html);
          })
      );
    };

    const html = await inliner();

    return { html };
  }

  @Mutation(() => SaveScrapingHTML, { nullable: true })
  async saveScrapingHTML(
    @Ctx() ctx: Context,
    @Arg("html") html: string,
    @Arg("url") url: string,
    @Arg("title") title: string
  ): Promise<SaveScrapingHTML | undefined> {
    if (!ctx.user) {
      return undefined;
    }

    const auth = await Auth.findOne({
      id: Number(ctx.user),
    });

    if (!auth) {
      return undefined;
    }

    const googleClient = googleapis.client(auth.accessToken);
    const drive = googleapis.drive(googleClient);

    const appFolderID = (await googleapis.getFolderIDByFolderName(
      drive,
      googleapis.folderName.app
    )) as string;
    const scrapingFolderID = await googleapis.createChildFolderByFolderNameAndFolderID(
      drive,
      googleapis.folderName.scraping,
      appFolderID
    );
    await googleapis.createPermission(drive, scrapingFolderID);
    const scrapingURLFolderID = await googleapis.createChildFolderByFolderNameAndFolderID(
      drive,
      url,
      scrapingFolderID
    );
    const scrapingTitleFolderID = await googleapis.createChildFolderByFolderNameAndFolderID(
      drive,
      title,
      scrapingURLFolderID
    );

    const htmlFileName = `${getTimeStamp()}.html`;
    const fileID = await googleapis.createHTMLFileByHTMLFileNameAndFolderID(
      drive,
      htmlFileName,
      scrapingTitleFolderID,
      html
    );

    return { fileID, directoryID: scrapingFolderID, html, url, title };
  }
}