1- import { MESSAGES_FS , functions , USERS_FS , BOATS_FS , firestore } from "../firebase"
1+ import { MESSAGES_FS , functions , USERS_FS , BOATS_FS } from "../firebase"
22import { dualogStringify , dualogParse } from "./utils"
33import { dualog } from "."
44import { format } from "date-fns"
@@ -16,115 +16,125 @@ Object.entries = function (obj) { //eslint-disable-line no-extend-native
1616function convertDate ( e ) { return format ( e . toDate ( ) , "yyyyMMdd" ) }
1717function convertTime ( e ) { return format ( e . toDate ( ) , "HHmm" ) }
1818function stringifyCatch ( c ) { return Object . entries ( c ) . map ( ( [ k , v ] ) => [ k , v ] . join ( " " ) ) . join ( " " ) }
19+ function prependSign ( number ) { return `${ Math . sign ( number ) > 0 ? "+" : "" } ${ number } ` }
1920
2021export default functions . firestore . document ( "users/{userId}/messages/{messageId}" )
2122 . onCreate ( async ( snap , { params : { userId, messageId} , eventId} ) => {
2223 if ( ! ( await MESSAGES_FS ( userId ) . where ( "eventId" , "==" , eventId ) . get ( ) ) . empty ) return null
23- let m = snap . data ( )
24+ try {
25+ let m = snap . data ( )
2426
25- console . log ( `${ m . TM } message created` )
27+ console . log ( `${ m . TM } message created` )
2628
27- let boat = { }
28- let wgs = { }
29+ let boat = { }
30+ let wgs = { }
2931
30- let user = ( await USERS_FS . doc ( userId ) . get ( ) ) . data ( ) // Fetch last serial number
32+ await MESSAGES_FS ( userId ) . doc ( messageId ) . update ( { eventId } )
3133
32- const RN = user . RN ? user . RN + 1 : 1
34+ const boatQuery = await BOATS_FS . where ( "userId" , "==" , userId ) . get ( )
35+ boatQuery . docs . forEach ( b => { if ( b . exists ) boat = b . data ( ) } )
3336
34- const batch = firestore . batch ( )
35- batch . update ( USERS_FS . doc ( userId ) , { RN } )
36- batch . update ( MESSAGES_FS ( userId ) . doc ( messageId ) , { RN , eventId} )
37- await batch . commit ( )
38-
39- const boatQuery = await BOATS_FS . where ( "userId" , "==" , userId ) . get ( )
40- boatQuery . docs . forEach ( b => { if ( b . exists ) boat = b . data ( ) } )
41-
42- let message = {
43- TM : m . TM ,
44- RN ,
45- AD : "NOR" ,
46- RC : boat . RC ,
47- NA : boat . NA ,
48- MA : m . MA ,
49- DA : convertDate ( m . created ) ,
50- TI : convertTime ( m . created )
51- }
52-
53- switch ( m . TM ) {
54- case "DEP" :
55- wgs = utm . fromLatLon ( m . expectedFishingSpot . latitude , m . expectedFishingSpot . longitude )
56- message = {
57- ...message ,
58- XR : boat . XR ,
59- PO : m . PO ,
60- ZD : convertDate ( m . departure ) ,
61- ZT : convertTime ( m . departure ) ,
62- PD : convertDate ( m . expectedFishingStart ) ,
63- PT : convertTime ( m . expectedFishingStart ) ,
64- LA : "N" + wgs . northing ,
65- LO : "E" + wgs . easting ,
66- AC : m . AC ,
67- DS : m . DS ,
68- OB : stringifyCatch ( m . OB )
37+ let message = {
38+ TM : m . TM ,
39+ RN : m . RN ,
40+ AD : "NOR" ,
41+ RC : boat . RC ,
42+ NA : boat . NA ,
43+ MA : m . MA ,
44+ DA : convertDate ( m . created ) ,
45+ TI : convertTime ( m . created )
6946 }
70- break
71-
72- case "DCA" : {
73- const { AD , QI , AC , TS , ZO , GE , GP , DU , CA , ME , GS , fishingStart, startFishingSpot, endFishingSpot} = m
74- message = {
75- ...message ,
76- XR : boat . XR ,
77- AD ,
78- QI ,
79- AC ,
80- BD : convertDate ( fishingStart ) ,
81- BT : convertTime ( fishingStart ) ,
82- ZO ,
83- LT : `+${ startFishingSpot . latitude . toString ( ) } ` , //LT/+63.400
84- LG : `+${ startFishingSpot . longitude . toString ( ) } ` , //LG/+010.400
85- GE ,
86- GP ,
87- XT : `+${ endFishingSpot . latitude . toString ( ) } ` , //Same as LT
88- XG : `+${ endFishingSpot . longitude . toString ( ) } ` , //Same as LG
89- DU ,
90- CA : stringifyCatch ( CA ) ,
91- GS
47+
48+ switch ( m . TM ) {
49+ case "DEP" :
50+ wgs = utm . fromLatLon ( m . expectedFishingSpot . latitude , m . expectedFishingSpot . longitude )
51+ message = {
52+ ...message ,
53+ XR : boat . XR ,
54+ PO : m . PO ,
55+ ZD : convertDate ( m . departure ) ,
56+ ZT : convertTime ( m . departure ) ,
57+ PD : convertDate ( m . expectedFishingStart ) ,
58+ PT : convertTime ( m . expectedFishingStart ) ,
59+ LA : "N" + wgs . northing ,
60+ LO : "E" + wgs . easting ,
61+ AC : m . AC ,
62+ DS : m . DS ,
63+ OB : stringifyCatch ( m . OB )
64+ }
65+ break
66+
67+ case "DCA" : {
68+ const { AD , QI , AC , TS , ZO , GE , GP , DU , ME , GS , fishingStart, startFishingSpot, endFishingSpot} = m
69+ message = {
70+ ...message ,
71+ XR : boat . XR ,
72+ AD ,
73+ QI ,
74+ AC ,
75+ BD : convertDate ( fishingStart ) ,
76+ BT : convertTime ( fishingStart ) ,
77+ ZO ,
78+ LT : prependSign ( startFishingSpot . latitude ) , //LT/+63.400
79+ LG : prependSign ( startFishingSpot . longitude ) , //LG/+010.400
80+ GE ,
81+ GP ,
82+ XG : prependSign ( endFishingSpot . longitude ) , //Same as LG
83+ XT : prependSign ( endFishingSpot . latitude ) , //Same as LT
84+ DU ,
85+ GS
86+ }
87+ if ( m . CA ) m . CA = stringifyCatch ( messages . CA )
88+ if ( [ "OTB" , "OTM" , "SSC" , "GEN" , "TBS" ] . includes ( GE ) ) {
89+ message = { ...message , ME }
90+ }
9291 }
93- if ( [ "OTB" , "OTM" , "SSC" , "GEN" , "TBS" ] . includes ( GE ) ) {
94- message = { ...message , ME }
92+ break
93+
94+ case "POR" : {
95+ const { PO , portArrival, LS , } = m
96+ message = {
97+ ...message ,
98+ NA : boat . NA ,
99+ XR : boat . NA ,
100+ PO ,
101+ PD : convertDate ( portArrival ) ,
102+ PT : convertTime ( portArrival ) ,
103+ OB : stringifyCatch ( m . OB ) ,
104+ LS ,
105+ KG : stringifyCatch ( m . KG )
106+ }
95107 }
96- }
97- break
108+ break
98109
99- case "POR" : {
100- const { PO , portArrival, LS , } = m
101- message = {
102- ...message ,
103- NA : boat . NA ,
104- XR : boat . NA ,
105- PO ,
106- PD : convertDate ( portArrival ) ,
107- PT : convertTime ( portArrival ) ,
108- OB : stringifyCatch ( m . OB ) ,
109- LS ,
110- KG : stringifyCatch ( m . KG )
110+ default :
111+ break
111112 }
113+ console . log ( `Sending ${ dualogStringify ( message ) } to Dualog` )
114+ let result = await dualog ( {
115+ body : { PlainTextNaf : dualogStringify ( message ) }
116+ } )
117+
118+ result = dualogParse ( result )
119+
120+ await USERS_FS . doc ( userId ) . collection ( "messages" ) . doc ( messageId ) . update ( { result} )
121+
122+ console . log ( `Response from Dualog: ${ JSON . stringify ( result ) } ` )
123+
124+ return null
125+ } catch ( error ) {
126+ const m = snap . data ( )
127+ const now = Date . now ( )
128+ return USERS_FS . doc ( userId ) . collection ( "messages" ) . doc ( messageId ) . update ( { result :{
129+ TM : "RET" ,
130+ RN : m . RN ,
131+ FR : "NOR-DUALOG" ,
132+ RC : m . RC ,
133+ RS : "NAK" ,
134+ RE : 100 ,
135+ DA : format ( now , "yyyyMMdd" ) ,
136+ TI : format ( now , "HHmm" ) ,
137+ error
138+ } } )
112139 }
113- break
114-
115- default :
116- break
117- }
118- console . log ( `Sending ${ dualogStringify ( message ) } to Dualog` )
119- let result = await dualog ( {
120- body : { PlainTextNaf : dualogStringify ( message ) }
121- } )
122-
123- result = dualogParse ( result )
124-
125- await USERS_FS . doc ( userId ) . collection ( "messages" ) . doc ( messageId ) . update ( { result} )
126-
127- console . log ( `Response from Dualog: ${ JSON . stringify ( result ) } ` )
128-
129- return null
130140 } )
0 commit comments