import { applicationDefault, initializeApp } from "firebase-admin/app"; import { region as functionsRegion, Request, Response, config as functionsConfig } from "firebase-functions"; import * as path from "path"; import { App } from "./App"; import { AppConfig, Config } from "./config"; import * as fw from "./fw"; import { register } from "./register"; import CheckExipiredPlays from "./tasks/CheckExipiredPlays"; import { AkashicInstanceCount } from "./tasks/AkashicInstanceCount"; import * as functions from "firebase-functions"; const region = functionsRegion("asia-northeast1"); const { https } = region; /* const { auth } = region; export const onBeforeSignIn = auth.user().beforeSignIn(async (user, context) => { const newClaims = { test: `a${Date.now()}`, }; // これならきく await admin.auth().setCustomUserClaims(user.uid, newClaims); // きかない // user.customClaims = { // test2: "fuga", // }; // ドキュメントではききそうだが、こっちもきかない // return { // customClaims: { // test: "hoge", // }, // sessionClaims: { // abc: "bcd", // }, // }; }); */ let app: App | undefined = undefined; let apiKey: string | undefined = undefined; function processRequest(app: App, apiKey: string | undefined, request: Request, response: Response) { if (request.method !== "OPTIONS" && !request.path.startsWith("/debug/")) { if (apiKey != null) { const xApiKey = request.header("X-API-KEY"); if (xApiKey !== apiKey) { response.status(403).send( JSON.stringify({ meta: { status: 403, errorCode: "INVALID_API_KEY", }, }) ); return undefined; } } } return app.app(request, response); } export const api = https.onRequest((request, response) => { if (app == null) { return fw .Configure(path.resolve(__dirname, "config")) .then((config) => { initializeApp({ credential: applicationDefault(), }); app = new App(config.app as AppConfig); apiKey = functionsConfig().api?.key as string | undefined; register(app); return app; }) .then((initializedApp) => { return processRequest(initializedApp, apiKey, request, response); }); } else { return processRequest(app, apiKey, request, response); } }); /** * 一時間に一回、期限切れのplayを探し、stateをterminateに変更するタスク */ export const checkExipiredPlays = functions.pubsub.schedule("every 1 hours").onRun(CheckExipiredPlays); const firestore = region.firestore; export const akashicInstanceCount = firestore.document("plays/{playId}").onWrite(AkashicInstanceCount);