Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 26x 26x 26x 26x 26x 26x 26x 26x 52x 52x 52x 52x 52x 52x 52x 26x | import type { FastifyPluginAsync } from "fastify";
import type { AppConfig } from "../config.js";
import { requireUser, type IdTokenVerifier } from "../lib/firebase-auth.js";
import { proxyJsonRequest } from "../lib/http-client.js";
const idParam = {
type: "object",
required: ["id"],
additionalProperties: false,
properties: { id: { type: "string", pattern: "^[1-9][0-9]*$" } },
} as const;
/** Справочники типов/раскладок: публичный список + админ-CRUD (роль проверяет каталог). */
export const dictionariesRoutes: FastifyPluginAsync<{
config: AppConfig;
verifyIdToken: IdTokenVerifier;
}> = async (app, opts) => {
const { config, verifyIdToken } = opts;
const svc = { "x-service-token": config.serviceToken };
const userHeaders = (uid: string) => ({
"x-service-token": config.serviceToken,
"x-user-uid": uid,
});
/** Публично — коды/лейблы для форм каталога. */
app.get("/dictionaries", async () =>
proxyJsonRequest<unknown>({
method: "GET",
url: `${config.catalogServiceUrl}/dictionaries`,
headers: svc,
timeoutMs: config.upstreamTimeoutMs,
}),
);
app.get("/admin/dictionaries", async (request) => {
const user = await requireUser(request, verifyIdToken);
return proxyJsonRequest<unknown>({
method: "GET",
url: `${config.catalogServiceUrl}/admin/dictionaries`,
headers: userHeaders(user.uid),
timeoutMs: config.upstreamTimeoutMs,
});
});
for (const dict of ["track-types", "route-layouts"] as const) {
app.post(`/admin/${dict}`, async (request) => {
const user = await requireUser(request, verifyIdToken);
return proxyJsonRequest<unknown>({
method: "POST",
url: `${config.catalogServiceUrl}/admin/${dict}`,
headers: userHeaders(user.uid),
body: request.body ?? {},
timeoutMs: config.upstreamTimeoutMs,
});
});
app.put(`/admin/${dict}/:id`, { schema: { params: idParam } }, async (request) => {
const user = await requireUser(request, verifyIdToken);
const { id } = request.params as { id: string };
return proxyJsonRequest<unknown>({
method: "PUT",
url: `${config.catalogServiceUrl}/admin/${dict}/${encodeURIComponent(id)}`,
headers: userHeaders(user.uid),
body: request.body ?? {},
timeoutMs: config.upstreamTimeoutMs,
});
});
app.delete(`/admin/${dict}/:id`, { schema: { params: idParam } }, async (request) => {
const user = await requireUser(request, verifyIdToken);
const { id } = request.params as { id: string };
return proxyJsonRequest<unknown>({
method: "DELETE",
url: `${config.catalogServiceUrl}/admin/${dict}/${encodeURIComponent(id)}`,
headers: userHeaders(user.uid),
body: {},
timeoutMs: config.upstreamTimeoutMs,
});
});
}
};
|