Added fire - telegram links, for more info

This commit is contained in:
vjrj 2018-01-18 10:55:58 +01:00
parent 40aedbfdfb
commit c79f8b5f8b
7 changed files with 72 additions and 51 deletions

View file

@ -7,15 +7,22 @@ const firesCommonSchema = {
ourid: LocationSchema,
lat: Number,
lon: Number,
address: { type: String, optional: true },
scan: Number,
type: String,
when: Date,
// Neighbour notified fires
owner: { type: String, optional: true },
dateformat: { type: String, optional: true },
// NASA types
address: { type: String, optional: true }, // reverse geo
scan: { type: Number, optional: true },
track: { type: Number, optional: true },
acq_date: { type: String, optional: true },
acq_time: { type: String, optional: true },
satellite: { type: String, optional: true },
confidence: { type: Number, optional: true },
confidence: { type: String, optional: true },
version: { type: String, optional: true },
frp: { type: Number, optional: true },
daynight: { type: String, optional: true },
@ -23,6 +30,8 @@ const firesCommonSchema = {
bright_t31: { type: Number, optional: true },
bright_ti4: { type: Number, optional: true },
bright_ti5: { type: Number, optional: true },
// common
createdAt: defaultCreatedAt,
updatedAt: defaultUpdateAt
};

View file

@ -2,6 +2,7 @@
import { Mongo } from 'meteor/mongo';
import SimpleSchema from 'simpl-schema';
import firesCommonSchema from '../Common/FiresSchema';
const FireAlerts = new Mongo.Collection('avisosfuego', { idGeneration: 'MONGO' });
@ -17,33 +18,7 @@ FireAlerts.deny({
remove: () => true
});
/* Sample:
* "_id" : ObjectId("5a059c4879095a1adba47507"),
* "chatId" : null,
* "location" : {
* "lat" : 40.2324096,
* "lon" : -3.3514863,
* "text" : null
* },
* "aviso" : ISODate("2017-11-10T12:32:08.973Z"),
* "dateformat" : "20171110",
* "geo" : {
* "type" : "Point",
* "coordinates" : [
* -3.3514863,
* 40.2324096
* ]
* }
* }
* */
FireAlerts.schema = new SimpleSchema({
location: Object,
'location.lat': Number,
'location.lon': Number,
aviso: Date
});
FireAlerts.schema = new SimpleSchema(firesCommonSchema);
FireAlerts.attachSchema(FireAlerts.schema);

View file

@ -5,12 +5,12 @@ import { Meteor } from 'meteor/meteor';
import { check } from 'meteor/check';
import urlEnc from '/imports/modules/url-encode';
import { Promise } from 'meteor/promise';
import FiresCollection from '../Fires';
import NodeGeocoder from 'node-geocoder';
import { gmapServerKey } from '/imports/startup/server/IPGeocoder';
import FiresCollection from '../Fires';
function findFire(unsealed) {
const fire = FiresCollection.find({ ourid: { type: 'Point', coordinates: [unsealed.lon, unsealed.lat] } });
const fire = FiresCollection.find({ ourid: { type: 'Point', coordinates: [unsealed.lon, unsealed.lat] }, when: unsealed.when, type: unsealed.type });
return fire;
}
@ -30,22 +30,32 @@ Meteor.publish('fireFromHash', function fireFromHash(fireEnc) {
// console.log(fireEnc);
const unsealed = Promise.await(urlEnc.decrypt(fireEnc));
const w = unsealed.when;
// console.log(w);
unsealed.when = new Date(w);
// console.log(unsealed.when);
const c = unsealed.createdAt;
unsealed.createdAt = new Date(c);
const u = unsealed.updatedAt;
unsealed.updatedAt = new Date(u);
// console.log(unsealed);
FiresCollection.schema.validate(unsealed);
const fire = findFire(unsealed);
try {
const rev = Promise.await(geocoder.reverse({ lat: unsealed.lat, lon: unsealed.lon }));
if (rev[0]) {
unsealed.address = rev[0].formattedAddress;
// console.log(`Found: ${fire.count()}`);
if (!unsealed.address) {
try {
const rev = Promise.await(geocoder.reverse({ lat: unsealed.lat, lon: unsealed.lon }));
if (rev[0]) {
unsealed.address = rev[0].formattedAddress;
}
// console.log(unsealed.address);
} catch (reve) {
console.error(reve);
}
// console.log(unsealed.address);
} catch (reve) {
console.error(reve);
}
if (fire.count() === 0) {
const result = FiresCollection.upsert({ ourid: unsealed.ourid }, { $set: unsealed }, { multi: false, upsert: true });
console.log(JSON.stringify(result));
// const result =
FiresCollection.upsert({ ourid: unsealed.ourid, when: unsealed.when, type: unsealed.type }, { $set: unsealed }, { multi: false, upsert: true });
// console.log(JSON.stringify(result));
}
return findFire(unsealed);
/* console.log(`fires: ${fire.count()}`);

View file

@ -4,6 +4,7 @@ import { Meteor } from 'meteor/meteor';
import { Accounts } from 'meteor/accounts-base';
import randomHex from 'crypto-random-hex';
import UserSubsToFiresCollection from '/imports/api/Subscriptions/Subscriptions';
import FireAlertsCollection from '/imports/api/FireAlerts/FireAlerts';
Meteor.startup(() => {
// https://github.com/percolatestudio/meteor-migrations
@ -69,6 +70,18 @@ Meteor.startup(() => {
}
});
Migrations.add({
version: 4,
up: function deleteOldAlertFiresAndIndexes() {
FireAlertsCollection.remove({ createdAd: null });
const raw = FireAlertsCollection.rawCollection();
raw.createIndex({ ourid: '2dsphere' });
raw.createIndex({ when: 1 });
raw.createIndex({ updatedAt: 1 });
raw.createIndex({ createdAt: 1 });
raw.createIndex({ ourid: 1, type: 1 });
}
});
// Set createdAt in users & subs
Migrations.migrateTo('latest');

View file

@ -26,14 +26,17 @@ class Fire extends React.Component {
render() {
const { loading, fire, t } = this.props;
if (fire && fire.when) {
this.when = moment.tz(fire.when, moment.tz.guess());
}
return (
<div className="ViewFire">
{!loading &&
<Fragment>
<h4 className="page-header">
{fire.address ?
t('Información adicional sobre fuego detectado en {{where}} el {{when}}', { where: fire.address, when: moment(fire.when).tz(moment.tz.guess()).format('LLLL (z)') }) :
t('Información adicional sobre fuego detectado el {{when}}', { when: moment.utc(fire.when).format('LLLL') })}
t('Información adicional sobre fuego detectado en {{where}} el {{when}}', { where: fire.address, when: this.when.format('LLLL (z)') }) :
t('Información adicional sobre fuego detectado el {{when}}', { when: this.when.format('LLLL (z)') })}
</h4>
<Map
@ -44,7 +47,7 @@ class Fire extends React.Component {
sleep={false}
center={[fire.lat, fire.lon]}
className="fire-leaflet-container"
zoom={8}
zoom={12}
>
<Fragment>
<Circle
@ -52,15 +55,18 @@ class Fire extends React.Component {
color="red"
fillColor="red"
fillOpacity={0.1}
radius={fire.scan * 1000}
radius={fire.scan ? fire.scan * 1000 : 300}
/>
</Fragment>
<DefMapLayers />
</Map>
<p>{t('Coordenadas:')} {fire.lat}, {fire.lon}</p>
{(fire.type === 'modis' || fire.type === 'virrs') &&
<p>{t('Fuego detectado por satélites de la NASA {{when}}', { when: moment(fire.when).fromNow() })}</p>
{(fire.type === 'modis' || fire.type === 'viirs') &&
<p>{t('Fuego detectado por satélites de la NASA {{when}}', { when: this.when.fromNow() })}</p>
}
{(fire.type === 'vecinal') &&
<p>{t('Fuego notificado por uno de nuestros usuarios/as {{when}}', { when: this.when.fromNow() })}</p>
}
{/* TODO: marcar tipo de fuego, industria, etc */}
<h4>{t('Comentarios')}</h4>
<div className="comments-info">
@ -71,7 +77,7 @@ class Fire extends React.Component {
<li>{t('si conoces esta zona y cómo acceder a el fuego (esto puede de ser de ayuda para apagarlo si sigue activo o para investigarlo en un futuro)')}</li>
<li>{t('si conoces el motivo por el que comenzó el fuego')}</li>
<li>{t('si quieres denunciar algún tipo de ilegalidad, incluso anónimamente')}</li>
<li>{t('etc')}</li>
<li>{t('o cualquier otra información')}</li>
</ul>
</div>
<div className="comments-section">

View file

@ -260,9 +260,7 @@ export default translate([], { wait: true })(withTracker(() => {
activefires: ActiveFiresCollection.find({}, { reactive: zoom.get() >= MAXZOOMREACTIVE }).fetch(),
// activefires: ActiveFiresCollection.find({}).fetch(),
activefirestotal: Counter.get('countActiveFires'),
firealerts: FireAlertsCollection.find().fetch().map(doc => (
{ _id: doc._id, lat: doc.location.lat, lon: doc.location.lon }
)),
firealerts: FireAlertsCollection.find().fetch(),
center: geolocation.get(),
zoom: zoom.get()
};

View file

@ -3,6 +3,7 @@
import { chai } from 'meteor/practicalmeteor:chai';
import ActiveFiresCollection from '/imports/api/ActiveFires/ActiveFires';
import Iron from 'iron';
import urlEnc from '/imports/modules/url-encode';
describe('url encoding', () => {
@ -68,4 +69,13 @@ describe('url encoding', () => {
unsealed.updatedAt = new Date(u);
chai.expect(unsealed).to.deep.equal(obj);
});
it('should decrypt node-red enc objects', async () => {
const sealed = 'Fe26.2**750f04110aef0f20d1093aa3f2a54dac3d7d5cc86e864e2c7d71b0ead88bc5b9*rX653dosl4BiM2L4fmZiiA*xuKj8XojCaS38R6X1EXkXBWjOidpnB0EVgGbdod_4vACHSl1w61hgXkU6SOq8HdURakJKCyIqWrsrdGt6DI6bl1xgfZ4ejlRMV_Keu0-WV0BVqrxbw0NlMN9KPexRDsy15yZou4ExU1yE36PBsfZIYysUrIsXwiBz3D5KvDaW0BnAXZ4sUR5Kyvk8g75QQmBth_LVHaEWE_OMarQUXDvFZ33R2_vM_i89QSj-wzwG5v-lbYrimE_5SMhEngRJFjihtQ_LfQlkH0wrpe5SUIdNL-DzsRxswvY7RIuMKHVLWSy8So66PxCuVJKa-DGvclX7tj7NO9RgNidfqP8U0izTpoV7dJB44Bwi4NOwLKGwNO9NG7jt-KGb2P6FeLTJYq8Mt0qqNsYXWUMpuhgXlKc2SuKT0avh-kYdovFO3YztGg5dz_Asu5hGZtkzRG6oGrvZxU8j7VDDNSQLLHo67Skmqg5_0e6Bp0gqpz13bmCSVvM_IpOkJLIgkRkGAvFoPy-woBqWiBU3NICo0z9X35WJ8j2xFY5niidGPXkP_uo5JbpGkmLH1tL06UUqjXZ5GS7gVhi8ii0vZt5zgaM4z0g4Q**96aa408156b0952f0d90e7c6d3960c06595543ffcfd642274138631b51b03383*BRnu9clkqVeKeXfWVe8i_Dh6TgqstVgV9HafoiLKxks';
// console.log(Iron.defaults);
const unsealed = await urlEnc.decrypt(sealed);
// console.log(unsealed);
/* chai.expect(unsealed).to.deep.equal(obj); */
});
});