Skip to content

Commit

Permalink
fix: various improvements (#1522)
Browse files Browse the repository at this point in the history
  • Loading branch information
julianpoy authored Feb 12, 2025
2 parents ffad234 + 7eb9bf0 commit 4203c35
Show file tree
Hide file tree
Showing 35 changed files with 1,555 additions and 380 deletions.
2 changes: 1 addition & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ services:
- ./.credentials:/app/.credentials
ports:
- "3000:3000"
command: ./scripts/watchandrun.sh 'node node_modules/ts-node/dist/bin.js --swc --project packages/backend/tsconfig.json packages/backend/src/bin/www' ./packages/backend ./packages/trpc ./packages/util ./packages/express ./packages/prisma
command: ./scripts/watchandrun.sh 'node node_modules/ts-node/dist/bin.js --swc --project packages/backend/tsconfig.json -r packages/backend/src/tracing.ts packages/backend/src/bin/www' ./packages/backend ./packages/trpc ./packages/util ./packages/express ./packages/prisma
environment:
- AWS_REGION=us-west-2
- AWS_BUCKET=chefbook-dev
Expand Down
1,293 changes: 1,133 additions & 160 deletions package-lock.json

Large diffs are not rendered by default.

10 changes: 8 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,16 @@
"@fanoutio/serve-grip": "^1.3.1",
"@google-cloud/vision": "^4.1.0",
"@ionic/angular": "^8.4.0",
"@julianpoy/recipe-clipper": "^3.1.0",
"@julianpoy/recipe-clipper": "^3.2.0",
"@ngx-loading-bar/core": "^6.0.2",
"@ngx-translate/core": "^15.0.0",
"@ngx-translate/http-loader": "^8.0.0",
"@opentelemetry/auto-instrumentations-node": "^0.56.0",
"@opentelemetry/exporter-trace-otlp-http": "^0.57.1",
"@opentelemetry/sdk-node": "^0.57.1",
"@opentelemetry/semantic-conventions": "^1.30.0",
"@prisma/client": "^6.2.1",
"@prisma/instrumentation": "^6.3.1",
"@sentry/browser": "^8.54.0",
"@sentry/node": "^8.54.0",
"@sentry/profiling-node": "^8.54.0",
Expand Down Expand Up @@ -78,7 +83,7 @@
"prisma": "^6.2.1",
"prisma-cursorstream": "^0.4.0",
"pug": "^3.0.3",
"puppeteer-core": "^22.15.0",
"puppeteer-core": "^24.2.0",
"sanitize-html": "^2.13.0",
"semver": "7.6.0",
"sequelize": "6.37.2",
Expand All @@ -95,6 +100,7 @@
"umzug": "^3.7.0",
"unitz-ts": "^1.0.1",
"uuid": "^9.0.1",
"workerpool": "^9.2.0",
"xml-js": "^1.6.11",
"zip-stream": "^6.0.1",
"zod": "^3.22.4",
Expand Down
2 changes: 1 addition & 1 deletion packages/backend/src/bin/www.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ const attemptExit = () => {
if (jobsWaiting === 0) exit();
};

const termHandler = () => {
const termHandler = async () => {
if (process.env.NODE_ENV !== "production") {
process.exit(0);
}
Expand Down
12 changes: 0 additions & 12 deletions packages/backend/src/routes/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,6 @@ import * as Sentry from "@sentry/node";
import * as semver from "semver";
import { prisma } from "@recipesage/prisma";

// DB
import { sequelize } from "../models/index.js";

router.get("/", function (req, res) {
res.render("index", { version: process.env.VERSION });
});
Expand All @@ -29,17 +26,9 @@ router.get("/versioncheck", (req, res) => {
// Health information in JSON response
router.get("/health", async (req, res) => {
const healthy = {
sequelize: false,
prisma: false,
};

try {
await sequelize.authenticate();
healthy.sequelize = true;
} catch (e) {
// Do nothing
}

try {
await prisma.$queryRaw`SELECT 1`;
healthy.prisma = true;
Expand All @@ -57,7 +46,6 @@ router.get("/health", async (req, res) => {
// 500 => unhealthy, roll pod
router.get("/healthz", async (req, res) => {
try {
await sequelize.authenticate();
await prisma.$queryRaw`SELECT 1`;

res.status(200).send("healthy");
Expand Down
70 changes: 45 additions & 25 deletions packages/backend/src/routes/mealPlans.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import {

// Service
import * as MiddlewareService from "../services/middleware.js";
import { broadcastWSEvent } from "@recipesage/util/server/general";
import { broadcastWSEventIgnoringErrors } from "@recipesage/util/server/general";

// Util
import { wrapRequestWithErrorHandler } from "../utils/wrapRequestWithErrorHandler.js";
Expand Down Expand Up @@ -48,14 +48,18 @@ router.post(
});

for (let i = 0; i < (req.body.collaborators || []).length; i++) {
broadcastWSEvent(req.body.collaborators[i], "mealPlan:received", {
mealPlanId: mealPlan.id,
from: {
id: res.locals.user.id,
name: res.locals.user.name,
email: res.locals.user.email,
broadcastWSEventIgnoringErrors(
req.body.collaborators[i],
"mealPlan:received",
{
mealPlanId: mealPlan.id,
from: {
id: res.locals.user.id,
name: res.locals.user.name,
email: res.locals.user.email,
},
},
});
);
}

res.status(200).json(mealPlan);
Expand Down Expand Up @@ -190,13 +194,13 @@ router.post(
reference,
};

broadcastWSEvent(
broadcastWSEventIgnoringErrors(
mealPlan.userId,
"mealPlan:itemsUpdated",
broadcastPayload,
);
for (let i = 0; i < mealPlan.collaborators.length; i++) {
broadcastWSEvent(
broadcastWSEventIgnoringErrors(
mealPlan.collaborators[i].id,
"mealPlan:itemsUpdated",
broadcastPayload,
Expand Down Expand Up @@ -240,14 +244,18 @@ router.delete(
if (mealPlan.userId === res.locals.session.userId) {
await mealPlan.destroy();
for (let i = 0; i < (mealPlan.collaborators || []).length; i++) {
broadcastWSEvent(mealPlan.collaborators[i], "mealPlan:removed", {
mealPlanId: mealPlan.id,
updatedBy: {
id: res.locals.user.id,
name: res.locals.user.name,
email: res.locals.user.email,
broadcastWSEventIgnoringErrors(
mealPlan.collaborators[i],
"mealPlan:removed",
{
mealPlanId: mealPlan.id,
updatedBy: {
id: res.locals.user.id,
name: res.locals.user.name,
email: res.locals.user.email,
},
},
});
);
}
} else {
await mealPlan.removeCollaborator(res.locals.session.userId);
Expand Down Expand Up @@ -304,13 +312,13 @@ router.delete(
reference,
};

broadcastWSEvent(
broadcastWSEventIgnoringErrors(
mealPlan.userId,
"mealPlan:itemsUpdated",
deletedItemBroadcast,
);
for (let i = 0; i < mealPlan.collaborators.length; i++) {
broadcastWSEvent(
broadcastWSEventIgnoringErrors(
mealPlan.collaborators[i].id,
"mealPlan:itemsUpdated",
deletedItemBroadcast,
Expand Down Expand Up @@ -386,9 +394,13 @@ router.put(
reference,
};

broadcastWSEvent(mealPlan.userId, "mealPlan:itemsUpdated", updateBroadcast);
broadcastWSEventIgnoringErrors(
mealPlan.userId,
"mealPlan:itemsUpdated",
updateBroadcast,
);
for (let i = 0; i < mealPlan.collaborators.length; i++) {
broadcastWSEvent(
broadcastWSEventIgnoringErrors(
mealPlan.collaborators[i].id,
"mealPlan:itemsUpdated",
updateBroadcast,
Expand Down Expand Up @@ -460,9 +472,13 @@ router.post(
reference,
};

broadcastWSEvent(mealPlan.userId, "mealPlan:itemsUpdated", updateBroadcast);
broadcastWSEventIgnoringErrors(
mealPlan.userId,
"mealPlan:itemsUpdated",
updateBroadcast,
);
for (let i = 0; i < mealPlan.collaborators.length; i++) {
broadcastWSEvent(
broadcastWSEventIgnoringErrors(
mealPlan.collaborators[i].id,
"mealPlan:itemsUpdated",
updateBroadcast,
Expand Down Expand Up @@ -532,9 +548,13 @@ router.delete(
reference,
};

broadcastWSEvent(mealPlan.userId, "mealPlan:itemsUpdated", updateBroadcast);
broadcastWSEventIgnoringErrors(
mealPlan.userId,
"mealPlan:itemsUpdated",
updateBroadcast,
);
for (let i = 0; i < mealPlan.collaborators.length; i++) {
broadcastWSEvent(
broadcastWSEventIgnoringErrors(
mealPlan.collaborators[i].id,
"mealPlan:itemsUpdated",
updateBroadcast,
Expand Down
34 changes: 19 additions & 15 deletions packages/backend/src/routes/shoppingLists.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import {

// Service
import * as MiddlewareService from "../services/middleware.js";
import { broadcastWSEvent } from "@recipesage/util/server/general";
import { broadcastWSEventIgnoringErrors } from "@recipesage/util/server/general";
import * as ShoppingListCategorizerService from "../services/shopping-list-categorizer.js";
import { joiValidator } from "../middleware/joiValidator.js";

Expand Down Expand Up @@ -54,14 +54,18 @@ router.post(
});

for (let i = 0; i < (req.body.collaborators || []).length; i++) {
broadcastWSEvent(req.body.collaborators[i], "shoppingList:received", {
shoppingListId: shoppingList.id,
from: {
id: res.locals.user.id,
name: res.locals.user.name,
email: res.locals.user.email,
broadcastWSEventIgnoringErrors(
req.body.collaborators[i],
"shoppingList:received",
{
shoppingListId: shoppingList.id,
from: {
id: res.locals.user.id,
name: res.locals.user.name,
email: res.locals.user.email,
},
},
});
);
}

res.status(200).json(shoppingList);
Expand Down Expand Up @@ -193,13 +197,13 @@ router.post(
reference,
};

broadcastWSEvent(
broadcastWSEventIgnoringErrors(
shoppingList.userId,
"shoppingList:itemsUpdated",
broadcastPayload,
);
for (let i = 0; i < shoppingList.collaborators.length; i++) {
broadcastWSEvent(
broadcastWSEventIgnoringErrors(
shoppingList.collaborators[i].id,
"shoppingList:itemsUpdated",
broadcastPayload,
Expand Down Expand Up @@ -244,7 +248,7 @@ router.delete(
await shoppingList.destroy();

for (let i = 0; i < (shoppingList.collaborators || []).length; i++) {
broadcastWSEvent(
broadcastWSEventIgnoringErrors(
shoppingList.collaborators[i],
"shoppingList:removed",
{
Expand Down Expand Up @@ -316,13 +320,13 @@ router.delete(
reference,
};

broadcastWSEvent(
broadcastWSEventIgnoringErrors(
shoppingList.userId,
"shoppingList:itemsUpdated",
deletedItemBroadcast,
);
for (let i = 0; i < shoppingList.collaborators.length; i++) {
broadcastWSEvent(
broadcastWSEventIgnoringErrors(
shoppingList.collaborators[i].id,
"shoppingList:itemsUpdated",
deletedItemBroadcast,
Expand Down Expand Up @@ -507,13 +511,13 @@ router.put(
reference,
};

broadcastWSEvent(
broadcastWSEventIgnoringErrors(
shoppingList.userId,
"shoppingList:itemsUpdated",
broadcast,
);
for (let i = 0; i < shoppingList.collaborators.length; i++) {
broadcastWSEvent(
broadcastWSEventIgnoringErrors(
shoppingList.collaborators[i].id,
"shoppingList:itemsUpdated",
broadcast,
Expand Down
1 change: 1 addition & 0 deletions packages/backend/src/services/sentry-init.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ Sentry.init({

tracesSampleRate: parseFloat(process.env.SENTRY_SAMPLE_RATE || 1.0, 10),
profilesSampleRate: parseFloat(process.env.SENTRY_SAMPLE_RATE || 1.0, 10),
skipOpenTelemetrySetup: true,

environment: process.env.ENVIRONMENT || "unknown",
release: RS_VERSION,
Expand Down
6 changes: 4 additions & 2 deletions packages/backend/src/services/util.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,9 @@ export const dispatchImportNotification = (user, status, reason) => {
);
}

sendQueues.push(ServerUtil.broadcastWSEvent(user.id, type, message));
sendQueues.push(
ServerUtil.broadcastWSEventIgnoringErrors(user.id, type, message),
);

return Promise.all(sendQueues);
};
Expand Down Expand Up @@ -102,7 +104,7 @@ export const dispatchMessageNotification = (user, fullMessage) => {
}

sendQueues.push(
ServerUtil.broadcastWSEvent(user.id, "messages:new", message),
ServerUtil.broadcastWSEventIgnoringErrors(user.id, "messages:new", message),
);

return Promise.all(sendQueues);
Expand Down
32 changes: 32 additions & 0 deletions packages/backend/src/tracing.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import { NodeSDK } from "@opentelemetry/sdk-node";
import { getNodeAutoInstrumentations } from "@opentelemetry/auto-instrumentations-node";
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
import { Resource } from "@opentelemetry/resources";
import { SemanticResourceAttributes } from "@opentelemetry/semantic-conventions";
import { PrismaInstrumentation } from "@prisma/instrumentation";

const traceExporter = new OTLPTraceExporter({
url: process.env.OTEL_COLLECTOR_URI,
});
const sdk = new NodeSDK({
traceExporter,
instrumentations: [
getNodeAutoInstrumentations(),
new PrismaInstrumentation({
middleware: true,
}),
],
resource: new Resource({
[SemanticResourceAttributes.SERVICE_NAME]: "recipesage_api",
[SemanticResourceAttributes.SERVICE_VERSION]: process.env.VERSION,
}),
});

sdk.start();

const termHandler = () => {
sdk.shutdown();
};

process.on("SIGTERM", termHandler);
process.on("SIGINT", termHandler);
Loading

0 comments on commit 4203c35

Please sign in to comment.