Skip to content
Open

SMURFI #5042

Show file tree
Hide file tree
Changes from 36 commits
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
8cb7aff
route
brettedw Jan 20, 2026
8de2d2f
tabs + page skeleton
brettedw Jan 20, 2026
b38b3a6
added chefs_config and script to download CHEFS form data via API
andrea-williams Jan 21, 2026
55a45a0
Management UI wip (#5038)
dgboss Jan 21, 2026
2e7be16
Forecaster form (#5039)
brettedw Jan 21, 2026
0f5c599
migration to create smurfi related tables (#5041)
acatchpole Jan 21, 2026
074c2ce
Form updates (#5043)
brettedw Jan 21, 2026
372d7c5
Add 1 mock marker to SmurfiMap (#5044)
andrea-williams Jan 21, 2026
420fb4f
fixed broken frontend because of merge oopsie
andrea-williams Jan 22, 2026
3870a9c
smurfi data models and migration (#5046)
acatchpole Jan 22, 2026
9cd0cce
uv lock
brettedw Jan 22, 2026
8b99f08
Management wip (#5049)
dgboss Jan 22, 2026
ab25b34
SMURFI create spot and model updates (#5048)
acatchpole Jan 22, 2026
a2b3179
model changes that were supposed to accompany migration
acatchpole Jan 22, 2026
42cff81
SMURFI map popup & request link (#5052)
brettedw Jan 22, 2026
744752b
added fire_size; smurfi data schema (#5055)
acatchpole Jan 22, 2026
6adae4a
lat long added to spot
acatchpole Jan 22, 2026
5237e0d
functions to get save and update spots and versions (#5056)
acatchpole Jan 22, 2026
4cb146c
Wire up management button & fancy-up map (#5057)
andrea-williams Jan 22, 2026
a27f878
Load chefs data to db
brettedw Jan 22, 2026
8d5667d
endpoints for getting and saving spot forecast
acatchpole Jan 22, 2026
ab32ebf
skip
brettedw Jan 22, 2026
d76a745
0
brettedw Jan 22, 2026
c145057
check existing
brettedw Jan 22, 2026
fb48a5d
entirely vibe-coded my way through creating a history view of forecas…
andrea-williams Jan 22, 2026
300a1ea
removed unneeded Spot Forecast tab from SmurfiPage (#5059)
andrea-williams Jan 22, 2026
f82703c
smurfi cards (#5062)
dgboss Jan 22, 2026
f2f2c0c
frontend post forecast
brettedw Jan 22, 2026
c1d8740
dashboard tab title
brettedw Jan 22, 2026
f0727e3
pdf view
brettedw Jan 22, 2026
4ba168d
Smurfi rebase (#5407)
dgboss May 14, 2026
5b7cba7
smurfi models (#5408)
dgboss May 19, 2026
38bdee4
SMURFI Request Form (#5418)
brettedw May 19, 2026
affa6ca
SMURFI endpoints, crud and schema (#5419)
dgboss May 19, 2026
ceaa094
SMURFI forecast form refactor (#5421)
brettedw May 19, 2026
18e8613
SMURFI - Spot Request requests (#5424)
brettedw May 20, 2026
3f76f58
SMURFI: Spot request subscribe (#5423)
conbrad May 21, 2026
d9b1351
SpotRequests landing page (#5431)
dgboss May 21, 2026
686d1f4
Spot Request detaill (#5434)
dgboss May 22, 2026
1c2a07d
Merge branch 'main' into smurfi
brettedw May 22, 2026
512b1fb
yarn
brettedw May 22, 2026
44701da
hook form
brettedw May 22, 2026
c4821de
fix test
brettedw May 22, 2026
e1d6fbd
vite config
brettedw May 22, 2026
9a74eda
SMURFI wire forecasts (#5435)
brettedw May 25, 2026
309ba7e
SMURFI Forecast - Part 2 (#5436)
brettedw May 25, 2026
2410fe0
Wire VANITY_DOMAIN into nats deployment for WEB_BASE_URL (#5443)
conbrad May 25, 2026
68e2b96
SMURFI: Remove Admin tab (#5445)
brettedw May 25, 2026
f1f0c6c
SMURFI: Fire polygons & layer switcher (#5442)
brettedw May 25, 2026
8581bce
SMURFI: Fix smurfi nats subject (#5446)
conbrad May 25, 2026
ecf4534
SMURFI: icons (#5447)
brettedw May 25, 2026
08cee46
SMURFI: Dashboard forecast frequency (#5448)
brettedw May 25, 2026
e51b2a6
fix
brettedw May 25, 2026
fca715d
SMURFI: Configure email merge url (#5449)
conbrad May 25, 2026
69c4d37
SMURFI: Form validation error on submit button (#5451)
brettedw May 25, 2026
c5a53b3
centre frequency
brettedw May 26, 2026
2cb7101
Full spot forecast detail page (#5450)
dgboss May 26, 2026
3d40477
SMURFI Map Updates (#5452)
brettedw May 26, 2026
6b56648
sort column
brettedw May 26, 2026
01e3247
SMURFI: Adjust email template (#5455)
conbrad May 26, 2026
07ace4c
Mini forecast detail pages (#5453)
dgboss May 26, 2026
8268200
SMURFI: Add Fire number filter to map view legend (#5457)
conbrad May 26, 2026
ab1eeeb
forecast list (#5459)
dgboss May 26, 2026
47c87d4
SMURFI: Data Model rework (#5458)
brettedw May 26, 2026
a53abfd
SMURFI: Forecast form improvements & editing (#5461)
brettedw May 27, 2026
2531925
email link
brettedw May 27, 2026
ec3e715
SMURFI: Email Dist list mgmt (#5460)
conbrad May 28, 2026
6a2f1f5
SMURFI: Add fire points to map (#5464)
brettedw May 28, 2026
b621a81
SMURFI: Subscribe requestor by default (#5468)
brettedw May 28, 2026
e62d3b9
Allow new request on map click (#5465)
dgboss May 28, 2026
df5cb99
Spot Request Edits and Forecast Views (#5470)
dgboss Jun 4, 2026
ec8c34b
SMURFI: Status Change (#5484)
brettedw Jun 4, 2026
23835c6
Merge branch 'main' into smurfi
brettedw Jun 8, 2026
0f9c8b3
SMURFI Forecaster Info & Stats (#5492)
brettedw Jun 8, 2026
5443e23
Merge branch 'main' into smurfi
brettedw Jun 8, 2026
9b8aefd
repoint
brettedw Jun 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
17 changes: 9 additions & 8 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,21 @@
.gitignore
.ipynb_checkpoints
node_modules
mobile/**
web/build
web/coverage-cypress
web/coverage
web/.nyc_output
web/node_modules
web/cypress
web/.pnp.*
web/.yarn/*
web/**/node_modules
web/apps/wps-web/coverage
web/apps/wps-web/coverage-playwright
web/apps/wps-web/.nyc_output
web/apps/wps-web/.nyc_temp_playwright
web/apps/wps-web/playwright
web/apps/wps-web/.pnp.*
web/apps/wps-web/.yarn/*
!web/.yarn/patches
!web/.yarn/plugins
!web/.yarn/releases
!web/.yarn/sdks
!web/.yarn/versions
r
.dockerignore
grib
**/Dockerfile*
Expand Down
18 changes: 13 additions & 5 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -50,14 +50,22 @@ CLASSPATH=/somewhere/wps/api/libs/REDapp_Lib.jar:/somewhere/wps/api/libs/WTime.j
SFMS_SECRET=somesecret
NATS_STREAM_PREFIX=local
NATS_SERVER=localhost
OBJECT_STORE_SERVER=object_store_server
OBJECT_STORE_USER_ID=object_store_user
OBJECT_STORE_SECRET=object_store_secret
OBJECT_STORE_BUCKET=object_store_bucket
DEM_NAME=dem_mosaic_250_max.tif
TPI_DEM_NAME=bc_dem_50m_tpi.tif
CLASSIFIED_TPI_DEM_NAME=bc_dem_50m_tpi_win100_classified.tif
CLASSIFIED_TPI_DEM_FUEL_MASKED_NAME=bc_dem_50m_tpi_win100_classified_fuel_masked.tif
SENTRY_DSN=some_dsn
DOCKER_HOST=unix:///Users/<you>/.docker/run/docker.sock
DATA_RETENTION_THRESHOLD=358
DATA_RETENTION_THRESHOLD=358
EARTHDATA_USERNAME=test
EARTHDATA_PASSWORD=test
#### Object Store
OBJECT_STORE_SERVER=object_store_server
OBJECT_STORE_USER_ID=object_store_user
OBJECT_STORE_SECRET=object_store_secret
OBJECT_STORE_BUCKET=object_store_bucket
GRIB_RETENTION_THRESHOLD=2
WX_OBJECT_STORE_SERVER=wx_object_store_server
WX_OBJECT_STORE_USER_ID=wx_object_store_server
WX_OBJECT_STORE_SECRET=wx_object_store_server
WX_OBJECT_STORE_BUCKET=wx_object_store_server
55 changes: 55 additions & 0 deletions .github/actions/aps-publish/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: APS Publish
description: Render, publish, and upload the APS gateway configuration

inputs:
gateway-id:
description: APS gateway id
required: true
client-id:
description: APS service account client id
required: true
client-secret:
description: APS service account client secret
required: true
project-namespace:
description: OpenShift namespace that contains the upstream ASA Go service
required: true
host:
description: Public APS hostname for the rendered route
required: true
suffix:
description: Config suffix used for service naming, tag scope, and gwa qualifier
required: true

runs:
using: composite
steps:
- name: Render ASA Go APS gateway config
shell: bash
env:
APS_NAMESPACE: ${{ inputs.gateway-id }}
PROJECT_NAMESPACE: ${{ inputs.project-namespace }}
ASA_GO_HOST: ${{ inputs.host }}
SUFFIX: ${{ inputs.suffix }}
run: |
set -euo pipefail
CONFIG_PATH=".github/tmp/asa-go-gw-config-${SUFFIX}.yaml"
mkdir -p "$(dirname "${CONFIG_PATH}")"
bash "${{ github.workspace }}/openshift/scripts/render_asa_go_gateway_config.sh" \
"${SUFFIX}" \
"${CONFIG_PATH}"

- name: Publish ASA Go APS gateway config
uses: ./.github/actions/gwa-publish
with:
gateway-id: ${{ inputs.gateway-id }}
client-id: ${{ inputs.client-id }}
client-secret: ${{ inputs.client-secret }}
config-path: .github/tmp/asa-go-gw-config-${{ inputs.suffix }}.yaml
qualifier: ${{ inputs.suffix }}

- name: Upload ASA Go APS gateway config
uses: actions/upload-artifact@v7
with:
name: asa-go-aps-gateway-config-${{ inputs.suffix }}
path: .github/tmp/asa-go-gw-config-${{ inputs.suffix }}.yaml
39 changes: 39 additions & 0 deletions .github/actions/asa-go-setup/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
name: ASA Go Setup
description: Install Node.js, build the keycloak plugin, and install asa-go dependencies

runs:
using: composite
steps:
- name: Setup Node.js environment
uses: actions/setup-node@v6
with:
node-version: "20"

- uses: actions/cache@v5
id: asa-go-keycloak-cache
with:
path: mobile/keycloak/node_modules
key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}

- name: Install keycloak plugin
if: steps.asa-go-keycloak-cache.outputs.cache-hit != 'true'
working-directory: ./mobile/keycloak
shell: bash
run: yarn install

- name: Build keycloak plugin
working-directory: ./mobile/keycloak
shell: bash
run: yarn build

- uses: actions/cache@v5
id: asa-go-cache
with:
path: mobile/asa-go/node_modules
key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}

- name: Install dependencies
if: steps.asa-go-cache.outputs.cache-hit != 'true'
working-directory: ./mobile/asa-go
shell: bash
run: yarn install
24 changes: 24 additions & 0 deletions .github/actions/asa-go-validate-mui-license/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
name: Validate ASA Go MUI License
description: Verify the MUI X Pro license key is present and valid

inputs:
mui-license-key:
description: MUI X Pro license key
required: true

runs:
using: composite
steps:
- name: Validate MUI License
working-directory: ./mobile/asa-go
shell: bash
env:
VITE_MUI_LICENSE_KEY: ${{ inputs.mui-license-key }}
run: |
node -e "
const { verifyLicense, generateReleaseInfo } = require('./node_modules/@mui/x-license-pro/node/verifyLicense/verifyLicense.js');
const result = verifyLicense({ releaseInfo: generateReleaseInfo(), licenseKey: process.env.VITE_MUI_LICENSE_KEY, acceptedScopes: ['pro', 'premium'] });
if (result.meta?.expiryTimestamp) console.log('MUI license expiry:', new Date(result.meta.expiryTimestamp).toISOString().split('T')[0]);
console.log('MUI license status:', result.status);
if (result.status !== 'Valid') { console.error('MUI license check failed'); process.exit(1); }
"
52 changes: 52 additions & 0 deletions .github/actions/gwa-publish/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
name: GWA Publish
description: Install gwa, authenticate, and publish APS gateway configuration

inputs:
gateway-id:
description: APS gateway id
required: true
client-id:
description: APS service account client id
required: true
client-secret:
description: APS service account client secret
required: true
config-path:
description: Path to the gateway config file to publish
required: true
qualifier:
description:
Qualifier used with publish-gateway. Qualifiers allow one gateway to hold
multiple independent config sets without pruning other service configs.
required: true

runs:
using: composite
steps:
- name: Install GWA CLI
shell: bash
run: |
set -euo pipefail
GWA_BIN_DIR="${RUNNER_TEMP}/gwa-bin"
mkdir -p "${GWA_BIN_DIR}"
curl -L "https://github.com/bcgov/gwa-cli/releases/download/v3.0.7/gwa_Linux_x86_64.tgz" \
| tar -zxf - -C "${GWA_BIN_DIR}"
echo "${GWA_BIN_DIR}" >> "${GITHUB_PATH}"

- name: Login and publish gateway config
shell: bash
env:
GATEWAY_ID: ${{ inputs.gateway-id }}
GWA_CLIENT_ID: ${{ inputs.client-id }}
GWA_CLIENT_SECRET: ${{ inputs.client-secret }}
CONFIG_PATH: ${{ inputs.config-path }}
QUALIFIER: ${{ inputs.qualifier }}
run: |
set -euo pipefail

gwa config set --gateway "${GATEWAY_ID}"
gwa login \
--client-id="${GWA_CLIENT_ID}" \
--client-secret="${GWA_CLIENT_SECRET}"

gwa publish-gateway "${CONFIG_PATH}" --qualifier "${QUALIFIER}"
34 changes: 34 additions & 0 deletions .github/actions/oc-login/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: OC Login
description: Request a short-lived token via the TokenRequest API and log in

inputs:
oc-server:
description: OpenShift server URL
required: true
oc-token:
description: Long-lived service account token
required: true
oc-namespace:
description: OpenShift namespace for the service account
required: true
oc-service-account:
description: Service account name
required: false
default: ghactions

runs:
using: composite
steps:
- name: OC Login
shell: bash
env:
OC_SERVER: ${{ inputs.oc-server }}
OC_TOKEN: ${{ inputs.oc-token }}
run: |
OC_TEMP_TOKEN=$(curl -sk -X POST \
"${OC_SERVER}/api/v1/namespaces/${{ inputs.oc-namespace }}/serviceaccounts/${{ inputs.oc-service-account }}/token" \
-H "Authorization: Bearer ${OC_TOKEN}" \
-H "Content-Type: application/json" \
-d '{"spec": {"expirationSeconds": 600}}' \
| jq -r '.status.token')
oc login --token="${OC_TEMP_TOKEN}" --server="${OC_SERVER}"
19 changes: 19 additions & 0 deletions .github/actions/oc-setup/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
name: OC Setup
description: Common setup steps for OpenShift deployment jobs

runs:
using: composite
steps:
- name: Log public IP address
shell: bash
run: |
echo -e "Public IPv4:"
curl -s https://api.ipify.org
echo -e "\nPublic IPv4(v6):"
curl -s https://api64.ipify.org

- name: Install OpenShift CLI tools
uses: redhat-actions/openshift-tools-installer@v1
with:
oc: "4.14"
skip_cache: true
39 changes: 39 additions & 0 deletions .github/actions/python-setup/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
name: Python Setup
description: Install uv, cache venv, and install Python dependencies

inputs:
install-jdk:
description: Whether to install JDK
required: false
default: "false"

runs:
using: composite
steps:
- name: Install uv
uses: astral-sh/setup-uv@v8.1.0
with:
version: "0.11.11"

- name: Cache .venv
id: cache-venv
uses: actions/cache@v5
with:
path: ~/work/wps/wps/backend/.venv
key: ${{ runner.os }}-venv-uv-0.9.11-${{ hashFiles('**/uv.lock') }}

- name: Install JDK
if: inputs.install-jdk == 'true' && steps.cache-venv.outputs.cache-hit != 'true'
shell: bash
run: |
apt-get update --fix-missing
apt-get -y install default-jdk

- name: Install python dependencies using uv
if: steps.cache-venv.outputs.cache-hit != 'true'
working-directory: ./backend
shell: bash
run: |
uv sync --all-extras
uv pip install setuptools
uv pip install --no-build-isolation gdal==$(gdal-config --version)
Loading
Loading