Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Add firestore helper functions
  • Loading branch information
regalijan committed Oct 19, 2023
1 parent f37b680 commit 161d077
Showing 1 changed file with 172 additions and 3 deletions.
175 changes: 172 additions & 3 deletions functions/gcloud.ts
Expand Up @@ -79,9 +79,7 @@ async function GetAccessToken(env: Env): Promise<string> {

const signingKey = await crypto.subtle.importKey(
"pkcs8",
stringToBuffer(
atob(env.STORAGE_ACCOUNT_KEY.replace(/(\r\n|\n|\r)/gm, ""))
),
stringToBuffer(atob(env.STORAGE_ACCOUNT_KEY.replace(/(\r\n|\n|\r)/gm, ""))),
{ name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" },
false,
["sign"]
Expand All @@ -107,3 +105,174 @@ async function GetAccessToken(env: Env): Promise<string> {

return ((await tokenRequest.json()) as { [k: string]: any }).access_token;
}

async function getKeyIDs(
access_token: string,
projectId: string,
keys: { partitionId: { projectId: string }; path: { kind: string }[] }[]
) {
const keyRequest = await fetch(
`https://datastore.googleapis.com/v1/projects/${projectId}:allocateIds`,
{
body: JSON.stringify({ keys }),
headers: {
authorization: `Bearer ${access_token}`,
"content-type": "application/json",
},
method: "POST",
}
);

if (!keyRequest.ok) {
console.log(await keyRequest.json());
throw new Error("Failed to allocate key IDs");
}

return ((await keyRequest.json()) as { keys: { [k: string]: any }[] }).keys;
}

export async function insertLogs(
userActionMap: { [k: string]: number },
reportId: string,
context: RequestContext
) {
const accessToken = await GetAccessToken(context.env);
const actionBaseURLs: { [k: number]: string } = {
1: "https://portal.carcrushers.cc/view-closed-report/",
2: "https://portal.carcrushers.cc/view-closed-report/",
3: "",
4: "https://portal.carcrushers.cc/game-appeals/",
};
const actionIntegers: { [k: number]: string } = {
1: "blacklist",
2: "ban",
3: "revoke",
4: "accept_appeal",
};
const incompleteLogKey = {
partitionId: {
projectId: context.env.DATASTORE_PROJECT,
},
path: [
{
kind: "log",
},
],
};
const payload: { mode: string; mutations: { [k: string]: any }[] } = {
mode: "NON_TRANSACTIONAL",
mutations: [],
};
const preAllocatedLogKeys = [];

while (preAllocatedLogKeys.length < Object.keys(userActionMap).length)
preAllocatedLogKeys.push(incompleteLogKey);

const keys = await getKeyIDs(
accessToken,
context.env.DATASTORE_PROJECT,
preAllocatedLogKeys
);

for (const [user, action] of Object.entries(userActionMap)) {
payload.mutations.push({
insert: {
key: keys.pop(),
properties: {
action: {
stringValue: actionIntegers[action],
},
evidence: {
stringValue: actionBaseURLs[action] + reportId,
},
executed_at: {
integerValue: Date.now(),
},
executor: {
stringValue: context.data.current_user.id,
},
target: {
integerValue: user,
},
},
},
});
}

const mutationRequest = await fetch(
`https://datastore.googleapis.com/v1/projects/${context.env.DATASTORE_PROJECT}:commit`,
{
body: JSON.stringify(payload),
headers: {
authorization: `Bearer ${accessToken}`,
"content-type": "application/json",
},
method: "POST",
}
);

if (!mutationRequest.ok) {
console.log(await mutationRequest.json());
throw new Error("Failed to commit mutation");
}

return await mutationRequest.json();
}

export async function queryLogs(user: number, context: RequestContext) {
const accessToken = await GetAccessToken(context.env);

const queryRequest = await fetch(
`https://datastore.googleapis.com/v1/projects/${context.env.DATASTORE_PROJECT}:runQuery`,
{
body: JSON.stringify({
partitionId: {
projectId: context.env.DATASTORE_PROJECT,
},
query: {
filter: {
propertyFilter: {
op: "EQUAL",
property: {
name: "target",
},
value: {
integerValue: user.toString(),
},
},
},
kind: [
{
name: "log",
},
],
},
}),
headers: {
authorization: `Bearer ${accessToken}`,
"content-type": "application/json",
},
method: "POST",
}
);

if (!queryRequest.ok) {
console.log(await queryRequest.json());
throw new Error("Failed to query logs");
}

const entityResult =
(
(await queryRequest.json()) as {
batch: { entityResults: { [k: string]: { [k: string]: any } }[] };
}
).batch?.entityResults ?? [];

if (!entityResult.length) return {};

const entity = entityResult[0].entity.properties;
delete entity.executor;
delete entity.target;

return entity;
}

0 comments on commit 161d077

Please sign in to comment.