This repository has been archived on 2026-10-08. You can view files and clone it, but cannot push or open issues or pull requests.
allotment/packages/server/services/allotmentState.js

85 lines
2.2 KiB
JavaScript

import config from "../config.js";
import { Device, Patch, WateringSession } from "../db/models/index.js";
import { formatClientPatches } from "./patches.js";
import { attachNodesToPatches } from "./nodes.js";
import { getOrCreateWaterTank } from "./waterTank.js";
import {
formatPowerStateForClient,
getOrCreatePowerState,
} from "./powerState.js";
function mapWateringSessions(recentSessions) {
return {
activeWateringSessions: recentSessions.filter((s) => !s.endedAt),
recentWateringSessions: recentSessions.map((s) => ({
...s,
id: s._id.toString(),
deviceId: s.deviceId?.toString() ?? null,
_id: undefined,
})),
};
}
export async function getDeviceState() {
const tid = config.device?.ttnApplicationId?.trim();
const did = config.device?.ttnDeviceId?.trim();
if (!tid || !did) {
return { device: null };
}
const device = await Device.findOne({
ttnApplicationId: tid,
ttnDeviceId: did,
}).lean();
if (!device) {
return { device: null };
}
const patchList = await Patch.find({ deviceId: device._id })
.populate({ path: "images", select: "blurHash contentType" })
.lean();
const id = device._id.toString();
return {
device: {
...device,
id,
_id: undefined,
patches: await attachNodesToPatches(formatClientPatches(patchList)),
},
};
}
export async function getWaterTankState() {
const tank = await getOrCreateWaterTank();
return {
level: tank.level,
updatedAt: tank.updatedAt,
};
}
export async function getPowerStatePayload() {
const power = await getOrCreatePowerState();
return formatPowerStateForClient(power);
}
export async function getWateringSessionsState() {
const recentSessions = await WateringSession.find()
.sort({ startedAt: -1 })
.limit(20)
.lean();
return mapWateringSessions(recentSessions);
}
/** @param {string} patchId logical patch id (client `patch.id` / Mongo `patchId`) */
export async function getPatchState(patchId) {
if (!patchId) return null;
const p = await Patch.findOne({ patchId })
.populate({ path: "images", select: "blurHash contentType" })
.lean();
if (!p) return null;
const [patch] = await attachNodesToPatches(formatClientPatches([p]));
return patch;
}