├── .devcontainer ├── Dockerfile ├── config │ ├── api │ │ ├── client_secrets │ │ │ └── secrets.json │ │ └── dotenv │ └── frontend │ │ └── public │ │ └── config │ │ └── configuration.json ├── devcontainer.json ├── docker-compose.yml └── postCreateCommand.sh ├── .github ├── CODEOWNERS └── workflows │ ├── README.md │ ├── Vue3cicd.yaml │ ├── cron-tag-cleanup.yaml │ ├── main-deploy.yaml │ ├── openshift │ └── service_account.yaml │ ├── prautorun.yaml │ ├── pull-request-appointment.yml │ ├── pull-request-deploy-frontend.yaml │ ├── pull-request-deploy.yaml │ ├── reusable-appointment-frontend-cypress.yaml │ ├── reusable-build-dockerfile.yaml │ ├── reusable-build-s2i.yaml │ ├── reusable-queue-management-frontend-cypress.yaml │ ├── reusable-tag-cleanup-commit.yaml │ ├── reusable-tag-cleanup-pr.yaml │ ├── reusable-tag-image.yaml │ ├── reusable-wait-for-rollouts.yaml │ └── tyu-reusable-appointment-frontend-cypress.yaml ├── .gitignore ├── .sonarcloud.properties ├── .vscode ├── launch.json └── tasks.json ├── CODE_OF_CONDUCT.md ├── COMPLIANCE.yaml ├── CONTRIBUTING.md ├── Jenkinsfile.groovy ├── JenkinsfileSMS.groovy ├── Jenkinsfilebasic.groovy ├── LICENSE ├── README.md ├── api ├── .s2i │ └── bin │ │ ├── assemble │ │ └── run ├── __init__.py ├── app │ ├── README.md │ ├── __init__.py │ ├── admin │ │ ├── __init__.py │ │ ├── base.py │ │ ├── channel.py │ │ ├── counter.py │ │ ├── csr.py │ │ ├── examtype.py │ │ ├── index.py │ │ ├── invigilator.py │ │ ├── login.py │ │ ├── logout.py │ │ ├── office.py │ │ ├── role.py │ │ ├── room.py │ │ ├── service.py │ │ ├── smartboard.py │ │ └── timeslot.py │ ├── auth │ │ ├── __init__.py │ │ └── auth.py │ ├── exceptions │ │ ├── AuthError.py │ │ └── __init__.py │ ├── models │ │ ├── __init__.py │ │ ├── bookings │ │ │ ├── __init__.py │ │ │ ├── appointments.py │ │ │ ├── base.py │ │ │ ├── booking.py │ │ │ ├── exam.py │ │ │ ├── exam_type.py │ │ │ ├── invigilator.py │ │ │ └── room.py │ │ └── theq │ │ │ ├── __init__.py │ │ │ ├── base.py │ │ │ ├── channel.py │ │ │ ├── citizen.py │ │ │ ├── citizen_state.py │ │ │ ├── counter.py │ │ │ ├── csr.py │ │ │ ├── csr_state.py │ │ │ ├── metadata.py │ │ │ ├── office.py │ │ │ ├── period.py │ │ │ ├── period_state.py │ │ │ ├── permission.py │ │ │ ├── public_user.py │ │ │ ├── right.py │ │ │ ├── role.py │ │ │ ├── service.py │ │ │ ├── service_req.py │ │ │ ├── smartboard.py │ │ │ ├── sr_state.py │ │ │ ├── time_slot.py │ │ │ └── timezone.py │ ├── resources │ │ ├── __init__.py │ │ ├── bookings │ │ │ ├── __init__.py │ │ │ ├── appointment │ │ │ │ ├── __init__.py │ │ │ │ ├── all_recurring_stat_delete.py │ │ │ │ ├── appointment_availability.py │ │ │ │ ├── appointment_delete.py │ │ │ │ ├── appointment_detail.py │ │ │ │ ├── appointment_draft_delete.py │ │ │ │ ├── appointment_draft_flush.py │ │ │ │ ├── appointment_draft_post.py │ │ │ │ ├── appointment_list.py │ │ │ │ ├── appointment_post.py │ │ │ │ ├── appointment_put.py │ │ │ │ ├── appointment_recurring_delete.py │ │ │ │ ├── appointment_recurring_put.py │ │ │ │ └── appointment_reminder_get.py │ │ │ ├── booking │ │ │ │ ├── __init__.py │ │ │ │ ├── booking_delete.py │ │ │ │ ├── booking_detail.py │ │ │ │ ├── booking_list.py │ │ │ │ ├── booking_post.py │ │ │ │ ├── booking_put.py │ │ │ │ ├── booking_recurring_delete.py │ │ │ │ ├── booking_recurring_put.py │ │ │ │ └── booking_recurring_stat_delete.py │ │ │ ├── exam │ │ │ │ ├── __init__.py │ │ │ │ ├── documents │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── exam_download.py │ │ │ │ │ ├── exam_external_send.py │ │ │ │ │ └── exam_upload.py │ │ │ │ ├── exam_bcmp.py │ │ │ │ ├── exam_bulk_status.py │ │ │ │ ├── exam_delete.py │ │ │ │ ├── exam_detail.py │ │ │ │ ├── exam_download.py │ │ │ │ ├── exam_email_invigilator.py │ │ │ │ ├── exam_event_id_detail.py │ │ │ │ ├── exam_export_list.py │ │ │ │ ├── exam_list.py │ │ │ │ ├── exam_post.py │ │ │ │ ├── exam_put.py │ │ │ │ ├── exam_transfer.py │ │ │ │ └── exam_upload.py │ │ │ ├── exam_type │ │ │ │ ├── __init__.py │ │ │ │ └── exam_type_list.py │ │ │ ├── invigilator │ │ │ │ ├── __init__.py │ │ │ │ ├── invigilator_list.py │ │ │ │ ├── invigilator_list_offsite.py │ │ │ │ └── invigilator_put.py │ │ │ ├── room │ │ │ │ ├── __init__.py │ │ │ │ └── room_list.py │ │ │ └── walkin │ │ │ │ ├── __init__.py │ │ │ │ └── walkin.py │ │ └── theq │ │ │ ├── __init__.py │ │ │ ├── categories.py │ │ │ ├── channels.py │ │ │ ├── citizen │ │ │ ├── __init__.py │ │ │ ├── citizen_add_to_queue.py │ │ │ ├── citizen_begin_service.py │ │ │ ├── citizen_detail.py │ │ │ ├── citizen_finish_service.py │ │ │ ├── citizen_generic_invite.py │ │ │ ├── citizen_left.py │ │ │ ├── citizen_list.py │ │ │ ├── citizen_place_on_hold.py │ │ │ ├── citizen_remove_from_queue.py │ │ │ ├── citizen_service_requests.py │ │ │ └── citizen_specific_invite.py │ │ │ ├── csr_detail.py │ │ │ ├── csr_states.py │ │ │ ├── csrs.py │ │ │ ├── feedback.py │ │ │ ├── health.py │ │ │ ├── login.py │ │ │ ├── offices.py │ │ │ ├── service_requests_detail.py │ │ │ ├── service_requests_list.py │ │ │ ├── services.py │ │ │ ├── slack.py │ │ │ ├── smartboard.py │ │ │ ├── upload.py │ │ │ ├── user │ │ │ ├── __init__.py │ │ │ ├── user.py │ │ │ └── user_appointments.py │ │ │ ├── videofiles.py │ │ │ └── websocket.py │ ├── schemas │ │ ├── __init__.py │ │ ├── bookings │ │ │ ├── __init__.py │ │ │ ├── appointment_availability_schema.py │ │ │ ├── appointment_schema.py │ │ │ ├── booking_schema.py │ │ │ ├── exam_schema.py │ │ │ ├── exam_type_schema.py │ │ │ ├── invigilator_schema.py │ │ │ └── room_schema.py │ │ └── theq │ │ │ ├── __init__.py │ │ │ ├── channel_schema.py │ │ │ ├── citizen_schema.py │ │ │ ├── citizen_state_schema.py │ │ │ ├── counter_schema.py │ │ │ ├── csr_schema.py │ │ │ ├── csr_state_schema.py │ │ │ ├── metadata_schema.py │ │ │ ├── office_schema.py │ │ │ ├── period_schema.py │ │ │ ├── period_state_schema.py │ │ │ ├── permission_schema.py │ │ │ ├── role_schema.py │ │ │ ├── service_req_schema.py │ │ │ ├── service_schema.py │ │ │ ├── smartboard_schema.py │ │ │ ├── sr_state_schema.py │ │ │ ├── timeslot_schema.py │ │ │ ├── timezone_schema.py │ │ │ └── user_schema.py │ ├── services │ │ ├── __init__.py │ │ └── availability_service.py │ ├── tests │ │ ├── __init__.py │ │ └── test.py │ └── utilities │ │ ├── __init__.py │ │ ├── auth_util.py │ │ ├── bcmp_service.py │ │ ├── date_util.py │ │ ├── document_service.py │ │ ├── email.py │ │ ├── notification_email.py │ │ ├── sms.py │ │ ├── snowplow.py │ │ └── yesno.py ├── audit_script │ ├── .env.example │ └── keyclock_audit_users.py ├── config.py ├── email_templates │ ├── blackout_email.html │ ├── confirmation_email.html │ ├── delete_email.html │ ├── reminder_email.html │ ├── walkin_reminder.html │ └── walkin_spot_confirmation.html ├── entrust_g2_ca.cer ├── gunicorn_config.py ├── lock │ └── .gitignore ├── logs │ └── .gitignore ├── manage.py ├── migrations │ ├── README │ ├── alembic.ini │ ├── env.py │ ├── script.py.mako │ └── versions │ │ ├── 01e9a0399784_online_flag.py │ │ ├── 05301cda7812_.py │ │ ├── 06e914da9675_.py │ │ ├── 0b452e9fb67c_.py │ │ ├── 1171a9129db4_.py │ │ ├── 129ea023f600_.py │ │ ├── 13e4908529d2_add_telephone_to_office.py │ │ ├── 13f777964cf9_.py │ │ ├── 198b2c9110b9_.py │ │ ├── 2118a4e8e321_create_timeslot_duration_as_a_plain_.py │ │ ├── 2913f24ec7ad_.py │ │ ├── 34df859d1d05_.py │ │ ├── 44c03a3c8a83_.py │ │ ├── 47c80f6b0123_add_online_status.py │ │ ├── 4b4bac23d407_appointment_version.py │ │ ├── 4bf4b127aaa4_sbcq155.py │ │ ├── 4bf82b73bbb3_.py │ │ ├── 5b3921d80d78_.py │ │ ├── 62686ac6eefc_.py │ │ ├── 641db6e01015_.py │ │ ├── 65c4064116f4_.py │ │ ├── 664c765d1547_adding_sms_reminder_flag.py │ │ ├── 71486b5dce97_.py │ │ ├── 7564bc97ed99_.py │ │ ├── 89294ac623e8_.py │ │ ├── 8a939073b36f_.py │ │ ├── 8b6c67545310_sbcq156.py │ │ ├── 92cd814a5c05_.py │ │ ├── a05659940088_.py │ │ ├── ad4ef26eff9c_online_appointment_changes.py │ │ ├── b73622264ca0_.py │ │ ├── ba295f379d0d_citizen_start_position_column_add.py │ │ ├── c1b93103c752_.py │ │ ├── c25c4ee67df6_.py │ │ ├── c9f1e5a3a0d4_.py │ │ ├── ca2023cc8b00_.py │ │ ├── ca3161acb1d3_.py │ │ ├── d195a426f111_online_appointments_2.py │ │ ├── d2bbfaeeb7d9_online_appointment_email_changes.py │ │ ├── d84abcbcf722_.py │ │ ├── f78833b67a10_add_dlkt_to_service_and_office.py │ │ └── fc3fd3bab5bc_adding_office_address.py ├── postman │ ├── API_Test_TheQ_Booking.json │ ├── API_Test_TheQ_Booking_with_QTxn.json │ ├── Load_Test_Booking.json │ ├── Load_Test_Exam.json │ ├── Load_Test_TheQ.json │ ├── postman_env.json │ └── postman_load_env.json ├── qsystem.py ├── requirements.txt ├── requirements_dev.txt ├── setup.cfg ├── setup.py ├── sqlcode │ ├── Q2-ArchiveDataFunctionDefinition.sql │ └── Q2-CloseOpenTicketsFunctionDefinition.sql ├── templates │ ├── admin │ │ └── base.html │ └── office │ │ ├── office_create.html │ │ ├── office_edit.html │ │ ├── officega_create.html │ │ └── officega_edit.html ├── version.py ├── videos │ └── manifest.json └── wsgi.py ├── appointment-frontend ├── .dockerignore ├── .eslintrc.js ├── Dockerfile ├── README.md ├── babel.config.js ├── caddy │ └── Caddyfile ├── cypress.config.ts ├── cypress │ ├── .eslintrc.json │ ├── README.md │ ├── e2e │ │ └── image_snapshot │ │ │ ├── account_settings_update.cy.ts │ │ │ ├── appointment_cancel.cy.ts │ │ │ ├── appointment_change.cy.ts │ │ │ ├── step1.cy.ts │ │ │ ├── step2.cy.ts │ │ │ ├── step3.cy.ts │ │ │ ├── step4.cy.ts │ │ │ └── step5.cy.ts │ ├── fixtures │ │ ├── appointments.json │ │ ├── appointments │ │ │ ├── draft.json │ │ │ └── id=66 │ │ ├── categories.json │ │ ├── offices.json │ │ ├── offices │ │ │ ├── 3 │ │ │ │ └── slots │ │ │ │ │ ├── service_id=7.json │ │ │ │ │ └── service_id=85.json │ │ │ └── test │ │ │ │ └── offices.json │ │ ├── services.json │ │ ├── services │ │ │ ├── appointment_cancel.json │ │ │ └── office_id=3.json │ │ └── users │ │ │ ├── appointments.json │ │ │ ├── appointments │ │ │ └── appointment_cancel.json │ │ │ ├── id=12706 │ │ │ └── me.json │ ├── plugins │ │ ├── bceidLogin.ts │ │ └── index.ts │ ├── runloop.sh │ ├── snapshots │ │ └── image_snapshot │ │ │ ├── account_settings_update.cy.ts │ │ │ ├── Account Settings -- Update User.snap.png │ │ │ └── Account Settings -- page loaded.snap.png │ │ │ ├── appointment_cancel.cy.ts │ │ │ ├── Cancel Appointment -- Cancel Appointment.snap.png │ │ │ └── Cancel Appointment -- page loaded.snap.png │ │ │ ├── appointment_change.cy.ts │ │ │ ├── Change Appointment -- Change Appointment.snap.png │ │ │ └── Change Appointment -- page loaded.snap.png │ │ │ ├── step1.cy.ts │ │ │ ├── step 1 -- office selected.snap.png │ │ │ ├── step 1 -- page loaded.snap.png │ │ │ └── step 1 -- services popup.snap.png │ │ │ ├── step2.cy.ts │ │ │ ├── step 2 -- page loaded.snap.png │ │ │ └── step 2 -- service selected.snap.png │ │ │ ├── step3.cy.ts │ │ │ └── step 3 -- page loaded.snap.png │ │ │ └── step5.cy.ts │ │ │ ├── step 5 -- confirm clicked.snap.png │ │ │ ├── step 5 -- consent checked.snap.png │ │ │ └── step 5 -- page loaded.snap.png │ └── support │ │ ├── commands.ts │ │ ├── e2e.ts │ │ └── selectors.ts ├── jest.config.js ├── nginx.conf ├── package-lock.json ├── package.json ├── public │ ├── favicon.png │ ├── img │ │ └── icons │ │ │ ├── android-chrome-192x192.png │ │ │ └── android-chrome-512x512.png │ ├── index.html │ └── robots.txt ├── src │ ├── App.vue │ ├── assets │ │ ├── fonts │ │ │ └── BCSans │ │ │ │ ├── BCSans-Bold.woff │ │ │ │ ├── BCSans-Bold.woff2 │ │ │ │ ├── BCSans-BoldItalic.woff │ │ │ │ ├── BCSans-BoldItalic.woff2 │ │ │ │ ├── BCSans-Italic.woff │ │ │ │ ├── BCSans-Italic.woff2 │ │ │ │ ├── BCSans-Regular.woff │ │ │ │ ├── BCSans-Regular.woff2 │ │ │ │ └── LICENSE_OFL.txt │ │ ├── img │ │ │ ├── BCServicesCard.png │ │ │ ├── bceid_logo.jpg │ │ │ ├── bceid_logo_sm.jpg │ │ │ ├── gov3_bc_logo.png │ │ │ ├── gov3_bc_logo_mobile.png │ │ │ ├── officemaps │ │ │ │ ├── 1.png │ │ │ │ ├── 10.png │ │ │ │ ├── 11.png │ │ │ │ ├── 12.png │ │ │ │ ├── 13.png │ │ │ │ ├── 14.png │ │ │ │ ├── 15.png │ │ │ │ ├── 16.png │ │ │ │ ├── 17.png │ │ │ │ ├── 18.png │ │ │ │ ├── 19.png │ │ │ │ ├── 2.png │ │ │ │ ├── 23.png │ │ │ │ ├── 25.png │ │ │ │ ├── 3.png │ │ │ │ ├── 30.png │ │ │ │ ├── 31.png │ │ │ │ ├── 32.png │ │ │ │ ├── 33.png │ │ │ │ ├── 35.png │ │ │ │ ├── 36.png │ │ │ │ ├── 37.png │ │ │ │ ├── 38.png │ │ │ │ ├── 39.png │ │ │ │ ├── 40.png │ │ │ │ ├── 41.png │ │ │ │ ├── 42.png │ │ │ │ ├── 43.png │ │ │ │ ├── 45.png │ │ │ │ ├── 46.png │ │ │ │ ├── 47.png │ │ │ │ ├── 48.png │ │ │ │ ├── 50.png │ │ │ │ ├── 51.png │ │ │ │ ├── 55.png │ │ │ │ ├── 56.png │ │ │ │ ├── 60.png │ │ │ │ ├── 61.png │ │ │ │ ├── 64.png │ │ │ │ ├── 65.png │ │ │ │ ├── 66.png │ │ │ │ ├── 67.png │ │ │ │ ├── 68.png │ │ │ │ ├── 69.png │ │ │ │ ├── 70.png │ │ │ │ ├── 73.png │ │ │ │ ├── 75.png │ │ │ │ ├── 8.png │ │ │ │ ├── 80.png │ │ │ │ ├── 81.png │ │ │ │ ├── 82.png │ │ │ │ ├── 83.png │ │ │ │ ├── 84.png │ │ │ │ ├── 85.png │ │ │ │ ├── 86.png │ │ │ │ ├── 87.png │ │ │ │ ├── 88.png │ │ │ │ ├── 89.png │ │ │ │ ├── 90.png │ │ │ │ ├── 91.png │ │ │ │ ├── 92.png │ │ │ │ ├── 93.png │ │ │ │ ├── 94.png │ │ │ │ ├── 95.png │ │ │ │ ├── 97.png │ │ │ │ └── 999.png │ │ │ ├── officemapsorig │ │ │ │ ├── 100milehouse.png │ │ │ │ ├── ashcroft.png │ │ │ │ ├── atlin.png │ │ │ │ ├── bellacoola.png │ │ │ │ ├── burnaby.png │ │ │ │ ├── burnslake.png │ │ │ │ ├── campbellriver.png │ │ │ │ ├── chetwynd.png │ │ │ │ ├── chilliwack.png │ │ │ │ ├── clinton.png │ │ │ │ ├── courtenay.png │ │ │ │ ├── cranbrook.png │ │ │ │ ├── creston.png │ │ │ │ ├── dawsoncreek.png │ │ │ │ ├── deaselake.png │ │ │ │ ├── duncan.png │ │ │ │ ├── fernie.png │ │ │ │ ├── fortnelson.png │ │ │ │ ├── fortstjames.png │ │ │ │ ├── fortstjohn.PNG │ │ │ │ ├── ganges.png │ │ │ │ ├── golden.png │ │ │ │ ├── grandforks.png │ │ │ │ ├── hazelton.png │ │ │ │ ├── houston.png │ │ │ │ ├── invermere.png │ │ │ │ ├── kamloops.png │ │ │ │ ├── kaslo.png │ │ │ │ ├── kelowna.png │ │ │ │ ├── kitimat.png │ │ │ │ ├── lillooet.png │ │ │ │ ├── mackenzie.png │ │ │ │ ├── mapleridge.png │ │ │ │ ├── masset.png │ │ │ │ ├── merritt.png │ │ │ │ ├── nakusp.png │ │ │ │ ├── nanaimo.png │ │ │ │ ├── nelson.png │ │ │ │ ├── oliver.png │ │ │ │ ├── penticton.png │ │ │ │ ├── portalberni.png │ │ │ │ ├── porthardy.png │ │ │ │ ├── powellriver.png │ │ │ │ ├── princegeorge.png │ │ │ │ ├── princerupert.png │ │ │ │ ├── princeton.png │ │ │ │ ├── queencharlotte.png │ │ │ │ ├── quesnel.png │ │ │ │ ├── revelstoke.png │ │ │ │ ├── salmonarm.png │ │ │ │ ├── sechelt.png │ │ │ │ ├── smithers.png │ │ │ │ ├── sparwood.png │ │ │ │ ├── squamish.png │ │ │ │ ├── stewart.png │ │ │ │ ├── surrey.png │ │ │ │ ├── terrace.png │ │ │ │ ├── trail.png │ │ │ │ ├── ucluelet.png │ │ │ │ ├── valemount.png │ │ │ │ ├── vancouver.png │ │ │ │ ├── vanderhoof.png │ │ │ │ ├── vernon.png │ │ │ │ ├── victoria.png │ │ │ │ └── williamslake.png │ │ │ └── service_bc.jpg │ │ ├── logo.png │ │ └── scss │ │ │ ├── base.scss │ │ │ ├── layout.scss │ │ │ ├── overrides.scss │ │ │ └── theme.scss │ ├── components │ │ ├── Home │ │ │ ├── HelloWorld.vue │ │ │ └── index.ts │ │ ├── appointment │ │ │ ├── AppointmentSummary.vue │ │ │ ├── DateSelection.vue │ │ │ ├── GeocoderInput.vue │ │ │ ├── LocationsList.vue │ │ │ ├── LoginToConfirm.vue │ │ │ ├── ServiceListPopup.vue │ │ │ ├── ServiceSelection.vue │ │ │ ├── TermsOfServicePopup.vue │ │ │ └── index.ts │ │ ├── common │ │ │ ├── AppFooter.vue │ │ │ ├── AppHeader.vue │ │ │ ├── LoadingScreen.vue │ │ │ ├── NoEmailAlert.vue │ │ │ ├── ResourceExample.vue │ │ │ ├── SignedUser.vue │ │ │ └── index.ts │ │ └── feedback │ │ │ ├── Feedback.vue │ │ │ └── index.ts │ ├── enums │ │ └── index.ts │ ├── events │ │ └── locationBus.ts │ ├── interfaces │ │ ├── action-interface.ts │ │ ├── index.ts │ │ ├── resource-interface.ts │ │ └── state-interface.ts │ ├── locales │ │ ├── en.json │ │ └── fr.json │ ├── main.ts │ ├── mixins │ │ ├── StepperMixin.vue │ │ ├── common-mixin.ts │ │ ├── index.ts │ │ └── resource-lookup-mixin.ts │ ├── models │ │ ├── KCUserProfile.ts │ │ ├── appointment.ts │ │ ├── feedback.ts │ │ ├── geo.ts │ │ ├── global.ts │ │ ├── office.ts │ │ ├── service.ts │ │ ├── user.ts │ │ └── walkin.ts │ ├── plugins │ │ ├── i18n.ts │ │ └── vuetify.ts │ ├── resources │ │ ├── externalResourceExample.ts │ │ └── index.ts │ ├── router │ │ ├── index.ts │ │ └── routes.ts │ ├── services │ │ ├── appointment.services.ts │ │ ├── feedback.service.ts │ │ ├── geocoder.services.ts │ │ ├── keycloak.services.ts │ │ ├── office.services.ts │ │ ├── token.services.ts │ │ ├── user.services.ts │ │ └── walkin.service.ts │ ├── shims-tsx.d.ts │ ├── shims-vue.d.ts │ ├── store │ │ ├── actions │ │ │ ├── actions-model.ts │ │ │ └── index.ts │ │ ├── getters │ │ │ └── index.ts │ │ ├── index.ts │ │ ├── modules │ │ │ ├── account.ts │ │ │ ├── appointment.ts │ │ │ ├── auth.ts │ │ │ ├── geo.ts │ │ │ ├── index.ts │ │ │ ├── office.ts │ │ │ └── walkin.ts │ │ ├── mutations │ │ │ ├── index.ts │ │ │ └── mutations-model.ts │ │ └── state │ │ │ ├── index.ts │ │ │ ├── resource-model.ts │ │ │ └── state-model.ts │ ├── utils │ │ ├── common-util.ts │ │ ├── config-helper.ts │ │ ├── constants.ts │ │ ├── index.ts │ │ └── interceptors.ts │ └── views │ │ ├── AccountSettingsView.vue │ │ ├── AppointmentBookingView.vue │ │ ├── BookedAppointmentsView.vue │ │ ├── Home.vue │ │ ├── LoginSelectorView.vue │ │ ├── MixinExample.vue │ │ ├── NoContentView.vue │ │ ├── SigninView.vue │ │ ├── SignoutView.vue │ │ ├── StateExample.vue │ │ └── WalkinQ.vue ├── tests │ └── unit │ │ ├── example.spec.ts │ │ └── stateExample.spec.ts ├── tsconfig.json └── vue.config.js ├── documentation ├── Architecture │ ├── CFMS Data Dictionary V13.docx │ ├── SbcCfmsLogicalV13.pdf │ └── SbcCfmsPhysicalV13.pdf ├── DigitalSignage │ └── Setup Instructions for Raspberry Pi Kiosk.docx ├── Readme.md ├── Roadmap │ └── Appointments │ │ └── procurement │ │ └── appointment_procurement.docx ├── demo-files │ ├── .env.appointments │ ├── keycloak.json │ └── launch.json ├── keycloak-add-roles │ ├── README.md │ └── add_roles_to_users.py ├── keycloak-config │ └── config.json └── open-api │ └── swagger.yaml ├── feedback-api ├── .dockerignore ├── .s2i │ └── environment ├── Dockerfile ├── LICENSE ├── MANIFEST.in ├── Makefile ├── README.md ├── camunda_email_template.template ├── config.py ├── entrypoint.sh ├── gunicorn_config.py ├── logging.conf ├── manage.py ├── pytest.xml ├── requirements.txt ├── setup.cfg ├── setup.py ├── src │ └── api │ │ ├── __init__.py │ │ ├── resources │ │ ├── __init__.py │ │ ├── feedback.py │ │ ├── meta.py │ │ └── ops.py │ │ └── services │ │ ├── __init__.py │ │ └── feedback │ │ ├── __init__.py │ │ ├── feedback_base_service.py │ │ └── feedback_camunda_service.py └── wsgi.py ├── frontend ├── .dockerignore ├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .postcssrc.js ├── .s2i │ ├── bin │ │ └── assemble │ └── environment ├── Dockerfile ├── README.md ├── babel.config.js ├── build │ ├── build-local.js │ ├── build-prod.js │ ├── check-versions.js │ ├── dev-client.js │ ├── dev-server.js │ ├── localhost-server.js │ ├── utils.js │ ├── vue-loader.conf.js │ ├── webpack.base.conf.js │ ├── webpack.dev.conf.js │ └── webpack.prod.conf.js ├── caddy │ └── Caddyfile ├── config.ts ├── config │ ├── dev.env.js │ ├── index.js │ └── prod.env.js ├── cypress.config.ts ├── cypress │ ├── e2e │ │ └── image_snapshot │ │ │ └── step1.cy.ts │ ├── fixtures │ │ ├── example.json │ │ └── offices.json │ ├── snapshots │ │ └── image_snapshot │ │ │ └── step1.cy.ts │ │ │ └── Login page -- should match screenshot of element.snap.png │ └── support │ │ ├── commands.ts │ │ └── e2e.ts ├── index.d.ts ├── index.html ├── nginx.conf ├── package-lock.json ├── package.json ├── public │ ├── index.html │ └── static │ │ └── videos │ │ └── manifest.json ├── src │ ├── MainApp.vue │ ├── assets │ │ ├── bcid.jpg │ │ ├── css │ │ │ ├── bc-gov-style.css │ │ │ ├── q.css │ │ │ └── service-flow.css │ │ └── fonts │ │ │ ├── MyriadWebPro.eot │ │ │ ├── MyriadWebPro.svg │ │ │ ├── MyriadWebPro.ttf │ │ │ ├── MyriadWebPro.woff │ │ │ ├── MyriadWebPro.woff2 │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ ├── glyphicons-halflings-regular.woff │ │ │ └── glyphicons-halflings-regular.woff2 │ ├── components │ │ ├── AddCitizen │ │ │ ├── add-citizen-form.vue │ │ │ ├── add-citizen.vue │ │ │ └── form-components │ │ │ │ ├── buttons.vue │ │ │ │ ├── channel.vue │ │ │ │ ├── comments.vue │ │ │ │ ├── filters.vue │ │ │ │ ├── notification_fields.vue │ │ │ │ └── tables.vue │ │ ├── Agenda │ │ │ ├── Agenda.vue │ │ │ └── buttons-agenda.vue │ │ ├── Appointments │ │ │ ├── appointments.vue │ │ │ ├── appointmentsFilter.vue │ │ │ ├── appt-booking-modal │ │ │ │ ├── appt-blackout-modal.vue │ │ │ │ ├── appt-booking-modal.vue │ │ │ │ └── loading.vue │ │ │ ├── buttons-appointments.vue │ │ │ └── checkin-modal.vue │ │ ├── Booking │ │ │ ├── booking-blackout-modal.vue │ │ │ ├── booking-modal.vue │ │ │ ├── buttons-calendar.vue │ │ │ ├── calendar.vue │ │ │ ├── dropdown-calendar.vue │ │ │ ├── edit-booking-modal.vue │ │ │ ├── exam-inventory-modal.vue │ │ │ ├── filterCards.vue │ │ │ ├── loading.vue │ │ │ ├── other-booking-modal.vue │ │ │ └── scheduling-indicator.vue │ │ ├── Layout │ │ │ ├── footer.vue │ │ │ ├── header.vue │ │ │ └── nav.vue │ │ ├── Login │ │ │ ├── Login.vue │ │ │ └── login-warning.vue │ │ ├── ServeCitizen │ │ │ ├── dash-buttons.vue │ │ │ ├── dash-hold-table.vue │ │ │ ├── dash-table.vue │ │ │ ├── dash.vue │ │ │ ├── serve-citizen-table.vue │ │ │ └── serve-citizen.vue │ │ ├── TaskList │ │ │ └── ButtonTasklist.vue │ │ ├── agenda-screen │ │ │ └── agenda-screen.vue │ │ ├── exams │ │ │ ├── add-exam-final-step.vue │ │ │ ├── add-exam-form-components.ts │ │ │ ├── add-exam-form-confirm.vue │ │ │ ├── add-exam-form-controller.vue │ │ │ ├── add-exam-modal.vue │ │ │ ├── add-pesticide-final-step.vue │ │ │ ├── buttons-exams.vue │ │ │ ├── data-summary-table.vue │ │ │ ├── delete-exam-modal.vue │ │ │ ├── edit-exam-confirmation-modal.vue │ │ │ ├── edit-exam-form-modal.vue │ │ │ ├── edit-group-exam-modal.vue │ │ │ ├── exam-inventory-table.vue │ │ │ ├── exams.vue │ │ │ ├── failure-exam-alert.vue │ │ │ ├── form-components │ │ │ │ ├── group-pesticide-modal.vue │ │ │ │ └── pesticide-fees.vue │ │ │ ├── generate-financial-report-modal.vue │ │ │ ├── office-drop.vue │ │ │ ├── office-dropdown-filter.vue │ │ │ ├── return-exam-form-modal.vue │ │ │ ├── select-invigilator-modal.vue │ │ │ ├── success-exam-alert.vue │ │ │ └── upload-pesticide-exam.vue │ │ ├── ga-screen │ │ │ └── ga-screen.vue │ │ ├── smartboard │ │ │ ├── board-socket.vue │ │ │ ├── call-by-name.vue │ │ │ ├── call-by-ticket.vue │ │ │ ├── index.vue │ │ │ ├── marquee-text.vue │ │ │ ├── non-reception.vue │ │ │ ├── right-menu.vue │ │ │ └── video.vue │ │ └── upload │ │ │ ├── buttons-upload.vue │ │ │ ├── existingfiles.vue │ │ │ └── upload.vue │ ├── events │ │ ├── progressBus.ts │ │ ├── setMaxBus.ts │ │ ├── showBookingFlagBus.ts │ │ └── showFlagBus.ts │ ├── interfaces │ │ ├── action-interface.ts │ │ ├── index.ts │ │ ├── resource-interface.ts │ │ └── state-interface.ts │ ├── main.ts │ ├── plugins │ │ └── vuetify.ts │ ├── router │ │ ├── componentHooks.ts │ │ ├── index.ts │ │ └── routes.ts │ ├── shims-tsx.d.ts │ ├── shims-vue.d.ts │ ├── store │ │ ├── actions │ │ │ ├── actions-model.ts │ │ │ └── index.ts │ │ ├── getters │ │ │ ├── getters-model.ts │ │ │ └── index.ts │ │ ├── helpers │ │ │ ├── helpers.ts │ │ │ ├── index.ts │ │ │ └── makeBookingReqObj.ts │ │ ├── index.ts │ │ ├── modules │ │ │ ├── add-exam-module.ts │ │ │ ├── appointments-module.ts │ │ │ ├── exams-module.js │ │ │ └── index.ts │ │ ├── mutations │ │ │ ├── index.ts │ │ │ └── mutations-model.ts │ │ └── state │ │ │ ├── index.ts │ │ │ └── state-model.ts │ ├── test │ │ ├── bookings-book-exam.test.js │ │ ├── bookings-edit-exam-detail.test.js │ │ ├── bookings-group-exam.test.js │ │ ├── bookings-individual-exam.test.js │ │ ├── bookings-individual-other.test.js │ │ ├── bookings-nav.test.js │ │ ├── bookings-pesticide-exam.test.js │ │ ├── bookings-return-exam.test.js │ │ ├── bookings-session-exam.test.js │ │ └── index.test.js │ ├── utils │ │ ├── axios.ts │ │ ├── config-helper.ts │ │ └── helpers.ts │ ├── version.js │ └── views │ │ ├── App.vue │ │ ├── FormView.vue │ │ ├── Socket.vue │ │ ├── TaskList.vue │ │ ├── admin.vue │ │ ├── alert.vue │ │ ├── buttons-admin.vue │ │ ├── exam-alert.vue │ │ ├── feedback.vue │ │ └── response.vue ├── static │ └── videos │ │ └── manifest.json ├── tsconfig.json └── vue.config.js ├── jobs └── appointment_reminder │ ├── Dockerfile │ ├── README Cron Docker.md │ ├── README.md │ ├── __init__.py │ ├── config.py │ ├── cron │ └── crontab │ ├── docker-entrypoint.sh │ ├── flush_expired_draft_appointments.py │ ├── logging.conf │ ├── redis_cluster_meet.py │ ├── requirements.txt │ ├── run_email_reminders.sh │ ├── run_sms_reminders.sh │ ├── send_email_reminder.py │ ├── send_sms_reminder.py │ ├── utils │ ├── __init__.py │ ├── appointment.py │ └── logging.py │ └── version.py ├── keycloak-local-testserver ├── Dockerfile ├── registry-realm.json ├── setup.sh └── startup.sh ├── login-proxy ├── README.md ├── authentication.json ├── available_roles.json ├── clients-dev.json ├── composite_roles.json ├── groups.json ├── identity-providers-dev.json ├── identity-providers-test.json └── roles.json ├── mender ├── README.md ├── image-tools │ ├── .gitignore │ ├── README.md │ ├── artifact-builder │ │ ├── .dockerignore │ │ ├── .gitignore │ │ ├── Dockerfile │ │ ├── build-artifact │ │ ├── docker-build │ │ ├── docker-entrypoint.sh │ │ └── raspbian-setup │ │ │ ├── files │ │ │ ├── .gitignore │ │ │ ├── Xwrapper.config │ │ │ ├── autologin.conf │ │ │ ├── autologin@.service │ │ │ ├── bashrc │ │ │ ├── crontab │ │ │ ├── deps_add.txt │ │ │ ├── deps_remove.txt │ │ │ ├── first-boot.service │ │ │ ├── first-boot.sh │ │ │ ├── fstab.base │ │ │ ├── fstab.mender │ │ │ ├── launch-browser.sh │ │ │ ├── load-smartboard-data.sh │ │ │ ├── mender-device-identity │ │ │ ├── mender-inventory-smartboard │ │ │ ├── mender.conf │ │ │ ├── mount_overlay │ │ │ ├── network-watchdog.service │ │ │ ├── network-watchdog.sh │ │ │ ├── network │ │ │ │ ├── .gitignore │ │ │ │ ├── 01-wired.network │ │ │ │ ├── 02-wireless.network │ │ │ │ ├── rfkill-unblock.service │ │ │ │ └── wpa_supplicant-country.conf │ │ │ ├── nginx.conf │ │ │ ├── raspi-blacklist.conf │ │ │ ├── rc.local │ │ │ ├── rsyslog.conf │ │ │ ├── splashscreen.service │ │ │ ├── sshd_config │ │ │ ├── timesyncd.conf │ │ │ ├── venv.tar │ │ │ ├── video-updater.service │ │ │ ├── video-updater.sh │ │ │ ├── web-service.conf │ │ │ ├── web-service.localhost │ │ │ └── web-service │ │ │ │ ├── requirements.txt │ │ │ │ ├── src │ │ │ │ └── __init__.py │ │ │ │ ├── start.sh │ │ │ │ └── static │ │ │ │ ├── axios.min.js │ │ │ │ ├── splash.html │ │ │ │ ├── splash.png │ │ │ │ ├── style.css │ │ │ │ └── video.html │ │ │ ├── scripts │ │ │ ├── 01-dependencies │ │ │ ├── 02-create-default-user │ │ │ ├── 03-ssh │ │ │ ├── 04-network │ │ │ ├── 05-video-fetch │ │ │ ├── 06-logs │ │ │ ├── 07-timezone │ │ │ ├── 08-splashscreen │ │ │ ├── 09-disabled-hardware │ │ │ ├── 10-web-service │ │ │ ├── 11-browser │ │ │ ├── 12-mender-configuration │ │ │ ├── 13-cleanup │ │ │ ├── 14-lockdown │ │ │ └── 15-prepare-base-image-localdata │ │ │ ├── setup.sh │ │ │ └── state-scripts │ │ │ ├── ArtifactCommit_Enter_00 │ │ │ ├── ArtifactCommit_Leave_01_firewall │ │ │ ├── ArtifactCommit_Leave_02_localdata │ │ │ └── ArtifactReboot_Enter_01_hardward_config │ ├── bootstrap-builder │ │ ├── .gitignore │ │ ├── generate-image.sh │ │ ├── prepare-raspbian │ │ │ ├── .dockerignore │ │ │ ├── Dockerfile │ │ │ ├── docker-build │ │ │ ├── docker-entrypoint.sh │ │ │ └── prepare-raspbian │ │ └── shrink-image │ │ │ ├── .dockerignore │ │ │ ├── .gitignore │ │ │ ├── Dockerfile │ │ │ ├── README-pishrink.md │ │ │ ├── docker-build │ │ │ ├── docker-entrypoint.sh │ │ │ ├── pishrink.sh │ │ │ └── shrink-image │ ├── config.example.env │ ├── mender-image-patcher │ │ ├── .dockerignore │ │ ├── Dockerfile │ │ ├── docker-build │ │ ├── docker-entrypoint.sh │ │ └── mender-image-patcher │ └── sites.example.txt └── openshift │ ├── README.md │ ├── mender_deployment_quickstart.md │ └── templates │ ├── mender-gui-config_configmap.yaml │ ├── mender-gui_buildconfig.yaml │ └── mender-gui_imagestream.yaml ├── minio ├── .gitignore ├── README.md └── data │ └── .gitignore ├── notifications-api ├── .dockerignore ├── .s2i │ └── environment ├── Dockerfile ├── LICENSE ├── MANIFEST.in ├── Makefile ├── README.md ├── config.py ├── entrypoint.sh ├── gunicorn_config.py ├── logging.conf ├── manage.py ├── pytest.xml ├── requirements.txt ├── setup.cfg ├── setup.py ├── src │ └── api │ │ ├── __init__.py │ │ ├── auth │ │ ├── __init__.py │ │ └── auth.py │ │ ├── resources │ │ ├── __init__.py │ │ ├── email.py │ │ ├── meta.py │ │ ├── notifications.py │ │ └── ops.py │ │ └── services │ │ ├── __init__.py │ │ ├── email │ │ ├── __init__.py │ │ ├── email_base_service.py │ │ ├── email_ches_notify.py │ │ └── email_gc_notify.py │ │ └── sms │ │ ├── __init__.py │ │ ├── custom_notify.py │ │ ├── gc_notify.py │ │ └── sms_base_service.py └── wsgi.py ├── openshift └── templates │ ├── Old │ ├── send-appointment-reminder-build.json │ └── send-appointment-reminder.yaml │ ├── Readme.md │ ├── appointment-frontend-build.yaml │ ├── appointment-frontend-dc.yaml │ ├── appointment-nginx-frontend-build.yaml │ ├── appointment-nginx-frontend-dc.yaml │ ├── crond-send-appointment-reminder-build.yaml │ ├── crond-send-appointment-reminder-deploy.yaml │ ├── feedback-api-bc.yml │ ├── feedback-api-dc.yml │ ├── notifications-api-dc.yml │ ├── percona-dc.yml │ ├── queue-management-api-dc.yml │ ├── queue-management-chained-builds.yml │ ├── queue-management-frontend-dc.yml │ ├── queue-management-nginx-frontend-build.yaml │ ├── queue-management-nginx-frontend-dc.yml │ └── rabbitmq3.7-dc.yml ├── owasp ├── README.md ├── build.gradle ├── dependency-check │ ├── LICENSE.txt │ ├── NOTICE.txt │ ├── README.md │ ├── bin │ │ ├── dependency-check.bat │ │ └── dependency-check.sh │ ├── licenses │ │ └── commons-cli │ │ │ └── LICENSE.txt │ └── repo │ │ ├── ch │ │ └── qos │ │ │ └── logback │ │ │ ├── logback-classic │ │ │ └── 1.2.3 │ │ │ │ └── logback-classic-1.2.3.jar │ │ │ └── logback-core │ │ │ └── 1.2.3 │ │ │ └── logback-core-1.2.3.jar │ │ ├── com │ │ ├── google │ │ │ └── code │ │ │ │ └── gson │ │ │ │ └── gson │ │ │ │ └── 2.8.2 │ │ │ │ └── gson-2.8.2.jar │ │ ├── h2database │ │ │ └── h2 │ │ │ │ └── 1.4.196 │ │ │ │ └── h2-1.4.196.jar │ │ ├── sun │ │ │ └── mail │ │ │ │ └── mailapi │ │ │ │ └── 1.6.1 │ │ │ │ └── mailapi-1.6.1.jar │ │ └── vdurmont │ │ │ └── semver4j │ │ │ └── 2.1.0 │ │ │ └── semver4j-2.1.0.jar │ │ ├── commons-cli │ │ └── commons-cli │ │ │ └── 1.4 │ │ │ └── commons-cli-1.4.jar │ │ ├── commons-collections │ │ └── commons-collections │ │ │ └── 3.2.2 │ │ │ └── commons-collections-3.2.2.jar │ │ ├── commons-io │ │ └── commons-io │ │ │ └── 2.6 │ │ │ └── commons-io-2.6.jar │ │ ├── commons-lang │ │ └── commons-lang │ │ │ └── 2.4 │ │ │ └── commons-lang-2.4.jar │ │ ├── javax │ │ └── activation │ │ │ └── activation │ │ │ └── 1.1 │ │ │ └── activation-1.1.jar │ │ ├── joda-time │ │ └── joda-time │ │ │ └── 1.6 │ │ │ └── joda-time-1.6.jar │ │ └── org │ │ ├── apache │ │ ├── ant │ │ │ └── ant │ │ │ │ └── 1.9.9 │ │ │ │ └── ant-1.9.9.jar │ │ ├── commons │ │ │ ├── commons-compress │ │ │ │ └── 1.16.1 │ │ │ │ │ └── commons-compress-1.16.1.jar │ │ │ └── commons-lang3 │ │ │ │ └── 3.4 │ │ │ │ └── commons-lang3-3.4.jar │ │ ├── lucene │ │ │ ├── lucene-analyzers-common │ │ │ │ └── 5.5.5 │ │ │ │ │ └── lucene-analyzers-common-5.5.5.jar │ │ │ ├── lucene-core │ │ │ │ └── 5.5.5 │ │ │ │ │ └── lucene-core-5.5.5.jar │ │ │ ├── lucene-queries │ │ │ │ └── 5.5.5 │ │ │ │ │ └── lucene-queries-5.5.5.jar │ │ │ ├── lucene-queryparser │ │ │ │ └── 5.5.5 │ │ │ │ │ └── lucene-queryparser-5.5.5.jar │ │ │ └── lucene-sandbox │ │ │ │ └── 5.5.5 │ │ │ │ └── lucene-sandbox-5.5.5.jar │ │ └── velocity │ │ │ └── velocity │ │ │ └── 1.7 │ │ │ └── velocity-1.7.jar │ │ ├── glassfish │ │ └── javax.json │ │ │ └── 1.0.4 │ │ │ └── javax.json-1.0.4.jar │ │ ├── jsoup │ │ └── jsoup │ │ │ └── 1.11.2 │ │ │ └── jsoup-1.11.2.jar │ │ ├── objenesis │ │ └── objenesis │ │ │ └── 2.6 │ │ │ └── objenesis-2.6.jar │ │ ├── owasp │ │ ├── dependency-check-cli │ │ │ └── 3.1.2 │ │ │ │ └── dependency-check-cli-3.1.2.jar │ │ ├── dependency-check-core │ │ │ └── 3.1.2 │ │ │ │ └── dependency-check-core-3.1.2.jar │ │ └── dependency-check-utils │ │ │ └── 3.1.2 │ │ │ └── dependency-check-utils-3.1.2.jar │ │ └── slf4j │ │ └── slf4j-api │ │ └── 1.7.25 │ │ └── slf4j-api-1.7.25.jar ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew └── gradlew.bat ├── rabbitmq ├── Dockerfile └── docker-entrypoint.sh ├── sonar-runner ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew └── gradlew.bat ├── tests └── loadtesting │ ├── .gitignore │ ├── README.md │ ├── csr-http.yaml │ ├── csr-socket.yaml │ ├── csr-test-all.yaml │ ├── envs.example.sh │ ├── functions.js │ ├── output │ └── .gitkeep │ ├── package.json │ ├── profile-demo-withloadtesting.svg │ └── profile-python.sh └── vetur.config.js /.devcontainer/config/frontend/public/config/configuration.json: -------------------------------------------------------------------------------- 1 | { 2 | "VUE_APP_ROOT_API": "http://localhost:5000/api/v1" 3 | } 4 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # As a security feature, add these people as reviewers if a PR is created for 2 | # anything under .github, including GitHub Actions and this file itself. 3 | # Define code owners for the entire repository 4 | * @chrsamp @josekudiyirippil @Rajandeep98 -------------------------------------------------------------------------------- /.sonarcloud.properties: -------------------------------------------------------------------------------- 1 | sonar.projectName=Queue Management 2 | sonar.projectKey=queue-management 3 | 4 | # Path to sources 5 | sonar.sources=api,frontend,appointment-frontend,jobs,feedback-api,notifications-api 6 | #sonar.exclusions=**/*.test.js,request-management-api/tests/**/* 7 | #sonar.inclusions= 8 | 9 | # Path to tests 10 | # sonar.tests= 11 | #sonar.test.exclusions= 12 | #sonar.test.inclusions= 13 | 14 | # Source encoding 15 | sonar.sourceEncoding=UTF-8 16 | 17 | # Exclusions for copy-paste detection 18 | #sonar.cpd.exclusions= -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "tasks": [ 3 | { 4 | "args": [ 5 | "-c", 6 | "cd ${workspaceFolder}/api; source env/bin/activate; python manage.py db upgrade" 7 | ], 8 | "command": "bash", 9 | "detail": "python manage.py db upgrade", 10 | "label": "alembic: upgrade - api", 11 | "group": "build", 12 | "presentation": { 13 | "close": true, 14 | "panel": "new", 15 | "reveal": "always", 16 | }, 17 | "type": "shell" 18 | } 19 | ], 20 | "version": "2.0.0" 21 | } 22 | -------------------------------------------------------------------------------- /COMPLIANCE.yaml: -------------------------------------------------------------------------------- 1 | name: compliance 2 | description: | 3 | This document is used to track a projects PIA and STRA 4 | compliance. 5 | spec: 6 | - name: PIA 7 | status: completed 8 | last-updated: '2020-01-17T01:29:07.351Z' 9 | - name: STRA 10 | status: completed 11 | last-updated: '2020-01-17T01:29:23.753Z' 12 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ## How to contribute 2 | Government employees, public and members of the private sector are encouraged to contribute to the repository by **forking and submitting a pull request**. 3 | 4 | (If you are new to GitHub, you might start with a [basic tutorial](https://help.github.com/articles/set-up-git) and check out a more detailed guide to [pull requests](https://help.github.com/articles/using-pull-requests/).) 5 | 6 | Pull requests will be evaluated by the repository guardians on a schedule and if deemed beneficial will be committed to the master. 7 | 8 | All contributors retain the original copyright to their stuff, but by contributing to this project, you grant a world-wide, royalty-free, perpetual, irrevocable, non-exclusive, transferable license to all users **under the terms of the license under which this project is distributed.** -------------------------------------------------------------------------------- /api/.s2i/bin/assemble: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "Before assembling" 3 | 4 | 5 | # configure npm to use artifactory 6 | mkdir /opt/app-root/src/.pip 7 | touch /opt/app-root/src/.pip/pip.conf 8 | echo "[global]" >> ~/.pip/pip.conf 9 | echo "index-url = https://$AF_USERID:$AF_PASSWD@artifacts.developer.gov.bc.ca/artifactory/api/pypi/pypi-remote/simple" >> ~/.pip/pip.conf 10 | cat ~/.pip/pip.conf 11 | 12 | 13 | /usr/libexec/s2i/assemble 14 | # Todo - can delete below 15 | # We just need to run the default s2i assemble script as this is a standard build process 16 | # rc=$? 17 | 18 | # if [ $rc -eq 0 ]; then 19 | # npm run build:production 20 | # rc=$? 21 | # fi 22 | # exit $rc 23 | -------------------------------------------------------------------------------- /api/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/api/__init__.py -------------------------------------------------------------------------------- /api/app/README.md: -------------------------------------------------------------------------------- 1 | # Back-end Development Guide 2 | 3 | Generate new migrations 4 | 5 | ``` 6 | python3 manage.py db migrate 7 | python3 manage.py db upgrade 8 | ``` 9 | -------------------------------------------------------------------------------- /api/app/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/api/app/__init__.py -------------------------------------------------------------------------------- /api/app/admin/login.py: -------------------------------------------------------------------------------- 1 | from flask_admin.menu import MenuLink 2 | from flask_login import current_user 3 | 4 | 5 | class LoginMenuLink(MenuLink): 6 | 7 | def is_accessible(self): 8 | return not current_user.is_authenticated 9 | -------------------------------------------------------------------------------- /api/app/admin/logout.py: -------------------------------------------------------------------------------- 1 | from flask_admin.menu import MenuLink 2 | from flask_login import current_user 3 | 4 | 5 | class LogoutMenuLink(MenuLink): 6 | 7 | def is_accessible(self): 8 | return current_user.is_authenticated 9 | -------------------------------------------------------------------------------- /api/app/auth/__init__.py: -------------------------------------------------------------------------------- 1 | from qsystem import login_manager 2 | from app.models.theq import CSR 3 | 4 | 5 | @login_manager.user_loader 6 | def load_user(user_id): 7 | csr = CSR.query.filter_by(csr_id=int(user_id)).filter(CSR.deleted.is_(None)).first() 8 | if not csr: 9 | return None 10 | 11 | if csr.deleted is None: 12 | csr.is_active = True 13 | else: 14 | csr.is_active = False 15 | 16 | csr.is_authenticated = True 17 | csr.is_anonymous = False 18 | 19 | return csr 20 | -------------------------------------------------------------------------------- /api/app/auth/auth.py: -------------------------------------------------------------------------------- 1 | # Copyright © 2019 Province of British Columbia 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | """Auth.""" 15 | 16 | from flask_jwt_oidc import JwtManager 17 | 18 | 19 | jwt = JwtManager() 20 | -------------------------------------------------------------------------------- /api/app/exceptions/AuthError.py: -------------------------------------------------------------------------------- 1 | # Format error response and append state code. 2 | class AuthError(Exception): 3 | def __init__(self, error, status_code): 4 | self.error = error 5 | self.status_code = status_code -------------------------------------------------------------------------------- /api/app/exceptions/__init__.py: -------------------------------------------------------------------------------- 1 | from .AuthError import AuthError -------------------------------------------------------------------------------- /api/app/models/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/api/app/models/__init__.py -------------------------------------------------------------------------------- /api/app/models/bookings/base.py: -------------------------------------------------------------------------------- 1 | '''Copyright 2018 Province of British Columbia 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License.''' 14 | 15 | from sqlalchemy.ext.declarative import declared_attr 16 | from qsystem import db 17 | 18 | 19 | class Base(db.Model, object): 20 | __abstract__ = True 21 | 22 | @declared_attr 23 | def __tablename__(self): 24 | return self.__name__.lower() 25 | -------------------------------------------------------------------------------- /api/app/models/theq/base.py: -------------------------------------------------------------------------------- 1 | '''Copyright 2018 Province of British Columbia 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License.''' 14 | 15 | from qsystem import db 16 | from sqlalchemy.ext.declarative import declared_attr 17 | 18 | 19 | class Base(db.Model, object): 20 | __abstract__ = True 21 | 22 | @declared_attr 23 | def __tablename__(cls): 24 | return cls.__name__.lower() 25 | -------------------------------------------------------------------------------- /api/app/resources/__init__.py: -------------------------------------------------------------------------------- 1 | '''Copyright 2018 Province of British Columbia 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License.''' -------------------------------------------------------------------------------- /api/app/resources/bookings/__init__.py: -------------------------------------------------------------------------------- 1 | '''Copyright 2018 Province of British Columbia 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License.''' -------------------------------------------------------------------------------- /api/app/resources/bookings/appointment/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/api/app/resources/bookings/appointment/__init__.py -------------------------------------------------------------------------------- /api/app/resources/bookings/booking/__init__.py: -------------------------------------------------------------------------------- 1 | '''Copyright 2018 Province of British Columbia 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License.''' -------------------------------------------------------------------------------- /api/app/resources/bookings/exam/__init__.py: -------------------------------------------------------------------------------- 1 | '''Copyright 2018 Province of British Columbia 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License.''' -------------------------------------------------------------------------------- /api/app/resources/bookings/exam/documents/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/api/app/resources/bookings/exam/documents/__init__.py -------------------------------------------------------------------------------- /api/app/resources/bookings/exam/documents/exam_download.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/api/app/resources/bookings/exam/documents/exam_download.py -------------------------------------------------------------------------------- /api/app/resources/bookings/exam/documents/exam_external_send.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/api/app/resources/bookings/exam/documents/exam_external_send.py -------------------------------------------------------------------------------- /api/app/resources/bookings/exam/documents/exam_upload.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/api/app/resources/bookings/exam/documents/exam_upload.py -------------------------------------------------------------------------------- /api/app/resources/bookings/exam_type/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/api/app/resources/bookings/exam_type/__init__.py -------------------------------------------------------------------------------- /api/app/resources/bookings/invigilator/__init__.py: -------------------------------------------------------------------------------- 1 | '''Copyright 2018 Province of British Columbia 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License.''' -------------------------------------------------------------------------------- /api/app/resources/bookings/room/__init__.py: -------------------------------------------------------------------------------- 1 | '''Copyright 2018 Province of British Columbia 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License.''' -------------------------------------------------------------------------------- /api/app/resources/bookings/walkin/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/api/app/resources/bookings/walkin/__init__.py -------------------------------------------------------------------------------- /api/app/resources/theq/__init__.py: -------------------------------------------------------------------------------- 1 | '''Copyright 2018 Province of British Columbia 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License.''' -------------------------------------------------------------------------------- /api/app/resources/theq/citizen/__init__.py: -------------------------------------------------------------------------------- 1 | '''Copyright 2018 Province of British Columbia 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License.''' -------------------------------------------------------------------------------- /api/app/resources/theq/user/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/api/app/resources/theq/user/__init__.py -------------------------------------------------------------------------------- /api/app/schemas/__init__.py: -------------------------------------------------------------------------------- 1 | '''Copyright 2018 Province of British Columbia 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License.''' 14 | from marshmallow import EXCLUDE 15 | 16 | from qsystem import ma 17 | 18 | 19 | class BaseSchema(ma.SQLAlchemySchema): 20 | 21 | class Meta: 22 | load_instance = True 23 | unknown = EXCLUDE 24 | -------------------------------------------------------------------------------- /api/app/services/__init__.py: -------------------------------------------------------------------------------- 1 | '''Copyright 2018 Province of British Columbia 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License.''' 14 | 15 | from .availability_service import AvailabilityService 16 | -------------------------------------------------------------------------------- /api/app/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/api/app/tests/__init__.py -------------------------------------------------------------------------------- /api/app/utilities/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/api/app/utilities/__init__.py -------------------------------------------------------------------------------- /api/app/utilities/yesno.py: -------------------------------------------------------------------------------- 1 | import enum 2 | 3 | class YesNo(enum.Enum): 4 | YES = 'Yes' 5 | NO = 'No' -------------------------------------------------------------------------------- /api/audit_script/.env.example: -------------------------------------------------------------------------------- 1 | KEYCLOAK_SERVER_URL= 2 | REALM_NAME= 3 | OIDC_PROVIDER_TOKEN_URL= 4 | SERVICE_ACCOUNT_ID= 5 | SERVICE_ACCOUNT_SECRET= 6 | USERNAME= 7 | PASSWORD= -------------------------------------------------------------------------------- /api/email_templates/blackout_email.html: -------------------------------------------------------------------------------- 1 | Hello {{ display_name }}, 2 | 3 | Your appointment with Service BC {{ location }} on {{ formatted_date }} has been cancelled due to circumstances beyond our control. We apologize for the inconvenience. 4 | 5 | {{ blackout_notes }} 6 | 7 | To rebook your appointment, please visit Service BC Book an Appointment and sign in. 8 | 9 | [Book an Appointment with Service BC]({{ url }}) 10 | Thank you, 11 | 12 | Service BC {{ location }} 13 | {{ civic_address }} 14 | {{ telephone }} -------------------------------------------------------------------------------- /api/email_templates/delete_email.html: -------------------------------------------------------------------------------- 1 | Hello {{ display_name }}, 2 | 3 | {% if service_name is not none %} 4 | Service: {{ service_name }} 5 | 6 | {% endif %} 7 | Your appointment with Service BC {{ location }} on {{ formatted_date }} has been cancelled due to circumstances beyond our control. For further information please call {{ telephone }}. 8 | 9 | To rebook your appointment, please visit Service BC Book an Appointment and sign in. 10 | 11 | [Book an Appointment with Service BC]({{ url }}) 12 | Thank you, 13 | 14 | Service BC {{ location }} 15 | {{ civic_address }} 16 | {{ telephone }} -------------------------------------------------------------------------------- /api/email_templates/reminder_email.html: -------------------------------------------------------------------------------- 1 | 2 | Hello {{ display_name }}, 3 | 4 | {% if service_name is not none %} 5 | Service: {{ service_name }} 6 | 7 | {% endif %} 8 | REMINDER: You have an appointment with Service BC {{ location }} on {{ formatted_date }} for a total of {{ duration }} minutes. We're looking forward to seeing you. 9 | 10 | {% if office_email_paragraph is not none %} 11 | {{ office_email_paragraph|safe }} 12 | 13 | {% if service_email_paragraph is not none %} 14 | {{ service_email_paragraph|safe }} 15 | 16 | {% endif %} 17 | If you have any further questions, please call us at {{ telephone }} 18 | 19 | To change or cancel your appointment, please visit Service BC Book an Appointment and sign in. 20 | 21 | [Change or Cancel my Appointment with Service BC]({{ url }}) 22 | Thank you, 23 | 24 | Service BC {{ location }} 25 | {{ civic_address }} 26 | {{ telephone }} -------------------------------------------------------------------------------- /api/email_templates/walkin_reminder.html: -------------------------------------------------------------------------------- 1 | Hello {% if display_name is not none %} {{ display_name }} {% endif %}, 2 | 3 | {{reminder_msg}} 4 | 5 | 6 | Thank you, 7 | Service BC {{ location }} 8 | {{ civic_address }} 9 | {{ telephone }} 10 | -------------------------------------------------------------------------------- /api/email_templates/walkin_spot_confirmation.html: -------------------------------------------------------------------------------- 1 | Hello {% if display_name is not none %} {{ display_name }} {% endif %}, 2 | 3 | Thank you for saving your spot in line with Service BC! We will be with you shortly. 4 | To see your place in line, follow this link you are ticket {{ ticket_numer }} 5 | 6 | {{ url }} 7 | 8 | Thank you, 9 | Service BC {{ location }} 10 | {{ civic_address }} 11 | {{ telephone }} 12 | -------------------------------------------------------------------------------- /api/lock/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore everything in this directory 2 | * 3 | # Except this file 4 | !.gitignore -------------------------------------------------------------------------------- /api/logs/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore everything in this directory 2 | * 3 | # Except this file 4 | !.gitignore 5 | -------------------------------------------------------------------------------- /api/migrations/README: -------------------------------------------------------------------------------- 1 | Generic single-database configuration. 2 | 3 | Run Migrations: 4 | 5 | // make changes to your model 6 | run "flask db migrate -m "ticket_no_description" 7 | OR 8 | run "python manage.py db migrate -m "ticket_no_description" 9 | 10 | //wait for it to generate xyz_ticket_no_description.py in Migrations folder 11 | // check on the auto generated migration script verify/edit changes as required 12 | run "flask db upgrade" to apply changes 13 | 14 | run "flask db downgrade" to rollback the latest changes 15 | 16 | -------------------------------------------------------------------------------- /api/migrations/script.py.mako: -------------------------------------------------------------------------------- 1 | """${message} 2 | 3 | Revision ID: ${up_revision} 4 | Revises: ${down_revision | comma,n} 5 | Create Date: ${create_date} 6 | 7 | """ 8 | from alembic import op 9 | import sqlalchemy as sa 10 | import sqlalchemy_utc 11 | ${imports if imports else ""} 12 | 13 | # revision identifiers, used by Alembic. 14 | revision = ${repr(up_revision)} 15 | down_revision = ${repr(down_revision)} 16 | branch_labels = ${repr(branch_labels)} 17 | depends_on = ${repr(depends_on)} 18 | 19 | 20 | def upgrade(): 21 | ${upgrades if upgrades else "pass"} 22 | 23 | 24 | def downgrade(): 25 | ${downgrades if downgrades else "pass"} 26 | -------------------------------------------------------------------------------- /api/migrations/versions/01e9a0399784_online_flag.py: -------------------------------------------------------------------------------- 1 | """online_flag 2 | 3 | Revision ID: 01e9a0399784 4 | Revises: 2913f24ec7ad 5 | Create Date: 2020-05-01 23:59:12.129846 6 | 7 | """ 8 | from alembic import op 9 | import sqlalchemy as sa 10 | import sqlalchemy_utc 11 | 12 | 13 | # revision identifiers, used by Alembic. 14 | revision = '01e9a0399784' 15 | down_revision = '2913f24ec7ad' 16 | branch_labels = None 17 | depends_on = None 18 | 19 | 20 | def upgrade(): 21 | # ### commands auto generated by Alembic - please adjust! ### 22 | op.add_column('appointment', sa.Column('online_flag', sa.Boolean(), nullable=True)) 23 | # ### end Alembic commands ### 24 | 25 | 26 | def downgrade(): 27 | # ### commands auto generated by Alembic - please adjust! ### 28 | op.drop_column('appointment', 'online_flag') 29 | # ### end Alembic commands ### 30 | -------------------------------------------------------------------------------- /api/migrations/versions/13e4908529d2_add_telephone_to_office.py: -------------------------------------------------------------------------------- 1 | """add_telephone_to_office 2 | 3 | Revision ID: 13e4908529d2 4 | Revises: d2bbfaeeb7d9 5 | Create Date: 2020-04-29 19:08:19.651648 6 | 7 | """ 8 | from alembic import op 9 | import sqlalchemy as sa 10 | import sqlalchemy_utc 11 | 12 | 13 | # revision identifiers, used by Alembic. 14 | revision = '13e4908529d2' 15 | down_revision = 'd2bbfaeeb7d9' 16 | branch_labels = None 17 | depends_on = None 18 | 19 | 20 | def upgrade(): 21 | # ### commands auto generated by Alembic - please adjust! ### 22 | op.add_column('office', sa.Column('telephone', sa.String(length=20), nullable=True)) 23 | # ### end Alembic commands ### 24 | 25 | 26 | def downgrade(): 27 | # ### commands auto generated by Alembic - please adjust! ### 28 | op.drop_column('office', 'telephone') 29 | # ### end Alembic commands ### 30 | -------------------------------------------------------------------------------- /api/migrations/versions/198b2c9110b9_.py: -------------------------------------------------------------------------------- 1 | """empty message 2 | 3 | Revision ID: 198b2c9110b9 4 | Revises: c25c4ee67df6 5 | Create Date: 2020-11-27 10:21:22.200304 6 | 7 | """ 8 | from alembic import op 9 | import sqlalchemy as sa 10 | import sqlalchemy_utc 11 | 12 | 13 | # revision identifiers, used by Alembic. 14 | revision = '198b2c9110b9' 15 | down_revision = 'c25c4ee67df6' 16 | branch_labels = None 17 | depends_on = None 18 | 19 | 20 | def upgrade(): 21 | # ### commands auto generated by Alembic - please adjust! ### 22 | op.add_column('service', sa.Column('css_colour', sa.String(length=50), nullable=True)) 23 | # ### end Alembic commands ### 24 | 25 | 26 | def downgrade(): 27 | # ### commands auto generated by Alembic - please adjust! ### 28 | op.drop_column('service', 'css_colour') 29 | # ### end Alembic commands ### 30 | -------------------------------------------------------------------------------- /api/migrations/versions/34df859d1d05_.py: -------------------------------------------------------------------------------- 1 | """empty message 2 | 3 | Revision ID: 34df859d1d05 4 | Revises: 71486b5dce97 5 | Create Date: 2020-12-08 12:05:35.868123 6 | 7 | """ 8 | from alembic import op 9 | import sqlalchemy as sa 10 | import sqlalchemy_utc 11 | 12 | 13 | # revision identifiers, used by Alembic. 14 | revision = '34df859d1d05' 15 | down_revision = '71486b5dce97' 16 | branch_labels = None 17 | depends_on = None 18 | 19 | 20 | def upgrade(): 21 | # ### commands auto generated by Alembic - please adjust! ### 22 | op.add_column('office', sa.Column('soonest_appointment', sa.Integer(), nullable=True)) 23 | # ### end Alembic commands ### 24 | 25 | 26 | def downgrade(): 27 | # ### commands auto generated by Alembic - please adjust! ### 28 | op.drop_column('office', 'soonest_appointment') 29 | # ### end Alembic commands ### 30 | -------------------------------------------------------------------------------- /api/migrations/versions/44c03a3c8a83_.py: -------------------------------------------------------------------------------- 1 | """empty message 2 | 3 | Revision ID: 44c03a3c8a83 4 | Revises: ca3161acb1d3 5 | Create Date: 2019-11-11 15:41:43.558756 6 | 7 | """ 8 | from alembic import op 9 | import sqlalchemy as sa 10 | import sqlalchemy_utc 11 | 12 | 13 | # revision identifiers, used by Alembic. 14 | revision = '44c03a3c8a83' 15 | down_revision = 'ca3161acb1d3' 16 | branch_labels = None 17 | depends_on = None 18 | 19 | 20 | def upgrade(): 21 | # ### commands auto generated by Alembic - please adjust! ### 22 | op.add_column('exam', sa.Column('upload_received_ind', sa.Integer(), nullable=True)) 23 | # ### end Alembic commands ### 24 | 25 | 26 | def downgrade(): 27 | # ### commands auto generated by Alembic - please adjust! ### 28 | op.drop_column('exam', 'upload_received_ind') 29 | # ### end Alembic commands ### 30 | -------------------------------------------------------------------------------- /api/migrations/versions/641db6e01015_.py: -------------------------------------------------------------------------------- 1 | """empty message 2 | 3 | Revision ID: 641db6e01015 4 | Revises: 65c4064116f4 5 | Create Date: 2020-10-21 13:36:17.682423 6 | 7 | """ 8 | from alembic import op 9 | import sqlalchemy as sa 10 | import sqlalchemy_utc 11 | 12 | 13 | # revision identifiers, used by Alembic. 14 | revision = '641db6e01015' 15 | down_revision = '65c4064116f4' 16 | branch_labels = None 17 | depends_on = None 18 | 19 | 20 | def upgrade(): 21 | # ### commands auto generated by Alembic - please adjust! ### 22 | op.add_column('appointment', sa.Column('created_at', sqlalchemy_utc.sqltypes.UtcDateTime(timezone=True), nullable=True)) 23 | # ### end Alembic commands ### 24 | 25 | 26 | def downgrade(): 27 | # ### commands auto generated by Alembic - please adjust! ### 28 | op.drop_column('appointment', 'created_at') 29 | # ### end Alembic commands ### 30 | -------------------------------------------------------------------------------- /api/migrations/versions/65c4064116f4_.py: -------------------------------------------------------------------------------- 1 | """empty message 2 | 3 | Revision ID: 65c4064116f4 4 | Revises: f78833b67a10 5 | Create Date: 2020-10-21 08:45:51.779155 6 | 7 | """ 8 | from alembic import op 9 | import sqlalchemy as sa 10 | import sqlalchemy_utc 11 | 12 | 13 | # revision identifiers, used by Alembic. 14 | revision = '65c4064116f4' 15 | down_revision = 'f78833b67a10' 16 | branch_labels = None 17 | depends_on = None 18 | 19 | 20 | def upgrade(): 21 | # ### commands auto generated by Alembic - please adjust! ### 22 | op.add_column('appointment', sa.Column('is_draft', sa.Boolean(), nullable=True)) 23 | # ### end Alembic commands ### 24 | 25 | 26 | def downgrade(): 27 | # ### commands auto generated by Alembic - please adjust! ### 28 | op.drop_column('appointment', 'is_draft') 29 | # ### end Alembic commands ### 30 | -------------------------------------------------------------------------------- /api/migrations/versions/7564bc97ed99_.py: -------------------------------------------------------------------------------- 1 | """empty message 2 | 3 | Revision ID: 7564bc97ed99 4 | Revises: 92cd814a5c05 5 | Create Date: 2019-11-11 13:11:55.384979 6 | 7 | """ 8 | from alembic import op 9 | import sqlalchemy as sa 10 | import sqlalchemy_utc 11 | 12 | 13 | # revision identifiers, used by Alembic. 14 | revision = '7564bc97ed99' 15 | down_revision = '47c80f6b0123' 16 | branch_labels = None 17 | depends_on = None 18 | 19 | 20 | def upgrade(): 21 | # ### commands auto generated by Alembic - please adjust! ### 22 | op.add_column('exam', sa.Column('bcmp_job_id', sa.String(length=100), nullable=True)) 23 | # ### end Alembic commands ### 24 | 25 | 26 | def downgrade(): 27 | # ### commands auto generated by Alembic - please adjust! ### 28 | op.drop_column('exam', 'bcmp_job_id') 29 | # ### end Alembic commands ### 30 | -------------------------------------------------------------------------------- /api/migrations/versions/89294ac623e8_.py: -------------------------------------------------------------------------------- 1 | """empty message 2 | 3 | Revision ID: 89294ac623e8 4 | Revises: 05301cda7812 5 | Create Date: 2020-04-01 19:42:56.383186 6 | 7 | """ 8 | from alembic import op 9 | import sqlalchemy as sa 10 | import sqlalchemy_utc 11 | 12 | 13 | # revision identifiers, used by Alembic. 14 | revision = '89294ac623e8' 15 | down_revision = '05301cda7812' 16 | branch_labels = None 17 | depends_on = None 18 | 19 | 20 | def upgrade(): 21 | op.add_column('exam', sa.Column('candidates_list', sa.JSON(), nullable=True)) 22 | op.add_column('exam', sa.Column('is_pesticide', sa.Integer(), nullable=True, default=0)) 23 | 24 | 25 | def downgrade(): 26 | op.drop_column('exam', 'candidates_list') 27 | op.drop_column('exam', 'is_pesticide') 28 | -------------------------------------------------------------------------------- /api/migrations/versions/8a939073b36f_.py: -------------------------------------------------------------------------------- 1 | """empty message 2 | 3 | Revision ID: 8a939073b36f 4 | Revises: 641db6e01015 5 | Create Date: 2020-11-23 11:23:52.231462 6 | 7 | """ 8 | from alembic import op 9 | import sqlalchemy as sa 10 | import sqlalchemy_utc 11 | 12 | 13 | # revision identifiers, used by Alembic. 14 | revision = '8a939073b36f' 15 | down_revision = '641db6e01015' 16 | branch_labels = None 17 | depends_on = None 18 | 19 | 20 | def upgrade(): 21 | # ### commands auto generated by Alembic - please adjust! ### 22 | op.add_column('service', sa.Column('email_paragraph', sa.String(length=2000), nullable=True)) 23 | # ### end Alembic commands ### 24 | 25 | 26 | def downgrade(): 27 | # ### commands auto generated by Alembic - please adjust! ### 28 | op.drop_column('service', 'email_paragraph') 29 | # ### end Alembic commands ### 30 | -------------------------------------------------------------------------------- /api/migrations/versions/ba295f379d0d_citizen_start_position_column_add.py: -------------------------------------------------------------------------------- 1 | """citizen start position column add 2 | 3 | Revision ID: ba295f379d0d 4 | Revises: d84abcbcf722 5 | Create Date: 2022-05-24 21:33:54.034171 6 | 7 | """ 8 | from alembic import op 9 | import sqlalchemy as sa 10 | import sqlalchemy_utc 11 | 12 | 13 | # revision identifiers, used by Alembic. 14 | revision = 'ba295f379d0d' 15 | down_revision = 'd84abcbcf722' 16 | branch_labels = None 17 | depends_on = None 18 | 19 | 20 | def upgrade(): 21 | # ### commands auto generated by Alembic - please adjust! ### 22 | op.add_column('citizen', sa.Column('start_position', sa.Integer(), nullable=True)) 23 | # ### end Alembic commands ### 24 | 25 | 26 | def downgrade(): 27 | # ### commands auto generated by Alembic - please adjust! ### 28 | op.drop_column('citizen', 'start_position') 29 | # ### end Alembic commands ### 30 | -------------------------------------------------------------------------------- /api/migrations/versions/c25c4ee67df6_.py: -------------------------------------------------------------------------------- 1 | """empty message 2 | 3 | Revision ID: c25c4ee67df6 4 | Revises: 8a939073b36f 5 | Create Date: 2020-11-23 12:38:56.311121 6 | 7 | """ 8 | from alembic import op 9 | import sqlalchemy as sa 10 | import sqlalchemy_utc 11 | 12 | 13 | # revision identifiers, used by Alembic. 14 | revision = 'c25c4ee67df6' 15 | down_revision = '8a939073b36f' 16 | branch_labels = None 17 | depends_on = None 18 | 19 | 20 | def upgrade(): 21 | # ### commands auto generated by Alembic - please adjust! ### 22 | op.add_column('office', sa.Column('office_email_paragraph', sa.String(length=2000), nullable=True)) 23 | # ### end Alembic commands ### 24 | 25 | 26 | def downgrade(): 27 | # ### commands auto generated by Alembic - please adjust! ### 28 | op.drop_column('office', 'office_email_paragraph') 29 | # ### end Alembic commands ### 30 | -------------------------------------------------------------------------------- /api/migrations/versions/ca2023cc8b00_.py: -------------------------------------------------------------------------------- 1 | """empty message 2 | 3 | Revision ID: ca2023cc8b00 4 | Revises: 198b2c9110b9 5 | Create Date: 2020-12-07 13:22:16.353600 6 | 7 | """ 8 | from alembic import op 9 | import sqlalchemy as sa 10 | import sqlalchemy_utc 11 | 12 | 13 | # revision identifiers, used by Alembic. 14 | revision = 'ca2023cc8b00' 15 | down_revision = '198b2c9110b9' 16 | branch_labels = None 17 | depends_on = None 18 | 19 | 20 | def upgrade(): 21 | # ### commands auto generated by Alembic - please adjust! ### 22 | op.add_column('service', sa.Column('external_map_link', sa.String(length=500), nullable=True)) 23 | # ### end Alembic commands ### 24 | 25 | 26 | def downgrade(): 27 | # ### commands auto generated by Alembic - please adjust! ### 28 | op.drop_column('service', 'external_map_link') 29 | # ### end Alembic commands ### 30 | -------------------------------------------------------------------------------- /api/migrations/versions/ca3161acb1d3_.py: -------------------------------------------------------------------------------- 1 | """empty message 2 | 3 | Revision ID: ca3161acb1d3 4 | Revises: 7564bc97ed99 5 | Create Date: 2019-11-11 15:35:01.305946 6 | 7 | """ 8 | from alembic import op 9 | import sqlalchemy as sa 10 | import sqlalchemy_utc 11 | 12 | 13 | # revision identifiers, used by Alembic. 14 | revision = 'ca3161acb1d3' 15 | down_revision = '7564bc97ed99' 16 | branch_labels = None 17 | depends_on = None 18 | 19 | 20 | def upgrade(): 21 | # ### commands auto generated by Alembic - please adjust! ### 22 | op.add_column('exam', sa.Column('exam_destroyed_date', sa.String(length=50), nullable=True)) 23 | # ### end Alembic commands ### 24 | 25 | 26 | def downgrade(): 27 | # ### commands auto generated by Alembic - please adjust! ### 28 | op.drop_column('exam', 'exam_destroyed_date') 29 | # ### end Alembic commands ### 30 | -------------------------------------------------------------------------------- /api/migrations/versions/d2bbfaeeb7d9_online_appointment_email_changes.py: -------------------------------------------------------------------------------- 1 | """online_appointment_email_changes 2 | 3 | Revision ID: d2bbfaeeb7d9 4 | Revises: fc3fd3bab5bc 5 | Create Date: 2020-04-27 11:55:55.265894 6 | 7 | """ 8 | from alembic import op 9 | import sqlalchemy as sa 10 | import sqlalchemy_utc 11 | 12 | 13 | # revision identifiers, used by Alembic. 14 | revision = 'd2bbfaeeb7d9' 15 | down_revision = 'fc3fd3bab5bc' 16 | branch_labels = None 17 | depends_on = None 18 | 19 | 20 | def upgrade(): 21 | # ### commands auto generated by Alembic - please adjust! ### 22 | op.add_column('publicuser', sa.Column('send_reminders', sa.Boolean(), nullable=True)) 23 | # ### end Alembic commands ### 24 | 25 | 26 | def downgrade(): 27 | # ### commands auto generated by Alembic - please adjust! ### 28 | op.drop_column('publicuser', 'send_reminders') 29 | # ### end Alembic commands ### 30 | -------------------------------------------------------------------------------- /api/migrations/versions/d84abcbcf722_.py: -------------------------------------------------------------------------------- 1 | """add_exam_type 2 | 3 | Revision ID: d84abcbcf722 4 | Revises: 4b4bac23d407 5 | Create Date: 2021-05-11 12:02:17.628186 6 | 7 | """ 8 | from alembic import op 9 | import sqlalchemy as sa 10 | import sqlalchemy_utc 11 | 12 | 13 | # revision identifiers, used by Alembic. 14 | revision = 'd84abcbcf722' 15 | down_revision = '4b4bac23d407' 16 | branch_labels = None 17 | depends_on = None 18 | 19 | 20 | def upgrade(): 21 | # ### commands auto generated by Alembic - please adjust! ### 22 | op.add_column('examtype', sa.Column('deleted', sa.DateTime(), nullable=True)) 23 | # ### end Alembic commands ### 24 | 25 | 26 | def downgrade(): 27 | # ### commands auto generated by Alembic - please adjust! ### 28 | op.drop_column('examtype', 'deleted') 29 | # ### end Alembic commands ### 30 | -------------------------------------------------------------------------------- /api/migrations/versions/fc3fd3bab5bc_adding_office_address.py: -------------------------------------------------------------------------------- 1 | """adding_office_address 2 | 3 | Revision ID: fc3fd3bab5bc 4 | Revises: d195a426f111 5 | Create Date: 2020-04-25 22:09:36.415006 6 | 7 | """ 8 | from alembic import op 9 | import sqlalchemy as sa 10 | import sqlalchemy_utc 11 | 12 | 13 | # revision identifiers, used by Alembic. 14 | revision = 'fc3fd3bab5bc' 15 | down_revision = 'd195a426f111' 16 | branch_labels = None 17 | depends_on = None 18 | 19 | 20 | def upgrade(): 21 | # ### commands auto generated by Alembic - please adjust! ### 22 | op.add_column('office', sa.Column('civic_address', sa.String(length=200), nullable=True)) 23 | # ### end Alembic commands ### 24 | 25 | 26 | def downgrade(): 27 | # ### commands auto generated by Alembic - please adjust! ### 28 | op.drop_column('office', 'civic_address') 29 | # ### end Alembic commands ### 30 | -------------------------------------------------------------------------------- /api/requirements_dev.txt: -------------------------------------------------------------------------------- 1 | # Copyright 2022 Province of British Columbia 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); you may not 4 | # use this file except in compliance with the License. You may obtain a copy of 5 | # the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12 | # License for the specific language governing permissions and limitations under 13 | # the License. 14 | 15 | # Requirements for dev: everything deployed plus dev tools. 16 | 17 | -r requirements.txt 18 | pylint==2.7.2 19 | -------------------------------------------------------------------------------- /api/version.py: -------------------------------------------------------------------------------- 1 | __version__ = '1.1.7' -------------------------------------------------------------------------------- /api/videos/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": { 3 | "url": "/static/videos/sbc.mp4", 4 | "updated": "2019-09-03T14:19:06.419Z" 5 | }, 6 | "888": { 7 | "url": "/static/videos/sbc.mp4", 8 | "updated": "2019-09-03T13:28:06.419Z" 9 | }, 10 | "999": { 11 | "url": "/static/videos/Test.mp4", 12 | "updated": "2019-09-16T16:16:06.419Z" 13 | }, 14 | "61": { 15 | "url": "/static/videos/Victoria.mp4", 16 | "updated": "2019-09-17T13:47:06.419Z" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /api/wsgi.py: -------------------------------------------------------------------------------- 1 | import eventlet 2 | 3 | #Monkey patch to allow for async actions (aka multiple workers) 4 | eventlet.monkey_patch() 5 | 6 | from qsystem import application, socketio 7 | 8 | if __name__ == "__main__": 9 | print("Starting socketio app with debug=" + application.config['REDIS_DEBUG']) 10 | socketio.run(application, debug=True) 11 | -------------------------------------------------------------------------------- /appointment-frontend/.dockerignore: -------------------------------------------------------------------------------- 1 | **/node_modules 2 | **/dist 3 | -------------------------------------------------------------------------------- /appointment-frontend/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | node: true 5 | }, 6 | 'extends': [ 7 | 'plugin:vue/essential', 8 | '@vue/standard', 9 | '@vue/typescript' 10 | ], 11 | rules: { 12 | strict: 'off', 13 | 'no-console': 'warn', 14 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', 15 | 'sort-imports': 'error', 16 | 'space-before-function-paren': 1, 17 | 'prefer-const': 'warn', 18 | 'dot-notation': 'off', 19 | 'no-unused-vars': 'off', 20 | 'quote-props': 'off', 21 | 'prefer-rest-params': 'off', 22 | 'dot-notation': 'off', 23 | 'no-prototype-builtins': 'off', 24 | 'import/export': 'off', 25 | 'lines-between-class-members': 'warn', 26 | 'prefer-const': 'off' 27 | }, 28 | parserOptions: { 29 | parser: '@typescript-eslint/parser' 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /appointment-frontend/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM artifacts.developer.gov.bc.ca/docker-remote/node:14 as build-stage 2 | ENV VUE_APP_PATH=/ 3 | WORKDIR /app 4 | COPY ./package*.json ./ 5 | RUN npm install 6 | COPY . . 7 | RUN npm run build 8 | 9 | FROM artifacts.developer.gov.bc.ca/docker-remote/nginx:1.25.3 as production-stage 10 | COPY nginx.conf /etc/nginx/nginx.conf 11 | RUN mkdir /app 12 | COPY --from=build-stage /app/dist /app 13 | EXPOSE 8080:8080 14 | CMD ["nginx", "-g", "daemon off;"] -------------------------------------------------------------------------------- /appointment-frontend/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'presets': [ 3 | [ 4 | '@vue/cli-plugin-babel/preset', 5 | { 6 | 'useBuiltIns': 'entry', 7 | 'targets': { 8 | 'ie': '11' 9 | } 10 | } 11 | ] 12 | ], 13 | 'compact': true 14 | } 15 | -------------------------------------------------------------------------------- /appointment-frontend/cypress/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "cypress/globals": true 4 | }, 5 | "plugins": [ 6 | "cypress" 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /appointment-frontend/cypress/fixtures/users/appointments.json: -------------------------------------------------------------------------------- 1 | { 2 | "appointments": [] 3 | } 4 | -------------------------------------------------------------------------------- /appointment-frontend/cypress/fixtures/users/id=12706: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "display_name": "Walter Moar", 4 | "email": "walter.moar@gov.bc.ca", 5 | "last_name": null, 6 | "send_email_reminders": true, 7 | "send_sms_reminders": true, 8 | "telephone": "604-123-1234", 9 | "user_id": 12706, 10 | "username": "basic_walter@bceid" 11 | } 12 | ] 13 | -------------------------------------------------------------------------------- /appointment-frontend/cypress/fixtures/users/me.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "display_name": "Walter Moar", 4 | "email": "walter.moar@gov.bc.ca", 5 | "last_name": null, 6 | "send_email_reminders": false, 7 | "send_sms_reminders": true, 8 | "telephone": "381", 9 | "user_id": 12706, 10 | "username": "basic_walter@bceid" 11 | } 12 | ] 13 | -------------------------------------------------------------------------------- /appointment-frontend/cypress/snapshots/image_snapshot/account_settings_update.cy.ts/Account Settings -- Update User.snap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/cypress/snapshots/image_snapshot/account_settings_update.cy.ts/Account Settings -- Update User.snap.png -------------------------------------------------------------------------------- /appointment-frontend/cypress/snapshots/image_snapshot/account_settings_update.cy.ts/Account Settings -- page loaded.snap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/cypress/snapshots/image_snapshot/account_settings_update.cy.ts/Account Settings -- page loaded.snap.png -------------------------------------------------------------------------------- /appointment-frontend/cypress/snapshots/image_snapshot/appointment_cancel.cy.ts/Cancel Appointment -- Cancel Appointment.snap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/cypress/snapshots/image_snapshot/appointment_cancel.cy.ts/Cancel Appointment -- Cancel Appointment.snap.png -------------------------------------------------------------------------------- /appointment-frontend/cypress/snapshots/image_snapshot/appointment_cancel.cy.ts/Cancel Appointment -- page loaded.snap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/cypress/snapshots/image_snapshot/appointment_cancel.cy.ts/Cancel Appointment -- page loaded.snap.png -------------------------------------------------------------------------------- /appointment-frontend/cypress/snapshots/image_snapshot/appointment_change.cy.ts/Change Appointment -- Change Appointment.snap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/cypress/snapshots/image_snapshot/appointment_change.cy.ts/Change Appointment -- Change Appointment.snap.png -------------------------------------------------------------------------------- /appointment-frontend/cypress/snapshots/image_snapshot/appointment_change.cy.ts/Change Appointment -- page loaded.snap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/cypress/snapshots/image_snapshot/appointment_change.cy.ts/Change Appointment -- page loaded.snap.png -------------------------------------------------------------------------------- /appointment-frontend/cypress/snapshots/image_snapshot/step1.cy.ts/step 1 -- office selected.snap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/cypress/snapshots/image_snapshot/step1.cy.ts/step 1 -- office selected.snap.png -------------------------------------------------------------------------------- /appointment-frontend/cypress/snapshots/image_snapshot/step1.cy.ts/step 1 -- page loaded.snap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/cypress/snapshots/image_snapshot/step1.cy.ts/step 1 -- page loaded.snap.png -------------------------------------------------------------------------------- /appointment-frontend/cypress/snapshots/image_snapshot/step1.cy.ts/step 1 -- services popup.snap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/cypress/snapshots/image_snapshot/step1.cy.ts/step 1 -- services popup.snap.png -------------------------------------------------------------------------------- /appointment-frontend/cypress/snapshots/image_snapshot/step2.cy.ts/step 2 -- page loaded.snap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/cypress/snapshots/image_snapshot/step2.cy.ts/step 2 -- page loaded.snap.png -------------------------------------------------------------------------------- /appointment-frontend/cypress/snapshots/image_snapshot/step2.cy.ts/step 2 -- service selected.snap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/cypress/snapshots/image_snapshot/step2.cy.ts/step 2 -- service selected.snap.png -------------------------------------------------------------------------------- /appointment-frontend/cypress/snapshots/image_snapshot/step3.cy.ts/step 3 -- page loaded.snap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/cypress/snapshots/image_snapshot/step3.cy.ts/step 3 -- page loaded.snap.png -------------------------------------------------------------------------------- /appointment-frontend/cypress/snapshots/image_snapshot/step5.cy.ts/step 5 -- confirm clicked.snap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/cypress/snapshots/image_snapshot/step5.cy.ts/step 5 -- confirm clicked.snap.png -------------------------------------------------------------------------------- /appointment-frontend/cypress/snapshots/image_snapshot/step5.cy.ts/step 5 -- consent checked.snap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/cypress/snapshots/image_snapshot/step5.cy.ts/step 5 -- consent checked.snap.png -------------------------------------------------------------------------------- /appointment-frontend/cypress/snapshots/image_snapshot/step5.cy.ts/step 5 -- page loaded.snap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/cypress/snapshots/image_snapshot/step5.cy.ts/step 5 -- page loaded.snap.png -------------------------------------------------------------------------------- /appointment-frontend/cypress/support/e2e.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Province of British Columbia 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); you may not 4 | // use this file except in compliance with the License. You may obtain a copy of 5 | // the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11 | // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12 | // License for the specific language governing permissions and limitations under 13 | // the License. 14 | 15 | // Entry point for Cypress, set with the 'supportFile' configuration option. 16 | 17 | // Import custom commands. 18 | 19 | import './commands' 20 | 21 | export const API_PREFIX = 'http://localhost:5000/api/v1/' 22 | -------------------------------------------------------------------------------- /appointment-frontend/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | preset: '@vue/cli-plugin-unit-jest/presets/typescript-and-babel' 3 | } 4 | -------------------------------------------------------------------------------- /appointment-frontend/public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/public/favicon.png -------------------------------------------------------------------------------- /appointment-frontend/public/img/icons/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/public/img/icons/android-chrome-192x192.png -------------------------------------------------------------------------------- /appointment-frontend/public/img/icons/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/public/img/icons/android-chrome-512x512.png -------------------------------------------------------------------------------- /appointment-frontend/public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: / 3 | -------------------------------------------------------------------------------- /appointment-frontend/src/assets/fonts/BCSans/BCSans-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/fonts/BCSans/BCSans-Bold.woff -------------------------------------------------------------------------------- /appointment-frontend/src/assets/fonts/BCSans/BCSans-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/fonts/BCSans/BCSans-Bold.woff2 -------------------------------------------------------------------------------- /appointment-frontend/src/assets/fonts/BCSans/BCSans-BoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/fonts/BCSans/BCSans-BoldItalic.woff -------------------------------------------------------------------------------- /appointment-frontend/src/assets/fonts/BCSans/BCSans-BoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/fonts/BCSans/BCSans-BoldItalic.woff2 -------------------------------------------------------------------------------- /appointment-frontend/src/assets/fonts/BCSans/BCSans-Italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/fonts/BCSans/BCSans-Italic.woff -------------------------------------------------------------------------------- /appointment-frontend/src/assets/fonts/BCSans/BCSans-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/fonts/BCSans/BCSans-Italic.woff2 -------------------------------------------------------------------------------- /appointment-frontend/src/assets/fonts/BCSans/BCSans-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/fonts/BCSans/BCSans-Regular.woff -------------------------------------------------------------------------------- /appointment-frontend/src/assets/fonts/BCSans/BCSans-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/fonts/BCSans/BCSans-Regular.woff2 -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/BCServicesCard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/BCServicesCard.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/bceid_logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/bceid_logo.jpg -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/bceid_logo_sm.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/bceid_logo_sm.jpg -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/gov3_bc_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/gov3_bc_logo.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/gov3_bc_logo_mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/gov3_bc_logo_mobile.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/1.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/10.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/11.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/12.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/13.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/14.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/15.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/16.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/17.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/18.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/19.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/2.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/23.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/25.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/3.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/30.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/31.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/32.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/33.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/35.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/36.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/37.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/38.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/39.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/40.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/41.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/42.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/43.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/45.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/46.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/46.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/47.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/48.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/50.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/51.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/55.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/56.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/56.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/60.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/61.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/61.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/64.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/65.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/65.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/66.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/66.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/67.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/67.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/68.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/68.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/69.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/69.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/70.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/73.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/73.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/75.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/75.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/8.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/80.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/81.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/81.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/82.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/82.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/83.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/83.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/84.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/84.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/85.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/85.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/86.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/86.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/87.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/88.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/88.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/89.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/89.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/90.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/90.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/91.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/91.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/92.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/92.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/93.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/93.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/94.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/94.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/95.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/95.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/97.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/97.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemaps/999.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemaps/999.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/100milehouse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/100milehouse.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/ashcroft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/ashcroft.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/atlin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/atlin.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/bellacoola.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/bellacoola.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/burnaby.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/burnaby.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/burnslake.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/burnslake.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/campbellriver.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/campbellriver.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/chetwynd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/chetwynd.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/chilliwack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/chilliwack.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/clinton.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/clinton.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/courtenay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/courtenay.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/cranbrook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/cranbrook.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/creston.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/creston.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/dawsoncreek.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/dawsoncreek.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/deaselake.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/deaselake.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/duncan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/duncan.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/fernie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/fernie.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/fortnelson.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/fortnelson.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/fortstjames.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/fortstjames.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/fortstjohn.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/fortstjohn.PNG -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/ganges.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/ganges.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/golden.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/golden.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/grandforks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/grandforks.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/hazelton.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/hazelton.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/houston.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/houston.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/invermere.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/invermere.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/kamloops.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/kamloops.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/kaslo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/kaslo.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/kelowna.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/kelowna.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/kitimat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/kitimat.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/lillooet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/lillooet.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/mackenzie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/mackenzie.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/mapleridge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/mapleridge.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/masset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/masset.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/merritt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/merritt.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/nakusp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/nakusp.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/nanaimo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/nanaimo.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/nelson.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/nelson.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/oliver.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/oliver.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/penticton.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/penticton.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/portalberni.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/portalberni.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/porthardy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/porthardy.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/powellriver.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/powellriver.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/princegeorge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/princegeorge.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/princerupert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/princerupert.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/princeton.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/princeton.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/queencharlotte.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/queencharlotte.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/quesnel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/quesnel.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/revelstoke.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/revelstoke.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/salmonarm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/salmonarm.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/sechelt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/sechelt.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/smithers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/smithers.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/sparwood.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/sparwood.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/squamish.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/squamish.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/stewart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/stewart.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/surrey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/surrey.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/terrace.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/terrace.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/trail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/trail.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/ucluelet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/ucluelet.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/valemount.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/valemount.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/vancouver.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/vancouver.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/vanderhoof.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/vanderhoof.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/vernon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/vernon.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/victoria.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/victoria.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/officemapsorig/williamslake.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/officemapsorig/williamslake.png -------------------------------------------------------------------------------- /appointment-frontend/src/assets/img/service_bc.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/img/service_bc.jpg -------------------------------------------------------------------------------- /appointment-frontend/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/assets/logo.png -------------------------------------------------------------------------------- /appointment-frontend/src/components/Home/index.ts: -------------------------------------------------------------------------------- 1 | import HelloWorld from '@/components/Home/HelloWorld.vue' 2 | 3 | export { 4 | HelloWorld 5 | } 6 | -------------------------------------------------------------------------------- /appointment-frontend/src/components/appointment/index.ts: -------------------------------------------------------------------------------- 1 | import AppointmentSummary from './AppointmentSummary.vue' 2 | import DateSelection from './DateSelection.vue' 3 | import LocationsList from './LocationsList.vue' 4 | import LoginToConfirm from './LoginToConfirm.vue' 5 | import ServiceSelection from './ServiceSelection.vue' 6 | 7 | export { 8 | AppointmentSummary, 9 | DateSelection, 10 | ServiceSelection, 11 | LocationsList, 12 | LoginToConfirm 13 | } 14 | -------------------------------------------------------------------------------- /appointment-frontend/src/components/common/LoadingScreen.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 20 | 21 | 34 | -------------------------------------------------------------------------------- /appointment-frontend/src/components/common/ResourceExample.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | Welcome {{name}} 4 | This is your message: {{message}} 5 | 6 | 7 | 8 | 20 | 21 | 24 | -------------------------------------------------------------------------------- /appointment-frontend/src/components/common/index.ts: -------------------------------------------------------------------------------- 1 | import AppFooter from './AppFooter.vue' 2 | import AppHeader from './AppHeader.vue' 3 | import LoadingScreen from './LoadingScreen.vue' 4 | import NoEmailAlert from './NoEmailAlert.vue' 5 | import ResourceExample from './ResourceExample.vue' 6 | 7 | export { 8 | ResourceExample, 9 | AppFooter, 10 | AppHeader, 11 | LoadingScreen, 12 | NoEmailAlert 13 | } 14 | -------------------------------------------------------------------------------- /appointment-frontend/src/components/feedback/index.ts: -------------------------------------------------------------------------------- 1 | import Feedback from './Feedback.vue' 2 | 3 | export { 4 | Feedback 5 | } 6 | -------------------------------------------------------------------------------- /appointment-frontend/src/enums/index.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/enums/index.ts -------------------------------------------------------------------------------- /appointment-frontend/src/events/locationBus.ts: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | 3 | export enum locationBusEvents { 4 | ClosestLocationEvent = 'closest_location_event', 5 | } 6 | 7 | export const locationBus = new Vue() 8 | -------------------------------------------------------------------------------- /appointment-frontend/src/interfaces/action-interface.ts: -------------------------------------------------------------------------------- 1 | import { ActionContext } from 'vuex' 2 | 3 | // Interface to define a Vuex Action 4 | export interface ActionIF { 5 | (x: ActionContext, y: any): void 6 | } 7 | 8 | export interface ActionBindingIF { 9 | (x: any): void 10 | } 11 | -------------------------------------------------------------------------------- /appointment-frontend/src/interfaces/index.ts: -------------------------------------------------------------------------------- 1 | export * from './resource-interface' 2 | export * from './state-interface' 3 | export * from './action-interface' 4 | -------------------------------------------------------------------------------- /appointment-frontend/src/interfaces/resource-interface.ts: -------------------------------------------------------------------------------- 1 | // Interface to define the resource model example 2 | export interface ResourceExampleIF { 3 | id: number, 4 | displayName: string, 5 | message: string 6 | } 7 | -------------------------------------------------------------------------------- /appointment-frontend/src/interfaces/state-interface.ts: -------------------------------------------------------------------------------- 1 | // Interface to define the state model example 2 | export interface StateModelIF { 3 | stateText: string | undefined 4 | } 5 | -------------------------------------------------------------------------------- /appointment-frontend/src/locales/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "message": "hello i18n !!" 3 | } 4 | -------------------------------------------------------------------------------- /appointment-frontend/src/locales/fr.json: -------------------------------------------------------------------------------- 1 | { 2 | "message": "Hello French i18n !!", 3 | "test": "French" 4 | } 5 | -------------------------------------------------------------------------------- /appointment-frontend/src/mixins/StepperMixin.vue: -------------------------------------------------------------------------------- 1 | 12 | -------------------------------------------------------------------------------- /appointment-frontend/src/mixins/common-mixin.ts: -------------------------------------------------------------------------------- 1 | import { Component, Vue } from 'vue-property-decorator' 2 | 3 | /** 4 | * Mixin that provides some useful common utilities. 5 | */ 6 | @Component 7 | export default class CommonMixin extends Vue { 8 | /** 9 | * This is an example mixin that will return a msg. 10 | * 11 | * @param msg The msg to return. 12 | */ 13 | sendMsg (msg: string): string { 14 | return msg ? `${msg} - msg created by sendMsg mixin` : 'Error, no Message' 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /appointment-frontend/src/mixins/index.ts: -------------------------------------------------------------------------------- 1 | import CommonMixin from './common-mixin' 2 | import ResourceLookupMixin from '@/mixins/resource-lookup-mixin' 3 | 4 | export { 5 | CommonMixin, 6 | ResourceLookupMixin 7 | } 8 | -------------------------------------------------------------------------------- /appointment-frontend/src/models/KCUserProfile.ts: -------------------------------------------------------------------------------- 1 | export interface KCUserProfile { 2 | lastName: string; 3 | firstName: string; 4 | keycloakGuid: string; 5 | userName: string; 6 | roles: string[]; 7 | email: string; 8 | fullName: string; 9 | loginSource: string; 10 | displayName: string; 11 | } 12 | -------------------------------------------------------------------------------- /appointment-frontend/src/models/geo.ts: -------------------------------------------------------------------------------- 1 | export interface LatLng { 2 | latitude: number, 3 | longitude: number 4 | } 5 | 6 | export interface GeolocatorSuccess { 7 | coords: LatLng 8 | } 9 | -------------------------------------------------------------------------------- /appointment-frontend/src/models/global.ts: -------------------------------------------------------------------------------- 1 | export interface EmptyResponse {} 2 | -------------------------------------------------------------------------------- /appointment-frontend/src/models/service.ts: -------------------------------------------------------------------------------- 1 | export interface ServiceParent { 2 | serviceName: string 3 | } 4 | 5 | export interface Service { 6 | actualServiceInd: number 7 | deleted: string 8 | displayDashboardInd: number 9 | externalServiceName: string 10 | isDlkt: boolean 11 | onlineAvailability: string 12 | onlineLink: string 13 | parentId: number 14 | parent?: ServiceParent 15 | prefix: string 16 | serviceCode: string 17 | serviceDesc: string 18 | serviceId: number 19 | serviceName: string 20 | } 21 | 22 | export interface Services { 23 | services: Service[] 24 | } 25 | 26 | export interface Categories { 27 | categories: Service[] 28 | } 29 | -------------------------------------------------------------------------------- /appointment-frontend/src/models/user.ts: -------------------------------------------------------------------------------- 1 | export interface User { 2 | displayName: string 3 | email: string 4 | lastName: string 5 | telephone: string 6 | userId: number 7 | username: string 8 | sendEmailReminders: boolean 9 | sendSmsReminders: boolean 10 | } 11 | 12 | export interface UserUpdateBody { 13 | email: string 14 | telephone: string 15 | sendEmailReminders: boolean 16 | sendSmsReminders: boolean 17 | } 18 | -------------------------------------------------------------------------------- /appointment-frontend/src/models/walkin.ts: -------------------------------------------------------------------------------- 1 | export interface WalkinQModel{ 2 | ticketNumber: string, 3 | walkinUniqueId:string, 4 | startTime:string, 5 | } 6 | -------------------------------------------------------------------------------- /appointment-frontend/src/resources/externalResourceExample.ts: -------------------------------------------------------------------------------- 1 | export const ExternalResource = [ 2 | { 3 | id: 1, 4 | displayName: 'Cameron', 5 | message: 'Hola, Como Estas?' 6 | }, 7 | { 8 | id: 2, 9 | displayName: 'Bob', 10 | message: 'Muy bien, gracias. Y tu?' 11 | } 12 | ] 13 | -------------------------------------------------------------------------------- /appointment-frontend/src/resources/index.ts: -------------------------------------------------------------------------------- 1 | export * from './externalResourceExample' 2 | -------------------------------------------------------------------------------- /appointment-frontend/src/services/feedback.service.ts: -------------------------------------------------------------------------------- 1 | import Axios, { AxiosResponse } from 'axios' 2 | import ConfigHelper from '@/utils/config-helper' 3 | import { FeedbackRequestObject } from '@/models/feedback' 4 | import { addAxiosInterceptors } from '@/utils/interceptors' 5 | const axios = addAxiosInterceptors(Axios.create()) 6 | 7 | export default class FeedbackService { 8 | public static async submitFeedback (feedbackBody: FeedbackRequestObject): Promise> { 9 | return axios.post(`${ConfigHelper.getFeedbackURL()}/feedback`, feedbackBody) 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /appointment-frontend/src/services/user.services.ts: -------------------------------------------------------------------------------- 1 | import Axios, { AxiosResponse } from 'axios' 2 | import ConfigHelper from '@/utils/config-helper' 3 | import { User } from '@/models/user' 4 | import { addAxiosInterceptors } from '@/utils/interceptors' 5 | 6 | const axios = addAxiosInterceptors(Axios.create()) 7 | 8 | export default class UserService { 9 | public static async getUser (): Promise> { 10 | return axios.get(`${ConfigHelper.getAppAPIUrl()}/users/me/`) 11 | } 12 | 13 | public static async createUser (): Promise> { 14 | return axios.post(`${ConfigHelper.getAppAPIUrl()}/users/`, {}) 15 | } 16 | 17 | public static async updateUser (userId: number, updateBody): Promise> { 18 | return axios.put(`${ConfigHelper.getAppAPIUrl()}/users/${userId}/`, updateBody) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /appointment-frontend/src/services/walkin.service.ts: -------------------------------------------------------------------------------- 1 | import Axios, { AxiosResponse } from 'axios' 2 | import ConfigHelper from '@/utils/config-helper' 3 | import { WalkinQModel } from '@/models/walkin' 4 | import { addAxiosInterceptors } from '@/utils/interceptors' 5 | const axios = addAxiosInterceptors(Axios.create()) 6 | 7 | export default class WalkinService { 8 | public static async getWalkin (walkinUniqueId: string): Promise> { 9 | return axios.get(`${ConfigHelper.getAppAPIUrl()}/citizen/all-walkin/${walkinUniqueId}/`) 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /appointment-frontend/src/shims-tsx.d.ts: -------------------------------------------------------------------------------- 1 | import Vue, { VNode } from 'vue' 2 | 3 | declare global { 4 | namespace JSX { 5 | // tslint:disable no-empty-interface 6 | interface Element extends VNode {} 7 | // tslint:disable no-empty-interface 8 | interface ElementClass extends Vue {} 9 | interface IntrinsicElements { 10 | [elem: string]: any; 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /appointment-frontend/src/shims-vue.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.vue' { 2 | import Vue from 'vue' 3 | export default Vue 4 | } 5 | -------------------------------------------------------------------------------- /appointment-frontend/src/store/actions/actions-model.ts: -------------------------------------------------------------------------------- 1 | import { ActionIF } from '@/interfaces/action-interface' 2 | 3 | export const setName: ActionIF = ({ commit }, name): void => { 4 | commit('mutateName', name) 5 | } 6 | 7 | export const setResource: ActionIF = ({ commit }, resource): void => { 8 | commit('mutateResource', resource) 9 | } 10 | -------------------------------------------------------------------------------- /appointment-frontend/src/store/actions/index.ts: -------------------------------------------------------------------------------- 1 | export * from './actions-model' 2 | -------------------------------------------------------------------------------- /appointment-frontend/src/store/getters/index.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/appointment-frontend/src/store/getters/index.ts -------------------------------------------------------------------------------- /appointment-frontend/src/store/modules/index.ts: -------------------------------------------------------------------------------- 1 | import AccountModule from './account' 2 | import AppointmentModule from './appointment' 3 | import AuthModule from './auth' 4 | import GeoModule from './geo' 5 | import OfficeModule from './office' 6 | import WalkinModule from './walkin' 7 | 8 | export { 9 | AccountModule, 10 | AppointmentModule, 11 | AuthModule, 12 | GeoModule, 13 | OfficeModule, 14 | WalkinModule 15 | } 16 | -------------------------------------------------------------------------------- /appointment-frontend/src/store/modules/walkin.ts: -------------------------------------------------------------------------------- 1 | import { Action, Module, Mutation, VuexModule } from 'vuex-module-decorators' 2 | import { WalkinQModel } from '@/models/walkin' 3 | import WalkinService from '@/services/walkin.service' 4 | 5 | @Module({ 6 | name: 'walkin', 7 | namespaced: true 8 | }) 9 | export default class WalkinModule extends VuexModule { 10 | walkinList: WalkinQModel[] = [] 11 | 12 | /** 13 | Mutations in this Module 14 | **/ 15 | 16 | @Mutation 17 | public setwalkinList (walkinList: any) { 18 | this.walkinList = walkinList 19 | } 20 | /** 21 | Actions in this Module 22 | **/ 23 | 24 | @Action({ rawError: true }) 25 | public async getAllWalkin (walkinUniqueId: string) { 26 | const response = await WalkinService.getWalkin(walkinUniqueId) 27 | return response || {} 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /appointment-frontend/src/store/mutations/index.ts: -------------------------------------------------------------------------------- 1 | export * from './mutations-model' 2 | -------------------------------------------------------------------------------- /appointment-frontend/src/store/mutations/mutations-model.ts: -------------------------------------------------------------------------------- 1 | export const mutateName = (state: any, name: string) => { 2 | state.stateModel.stateText = name 3 | } 4 | 5 | export const mutateResource = (state: any, resource: object) => { 6 | state.resourceModel = resource 7 | } 8 | -------------------------------------------------------------------------------- /appointment-frontend/src/store/state/index.ts: -------------------------------------------------------------------------------- 1 | export * from './state-model' 2 | export * from './resource-model' 3 | -------------------------------------------------------------------------------- /appointment-frontend/src/store/state/resource-model.ts: -------------------------------------------------------------------------------- 1 | import { ResourceExampleIF } from '@/interfaces' 2 | 3 | export const resourceModel: Array = [ 4 | { 5 | id: 1, 6 | displayName: '', 7 | message: 'If you are reading this... my ACTIONS didnt work :(' 8 | }, 9 | { 10 | id: 2, 11 | displayName: '', 12 | message: 'You should never see this text!' 13 | } 14 | ] 15 | -------------------------------------------------------------------------------- /appointment-frontend/src/store/state/state-model.ts: -------------------------------------------------------------------------------- 1 | import { StateModelIF } from '@/interfaces' 2 | 3 | export const stateModel: StateModelIF = { 4 | stateText: 'Base State Text' 5 | } 6 | -------------------------------------------------------------------------------- /appointment-frontend/src/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from './config-helper' 2 | export * from './constants' 3 | export * from './common-util' 4 | -------------------------------------------------------------------------------- /appointment-frontend/src/utils/interceptors.ts: -------------------------------------------------------------------------------- 1 | import { AxiosInstance } from 'axios' 2 | import ConfigHelper from './config-helper' 3 | import { SessionStorageKeys } from './constants' 4 | import humps from 'humps' 5 | 6 | export function addAxiosInterceptors (axiosInstance: AxiosInstance): AxiosInstance { 7 | axiosInstance.interceptors.request.use(config => { 8 | const token = ConfigHelper.getFromSession(SessionStorageKeys.KeyCloakToken) 9 | if (token) { 10 | config.headers.Authorization = `Bearer ${token}` 11 | } 12 | return { ...config, data: humps.decamelizeKeys(config.data) } 13 | }, 14 | err => { 15 | return Promise.reject(err) 16 | }) 17 | axiosInstance.interceptors.response.use( 18 | response => { 19 | return { ...response, data: humps.camelizeKeys(response.data) } 20 | }, 21 | error => Promise.reject(error) 22 | ) 23 | return axiosInstance 24 | } 25 | -------------------------------------------------------------------------------- /appointment-frontend/src/views/Home.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 22 | -------------------------------------------------------------------------------- /appointment-frontend/src/views/MixinExample.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | This is an about page that contains an example for a Mixin 4 | Testing Mixins: {{ sendMsg('My First Message')}} 5 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /appointment-frontend/src/views/SignoutView.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 28 | 29 | 32 | -------------------------------------------------------------------------------- /appointment-frontend/tests/unit/example.spec.ts: -------------------------------------------------------------------------------- 1 | import { shallowMount } from '@vue/test-utils' 2 | import { HelloWorld } from '@/components/Home' 3 | 4 | describe('HelloWorld.vue', () => { 5 | it('renders props.msg when passed', () => { 6 | const msg = 'new message' 7 | const wrapper = shallowMount(HelloWorld, { 8 | propsData: { msg } 9 | }) 10 | expect(wrapper.text()).toMatch(msg) 11 | }) 12 | }) 13 | -------------------------------------------------------------------------------- /documentation/Architecture/CFMS Data Dictionary V13.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/documentation/Architecture/CFMS Data Dictionary V13.docx -------------------------------------------------------------------------------- /documentation/Architecture/SbcCfmsLogicalV13.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/documentation/Architecture/SbcCfmsLogicalV13.pdf -------------------------------------------------------------------------------- /documentation/Architecture/SbcCfmsPhysicalV13.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/documentation/Architecture/SbcCfmsPhysicalV13.pdf -------------------------------------------------------------------------------- /documentation/DigitalSignage/Setup Instructions for Raspberry Pi Kiosk.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/documentation/DigitalSignage/Setup Instructions for Raspberry Pi Kiosk.docx -------------------------------------------------------------------------------- /documentation/Roadmap/Appointments/procurement/appointment_procurement.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/documentation/Roadmap/Appointments/procurement/appointment_procurement.docx -------------------------------------------------------------------------------- /documentation/demo-files/.env.appointments: -------------------------------------------------------------------------------- 1 | VUE_APP_PATH = / 2 | VUE_APP_GOOGLE_STATIC_MAP_API_KEY = replace_key_here 3 | VUE_APP_ROOT_API = http://localhost:8080/api/v1 4 | -------------------------------------------------------------------------------- /documentation/demo-files/keycloak.json: -------------------------------------------------------------------------------- 1 | { 2 | "realm": "registry", 3 | "auth-server-url": "http://localhost:8085/auth", 4 | "ssl-required": "external", 5 | "resource": "account", 6 | "credentials": { 7 | "secret": "5abdcb03-9dc6-4789-8c1f-8230c7d7cb79" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /feedback-api/.dockerignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/feedback-api/.dockerignore -------------------------------------------------------------------------------- /feedback-api/.s2i/environment: -------------------------------------------------------------------------------- 1 | APP_CONFIG=gunicorn_config.py 2 | -------------------------------------------------------------------------------- /feedback-api/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright © 2018 Province of British Columbia 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | -------------------------------------------------------------------------------- /feedback-api/MANIFEST.in: -------------------------------------------------------------------------------- 1 | include requirements/prod.txt 2 | include config.py 3 | include logging.conf 4 | include LICENSE 5 | include README.md 6 | include src/api/static/images/*.png 7 | include src/api/static/images/*.jpg -------------------------------------------------------------------------------- /feedback-api/README.md: -------------------------------------------------------------------------------- 1 | 2 | # Feedback API 3 | 4 | Service BC Feedback API. 5 | 6 | -------------------------------------------------------------------------------- /feedback-api/camunda_email_template.template: -------------------------------------------------------------------------------- 1 | 2 | #Citizen feedback submitted 3 | 4 | Feedback Type: {{ feedback_type }} 5 | 6 | Feedback Message: {{ feedback_message }} 7 | 8 | Respose requested : {{ response_required }} 9 | 10 | Citizen Name: {{ citizen_name }} 11 | 12 | Citizen Contact: {{ citizen_contact }} 13 | 14 | Citizen Email: {{ citizen_email }} 15 | 16 | Submit Date: {{ submit_date_time }} 17 | 18 | Service Date: {{ service_date }} -------------------------------------------------------------------------------- /feedback-api/entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | echo "Waiting for postgres..." 4 | 5 | gunicorn -b 0.0.0.0:5000 wsgi:application 6 | -------------------------------------------------------------------------------- /feedback-api/logging.conf: -------------------------------------------------------------------------------- 1 | [loggers] 2 | keys=root,api 3 | 4 | [handlers] 5 | keys=console 6 | 7 | [formatters] 8 | keys=simple 9 | 10 | [logger_root] 11 | level=DEBUG 12 | handlers=console 13 | 14 | [logger_api] 15 | level=DEBUG 16 | handlers=console 17 | qualname=api 18 | propagate=0 19 | 20 | [handler_console] 21 | class=StreamHandler 22 | level=DEBUG 23 | formatter=simple 24 | args=(sys.stdout,) 25 | 26 | [formatter_simple] 27 | format=%(asctime)s - %(name)s - %(levelname)s in %(module)s:%(filename)s:%(lineno)d - %(funcName)s: %(message)s 28 | datefmt= -------------------------------------------------------------------------------- /feedback-api/pytest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /feedback-api/requirements.txt: -------------------------------------------------------------------------------- 1 | Flask 2 | requests 3 | python-dotenv 4 | Jinja2 5 | pytz 6 | Flask-Caching 7 | Werkzeug==2.2.3 8 | aniso8601 9 | attrs 10 | flask-cors 11 | flask-restx 12 | gunicorn 13 | flask-jwt-oidc==0.2.0 14 | -------------------------------------------------------------------------------- /feedback-api/src/api/services/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright © 2019 Province of British Columbia 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | """Exposes all of the Services used in the API.""" 15 | -------------------------------------------------------------------------------- /feedback-api/wsgi.py: -------------------------------------------------------------------------------- 1 | # Copyright © 2019 Province of British Columbia 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | """Provides the WSGI entry point for running the application 15 | """ 16 | from api import create_app 17 | 18 | application = create_app() 19 | 20 | if __name__ == "__main__": 21 | application.run() 22 | -------------------------------------------------------------------------------- /frontend/.dockerignore: -------------------------------------------------------------------------------- 1 | **/node_modules 2 | **/dist 3 | -------------------------------------------------------------------------------- /frontend/.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /frontend/.eslintignore: -------------------------------------------------------------------------------- 1 | build/*.js 2 | config/*.js 3 | -------------------------------------------------------------------------------- /frontend/.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | "plugins": { 5 | // to edit target browsers: use "browserslist" field in package.json 6 | "autoprefixer": {} 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /frontend/.s2i/bin/assemble: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "Before assembling" 3 | 4 | /usr/libexec/s2i/assemble 5 | 6 | # Todo - can delete below 7 | # We just need to run the default s2i assemble script as this is a standard build process 8 | # rc=$? 9 | 10 | # if [ $rc -eq 0 ]; then 11 | # npm run build:production 12 | # rc=$? 13 | # fi 14 | # exit $rc 15 | -------------------------------------------------------------------------------- /frontend/.s2i/environment: -------------------------------------------------------------------------------- 1 | DOCUMENTROOT=dist 2 | -------------------------------------------------------------------------------- /frontend/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM artifacts.developer.gov.bc.ca/docker-remote/node:20 as build-stage 2 | ENV VUE_APP_PATH=/ 3 | WORKDIR /app 4 | COPY ./package*.json ./ 5 | RUN npm install 6 | COPY . . 7 | RUN npm dedupe 8 | RUN npm run build 9 | 10 | FROM artifacts.developer.gov.bc.ca/docker-remote/nginx:1.25.3 as production-stage 11 | COPY nginx.conf /etc/nginx/nginx.conf 12 | RUN mkdir /app 13 | COPY --from=build-stage /app/dist /app 14 | EXPOSE 8080:8080 15 | CMD ["nginx", "-g", "daemon off;"] 16 | -------------------------------------------------------------------------------- /frontend/README.md: -------------------------------------------------------------------------------- 1 | # test 2 | 3 | > a test with bootstrap 4 | 5 | ## Build Setup 6 | 7 | ``` bash 8 | # install dependencies 9 | npm install 10 | 11 | # serve with hot reload at localhost:8080 12 | npm run dev 13 | 14 | # build for production with minification 15 | npm run build 16 | 17 | # build for production and view the bundle analyzer report 18 | npm run build --report 19 | ``` 20 | 21 | For detailed explanation on how things work, checkout the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader). 22 | -------------------------------------------------------------------------------- /frontend/build/dev-client.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | require('eventsource-polyfill') 3 | let hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true') 4 | 5 | hotClient.subscribe(function (event) { 6 | if (event.action === 'reload') { 7 | window.location.reload() 8 | } 9 | }) 10 | -------------------------------------------------------------------------------- /frontend/build/vue-loader.conf.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils') 2 | const config = require('../config') 3 | const isProduction = process.env.NODE_ENV === 'production' 4 | 5 | module.exports = { 6 | loaders: utils.cssLoaders({ 7 | sourceMap: isProduction 8 | ? config.build.productionSourceMap 9 | : config.dev.cssSourceMap, 10 | extract: isProduction 11 | }), 12 | transformToRequire: { 13 | video: 'src', 14 | source: 'src', 15 | img: 'src', 16 | image: 'xlink:href' 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /frontend/caddy/Caddyfile: -------------------------------------------------------------------------------- 1 | 0.0.0.0:2015 2 | root /var/www/html 3 | log stdout 4 | errors stdout 5 | 6 | rewrite { 7 | to {path} {path}/ / 8 | } 9 | 10 | header / { 11 | # Enable HTTP Strict Transport Security (HSTS) to force clients to always 12 | # connect via HTTPS (do not use if only testing) 13 | Strict-Transport-Security "max-age=31536000;" 14 | 15 | # Enable cross-site filter (XSS) and tell browser to block detected attacks 16 | X-XSS-Protection "1; mode=block" 17 | 18 | # Prevent some browsers from MIME-sniffing a response away from the declared Content-Type 19 | X-Content-Type-Options "nosniff" 20 | 21 | # Disallow the site to be rendered within a frame (clickjacking protection) 22 | X-Frame-Options "DENY" 23 | 24 | # Turn off all caddy caching 25 | Cache-Control no-cache,no-store,must-revalidate 26 | Pragma no-cache 27 | } 28 | -------------------------------------------------------------------------------- /frontend/config/dev.env.js: -------------------------------------------------------------------------------- 1 | const merge = require('webpack-merge') 2 | const prodEnv = require('./prod.env') 3 | 4 | module.exports = merge(prodEnv, { 5 | NODE_ENV: '"localhost"', 6 | API_URL: '"http://localhost:5000/api/v1"', 7 | SOCKET_URL: '"http://localhost:5000"', 8 | KEYCLOAK_JSON_URL: '"http://localhost:8080/static/keycloak.json"', 9 | REFRESH_TOKEN_SECONDS_LEFT: 180 10 | }) 11 | -------------------------------------------------------------------------------- /frontend/config/prod.env.js: -------------------------------------------------------------------------------- 1 | const merge = require('webpack-merge') 2 | const prodEnv = require('./prod.env') 3 | 4 | module.exports = merge(prodEnv, { 5 | NODE_ENV: '"production"', 6 | API_URL: '"/api/v1"', 7 | SOCKET_URL: '""', 8 | KEYCLOAK_JSON_URL: '"/static/keycloak/keycloak.json"', 9 | REFRESH_TOKEN_SECONDS_LEFT: 1700 10 | }) 11 | -------------------------------------------------------------------------------- /frontend/cypress/e2e/image_snapshot/step1.cy.ts: -------------------------------------------------------------------------------- 1 | import { API_PREFIX } from '../../support/e2e' 2 | 3 | describe('Login page', () => { 4 | 5 | beforeEach( () => { 6 | cy.fixture('offices').then((json) => { 7 | cy.intercept('GET', API_PREFIX + 'offices/', json) 8 | }) 9 | }) 10 | it('should match screenshot of element', () => { 11 | cy.visit('/') 12 | cy.matchImageSnapshot() 13 | }) 14 | }) -------------------------------------------------------------------------------- /frontend/cypress/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io", 4 | "body": "Fixtures are a great way to mock data for responses to routes" 5 | } 6 | -------------------------------------------------------------------------------- /frontend/cypress/snapshots/image_snapshot/step1.cy.ts/Login page -- should match screenshot of element.snap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/frontend/cypress/snapshots/image_snapshot/step1.cy.ts/Login page -- should match screenshot of element.snap.png -------------------------------------------------------------------------------- /frontend/cypress/support/e2e.ts: -------------------------------------------------------------------------------- 1 | // *********************************************************** 2 | // This example support/e2e.ts is processed and 3 | // loaded automatically before your test files. 4 | // 5 | // This is a great place to put global configuration and 6 | // behavior that modifies Cypress. 7 | // 8 | // You can change the location of this file or turn off 9 | // automatically serving support files with the 10 | // 'supportFile' configuration option. 11 | // 12 | // You can read more here: 13 | // https://on.cypress.io/configuration 14 | // *********************************************************** 15 | 16 | import './commands' 17 | 18 | export const API_PREFIX = 'http://localhost:5000/api/v1/' 19 | -------------------------------------------------------------------------------- /frontend/index.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'vue-fragment'; 2 | declare module 'v-dragged'; 3 | -------------------------------------------------------------------------------- /frontend/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Queue Management 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /frontend/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Queue Management 7 | 8 | 9 | 10 | We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue. 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /frontend/public/static/videos/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": { 3 | "url": "/static/videos/sbc.mp4", 4 | "updated": "2019-09-03T14:19:06.419Z" 5 | }, 6 | "888": { 7 | "url": "/static/videos/sbc.mp4", 8 | "updated": "2019-09-03T13:28:06.419Z" 9 | }, 10 | "999": { 11 | "url": "/static/videos/Test.mp4", 12 | "updated": "2019-09-16T16:16:06.419Z" 13 | }, 14 | "61": { 15 | "url": "/static/videos/Victoria.mp4", 16 | "updated": "2019-09-17T13:47:06.419Z" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /frontend/src/MainApp.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 15 | 16 | 26 | -------------------------------------------------------------------------------- /frontend/src/assets/bcid.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/frontend/src/assets/bcid.jpg -------------------------------------------------------------------------------- /frontend/src/assets/fonts/MyriadWebPro.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/frontend/src/assets/fonts/MyriadWebPro.eot -------------------------------------------------------------------------------- /frontend/src/assets/fonts/MyriadWebPro.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/frontend/src/assets/fonts/MyriadWebPro.ttf -------------------------------------------------------------------------------- /frontend/src/assets/fonts/MyriadWebPro.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/frontend/src/assets/fonts/MyriadWebPro.woff -------------------------------------------------------------------------------- /frontend/src/assets/fonts/MyriadWebPro.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/frontend/src/assets/fonts/MyriadWebPro.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/frontend/src/assets/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /frontend/src/assets/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/frontend/src/assets/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /frontend/src/assets/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/frontend/src/assets/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /frontend/src/assets/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/frontend/src/assets/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /frontend/src/components/TaskList/ButtonTasklist.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Service Flow 5 | 6 | 7 | 8 | 9 | 15 | -------------------------------------------------------------------------------- /frontend/src/components/exams/data-summary-table.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {{ displayData.title }} 7 | 8 | 9 | 10 | {{ item.key }} 11 | {{ item.value }} 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 29 | -------------------------------------------------------------------------------- /frontend/src/components/upload/buttons-upload.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Upload the Digital Signage Video 5 | 6 | 7 | 8 | 9 | 17 | -------------------------------------------------------------------------------- /frontend/src/events/progressBus.ts: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | 3 | export enum APIProgressBusEvents { 4 | APIProgressEvent = 'api_progress_bus', 5 | } 6 | 7 | export const apiProgressBus = new Vue() 8 | -------------------------------------------------------------------------------- /frontend/src/events/setMaxBus.ts: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | 3 | export enum SetMaxBusEvents { 4 | SetMaxEvent = 'set_max_bus', 5 | } 6 | 7 | export const setMaxBus = new Vue() 8 | -------------------------------------------------------------------------------- /frontend/src/events/showBookingFlagBus.ts: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | 3 | export enum ShowBookingFlagBusEvents { 4 | ShowBookingFlagEvent = 'show_booking_flag_bus', 5 | } 6 | 7 | export const showBookingFlagBus = new Vue() 8 | -------------------------------------------------------------------------------- /frontend/src/events/showFlagBus.ts: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | 3 | export enum ShowFlagBusEvents { 4 | ShowFlagEvent = 'show_flag_bus', 5 | } 6 | 7 | export const showFlagBus = new Vue() 8 | -------------------------------------------------------------------------------- /frontend/src/interfaces/action-interface.ts: -------------------------------------------------------------------------------- 1 | import { ActionContext } from 'vuex' 2 | 3 | // Interface to define a Vuex Action 4 | export interface ActionIF { 5 | (x: ActionContext, y: any): void 6 | } 7 | 8 | export interface ActionBindingIF { 9 | (x: any): void 10 | } 11 | -------------------------------------------------------------------------------- /frontend/src/interfaces/index.ts: -------------------------------------------------------------------------------- 1 | export * from './resource-interface' 2 | export * from './state-interface' 3 | export * from './action-interface' 4 | -------------------------------------------------------------------------------- /frontend/src/interfaces/resource-interface.ts: -------------------------------------------------------------------------------- 1 | // Interface to define the resource model example 2 | export interface ResourceExampleIF { 3 | id: number, 4 | displayName: string, 5 | message: string 6 | } 7 | -------------------------------------------------------------------------------- /frontend/src/plugins/vuetify.ts: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuetify from 'vuetify/lib' 3 | 4 | Vue.use(Vuetify) 5 | 6 | export default new Vuetify({ 7 | icons: { 8 | iconfont: 'mdi' 9 | } 10 | }) 11 | -------------------------------------------------------------------------------- /frontend/src/router/componentHooks.ts: -------------------------------------------------------------------------------- 1 | import Component from 'vue-class-component' 2 | 3 | // Register the router hooks with their names 4 | Component.registerHooks([ 5 | 'beforeRouteEnter', 6 | 'beforeRouteLeave', 7 | 'beforeRouteUpdate' 8 | ]) 9 | -------------------------------------------------------------------------------- /frontend/src/shims-tsx.d.ts: -------------------------------------------------------------------------------- 1 | import Vue, { VNode } from 'vue' 2 | 3 | declare global { 4 | namespace JSX { 5 | // tslint:disable no-empty-interface 6 | interface Element extends VNode {} 7 | // tslint:disable no-empty-interface 8 | interface ElementClass extends Vue {} 9 | interface IntrinsicElements { 10 | [elem: string]: any; 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /frontend/src/shims-vue.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.vue' { 2 | import Vue from 'vue' 3 | export default Vue 4 | } 5 | -------------------------------------------------------------------------------- /frontend/src/store/actions/index.ts: -------------------------------------------------------------------------------- 1 | export * from './actions-model' 2 | -------------------------------------------------------------------------------- /frontend/src/store/getters/index.ts: -------------------------------------------------------------------------------- 1 | export * from './getters-model' 2 | -------------------------------------------------------------------------------- /frontend/src/store/helpers/index.ts: -------------------------------------------------------------------------------- 1 | export * from './helpers' 2 | -------------------------------------------------------------------------------- /frontend/src/store/modules/index.ts: -------------------------------------------------------------------------------- 1 | import * as addExamModule from './add-exam-module' 2 | import * as appointmentsModule from './appointments-module' 3 | 4 | export { 5 | addExamModule, 6 | appointmentsModule 7 | } 8 | -------------------------------------------------------------------------------- /frontend/src/store/mutations/index.ts: -------------------------------------------------------------------------------- 1 | export * from './mutations-model' 2 | -------------------------------------------------------------------------------- /frontend/src/store/state/index.ts: -------------------------------------------------------------------------------- 1 | export * from './state-model' 2 | -------------------------------------------------------------------------------- /frontend/src/utils/axios.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable indent */ 2 | 3 | import URLConfig from '../../config' 4 | import axios from 'axios' 5 | 6 | const instance = axios.create({ 7 | baseURL: URLConfig.APP_API_URL, 8 | withCredentials: true, 9 | headers: { 10 | Accept: 'application/json' 11 | // Authorization: `Bearer ${bearer}` 12 | } 13 | }) 14 | 15 | export function Axios (context) { 16 | const bearer = typeof context === 'object' ? context.state.bearer : context 17 | 18 | return instance.interceptors.request.use((config) => { 19 | config.headers.common.Authorization = `Bearer ${bearer}` 20 | return config 21 | }) 22 | } 23 | 24 | export default instance 25 | -------------------------------------------------------------------------------- /frontend/src/views/response.vue: -------------------------------------------------------------------------------- 1 | 2 | 12 | Thank-you for submitting your feedback. We'll get right on it. 13 | 14 | 15 | 16 | 29 | -------------------------------------------------------------------------------- /frontend/static/videos/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": { 3 | "url": "/static/videos/sbc.mp4", 4 | "updated": "2019-09-03T14:19:06.419Z" 5 | }, 6 | "888": { 7 | "url": "/static/videos/sbc.mp4", 8 | "updated": "2019-09-03T13:28:06.419Z" 9 | }, 10 | "999": { 11 | "url": "/static/videos/Test.mp4", 12 | "updated": "2019-09-16T16:16:06.419Z" 13 | }, 14 | "61": { 15 | "url": "/static/videos/Victoria.mp4", 16 | "updated": "2019-09-17T13:47:06.419Z" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /frontend/vue.config.js: -------------------------------------------------------------------------------- 1 | const { defineConfig } = require('@vue/cli-service') 2 | const webpack = require('webpack') 3 | 4 | module.exports = defineConfig({ 5 | transpileDependencies: ['vuetify'], 6 | 7 | configureWebpack: { 8 | // process: {env: {}}, 9 | plugins: [ 10 | // fix "process is not defined" error: 11 | // (do "npm install process" before running the build) 12 | new webpack.ProvidePlugin({ 13 | process: 'process/browser' 14 | }), 15 | new webpack.ProvidePlugin({ 16 | Buffer: ['buffer', 'Buffer'] 17 | }) 18 | ], 19 | resolve: { 20 | fallback: { 21 | crypto: require.resolve('crypto-browserify'), 22 | buffer: require.resolve('buffer'), 23 | util: require.resolve('util'), 24 | stream: require.resolve('stream-browserify') 25 | } 26 | } 27 | }, 28 | runtimeCompiler: true 29 | 30 | }) 31 | -------------------------------------------------------------------------------- /jobs/appointment_reminder/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | # Copyright © 2019 Province of British Columbia 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); 5 | # you may not use this file except in compliance with the License. 6 | # You may obtain a copy of the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, 12 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | # See the License for the specific language governing permissions and 14 | # limitations under the License. 15 | -------------------------------------------------------------------------------- /jobs/appointment_reminder/cron/crontab: -------------------------------------------------------------------------------- 1 | */1 * * * * default cd / && ./run.sh 2 | -------------------------------------------------------------------------------- /jobs/appointment_reminder/docker-entrypoint.sh: -------------------------------------------------------------------------------- 1 | function start_cron_jobs() { 2 | echo "Starting go-crond as a background task ..." 3 | CRON_CMD="go-crond -v --allow-unprivileged --include=cron/" 4 | exec ${CRON_CMD} 5 | } 6 | 7 | start_cron_jobs 8 | -------------------------------------------------------------------------------- /jobs/appointment_reminder/logging.conf: -------------------------------------------------------------------------------- 1 | [loggers] 2 | keys=root,api 3 | 4 | [handlers] 5 | keys=console 6 | 7 | [formatters] 8 | keys=simple 9 | 10 | [logger_root] 11 | level=DEBUG 12 | handlers=console 13 | 14 | [logger_api] 15 | level=DEBUG 16 | handlers=console 17 | qualname=api 18 | propagate=0 19 | 20 | [handler_console] 21 | class=StreamHandler 22 | level=DEBUG 23 | formatter=simple 24 | args=(sys.stdout,) 25 | 26 | [formatter_simple] 27 | format=%(asctime)s - %(name)s - %(levelname)s in %(module)s:%(filename)s:%(lineno)d - %(funcName)s: %(message)s 28 | datefmt= 29 | -------------------------------------------------------------------------------- /jobs/appointment_reminder/requirements.txt: -------------------------------------------------------------------------------- 1 | Flask 2 | requests 3 | python-dotenv 4 | # Flask-Mail 5 | Jinja2 6 | pytz 7 | notifications-python-client 8 | 9 | # TODO: Can this be an env variable? Or can it be relative? 10 | -e git+https://github.com/bcgov/queue-management.git@main#egg=queue_api&subdirectory=api 11 | -------------------------------------------------------------------------------- /jobs/appointment_reminder/run_email_reminders.sh: -------------------------------------------------------------------------------- 1 | #! /bin/sh 2 | echo 'run send_email_reminder.py' 3 | python3 send_email_reminder.py -------------------------------------------------------------------------------- /jobs/appointment_reminder/run_sms_reminders.sh: -------------------------------------------------------------------------------- 1 | #! /bin/sh 2 | echo 'run send_sms_reminder.py' 3 | python3 send_sms_reminder.py -------------------------------------------------------------------------------- /jobs/appointment_reminder/utils/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | # Copyright © 2019 Province of British Columbia 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); 5 | # you may not use this file except in compliance with the License. 6 | # You may obtain a copy of the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, 12 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | # See the License for the specific language governing permissions and 14 | # limitations under the License. -------------------------------------------------------------------------------- /jobs/appointment_reminder/version.py: -------------------------------------------------------------------------------- 1 | __version__ = '1.0.1' -------------------------------------------------------------------------------- /keycloak-local-testserver/startup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | $KEYCLOAK_HOME/bin/standalone.sh -b 0.0.0.0 -bmanagement 0.0.0.0 4 | -------------------------------------------------------------------------------- /login-proxy/available_roles.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "c82a2d5e-de30-40c4-bc14-88466ebd32e6", 4 | "name": "user", 5 | "description": "user", 6 | "composite": false, 7 | "clientRole": false, 8 | "containerId": "vtkayq4c" 9 | }, 10 | { 11 | "id": "aad09709-0a34-4d2c-bde8-bd165120de02", 12 | "name": "online_appointment_user", 13 | "description": "Role to define an online appointment user", 14 | "composite": false, 15 | "clientRole": false, 16 | "containerId": "vtkayq4c" 17 | }, 18 | { 19 | "id": "ce9afa31-cc65-4427-89fb-e79a2ff2d3ef", 20 | "name": "reminder_job", 21 | "description": "Role for the reminder job to use", 22 | "composite": false, 23 | "clientRole": false, 24 | "containerId": "vtkayq4c" 25 | } 26 | ] -------------------------------------------------------------------------------- /login-proxy/composite_roles.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "00903876-c331-48ea-b574-52158e295143", 4 | "name": "uma_authorization", 5 | "description": "${role_uma_authorization}", 6 | "composite": False, 7 | "clientRole": False, 8 | "containerId": "vtkayq4c" 9 | }, 10 | { 11 | "id": "a657b90f-ccea-4508-bfdc-d3465db6d8fc", 12 | "name": "internal_user", 13 | "description": "Role to distinguish the user from public user if using same IDP to login", 14 | "composite": False, 15 | "clientRole": False, 16 | "containerId": "vtkayq4c" 17 | }, 18 | { 19 | "id": "87a89770-2901-4840-b39a-8cea9c81dfba", 20 | "name": "offline_access", 21 | "description": "${role_offline-access}", 22 | "composite": False, 23 | "clientRole": False, 24 | "containerId": "vtkayq4c" 25 | } 26 | ] -------------------------------------------------------------------------------- /login-proxy/roles.json: -------------------------------------------------------------------------------- 1 | { 2 | "roles": { 3 | "realm": [ 4 | { 5 | "name": "internal_user", 6 | "description": "Distinguishes the user from online_appointment_user for IdPs used by both applications" 7 | }, 8 | { 9 | "name": "online_appointment_user", 10 | "description": "Defines an online appointment user" 11 | }, 12 | { 13 | "name": "reminder_job", 14 | "description": "Role for the reminder job to use" 15 | } 16 | ] 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /mender/image-tools/.gitignore: -------------------------------------------------------------------------------- 1 | output/* 2 | config.env 3 | sites.txt 4 | wpa_supplicant.conf 5 | authorized_keys 6 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/.dockerignore: -------------------------------------------------------------------------------- 1 | input/ 2 | output/ 3 | raspbian-setup 4 | config.env 5 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/.gitignore: -------------------------------------------------------------------------------- 1 | output/* 2 | config.env 3 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:20.04 2 | 3 | ARG MENDER_ARTIFACT_VERSION='3.3.0' 4 | 5 | RUN apt-get update && apt-get install -y \ 6 | wget \ 7 | qemu-user-static 8 | 9 | RUN wget -q -O /usr/bin/mender-artifact https://d1b0l86ne08fsf.cloudfront.net/mender-artifact/$MENDER_ARTIFACT_VERSION/linux/mender-artifact && chmod +x /usr/bin/mender-artifact 10 | 11 | COPY docker-entrypoint.sh /usr/local/bin/ 12 | ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] 13 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/docker-build: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" 4 | 5 | set -e 6 | 7 | DOCKER_IMAGE_NAME=bcgov/smartboard-artifact-builder 8 | 9 | docker build $DIR -t ${DOCKER_IMAGE_NAME} 10 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/files/.gitignore: -------------------------------------------------------------------------------- 1 | sites.txt 2 | authorized_keys 3 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/files/Xwrapper.config: -------------------------------------------------------------------------------- 1 | # Xwrapper.config (Debian X Window System server wrapper configuration file) 2 | # 3 | # This file was generated by the post-installation script of the 4 | # xserver-xorg-legacy package using values from the debconf database. 5 | # 6 | # See the Xwrapper.config(5) manual page for more information. 7 | # 8 | # This file is automatically updated on upgrades of the xserver-xorg-legacy 9 | # package *only* if it has not been modified since the last upgrade of that 10 | # package. 11 | # 12 | # If you have edited this file but would like it to be automatically updated 13 | # again, run the following command as root: 14 | # dpkg-reconfigure xserver-xorg-legacy 15 | allowed_users=anybody 16 | needs_root_rights=yes 17 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/files/autologin.conf: -------------------------------------------------------------------------------- 1 | [Service] 2 | ExecStart= 3 | ExecStart=-/sbin/agetty --autologin ${username} --noclear %I \$TERM -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/files/crontab: -------------------------------------------------------------------------------- 1 | 0 0 * * * root reboot -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/files/deps_add.txt: -------------------------------------------------------------------------------- 1 | chromium-browser 2 | python3 3 | avahi-daemon 4 | ufw 5 | ifplugd 6 | wpasupplicant 7 | openbox 8 | xserver-xorg 9 | xserver-xorg-legacy 10 | xinit 11 | unclutter 12 | matchbox-window-manager 13 | x11-xserver-utils 14 | xserver-xorg-video-fbturbo 15 | nginx 16 | supervisor 17 | python3-venv 18 | fim 19 | fuse 20 | xloadimage 21 | jq 22 | xcompmgr 23 | gldriver-test 24 | libgl1-mesa-dri 25 | mesa-vdpau-drivers 26 | mesa-utils 27 | watchdog -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/files/deps_remove.txt: -------------------------------------------------------------------------------- 1 | samba-common 2 | manpages 3 | manpages-dev 4 | man-db 5 | gdb 6 | plymouth 7 | libplymouth4 8 | libraspberrypi-doc 9 | perl-modules-5.28 10 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/files/first-boot.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=First Boot 3 | DefaultDependencies=no 4 | After=local-fs.target 5 | 6 | [Service] 7 | ExecStart=/root/first-boot.sh 8 | 9 | [Install] 10 | WantedBy=sysinit.target 11 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/files/fstab.base: -------------------------------------------------------------------------------- 1 | proc /proc proc defaults 0 0 2 | PARTUUID=7ee80803-01 /boot vfat defaults 0 2 3 | PARTUUID=7ee80803-02 / ext4 defaults,noatime,ro 0 1 4 | 5 | tmpfs /tmp tmpfs defaults 0 0 6 | tmpfs /data tmpfs defaults 0 0 7 | 8 | mount_overlay /home fuse nofail,defaults 0 0 9 | mount_overlay /var fuse nofail,defaults 0 0 10 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/files/mender-inventory-smartboard: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | set -e 4 | 5 | echo "smartboard_id=`cat /var/smartboard/id`" 6 | echo "smartboard_timezone=`cat /var/smartboard/timezone`" 7 | echo "smartboard_location=`cat /var/smartboard/location`" 8 | echo "smartboard_last_seen=`date`" 9 | echo "smartboard_url=`cat /var/smartboard/base-url`" 10 | exit 0 11 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/files/mender.conf: -------------------------------------------------------------------------------- 1 | { 2 | "InventoryPollIntervalSeconds": 60, 3 | "RetryPollIntervalSeconds": 60, 4 | "RootfsPartA": "/dev/mmcblk0p2", 5 | "RootfsPartB": "/dev/mmcblk0p3", 6 | "ServerCertificate": "/etc/mender/server.crt", 7 | "ServerURL": "${SERVER_URL}", 8 | "TenantToken": "dummy", 9 | "UpdatePollIntervalSeconds": 180 10 | } 11 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/files/mount_overlay: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | DIR="$1" 3 | [ -z "${DIR}" ] && exit 1 4 | 5 | BASE="${DIR}.base" 6 | OVERLAY="${DIR}.overlay" 7 | 8 | if [ ! -d "${BASE}" ] 9 | then 10 | echo "${BASE} does not exist" >&2 11 | exit 1 12 | fi 13 | if [ ! -d "${OVERLAY}" ] 14 | then 15 | echo "${OVERLAY} does not exist" >&2 16 | exit 1 17 | fi 18 | # 19 | # ro must be the first mount option for root ..... 20 | # 21 | ROOT_MOUNT=$( awk '$2=="/" { print substr($4,1,2) }' /proc/mounts ) 22 | if [ "$ROOT_MOUNT" != "ro" ]; then 23 | /bin/mount --bind ${BASE} ${DIR} 24 | else 25 | /bin/mount -t tmpfs ramdisk ${OVERLAY} 26 | /bin/mkdir ${OVERLAY}/upper 27 | /bin/mkdir ${OVERLAY}/work 28 | OPTS="-o lowerdir=${BASE},upperdir=${OVERLAY}/upper,workdir=${OVERLAY}/work" 29 | /bin/mount -t overlay ${OPTS} overlay ${DIR} 30 | fi 31 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/files/network-watchdog.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Network Watchdog 3 | After=network-online.target 4 | 5 | [Service] 6 | ExecStart=/root/network-watchdog.sh 7 | 8 | [Install] 9 | WantedBy=multi-user.target 10 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/files/network-watchdog.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | /root/load-smartboard-data.sh 4 | 5 | NETWORK_DOWN=0 6 | TIMEOUT=5 7 | 8 | # How many times to retry before a reboot 9 | RETRIES=$((${network_reboot_timeout} / $TIMEOUT)) 10 | 11 | while true ; do 12 | wget -q -O /dev/null "`cat /var/smartboard/url`" 13 | if [ $? -gt 0 ] ; then 14 | NETWORK_DOWN=$((NETWORK_DOWN + 1)) 15 | echo "Network down, attempt number: ${NETWORK_DOWN}" 16 | 17 | systemctl restart systemd-networkd 18 | touch /var/network-down 19 | else 20 | NETWORK_DOWN=0 21 | 22 | if [ -e /var/network-down ] ; then 23 | rm /var/network-down 24 | fi 25 | fi 26 | 27 | if [ $NETWORK_DOWN -gt $RETRIES ] ; then 28 | reboot 29 | fi 30 | 31 | # We check every 5 seconds for network connection 32 | sleep $TIMEOUT 33 | done 34 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/files/network/.gitignore: -------------------------------------------------------------------------------- 1 | wpa_supplicant-wlan0.conf -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/files/network/01-wired.network: -------------------------------------------------------------------------------- 1 | [Match] 2 | Name=eth0 3 | 4 | [Network] 5 | DHCP=ipv4 6 | 7 | [DHCP] 8 | UseDNS=true 9 | RouteMetric=0 10 | ClientIdentifier=mac -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/files/network/02-wireless.network: -------------------------------------------------------------------------------- 1 | [Match] 2 | Name=wlan0 3 | 4 | [Network] 5 | DHCP=ipv4 6 | 7 | [DHCP] 8 | UseDNS=true 9 | RouteMetric=10 10 | ClientIdentifier=mac -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/files/network/rfkill-unblock.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=RFKill-Unblock Wifi 3 | 4 | [Service] 5 | Type=oneshot 6 | ExecStart=/usr/sbin/rfkill unblock wifi 7 | ExecStop= 8 | RemainAfterExit=yes 9 | 10 | [Install] 11 | WantedBy=multi-user.target -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/files/network/wpa_supplicant-country.conf: -------------------------------------------------------------------------------- 1 | country=CA -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/files/raspi-blacklist.conf: -------------------------------------------------------------------------------- 1 | blacklist btbcm 2 | blacklist hci_uart 3 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/files/rc.local: -------------------------------------------------------------------------------- 1 | #!/bin/sh -e 2 | # 3 | # rc.local 4 | # 5 | # This script is executed at the end of each multiuser runlevel. 6 | # Make sure that the script will "exit 0" on success or any other 7 | # value on error. 8 | # 9 | # In order to enable or disable this script just change the execution 10 | # bits. 11 | # 12 | # By default this script does nothing. 13 | 14 | # Print the IP address 15 | _IP=$(hostname -I) || true 16 | if [ "$_IP" ]; then 17 | printf "My IP address is %s\n" "$_IP" 18 | fi 19 | 20 | chmod g+rw /dev/tty? 21 | chmod g+rw /dev/tty? 22 | dmesg --console-off 23 | 24 | exit 0 25 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/files/splashscreen.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Splash screen 3 | DefaultDependencies=no 4 | After=local-fs.target 5 | 6 | [Service] 7 | ExecStart=/usr/bin/fim -w -T 1 -d /dev/fb0 --quiet -a /var/flaskapp/web-service/static/splash.png 8 | 9 | [Install] 10 | WantedBy=sysinit.target 11 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/files/timesyncd.conf: -------------------------------------------------------------------------------- 1 | # This file is part of systemd. 2 | # 3 | # systemd is free software; you can redistribute it and/or modify it 4 | # under the terms of the GNU Lesser General Public License as published by 5 | # the Free Software Foundation; either version 2.1 of the License, or 6 | # (at your option) any later version. 7 | # 8 | # Entries in this file show the compile time defaults. 9 | # You can change settings by editing this file. 10 | # Defaults can be restored by simply deleting this file. 11 | # 12 | # See timesyncd.conf(5) for details. 13 | 14 | [Time] 15 | NTP=tick.gov.bc.ca tock.gov.bc.ca clock.gov.bc.ca 16 | 17 | #FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org 3.debian.pool.ntp.org 18 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/files/venv.tar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/mender/image-tools/artifact-builder/raspbian-setup/files/venv.tar -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/files/video-updater.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Video Updater 3 | After=network-online.target 4 | 5 | [Service] 6 | ExecStart=/root/video-updater.sh 7 | 8 | [Install] 9 | WantedBy=multi-user.target 10 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/files/web-service.conf: -------------------------------------------------------------------------------- 1 | [program:web-service-flask-app] 2 | directory=/var/flaskapp/web-service 3 | command=/bin/bash -E -c ./start.sh 4 | autostart=true 5 | autorestart=true 6 | stopsignal=INT 7 | stopasgroup=true 8 | killasgroup=true 9 | user=www-data 10 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/files/web-service.localhost: -------------------------------------------------------------------------------- 1 | server { 2 | server_name localhost; 3 | listen 80; 4 | root /var/flaskapp/web-service/static; 5 | 6 | location / { 7 | try_files $uri @web-service-flask; 8 | } 9 | 10 | location @web-service-flask { 11 | include proxy_params; 12 | proxy_pass http://unix:/var/flaskapp/web-service/web-service.sock; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/files/web-service/requirements.txt: -------------------------------------------------------------------------------- 1 | Flask==1.0.2 -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/files/web-service/src/__init__.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | from flask import Flask, jsonify 3 | 4 | app = Flask(__name__) 5 | 6 | @app.route('/health', methods=['GET']) 7 | def get_health(): 8 | url = "" 9 | with open('/var/smartboard/url') as file: 10 | url = file.read().strip() 11 | 12 | timeout = 60 13 | with open('/var/smartboard/fallback-video-timeout') as file: 14 | timeout = int(file.read().strip()) 15 | 16 | response = jsonify({ 17 | 'connected': not Path("/var/network-down").is_file(), 18 | 'videoCached': Path("/data/videos/video.mp4").is_file(), 19 | 'url': url, 20 | 'fallbackVideoTimeout': timeout 21 | }) 22 | 23 | response.headers.add('Access-Control-Allow-Origin', '*') 24 | return response 25 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/files/web-service/start.sh: -------------------------------------------------------------------------------- 1 | source venv/bin/activate 2 | gunicorn --workers 3 --bind unix:web-service.sock -m 007 src:app 3 | deactivate 4 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/files/web-service/static/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/mender/image-tools/artifact-builder/raspbian-setup/files/web-service/static/splash.png -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/scripts/02-create-default-user: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | cd $files 3 | 4 | set -ex 5 | 6 | echo "${username} ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/011_${username}-nopasswd 7 | 8 | # Remove existing user so an installation can be rerun 9 | if id -u $username > /dev/null 2>&1; then 10 | deluser --force $username 11 | rm -rf /home/$username 12 | fi 13 | 14 | # Create new user that is a sudo user 15 | useradd --create-home \ 16 | --groups sudo,adm,dialout,cdrom,audio,plugdev,games,users,input,netdev,gpio,i2c,video,spi \ 17 | --shell /bin/bash \ 18 | $username 19 | echo "$username:$password" | chpasswd 20 | 21 | cp bashrc $home_dir/.bashrc 22 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/scripts/03-ssh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | cd $files 3 | 4 | set -ex 5 | 6 | envsubst '${sshd_port} ${username}' < sshd_config > /etc/ssh/sshd_config 7 | 8 | ssh_dir=$home_dir/.ssh/ 9 | 10 | mkdir -p $ssh_dir 11 | chmod 700 $ssh_dir 12 | cp authorized_keys $ssh_dir 13 | chmod 644 $ssh_dir/authorized_keys 14 | chown $username:$username $ssh_dir $ssh_dir/authorized_keys 15 | 16 | systemctl enable ssh 17 | 18 | echo $sshd_port > /var/sshd_port 19 | 20 | ssh-keygen -A 21 | systemctl disable regenerate_ssh_host_keys 22 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/scripts/05-video-fetch: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | cd $files 3 | 4 | set -ex 5 | 6 | envsubst '${video_cache_timeout}' < video-updater.sh > /root/video-updater.sh 7 | chmod +x /root/video-updater.sh 8 | 9 | cp video-updater.service /etc/systemd/system/ 10 | 11 | systemctl enable video-updater 12 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/scripts/06-logs: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | cd $files 3 | 4 | set -ex 5 | 6 | cp rc.local /etc/ 7 | cp rsyslog.conf /etc/ 8 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/scripts/07-timezone: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | cd $files 3 | 4 | set -ex 5 | 6 | cp timesyncd.conf /etc/systemd/ 7 | 8 | # Final timezone setting will be done after the image is deployed on a device 9 | ln -nsf /usr/share/zoneinfo/America/Vancouver /var/localtime 10 | ln -nsf /var/localtime /etc/localtime 11 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/scripts/08-splashscreen: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | cd $files 3 | 4 | set -ex 5 | 6 | mkdir -p /opt 7 | 8 | systemctl disable getty@tty1 9 | 10 | # The splash screen image is in the web-service static files 11 | cp splashscreen.service /etc/systemd/system/ 12 | 13 | systemctl enable splashscreen 14 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/scripts/09-disabled-hardware: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | cd $files 4 | 5 | set -ex 6 | 7 | cp raspi-blacklist.conf /etc/modprobe.d/ 8 | 9 | systemctl disable hciuart 10 | systemctl disable bluetooth 11 | 12 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/scripts/10-web-service: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | set -ex 4 | 5 | cd $files 6 | 7 | cp nginx.conf /etc/nginx/ 8 | 9 | mkdir -p /var/flaskapp 10 | cp -R web-service /var/flaskapp 11 | tar -C /var/flaskapp/web-service -xvf venv.tar 12 | chmod +x /var/flaskapp/web-service/start.sh 13 | chown -R www-data:www-data /var/flaskapp/web-service 14 | 15 | cp web-service.conf /etc/supervisor/conf.d/ 16 | cp web-service.localhost /etc/nginx/sites-enabled/ 17 | 18 | if [ -f /etc/nginx/sites-enabled/default ] ; then 19 | rm /etc/nginx/sites-enabled/default 20 | fi 21 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/scripts/12-mender-configuration: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | cd $files 3 | 4 | set -ex 5 | 6 | mkdir -p /usr/share/mender/identity 7 | cp mender-device-identity /usr/share/mender/identity 8 | chmod +x /usr/share/mender/identity/mender-device-identity 9 | 10 | mkdir -p /usr/share/mender/inventory 11 | cp mender-inventory-smartboard /usr/share/mender/inventory 12 | chmod +x /usr/share/mender/inventory/mender-inventory-smartboard 13 | 14 | # Only patch mender conf for Artifact updates 15 | if [ -e /etc/mender/mender.conf ] ; then 16 | export SERVER_URL=`cat /etc/mender/mender.conf | jq -r '.["ServerURL"]'` 17 | envsubst '${SERVER_URL}' < mender.conf > /etc/mender/mender.conf 18 | fi 19 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/scripts/14-lockdown: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | cd $files 3 | 4 | set -ex 5 | 6 | dphys-swapfile swapoff 7 | dphys-swapfile uninstall 8 | systemctl disable dphys-swapfile 9 | 10 | if [ -f /var/swap ] ; then 11 | rm /var/swap 12 | fi 13 | 14 | if [ ! -e /var.base ] ; then 15 | mkdir -p /var.overlay 16 | mv /var /var.base 17 | mkdir /var 18 | fi 19 | 20 | if [ ! -e /home.base ] ; then 21 | mkdir -p /home.overlay 22 | mv /home /home.base 23 | mkdir /home 24 | fi 25 | 26 | mkdir -p /tmp 27 | 28 | mkdir -p /usr/local/bin 29 | cp mount_overlay /usr/local/bin 30 | 31 | if [ -e /etc/mender/artifact_info ] ; then 32 | cp fstab.mender /etc/fstab 33 | else 34 | mkdir -p /data 35 | cp fstab.base /etc/fstab 36 | fi 37 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/setup.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | # Runs all scripts in ./scripts folder 3 | # This script should be run on a booted pi or a loaded container 4 | 5 | DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" 6 | 7 | set -ex 8 | 9 | if [ ! -f $DIR/config.env ] ; then 10 | echo "ERROR: No config.env provided" 11 | exit -1 12 | fi 13 | 14 | set -a 15 | source $DIR/config.env 16 | set +a 17 | 18 | export files=$DIR/files 19 | export home_dir="/home/${username}" 20 | 21 | for f in $DIR/scripts/*; do 22 | sudo -E bash -c "$f" 23 | done 24 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/state-scripts/ArtifactCommit_Leave_01_firewall: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | mount / -o remount,rw 4 | 5 | sed -i 's/IPV6=yes/IPV6=no/g' /etc/default/ufw 6 | systemctl daemon-reload 7 | ufw default deny incoming 8 | ufw default allow outgoing 9 | ufw allow 443 10 | ufw allow `cat /var/sshd_port` 11 | ufw allow ntp 12 | ufw --force enable 13 | 14 | mount / -o remount,ro 15 | exit 0 -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/state-scripts/ArtifactCommit_Leave_02_localdata: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | mount / -o remount,rw 4 | 5 | # Move the sites.txt to data so it can be modified if needed 6 | # just by mounting that drive 7 | cp /root/sites.txt /uboot/sites.txt 8 | cp /root/smartboard-base-url /uboot/smartboard-base-url.txt 9 | 10 | # We need to start ssh once before we go RO, otherwise it has problems 11 | 12 | rm /etc/ssh/ssh_host_* 13 | ssh-keygen -A 14 | 15 | mount / -o remount,ro 16 | 17 | systemctl restart network-watchdog.service 18 | systemctl restart video-updater.service 19 | 20 | pkill -f -- "chromium-browser" 21 | exit 0 22 | -------------------------------------------------------------------------------- /mender/image-tools/artifact-builder/raspbian-setup/state-scripts/ArtifactReboot_Enter_01_hardward_config: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | # NOTE: All the content of the config files must be contained in this 4 | # script as it will be loaded before the new FS will be available. 5 | 6 | cat << END_TEXT > /uboot/config.txt 7 | disable_splash=1 8 | 9 | hdmi_force_hotplug=1 10 | 11 | # To remove the undervoltage warning: 12 | avoid_warnings=1 13 | 14 | # Increase GPU Memory 15 | gpu_mem_1024=64 16 | 17 | #enable GPU Driver 18 | dtoverlay=vc4-kms-v3d 19 | dtparam=watchdog=on 20 | 21 | END_TEXT 22 | 23 | cat << END_TEXT > /uboot/cmdline.txt 24 | dwc_otg.lpm_enable=0 console=serial0,115200 root=\${mender_kernel_root} rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait logo.nologo 25 | END_TEXT 26 | exit 0 27 | -------------------------------------------------------------------------------- /mender/image-tools/bootstrap-builder/.gitignore: -------------------------------------------------------------------------------- 1 | output/* 2 | -------------------------------------------------------------------------------- /mender/image-tools/bootstrap-builder/generate-image.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" 4 | 5 | if [ "$#" -ne 2 ]; then 6 | echo "ERROR: Need to provide source image and config.env." 7 | exit 1 8 | fi 9 | 10 | INPUT_IMAGE=$1 11 | INPUT_NAME=$(basename $1) 12 | 13 | CONFIG_ENV=$2 14 | 15 | $DIR/prepare-raspbian/prepare-raspbian $INPUT_IMAGE $CONFIG_ENV 16 | $DIR/shrink-image/shrink-image output/smartboard-bootstrap-image.img 17 | 18 | -------------------------------------------------------------------------------- /mender/image-tools/bootstrap-builder/prepare-raspbian/.dockerignore: -------------------------------------------------------------------------------- 1 | output 2 | input 3 | -------------------------------------------------------------------------------- /mender/image-tools/bootstrap-builder/prepare-raspbian/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:20.04 2 | 3 | ARG MENDER_ARTIFACT_VERSION=3.3.0 4 | 5 | RUN apt-get update && apt-get install -y \ 6 | simg2img img2simg \ 7 | qemu-user-static 8 | 9 | COPY docker-entrypoint.sh /usr/local/bin/ 10 | ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] -------------------------------------------------------------------------------- /mender/image-tools/bootstrap-builder/prepare-raspbian/docker-build: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" 4 | 5 | set -e 6 | 7 | DOCKER_IMAGE_NAME=bcgov/smartboard-prepare-raspbian 8 | 9 | docker build $DIR -t ${DOCKER_IMAGE_NAME} 10 | 11 | -------------------------------------------------------------------------------- /mender/image-tools/bootstrap-builder/shrink-image/.dockerignore: -------------------------------------------------------------------------------- 1 | output 2 | input 3 | -------------------------------------------------------------------------------- /mender/image-tools/bootstrap-builder/shrink-image/.gitignore: -------------------------------------------------------------------------------- 1 | output/* 2 | -------------------------------------------------------------------------------- /mender/image-tools/bootstrap-builder/shrink-image/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:20.04 2 | 3 | RUN apt-get update && apt-get install -y \ 4 | parted util-linux 5 | 6 | COPY docker-entrypoint.sh /usr/local/bin/ 7 | COPY pishrink.sh /usr/local/bin/ 8 | 9 | ENTRYPOINT ["docker-entrypoint.sh"] 10 | -------------------------------------------------------------------------------- /mender/image-tools/bootstrap-builder/shrink-image/docker-build: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" 4 | 5 | set -e 6 | 7 | DOCKER_IMAGE_NAME=bcgov/smartboard-shrink-image 8 | 9 | docker build $DIR -t ${DOCKER_IMAGE_NAME} 10 | -------------------------------------------------------------------------------- /mender/image-tools/bootstrap-builder/shrink-image/docker-entrypoint.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | set -e 3 | 4 | INPUT=$1 5 | 6 | # Pi shrink in place will crash most of the time 7 | # so it's copied to a temp file first 8 | pishrink.sh -s /image/$INPUT /output/$INPUT.tmp 9 | -------------------------------------------------------------------------------- /mender/image-tools/mender-image-patcher/.dockerignore: -------------------------------------------------------------------------------- 1 | output 2 | input 3 | -------------------------------------------------------------------------------- /mender/image-tools/mender-image-patcher/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:20.04 2 | 3 | ARG MENDER_ARTIFACT_VERSION=3.3.0 4 | 5 | RUN apt-get update && apt-get install -y \ 6 | simg2img img2simg jq gettext \ 7 | qemu-user-static 8 | 9 | COPY docker-entrypoint.sh /usr/local/bin/ 10 | ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] 11 | -------------------------------------------------------------------------------- /mender/image-tools/mender-image-patcher/docker-build: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" 4 | 5 | set -e 6 | 7 | DOCKER_IMAGE_NAME=bcgov/smartboard-mender-image-patcher 8 | 9 | docker build $DIR -t ${DOCKER_IMAGE_NAME} 10 | 11 | -------------------------------------------------------------------------------- /mender/image-tools/sites.example.txt: -------------------------------------------------------------------------------- 1 | Mac_Address Time_Zone Smartboard_ID Location WIFI_MAC Static_IP 2 | b8:27:eb:61:a6:7d America/Vancouver 1 Tokyo b827eba1ba1a 142.28.64.168 3 | b8:27:eb:ed:ad:86 America/Edmonton 61 New_York b827eba1ba1a 142.28.64.168 4 | b8:27:eb:36:c3:31 America/Dawson_Creek 999 Paris b827eba1ba1a 142.28.64.168 5 | b8:27:eb:64:f0:70 America/Edmonton 61 Narnia b827eba1ba1a 142.28.64.168 6 | b8:27:eb:cb:c2:10 America/Vancouver 999 Berlin b827eba1ba1a 142.28.64.168 7 | -------------------------------------------------------------------------------- /mender/openshift/templates/mender-gui_imagestream.yaml: -------------------------------------------------------------------------------- 1 | kind: ImageStream 2 | apiVersion: image.openshift.io/v1 3 | metadata: 4 | name: mender-gui 5 | -------------------------------------------------------------------------------- /minio/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore all files in this dir... 2 | * 3 | 4 | # ... except for this one. 5 | !.gitignore 6 | data 7 | README.md 8 | 9 | -------------------------------------------------------------------------------- /minio/README.md: -------------------------------------------------------------------------------- 1 | docker run -v -v `pwd`/minio/data:/data -e "MINIO_ACCESS_KEY=minio" -e "MINIO_SECRET_KEY=minio1234" -p 9000:9000 minio/minio server /data 2 | -------------------------------------------------------------------------------- /minio/data/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore all files in this dir... 2 | * 3 | 4 | # ... except for this one. 5 | !.gitignore 6 | !exams 7 | 8 | -------------------------------------------------------------------------------- /notifications-api/.dockerignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/notifications-api/.dockerignore -------------------------------------------------------------------------------- /notifications-api/.s2i/environment: -------------------------------------------------------------------------------- 1 | APP_CONFIG=gunicorn_config.py 2 | -------------------------------------------------------------------------------- /notifications-api/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright © 2018 Province of British Columbia 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | -------------------------------------------------------------------------------- /notifications-api/MANIFEST.in: -------------------------------------------------------------------------------- 1 | include requirements/prod.txt 2 | include config.py 3 | include logging.conf 4 | include LICENSE 5 | include README.md 6 | include src/api/static/images/*.png 7 | include src/api/static/images/*.jpg -------------------------------------------------------------------------------- /notifications-api/README.md: -------------------------------------------------------------------------------- 1 | 2 | # Notifications API 3 | 4 | Service BC Notifications API. 5 | 6 | -------------------------------------------------------------------------------- /notifications-api/entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | echo "Waiting for postgres..." 4 | 5 | gunicorn -b 0.0.0.0:5000 wsgi:application 6 | -------------------------------------------------------------------------------- /notifications-api/logging.conf: -------------------------------------------------------------------------------- 1 | [loggers] 2 | keys=root,api 3 | 4 | [handlers] 5 | keys=console 6 | 7 | [formatters] 8 | keys=simple 9 | 10 | [logger_root] 11 | level=DEBUG 12 | handlers=console 13 | 14 | [logger_api] 15 | level=DEBUG 16 | handlers=console 17 | qualname=api 18 | propagate=0 19 | 20 | [handler_console] 21 | class=StreamHandler 22 | level=DEBUG 23 | formatter=simple 24 | args=(sys.stdout,) 25 | 26 | [formatter_simple] 27 | format=%(asctime)s - %(name)s - %(levelname)s in %(module)s:%(filename)s:%(lineno)d - %(funcName)s: %(message)s 28 | datefmt= -------------------------------------------------------------------------------- /notifications-api/pytest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /notifications-api/requirements.txt: -------------------------------------------------------------------------------- 1 | Flask 2 | requests 3 | python-dotenv 4 | Jinja2 5 | pytz 6 | notifications-python-client 7 | Flask-Caching 8 | Werkzeug==2.2.3 9 | aniso8601 10 | attrs 11 | flask-restx 12 | gunicorn 13 | flask-jwt-oidc 14 | -------------------------------------------------------------------------------- /notifications-api/src/api/auth/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/notifications-api/src/api/auth/__init__.py -------------------------------------------------------------------------------- /notifications-api/src/api/auth/auth.py: -------------------------------------------------------------------------------- 1 | # Copyright © 2019 Province of British Columbia 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | """Auth.""" 15 | from flask_jwt_oidc import JwtManager 16 | 17 | jwt = JwtManager() 18 | -------------------------------------------------------------------------------- /notifications-api/src/api/services/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright © 2019 Province of British Columbia 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | """Exposes all of the Services used in the API.""" 15 | -------------------------------------------------------------------------------- /notifications-api/wsgi.py: -------------------------------------------------------------------------------- 1 | # Copyright © 2019 Province of British Columbia 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | """Provides the WSGI entry point for running the application 15 | """ 16 | from api import create_app 17 | 18 | application = create_app() 19 | 20 | if __name__ == "__main__": 21 | application.run() 22 | -------------------------------------------------------------------------------- /owasp/README.md: -------------------------------------------------------------------------------- 1 | This example demonstrates how to analyze a simple Java project with Gradle. 2 | 3 | Prerequisites 4 | ============= 5 | * [SonarQube](http://www.sonarqube.org/downloads/) 4.5+ 6 | * [Gradle](http://www.gradle.org/) 2.1 or higher 7 | 8 | Usage 9 | ===== 10 | * Analyze the project with SonarQube using Gradle: 11 | 12 | gradle sonarqube [-Dsonar.host.url=... -Dsonar.jdbc.url=... -Dsonar.jdbc.username=... -Dsonar.jdbc.password=...] 13 | -------------------------------------------------------------------------------- /owasp/dependency-check/repo/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/owasp/dependency-check/repo/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar -------------------------------------------------------------------------------- /owasp/dependency-check/repo/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/owasp/dependency-check/repo/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar -------------------------------------------------------------------------------- /owasp/dependency-check/repo/com/google/code/gson/gson/2.8.2/gson-2.8.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/owasp/dependency-check/repo/com/google/code/gson/gson/2.8.2/gson-2.8.2.jar -------------------------------------------------------------------------------- /owasp/dependency-check/repo/com/h2database/h2/1.4.196/h2-1.4.196.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/owasp/dependency-check/repo/com/h2database/h2/1.4.196/h2-1.4.196.jar -------------------------------------------------------------------------------- /owasp/dependency-check/repo/com/sun/mail/mailapi/1.6.1/mailapi-1.6.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/owasp/dependency-check/repo/com/sun/mail/mailapi/1.6.1/mailapi-1.6.1.jar -------------------------------------------------------------------------------- /owasp/dependency-check/repo/com/vdurmont/semver4j/2.1.0/semver4j-2.1.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/owasp/dependency-check/repo/com/vdurmont/semver4j/2.1.0/semver4j-2.1.0.jar -------------------------------------------------------------------------------- /owasp/dependency-check/repo/commons-cli/commons-cli/1.4/commons-cli-1.4.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/owasp/dependency-check/repo/commons-cli/commons-cli/1.4/commons-cli-1.4.jar -------------------------------------------------------------------------------- /owasp/dependency-check/repo/commons-collections/commons-collections/3.2.2/commons-collections-3.2.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/owasp/dependency-check/repo/commons-collections/commons-collections/3.2.2/commons-collections-3.2.2.jar -------------------------------------------------------------------------------- /owasp/dependency-check/repo/commons-io/commons-io/2.6/commons-io-2.6.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/owasp/dependency-check/repo/commons-io/commons-io/2.6/commons-io-2.6.jar -------------------------------------------------------------------------------- /owasp/dependency-check/repo/commons-lang/commons-lang/2.4/commons-lang-2.4.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/owasp/dependency-check/repo/commons-lang/commons-lang/2.4/commons-lang-2.4.jar -------------------------------------------------------------------------------- /owasp/dependency-check/repo/javax/activation/activation/1.1/activation-1.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/owasp/dependency-check/repo/javax/activation/activation/1.1/activation-1.1.jar -------------------------------------------------------------------------------- /owasp/dependency-check/repo/joda-time/joda-time/1.6/joda-time-1.6.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/owasp/dependency-check/repo/joda-time/joda-time/1.6/joda-time-1.6.jar -------------------------------------------------------------------------------- /owasp/dependency-check/repo/org/apache/ant/ant/1.9.9/ant-1.9.9.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/owasp/dependency-check/repo/org/apache/ant/ant/1.9.9/ant-1.9.9.jar -------------------------------------------------------------------------------- /owasp/dependency-check/repo/org/apache/commons/commons-compress/1.16.1/commons-compress-1.16.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/owasp/dependency-check/repo/org/apache/commons/commons-compress/1.16.1/commons-compress-1.16.1.jar -------------------------------------------------------------------------------- /owasp/dependency-check/repo/org/apache/commons/commons-lang3/3.4/commons-lang3-3.4.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/owasp/dependency-check/repo/org/apache/commons/commons-lang3/3.4/commons-lang3-3.4.jar -------------------------------------------------------------------------------- /owasp/dependency-check/repo/org/apache/lucene/lucene-analyzers-common/5.5.5/lucene-analyzers-common-5.5.5.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/owasp/dependency-check/repo/org/apache/lucene/lucene-analyzers-common/5.5.5/lucene-analyzers-common-5.5.5.jar -------------------------------------------------------------------------------- /owasp/dependency-check/repo/org/apache/lucene/lucene-core/5.5.5/lucene-core-5.5.5.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/owasp/dependency-check/repo/org/apache/lucene/lucene-core/5.5.5/lucene-core-5.5.5.jar -------------------------------------------------------------------------------- /owasp/dependency-check/repo/org/apache/lucene/lucene-queries/5.5.5/lucene-queries-5.5.5.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/owasp/dependency-check/repo/org/apache/lucene/lucene-queries/5.5.5/lucene-queries-5.5.5.jar -------------------------------------------------------------------------------- /owasp/dependency-check/repo/org/apache/lucene/lucene-queryparser/5.5.5/lucene-queryparser-5.5.5.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/owasp/dependency-check/repo/org/apache/lucene/lucene-queryparser/5.5.5/lucene-queryparser-5.5.5.jar -------------------------------------------------------------------------------- /owasp/dependency-check/repo/org/apache/lucene/lucene-sandbox/5.5.5/lucene-sandbox-5.5.5.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/owasp/dependency-check/repo/org/apache/lucene/lucene-sandbox/5.5.5/lucene-sandbox-5.5.5.jar -------------------------------------------------------------------------------- /owasp/dependency-check/repo/org/apache/velocity/velocity/1.7/velocity-1.7.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/owasp/dependency-check/repo/org/apache/velocity/velocity/1.7/velocity-1.7.jar -------------------------------------------------------------------------------- /owasp/dependency-check/repo/org/glassfish/javax.json/1.0.4/javax.json-1.0.4.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/owasp/dependency-check/repo/org/glassfish/javax.json/1.0.4/javax.json-1.0.4.jar -------------------------------------------------------------------------------- /owasp/dependency-check/repo/org/jsoup/jsoup/1.11.2/jsoup-1.11.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/owasp/dependency-check/repo/org/jsoup/jsoup/1.11.2/jsoup-1.11.2.jar -------------------------------------------------------------------------------- /owasp/dependency-check/repo/org/objenesis/objenesis/2.6/objenesis-2.6.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/owasp/dependency-check/repo/org/objenesis/objenesis/2.6/objenesis-2.6.jar -------------------------------------------------------------------------------- /owasp/dependency-check/repo/org/owasp/dependency-check-cli/3.1.2/dependency-check-cli-3.1.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/owasp/dependency-check/repo/org/owasp/dependency-check-cli/3.1.2/dependency-check-cli-3.1.2.jar -------------------------------------------------------------------------------- /owasp/dependency-check/repo/org/owasp/dependency-check-core/3.1.2/dependency-check-core-3.1.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/owasp/dependency-check/repo/org/owasp/dependency-check-core/3.1.2/dependency-check-core-3.1.2.jar -------------------------------------------------------------------------------- /owasp/dependency-check/repo/org/owasp/dependency-check-utils/3.1.2/dependency-check-utils-3.1.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/owasp/dependency-check/repo/org/owasp/dependency-check-utils/3.1.2/dependency-check-utils-3.1.2.jar -------------------------------------------------------------------------------- /owasp/dependency-check/repo/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/owasp/dependency-check/repo/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar -------------------------------------------------------------------------------- /owasp/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/owasp/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /owasp/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue Sep 20 22:02:53 BST 2016 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.2-bin.zip 7 | -------------------------------------------------------------------------------- /sonar-runner/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-XX:PermSize=512M -XX:MaxPermSize=512M 2 | -------------------------------------------------------------------------------- /sonar-runner/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/sonar-runner/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /sonar-runner/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /tests/loadtesting/.gitignore: -------------------------------------------------------------------------------- 1 | output/ 2 | envs.sh -------------------------------------------------------------------------------- /tests/loadtesting/envs.example.sh: -------------------------------------------------------------------------------- 1 | #! /bin/sh 2 | set -e 3 | set -u 4 | 5 | # Set environment variables below. 6 | echo "Loading environment variables" 7 | 8 | # We update the API key from keycloak 9 | export SERVICE_API_KEY=$(npm run get-keycloak-token --silent) 10 | export MAX_VIRTUAL_USERS=200 11 | 12 | # Note - Changing target may require additional keycloak changes, depending on setup. 13 | # Currently this is configured to work with Keycloak/OIDC dev in OpenShifit DEV 14 | # and even localhost if your loaclhost uses OIDC dev. 15 | # Load-testing logs into keycloak via `admin:admin`. 16 | # Implementation details, including Keycloak URI, are in `function.js` 17 | export TARGET="http://localhost:5000" 18 | # export TARGET="https://dev-theq.pathfinder.gov.bc.ca" 19 | export KEYCLOAK_USERNAME='admin' 20 | export KEYCLOAK_PASSWORD='admin' 21 | 22 | echo "Target: $TARGET\n" -------------------------------------------------------------------------------- /tests/loadtesting/output/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bcgov/queue-management/0faa6c2f852d9e4ea9013ca99029ea21361d1d30/tests/loadtesting/output/.gitkeep --------------------------------------------------------------------------------
This is your message: {{message}}