Skip to content

Commit 0e1275b

Browse files
committed
feat: add Google Maps services for address retrieval and update intervention message with location details
1 parent e3ea45e commit 0e1275b

5 files changed

Lines changed: 132 additions & 19 deletions

File tree

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
"deploy": "docker compose build --no-cache && docker compose up -d --force-recreate"
1111
},
1212
"dependencies": {
13+
"@googlemaps/google-maps-services-js": "^3.4.2",
1314
"@googlemaps/routing": "^2.1.0",
1415
"axios": "^1.10.0",
1516
"dotenv": "^17.2.0",

src/controllers/telegram.ts

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import { sendTelegramMessage } from '../services/telegram'
22
import { ElaboratedIntervention, checkIfInterventionIsOfCompetence } from './intervention'
33
import * as locations from '../data/locations.json'
4-
import { getGoogleMapsRoute } from '../services/google-maps'
4+
import { getAddressFromCoordinates, getGoogleMapsRoute } from '../services/google-maps'
55
import { getTelegramUsers } from '../models/telegramuser'
66
import { MolinellaCoordinates } from '../utilites/constants'
7+
import { InlineKeyboardButton } from 'telegraf/typings/core/types/typegram'
78

89
const molinellaWord = 'MOLINELLA'
910

@@ -20,20 +21,40 @@ export const sendInterventionMessage = async (intervention: ElaboratedInterventi
2021
const appleMapsUrl = `https://maps.apple.com/?ll=${intervention.intervention.latitude},${intervention.intervention.longitude}`
2122
const wazeUrl = `https://waze.com/ul?ll=${intervention.intervention.latitude},${intervention.intervention.longitude}`
2223

24+
const placeAddress = await getAddressFromCoordinates({
25+
latitude: intervention.intervention.latitude,
26+
longitude: intervention.intervention.longitude,
27+
})
28+
2329
// Prepare the competence message with MOLINELLA in bold
2430
const competencesMessage = await generateCompetenceMessage(intervention)
2531

2632
// Do not change the indentation, it is important for the Telegram message formatting
2733
const textMessage = `
2834
🚒 ${title}
29-
📟 ${intervention.intervention.title}
35+
📟 ${intervention.intervention.title}
36+
📍 ${placeAddress || 'Indirizzo non disponibile'}
3037
${separator}
3138
🗺️ Competenze:
3239
${competencesMessage}
3340
${separator}
3441
📢 ${intervention.intervention.sender}
3542
`
3643

44+
const buttons: InlineKeyboardButton[][] = [
45+
[
46+
{ text: '📍 Google Maps', url: mapsUrl },
47+
{ text: '🍏 Apple Maps', url: appleMapsUrl },
48+
{ text: '🗺️ Waze', url: wazeUrl },
49+
],
50+
[
51+
{
52+
text: 'Asset Bologna',
53+
url: 'https://vvfsctas.maps.arcgis.com/apps/webappviewer/index.html?id=4fdccb08973d4ba5ab41e021a16e3241',
54+
},
55+
],
56+
]
57+
3758
const telegramUsers = await getTelegramUsers()
3859

3960
for (let i = 0; i < telegramUsers.length; i++) {
@@ -43,19 +64,7 @@ ${separator}
4364
await sendTelegramMessage(user.chat_id, textMessage, {
4465
parse_mode: 'HTML',
4566
reply_markup: {
46-
inline_keyboard: [
47-
[
48-
{ text: '📍 Google Maps', url: mapsUrl },
49-
{ text: '🍏 Apple Maps', url: appleMapsUrl },
50-
{ text: '🗺️ Waze', url: wazeUrl },
51-
],
52-
[
53-
{
54-
text: 'Asset Bologna',
55-
url: 'https://vvfsctas.maps.arcgis.com/apps/webappviewer/index.html?id=4fdccb08973d4ba5ab41e021a16e3241',
56-
},
57-
],
58-
],
67+
inline_keyboard: buttons,
5968
},
6069
})
6170
} catch (error) {

src/index.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ export let database: PostgreSQL
66

77
const app = async () => {
88
try {
9-
console.log('Starting application with configuration:', config)
10-
console.log('Node environment:', process.env.NODE_ENV)
119
await startServer()
1210
database = new PostgreSQL(config.database)
1311
await database.start()

src/services/google-maps.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { config } from '../config/config'
22
import { Coordinates } from '../utilites/geo'
33
import { RoutesClient } from '@googlemaps/routing'
4+
import { Client } from '@googlemaps/google-maps-services-js'
45

56
export const getGoogleMapsRoute = async (
67
from: Coordinates,
@@ -62,3 +63,26 @@ export const getGoogleMapsRoute = async (
6263
duration: (Number(route.duration.seconds) / 60).toFixed(0), // Convert seconds to minutes
6364
}
6465
}
66+
67+
export const getAddressFromCoordinates = async (coordinates: Coordinates): Promise<string | undefined> => {
68+
const client = new Client()
69+
70+
try {
71+
const response = await client
72+
.reverseGeocode({
73+
params: {
74+
latlng: { lat: coordinates.latitude, lng: coordinates.longitude },
75+
key: config.google_maps_api_key,
76+
},
77+
})
78+
.then((resp) => resp.data)
79+
80+
if (response.results.length > 0) {
81+
return response.results[0].formatted_address
82+
}
83+
} catch (error) {
84+
console.error('Error fetching address:', error)
85+
}
86+
87+
return undefined
88+
}

yarn.lock

Lines changed: 83 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,31 @@
5050
"@fastify/forwarded" "^3.0.0"
5151
ipaddr.js "^2.1.0"
5252

53+
"@googlemaps/google-maps-services-js@^3.4.2":
54+
version "3.4.2"
55+
resolved "https://registry.yarnpkg.com/@googlemaps/google-maps-services-js/-/google-maps-services-js-3.4.2.tgz#cdf75ce6a304e09026b22f7c362dbd3bb301d049"
56+
integrity sha512-QjxiJSt8woyPaaQIUUDNL1nRfCEXTiv8KfJSNq/YzKEUVXABT75GLG+Zo267UwOcq70n8OsZbaro5VrY962mJg==
57+
dependencies:
58+
"@googlemaps/url-signature" "^1.0.4"
59+
agentkeepalive "^4.1.0"
60+
axios "^1.5.1"
61+
query-string "<8.x"
62+
retry-axios "<3.x"
63+
5364
"@googlemaps/routing@^2.1.0":
5465
version "2.1.0"
5566
resolved "https://registry.yarnpkg.com/@googlemaps/routing/-/routing-2.1.0.tgz#585a77085106ab63e2fe3d9abe63463f281cec38"
5667
integrity sha512-mcLpzVIN5Q++ry1SdbubCATfd6TN5akXfopKAVn1iCCcqWgtXtNY3pIe2Stc24Vuw8CoTKuT5w5KT+robTO2Qw==
5768
dependencies:
5869
google-gax "^5.0.0"
5970

71+
"@googlemaps/url-signature@^1.0.4":
72+
version "1.0.40"
73+
resolved "https://registry.yarnpkg.com/@googlemaps/url-signature/-/url-signature-1.0.40.tgz#f23ae281a07f9e04345fb456053fd2cc6144fb28"
74+
integrity sha512-Gme3JxGZWQ4NVpATajSpS2/inQzhUxRvr/FK6IFpcC7AHOAmx8blI0y1/Qi2jqil+WoQ3TkEqq/MaKVtuV68RQ==
75+
dependencies:
76+
crypto-js "^4.2.0"
77+
6078
"@grpc/grpc-js@^1.12.6":
6179
version "1.13.4"
6280
resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.13.4.tgz#922fbc496e229c5fa66802d2369bf181c1df1c5a"
@@ -312,6 +330,13 @@ agent-base@^7.1.2:
312330
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.4.tgz#e3cd76d4c548ee895d3c3fd8dc1f6c5b9032e7a8"
313331
integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==
314332

333+
agentkeepalive@^4.1.0:
334+
version "4.6.0"
335+
resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.6.0.tgz#35f73e94b3f40bf65f105219c623ad19c136ea6a"
336+
integrity sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==
337+
dependencies:
338+
humanize-ms "^1.2.1"
339+
315340
ajv-formats@^3.0.1:
316341
version "3.0.1"
317342
resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-3.0.1.tgz#3d5dc762bca17679c3c2ea7e90ad6b7532309578"
@@ -396,6 +421,15 @@ axios@^1.10.0:
396421
form-data "^4.0.0"
397422
proxy-from-env "^1.1.0"
398423

424+
axios@^1.5.1:
425+
version "1.11.0"
426+
resolved "https://registry.yarnpkg.com/axios/-/axios-1.11.0.tgz#c2ec219e35e414c025b2095e8b8280278478fdb6"
427+
integrity sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==
428+
dependencies:
429+
follow-redirects "^1.15.6"
430+
form-data "^4.0.4"
431+
proxy-from-env "^1.1.0"
432+
399433
balanced-match@^1.0.0:
400434
version "1.0.2"
401435
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
@@ -570,6 +604,11 @@ create-require@^1.1.0:
570604
resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
571605
integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
572606

607+
crypto-js@^4.2.0:
608+
version "4.2.0"
609+
resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.2.0.tgz#4d931639ecdfd12ff80e8186dba6af2c2e856631"
610+
integrity sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==
611+
573612
data-uri-to-buffer@^4.0.0:
574613
version "4.0.1"
575614
resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e"
@@ -587,6 +626,11 @@ decamelize@^4.0.0:
587626
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837"
588627
integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==
589628

629+
decode-uri-component@^0.2.2:
630+
version "0.2.2"
631+
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9"
632+
integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==
633+
590634
deep-eql@^5.0.1:
591635
version "5.0.2"
592636
resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341"
@@ -789,6 +833,11 @@ fill-range@^7.1.1:
789833
dependencies:
790834
to-regex-range "^5.0.1"
791835

836+
filter-obj@^1.1.0:
837+
version "1.1.0"
838+
resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b"
839+
integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==
840+
792841
find-my-way@^9.0.0:
793842
version "9.3.0"
794843
resolved "https://registry.yarnpkg.com/find-my-way/-/find-my-way-9.3.0.tgz#9f57786b5d772cc45142bf39dd5349f9cc883f91"
@@ -828,7 +877,7 @@ form-data@^2.5.0:
828877
mime-types "^2.1.35"
829878
safe-buffer "^5.2.1"
830879

831-
form-data@^4.0.0:
880+
form-data@^4.0.0, form-data@^4.0.4:
832881
version "4.0.4"
833882
resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.4.tgz#784cdcce0669a9d68e94d11ac4eea98088edd2c4"
834883
integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==
@@ -1033,6 +1082,13 @@ https-proxy-agent@^7.0.1:
10331082
agent-base "^7.1.2"
10341083
debug "4"
10351084

1085+
humanize-ms@^1.2.1:
1086+
version "1.2.1"
1087+
resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
1088+
integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==
1089+
dependencies:
1090+
ms "^2.0.0"
1091+
10361092
ignore-by-default@^1.0.1:
10371093
version "1.0.1"
10381094
resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09"
@@ -1249,7 +1305,7 @@ mri@^1.2.0:
12491305
resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b"
12501306
integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==
12511307

1252-
ms@^2.1.3:
1308+
ms@^2.0.0, ms@^2.1.3:
12531309
version "2.1.3"
12541310
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
12551311
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
@@ -1504,6 +1560,16 @@ pstree.remy@^1.1.8:
15041560
resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a"
15051561
integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==
15061562

1563+
query-string@<8.x:
1564+
version "7.1.3"
1565+
resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.1.3.tgz#a1cf90e994abb113a325804a972d98276fe02328"
1566+
integrity sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==
1567+
dependencies:
1568+
decode-uri-component "^0.2.2"
1569+
filter-obj "^1.1.0"
1570+
split-on-first "^1.0.0"
1571+
strict-uri-encode "^2.0.0"
1572+
15071573
quick-format-unescaped@^4.0.3:
15081574
version "4.0.4"
15091575
resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7"
@@ -1552,6 +1618,11 @@ ret@~0.5.0:
15521618
resolved "https://registry.yarnpkg.com/ret/-/ret-0.5.0.tgz#30a4d38a7e704bd96dc5ffcbe7ce2a9274c41c95"
15531619
integrity sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==
15541620

1621+
retry-axios@<3.x:
1622+
version "2.6.0"
1623+
resolved "https://registry.yarnpkg.com/retry-axios/-/retry-axios-2.6.0.tgz#d4dc5c8a8e73982e26a705e46a33df99a28723e0"
1624+
integrity sha512-pOLi+Gdll3JekwuFjXO3fTq+L9lzMQGcSq7M5gIjExcl3Gu1hd4XXuf5o3+LuSBsaULQH7DiNbsqPd1chVpQGQ==
1625+
15551626
retry-request@^8.0.0:
15561627
version "8.0.0"
15571628
resolved "https://registry.yarnpkg.com/retry-request/-/retry-request-8.0.0.tgz#91c847cb648a049c14f0cb3322313d091d2445a3"
@@ -1647,6 +1718,11 @@ sonic-boom@^4.0.1:
16471718
dependencies:
16481719
atomic-sleep "^1.0.0"
16491720

1721+
split-on-first@^1.0.0:
1722+
version "1.1.0"
1723+
resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f"
1724+
integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==
1725+
16501726
split2@^4.0.0, split2@^4.1.0:
16511727
version "4.2.0"
16521728
resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4"
@@ -1664,6 +1740,11 @@ stream-shift@^1.0.2:
16641740
resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.3.tgz#85b8fab4d71010fc3ba8772e8046cc49b8a3864b"
16651741
integrity sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==
16661742

1743+
strict-uri-encode@^2.0.0:
1744+
version "2.0.0"
1745+
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546"
1746+
integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==
1747+
16671748
string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
16681749
version "4.2.3"
16691750
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"

0 commit comments

Comments
 (0)