Skip to content

Commit

Permalink
refactor: apply PR feedback
Browse files Browse the repository at this point in the history
  • Loading branch information
aleortega committed Apr 17, 2024
1 parent aa74cf7 commit ae4ff99
Show file tree
Hide file tree
Showing 2 changed files with 93 additions and 93 deletions.
55 changes: 1 addition & 54 deletions src/entities/CheckScenes/task/taskRunnerSqs.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,4 @@
import { randomUUID } from "crypto"
import { Readable } from "stream"

import AWS from "aws-sdk"
import env from "decentraland-gatsby/dist/utils/env"
import fetch from "node-fetch"
import { retry } from "radash"

import CategoryModel from "../../Category/model"
import { DecentralandCategories } from "../../Category/types"
Expand All @@ -20,7 +14,7 @@ import {
} from "../../Slack/utils"
import CheckScenesModel from "../model"
import { CheckSceneLogsTypes } from "../types"
import { calculateGenesisCityManifestPositions, getWorldAbout } from "../utils"
import { getWorldAbout, updateGenesisCityManifest } from "../utils"
import { DeploymentToSqs } from "./consumer"
import {
ProcessEntitySceneResult,
Expand Down Expand Up @@ -49,53 +43,6 @@ const placesAttributes: Array<keyof PlaceAttributes> = [
"textsearch",
]

const ACCESS_KEY = env("AWS_ACCESS_KEY")
const ACCESS_SECRET = env("AWS_ACCESS_SECRET")
const BUCKET_HOSTNAME = env("BUCKET_HOSTNAME")
const BUCKET_NAME = env("AWS_BUCKET_NAME", "")

async function updateGenesisCityManifest() {
const s3 = new AWS.S3({
accessKeyId: ACCESS_KEY,
secretAccessKey: ACCESS_SECRET,
signatureVersion: "v4",
})

const signedUrl = await retry({ times: 10, delay: 100 }, async () => {
const responseUrl = s3.getSignedUrl("putObject", {
Bucket: BUCKET_NAME,
Key: `WorldManifest.json`,
Expires: 60 * 1000,
ContentType: "application/json",
ACL: "public-read",
CacheControl: "no-store, no-cache, must-revalidate, proxy-revalidate",
})

const url = new URL(responseUrl)
if (url.searchParams.size === 0) {
throw new Error("Invalid AWS response")
}

if (BUCKET_HOSTNAME) {
url.hostname = BUCKET_HOSTNAME
}

return url.toString()
})

const genesisCityManifestPositions =
await calculateGenesisCityManifestPositions()

const stream = Readable.from([JSON.stringify(genesisCityManifestPositions)])
await fetch(signedUrl, {
method: "PUT",
headers: {
"Content-Type": "application/json",
},
body: stream,
})
}

export async function taskRunnerSqs(job: DeploymentToSqs) {
const contentEntityScene = await processEntityId(job)

Expand Down
131 changes: 92 additions & 39 deletions src/entities/CheckScenes/utils.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import { Readable } from "stream"

import { EntityType } from "@dcl/schemas/dist/platform/entity"
import AWS from "aws-sdk"
import Catalyst from "decentraland-gatsby/dist/utils/api/Catalyst"
import {
ContentDeploymentScene,
Expand All @@ -7,6 +10,9 @@ import {
ContentEntityScene,
} from "decentraland-gatsby/dist/utils/api/Catalyst.types"
import ContentServer from "decentraland-gatsby/dist/utils/api/ContentServer"
import env from "decentraland-gatsby/dist/utils/env"
import fetch from "node-fetch"
import { retry } from "radash"

import allCoordinates from "../../__data__/AllCoordinates.json"
import roadCoordinates from "../../__data__/RoadCoordinates.json"
Expand All @@ -15,6 +21,92 @@ import { PlaceAttributes } from "../Place/types"
import PlacePositionModel from "../PlacePosition/model"
import { DeploymentTrackAttributes, WorldAbout } from "./types"

const ACCESS_KEY = env("AWS_ACCESS_KEY")
const ACCESS_SECRET = env("AWS_ACCESS_SECRET")
const BUCKET_HOSTNAME = env("BUCKET_HOSTNAME")
const BUCKET_NAME = env("AWS_BUCKET_NAME", "")

type Pointer = string

interface ManifestResponse {
roads: Pointer[]
occupied: Pointer[]
empty: Pointer[]
}

export async function getWorldAbout(
url: string,
worldName: string
): Promise<WorldAbout> {
const worldContentServer = await ContentServer.getInstanceFrom(url)
return worldContentServer.fetch(`/world/${worldName}/about`)
}

async function calculateGenesisCityManifestPositions(): Promise<ManifestResponse> {
const occupiedPositions = (await PlacePositionModel.find()).map(
(place) => place.position
)

const roadSet = new Set(roadCoordinates)
const occupiedSet = new Set(occupiedPositions)
const restOfCoordinatesSet = new Set(allCoordinates)

const response: ManifestResponse = {
roads: Array.from(roadSet),
occupied: Array.from(occupiedSet),
empty: [],
}

roadSet.forEach((coordinate) => restOfCoordinatesSet.delete(coordinate))
occupiedSet.forEach((coordinate) => restOfCoordinatesSet.delete(coordinate))

response.empty = Array.from(restOfCoordinatesSet)

return response
}

export async function updateGenesisCityManifest() {
const s3 = new AWS.S3({
accessKeyId: ACCESS_KEY,
secretAccessKey: ACCESS_SECRET,
signatureVersion: "v4",
})

const signedUrl = await retry({ times: 10, delay: 100 }, async () => {
const responseUrl = s3.getSignedUrl("putObject", {
Bucket: BUCKET_NAME,
Key: `WorldManifest.json`,
Expires: 60 * 1000,
ContentType: "application/json",
ACL: "public-read",
CacheControl: "no-store, no-cache, must-revalidate, proxy-revalidate",
})

const url = new URL(responseUrl)
if (url.searchParams.size === 0) {
throw new Error("Invalid AWS response")
}

if (BUCKET_HOSTNAME) {
url.hostname = BUCKET_HOSTNAME
}

return url.toString()
})

const genesisCityManifestPositions =
await calculateGenesisCityManifestPositions()

const stream = Readable.from(JSON.stringify(genesisCityManifestPositions))
await fetch(signedUrl, {
method: "PUT",
headers: {
"Content-Type": "application/json",
},
body: stream,
})
}

/** @deprecated */
export async function fetchDeployments(catalyst: DeploymentTrackAttributes) {
const contentDeploymentsResponse = await Catalyst.getInstanceFrom(
Expand Down Expand Up @@ -83,42 +175,3 @@ export function isSameWorld(
place.world_name === contentEntityScene.metadata.worldConfiguration?.name
)
}

type Pointer = string

interface ManifestResponse {
roads: Pointer[]
occupied: Pointer[]
empty: Pointer[]
}

export async function getWorldAbout(
url: string,
worldName: string
): Promise<WorldAbout> {
const worldContentServer = await ContentServer.getInstanceFrom(url)
return worldContentServer.fetch(`/world/${worldName}/about`)
}

export async function calculateGenesisCityManifestPositions(): Promise<ManifestResponse> {
const occupiedPositions = (await PlacePositionModel.find()).map(
(place) => place.position
)

const roadSet = new Set(roadCoordinates)
const occupiedSet = new Set(occupiedPositions)
const restOfCoordinatesSet = new Set(allCoordinates)

const response: ManifestResponse = {
roads: Array.from(roadSet),
occupied: Array.from(occupiedSet),
empty: [],
}

roadSet.forEach((coordinate) => restOfCoordinatesSet.delete(coordinate))
occupiedSet.forEach((coordinate) => restOfCoordinatesSet.delete(coordinate))

response.empty = Array.from(restOfCoordinatesSet)

return response
}

0 comments on commit ae4ff99

Please sign in to comment.