📦 EqualifyEverything / equalify-v2-api

📄 runScan.ts · 58 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58import { db, event, isStaging } from '#src/utils';
import { LambdaClient, InvokeCommand } from '@aws-sdk/client-lambda';
const lambda = new LambdaClient();

export const runScan = async () => {
    const { audit_id } = event.body;
    await db.connect();
    const audit = (await db.query({
        text: `SELECT * FROM "audits" WHERE "id"=$1`,
        values: [audit_id],
    })).rows?.[0];
    try {
        const scanResponse = await (await fetch(`https://scan${isStaging ? '-dev' : ''}.equalify.app/generate/${audit?.is_sitemap ? 'sitemapurl' : 'url'}`, {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({ url: audit.audit_url, userId: event.claims.sub })
        })).json();
        // console.log(JSON.stringify({ scanResponse }));

        for (const { jobId, url } of scanResponse?.jobs ?? []) {
            const urlId = (await db.query({
                text: `SELECT "id" FROM "urls" WHERE "organization_id"=$1 AND "url"=$2 AND "audit_id"=$3`,
                values: [event.claims.profile, url, audit_id],
            })).rows?.[0]?.id ?? (await db.query({
                text: `INSERT INTO "urls" ("organization_id", "url", "audit_id") VALUES ($1, $2, $3) RETURNING "id"`,
                values: [event.claims.profile, url, audit_id]
            })).rows?.[0]?.id;

            const scan = (await db.query({
                text: `INSERT INTO "scans" ("user_id", "organization_id", "audit_id", "url_id", "job_id") VALUES ($1, $2, $3, $4, $5) RETURNING "job_id"`,
                values: [event.claims.sub, event.claims.profile, audit_id, urlId, parseInt(jobId)]
            })).rows[0];
        }

        if (!audit?.is_sitemap) {
            lambda.send(new InvokeCommand({
                FunctionName: `equalifyv2-api${isStaging ? '-staging' : ''}`,
                InvocationType: "Event",
                Payload: Buffer.from(JSON.stringify({
                    path: '/internal/processScans',
                    organization_id: event.claims.profile,
                    audit_id: audit_id,
                    is_sitemap: true,
                })),
            }));
        }
    }
    catch (err) {
        console.log(err);
    }
    await db.clean();

    return {
        status: 'success',
        message: 'Scans successfully queued',
    };
}