Add firestore helper functions
This commit is contained in:
parent
f37b68015a
commit
161d077ab9
@ -79,9 +79,7 @@ async function GetAccessToken(env: Env): Promise<string> {
|
|||||||
|
|
||||||
const signingKey = await crypto.subtle.importKey(
|
const signingKey = await crypto.subtle.importKey(
|
||||||
"pkcs8",
|
"pkcs8",
|
||||||
stringToBuffer(
|
stringToBuffer(atob(env.STORAGE_ACCOUNT_KEY.replace(/(\r\n|\n|\r)/gm, ""))),
|
||||||
atob(env.STORAGE_ACCOUNT_KEY.replace(/(\r\n|\n|\r)/gm, ""))
|
|
||||||
),
|
|
||||||
{ name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" },
|
{ name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" },
|
||||||
false,
|
false,
|
||||||
["sign"]
|
["sign"]
|
||||||
@ -107,3 +105,174 @@ async function GetAccessToken(env: Env): Promise<string> {
|
|||||||
|
|
||||||
return ((await tokenRequest.json()) as { [k: string]: any }).access_token;
|
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;
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user