diff --git a/k8s/analytics/values-prod.yaml b/k8s/analytics/values-prod.yaml index 98861f66e8..0a76851664 100644 --- a/k8s/analytics/values-prod.yaml +++ b/k8s/analytics/values-prod.yaml @@ -8,7 +8,7 @@ images: celeryWorker: eu.gcr.io/airqo-250220/airqo-analytics-celery-worker reportJob: eu.gcr.io/airqo-250220/airqo-analytics-report-job devicesSummaryJob: eu.gcr.io/airqo-250220/airqo-analytics-devices-summary-job - tag: prod-3d3f6c14-1733315928 + tag: prod-5e45c956-1733849508 api: name: airqo-analytics-api label: analytics-api diff --git a/k8s/analytics/values-stage.yaml b/k8s/analytics/values-stage.yaml index 6c2109404c..114d458f1a 100644 --- a/k8s/analytics/values-stage.yaml +++ b/k8s/analytics/values-stage.yaml @@ -8,7 +8,7 @@ images: celeryWorker: eu.gcr.io/airqo-250220/airqo-stage-analytics-celery-worker reportJob: eu.gcr.io/airqo-250220/airqo-stage-analytics-report-job devicesSummaryJob: eu.gcr.io/airqo-250220/airqo-stage-analytics-devices-summary-job - tag: stage-014ccd0f-1733315863 + tag: stage-dd764c29-1733849460 api: name: airqo-stage-analytics-api label: sta-alytics-api diff --git a/k8s/device-registry/values-prod.yaml b/k8s/device-registry/values-prod.yaml index 9f7570f9bc..b98df12889 100644 --- a/k8s/device-registry/values-prod.yaml +++ b/k8s/device-registry/values-prod.yaml @@ -6,7 +6,7 @@ app: replicaCount: 3 image: repository: eu.gcr.io/airqo-250220/airqo-device-registry-api - tag: prod-ae2e15a3-1733844050 + tag: prod-5e45c956-1733849508 nameOverride: '' fullnameOverride: '' podAnnotations: {} diff --git a/k8s/exceedance/values-prod-airqo.yaml b/k8s/exceedance/values-prod-airqo.yaml index 8eaf5c0da7..d26ed0773e 100644 --- a/k8s/exceedance/values-prod-airqo.yaml +++ b/k8s/exceedance/values-prod-airqo.yaml @@ -4,6 +4,6 @@ app: configmap: env-exceedance-production image: repository: eu.gcr.io/airqo-250220/airqo-exceedance-job - tag: prod-ae2e15a3-1733844050 + tag: prod-5e45c956-1733849508 nameOverride: '' fullnameOverride: '' diff --git a/k8s/exceedance/values-prod-kcca.yaml b/k8s/exceedance/values-prod-kcca.yaml index afea05a6f6..da76b77e9d 100644 --- a/k8s/exceedance/values-prod-kcca.yaml +++ b/k8s/exceedance/values-prod-kcca.yaml @@ -4,6 +4,6 @@ app: configmap: env-exceedance-production image: repository: eu.gcr.io/airqo-250220/kcca-exceedance-job - tag: prod-ae2e15a3-1733844050 + tag: prod-5e45c956-1733849508 nameOverride: '' fullnameOverride: '' diff --git a/k8s/predict/values-prod.yaml b/k8s/predict/values-prod.yaml index 18ec2275a1..9c89c531f4 100644 --- a/k8s/predict/values-prod.yaml +++ b/k8s/predict/values-prod.yaml @@ -7,7 +7,7 @@ images: predictJob: eu.gcr.io/airqo-250220/airqo-predict-job trainJob: eu.gcr.io/airqo-250220/airqo-train-job predictPlaces: eu.gcr.io/airqo-250220/airqo-predict-places-air-quality - tag: prod-ae2e15a3-1733844050 + tag: prod-5e45c956-1733849508 api: name: airqo-prediction-api label: prediction-api diff --git a/k8s/spatial/values-prod.yaml b/k8s/spatial/values-prod.yaml index 94644d2a35..dd1053451b 100644 --- a/k8s/spatial/values-prod.yaml +++ b/k8s/spatial/values-prod.yaml @@ -6,7 +6,7 @@ app: replicaCount: 3 image: repository: eu.gcr.io/airqo-250220/airqo-spatial-api - tag: prod-ae2e15a3-1733844050 + tag: prod-5e45c956-1733849508 nameOverride: '' fullnameOverride: '' podAnnotations: {} diff --git a/k8s/website/values-prod.yaml b/k8s/website/values-prod.yaml index 342d8be4aa..4f049cd0a1 100644 --- a/k8s/website/values-prod.yaml +++ b/k8s/website/values-prod.yaml @@ -6,7 +6,7 @@ app: replicaCount: 3 image: repository: eu.gcr.io/airqo-250220/airqo-website-api - tag: prod-ae2e15a3-1733844050 + tag: prod-5e45c956-1733849508 nameOverride: '' fullnameOverride: '' podAnnotations: {} diff --git a/k8s/workflows/values-prod.yaml b/k8s/workflows/values-prod.yaml index d0549ff120..e80c45e124 100644 --- a/k8s/workflows/values-prod.yaml +++ b/k8s/workflows/values-prod.yaml @@ -10,7 +10,7 @@ images: initContainer: eu.gcr.io/airqo-250220/airqo-workflows-xcom redisContainer: eu.gcr.io/airqo-250220/airqo-redis containers: eu.gcr.io/airqo-250220/airqo-workflows - tag: prod-ae2e15a3-1733844050 + tag: prod-5e45c956-1733849508 nameOverride: '' fullnameOverride: '' podAnnotations: {} diff --git a/src/device-registry/models/Cohort.js b/src/device-registry/models/Cohort.js index e5aeb92d20..a00884dacd 100644 --- a/src/device-registry/models/Cohort.js +++ b/src/device-registry/models/Cohort.js @@ -214,7 +214,7 @@ cohortSchema.statics.list = async function( .sort({ createdAt: -1 }) .project(inclusionProjection) .project(exclusionProjection) - .groups({ + .group({ _id: "$_id", visibility: { $first: "$visibility" }, cohort_tags: { $first: "$cohort_tags" }, diff --git a/src/device-registry/utils/scripts/new-bulk-script.js b/src/device-registry/utils/scripts/new-bulk-script.js new file mode 100644 index 0000000000..37b7f4c23b --- /dev/null +++ b/src/device-registry/utils/scripts/new-bulk-script.js @@ -0,0 +1,71 @@ +const axios = require("axios"); +const isEmpty = require("is-empty"); + +const url = "http://localhost:3000/api/v2/devices/sites"; +const config = { + headers: { + Authorization: "", + }, +}; + +const NETWORK_MAPPINGS = { + // iqair: "permian-health", + // usembassy: "us-embassy", + // urbanbetter: "urban-better", + // kcca: "kcca", + // airqo: "airqo", + // Add more mappings as needed +}; + +const DEFAULT_GROUP = "unknown"; + +axios + .get(url, config) + .then(async (response) => { + const groups = response.data.sites + .map((site) => { + // Look up the group based on network, with a fallback to a default + const group = NETWORK_MAPPINGS[site.network] || DEFAULT_GROUP; + + // Optionally log devices with unknown networks + if (group === DEFAULT_GROUP) { + console.log( + `Unrecognized network for device ${site.name}: ${site.network}` + ); + } + + return group; + }) + // Remove any 'unknown' groups if you want only mapped networks + .filter((group) => group !== DEFAULT_GROUP); + + console.log("the data:"); + console.dir({ groups }); + + // Process devices in batches + for (let i = 0; i < response.data.sites.length; i += 10) { + const batch = response.data.sites.slice(i, i + 10); + + for (const site of batch) { + const group = NETWORK_MAPPINGS[site.network] || DEFAULT_GROUP; + + if (group !== DEFAULT_GROUP) { + const url = `http://localhost:3000/api/v2/devices/sites?id=${site._id}`; + const data = { groups: [group] }; + // console.log("the data:"); + // console.dir(data); + + try { + // Uncomment if you want to make the PUT request + const putResponse = await axios.put(url, data, config); + console.log("PUT response:", putResponse.data); + } catch (error) { + console.error("PUT error:", error.message); + } + } + } + } + }) + .catch((error) => { + console.error("GET error:", error); + });