Commit 7e376fb8 authored by Nacim Goura's avatar Nacim Goura

global refactoring

parent 11d203aa
...@@ -8,6 +8,7 @@ Meteor.methods({ ...@@ -8,6 +8,7 @@ Meteor.methods({
// add account // add account
addAccount(user) { addAccount(user) {
// validate user data // validate user data
check(user, Object);
new SimpleSchema({ new SimpleSchema({
email: { email: {
type: String, type: String,
......
...@@ -2,10 +2,6 @@ ...@@ -2,10 +2,6 @@
import SimpleSchema from 'simpl-schema'; import SimpleSchema from 'simpl-schema';
import { Mongo } from 'meteor/mongo'; import { Mongo } from 'meteor/mongo';
if (Meteor.isClient) {
import './hooksForm';
}
SimpleSchema.extendOptions(['autoform']); SimpleSchema.extendOptions(['autoform']);
/** /**
......
import { check } from 'meteor/check'; import { check } from 'meteor/check';
import { Meteor } from 'meteor/meteor'; import { Meteor } from 'meteor/meteor';
import configCollection from '../../collections/configCollection'; import configCollection from '/imports/api/config/configCollection';
Meteor.methods({ Meteor.methods({
// define config // define config
......
import displayNotif from './../../ui/components/notifs/notifs.js'; import { AutoForm } from 'meteor/aldeed:autoform';
import displayNotif from '/imports/ui/components/notifs/notifs.js';
export default { const hooksFormApiCrawl = {
onSuccess(formType, result) { onSuccess(formType, result) {
displayNotif({ displayNotif({
type: 'success', type: 'success',
title: 'Indexation : ', title: 'Indexation : ',
message: `Indexation fini avec succès avec ${result.items.length} urls indexées!`, message: `Indexation fini avec succès avec ${result.index.items.length} urls indexées!`,
save: true, save: true,
}); });
}, },
...@@ -19,3 +20,7 @@ export default { ...@@ -19,3 +20,7 @@ export default {
}); });
}, },
}; };
AutoForm.hooks({
formApiCrawl: hooksFormApiCrawl,
});
import { Meteor } from 'meteor/meteor'; import { Meteor } from 'meteor/meteor';
import _ from 'lodash'; import _ from 'lodash';
import checkData from '../../utils/checkData'; import checkData from '/imports/utils/checkData';
export default class CrawlFacebook { export default class CrawlFacebook {
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
import { Meteor } from 'meteor/meteor'; import { Meteor } from 'meteor/meteor';
import Twitter from 'twitter'; import Twitter from 'twitter';
import _ from 'lodash'; import _ from 'lodash';
import checkData from '../../utils/checkData'; import checkData from '/imports/utils/checkData';
export default class CrawlTwitter { export default class CrawlTwitter {
......
import { AutoForm } from 'meteor/aldeed:autoform';
import displayNotif from '/imports/ui/components/notifs/notifs.js';
const hooksFormWebsiteCrawl = {
onSuccess(formType, result) {
displayNotif({
type: 'success',
title: 'Indexation : ',
message: `Indexation fini avec succès avec ${result.index.items.length} urls indexées!`,
save: true,
});
},
onError(formType, error) {
displayNotif({
type: 'error',
title: 'Indexation : ',
message: error.reason ? error.reason : error,
save: true,
});
},
};
AutoForm.hooks({
formWebsiteCrawl: hooksFormWebsiteCrawl,
});
import SimpleSchema from 'simpl-schema';
SimpleSchema.extendOptions(['autoform']);
export default new SimpleSchema({
urlWebsite: {
type: String,
label: 'Url du site ou du sitemap à indexer :',
},
}, { tracker: Tracker });
...@@ -3,7 +3,7 @@ import url from 'url'; ...@@ -3,7 +3,7 @@ import url from 'url';
import { Meteor } from 'meteor/meteor'; import { Meteor } from 'meteor/meteor';
import Crawler from 'crawler'; import Crawler from 'crawler';
import Sitemapper from 'sitemapper'; import Sitemapper from 'sitemapper';
import checkData from '../../utils/checkData'; import checkData from '/imports/utils/checkData';
export default class crawlWebsite { export default class crawlWebsite {
......
...@@ -2,10 +2,10 @@ ...@@ -2,10 +2,10 @@
import { check } from 'meteor/check'; import { check } from 'meteor/check';
import { Meteor } from 'meteor/meteor'; import { Meteor } from 'meteor/meteor';
import _ from 'lodash'; import _ from 'lodash';
import { formApiCrawlSchema } from '/imports/collections/schemaForm'; import formApiCrawlSchema from '/imports/api/crawl/api/formApiCrawlSchema';
import IndexGeneric from './indexGeneric'; import IndexGeneric from '/imports/api/indexation/server/indexGeneric';
import IndexWebsite from './indexWebsite'; import IndexWebsite from '/imports/api/indexation/server/indexWebsite';
import IndexApi from './indexApi'; import IndexApi from '/imports/api/indexation/server/indexApi';
Meteor.methods({ Meteor.methods({
initIndexElastic() { initIndexElastic() {
......
...@@ -87,7 +87,7 @@ exports.mapping = { ...@@ -87,7 +87,7 @@ exports.mapping = {
type: 'keyword', type: 'keyword',
}, },
domain: { domain: {
type: 'keyword' type: 'keyword',
}, },
title: { title: {
type: 'text', type: 'text',
......
import CrawlApi from '/imports/api/crawl/api/server/crawlApi';
import IndexGeneric from './indexGeneric'; import IndexGeneric from './indexGeneric';
import CrawlApi from '../crawl/crawlApi';
export default class IndexApi extends IndexGeneric { export default class IndexApi extends IndexGeneric {
async indexationApi(data) { async indexationApi(data) {
return new CrawlApi(data) return new CrawlApi(data)
.then(dataToIndex => this.indexByBulk(dataToIndex)) .then(dataToIndex => new Promise(async resolve => resolve({
index: await this.indexByBulk(dataToIndex),
dataForm: {
api: data,
},
})))
.catch((error) => { .catch((error) => {
throw error; throw error;
}); });
......
import { Meteor } from 'meteor/meteor'; import { Meteor } from 'meteor/meteor';
import indexationElastic from '../../libs/elasticsearch/elasticsearch'; import indexationElastic from '/imports/libs/elasticsearch/elasticsearch';
import configElastic from './elasticSearchConfig'; import configElastic from './elasticSearchConfig';
const esIndex = Meteor.settings.private.elasticsearch.esIndex; const esIndex = Meteor.settings.private.elasticsearch.esIndex;
......
import CrawlWebsite from '/imports/api/crawl/website/server/crawlWebsite';
import IndexGeneric from './indexGeneric'; import IndexGeneric from './indexGeneric';
import CrawlWebsite from '../crawl/crawlWebsite';
export default class IndexWebsite extends IndexGeneric { export default class IndexWebsite extends IndexGeneric {
...@@ -11,7 +11,12 @@ export default class IndexWebsite extends IndexGeneric { ...@@ -11,7 +11,12 @@ export default class IndexWebsite extends IndexGeneric {
*/ */
async indexationWebsite(urlWebsite) { async indexationWebsite(urlWebsite) {
return new CrawlWebsite(urlWebsite) return new CrawlWebsite(urlWebsite)
.then(dataToIndex => this.indexByBulk(dataToIndex)) .then(dataToIndex => new Promise(async resolve => resolve({
index: await this.indexByBulk(dataToIndex),
dataForm: {
urlWebsite,
},
})))
.catch((error) => { .catch((error) => {
throw error; throw error;
}); });
......
import { AutoForm } from 'meteor/aldeed:autoform';
import { Meteor } from 'meteor/meteor'; import { Meteor } from 'meteor/meteor';
import { Session } from 'meteor/session';
import { FlowRouter } from 'meteor/kadira:flow-router'; import { FlowRouter } from 'meteor/kadira:flow-router';
import displayNotif from './../../ui/components/notifs/notifs.js'; import displayNotif from '../../ui/components/notifs/notifs.js';
export default { const hooksFormLogin = {
onSubmit: (insertDoc, updateDoc, currentDoc) => { onSubmit: (insertDoc, updateDoc, currentDoc) => {
Meteor.loginWithPassword(insertDoc.login, insertDoc.password, (err) => { Meteor.loginWithPassword(insertDoc.login, insertDoc.password, (err) => {
if (err) { if (err) {
...@@ -22,7 +24,6 @@ export default { ...@@ -22,7 +24,6 @@ export default {
// get global config for user // get global config for user
Meteor.callPromise('getConfig', {}) Meteor.callPromise('getConfig', {})
.then((config) => { .then((config) => {
console.log(config);
Session.set('config', config); Session.set('config', config);
}); });
} }
...@@ -30,3 +31,8 @@ export default { ...@@ -30,3 +31,8 @@ export default {
return false; return false;
}, },
}; };
AutoForm.hooks({
formApiCrawl: hooksFormLogin,
});
import SimpleSchema from 'simpl-schema'; import SimpleSchema from 'simpl-schema';
SimpleSchema.extendOptions(['autoform']); SimpleSchema.extendOptions(['autoform']);
export default new SimpleSchema({ export default new SimpleSchema({
......
import SimpleSchema from 'simpl-schema'; import SimpleSchema from 'simpl-schema';
import { Meteor } from 'meteor/meteor';
import { Mongo } from 'meteor/mongo'; import { Mongo } from 'meteor/mongo';
/** /**
* this local collection keep tracks of all notification of this application * this local collection keep tracks of all notification of this application
* @type {Mongo.Collection} * @type {Mongo.Collection}
*/ */
const notifsCollection = new Mongo.Collection(null); const notifsCollection = new Mongo.Collection('notifs');
SimpleSchema.notifsCollection = new SimpleSchema({ SimpleSchema.notifsCollection = new SimpleSchema({
type: { type: {
...@@ -23,12 +24,15 @@ SimpleSchema.notifsCollection = new SimpleSchema({ ...@@ -23,12 +24,15 @@ SimpleSchema.notifsCollection = new SimpleSchema({
type: Date, type: Date,
defaultValue: new Date(), defaultValue: new Date(),
}, },
read: { user: {
type: Boolean, type: String,
defaultValue: false, defaultValue: Meteor.userId(),
}, },
}); });
notifsCollection.attachSchema(SimpleSchema.notifsCollection); notifsCollection.attachSchema(SimpleSchema.notifsCollection);
// publish notif for available by client
// Meteor.publish('notifs', () => notifsCollection.find({ user: Meteor.userId() }).fetch());
export default notifsCollection; export default notifsCollection;
import SimpleSchema from 'simpl-schema';
import { Meteor } from 'meteor/meteor'; import { Meteor } from 'meteor/meteor';
import { check } from 'meteor/check'; import { check } from 'meteor/check';
import _ from 'lodash'; import _ from 'lodash';
import testSearchCollection from '../../collections/testSearchCollection'; import testSearchCollection from '/imports/api/testSearch/testSearchCollection';
Meteor.methods({ Meteor.methods({
addTest(test) { addTest(test) {
......
import SimpleSchema from 'simpl-schema';
/**
* Custom error messages
*/
SimpleSchema.setDefaultMessages({
messages: {
en: {
supMax: 'Cette valeur est supérieure au maximum.',
maxInfMin: 'La valeur maximale doit être supérieure à la valeur minimale.',
startInfEnd: 'La date de début doit être inférieure à la date de fin.',
endInfStart: 'La date de fin doit être supérieure à la date de début.',
usernameExists: 'Ce login est déjà utilisé. Veuillez en choisir un autre',
noMatchingPassword: 'les champs liés au mot de passe ne correspondent pas.',
companyHasAlreadySubmittedForThisBatch: 'Cette entreprise participe déjà à une réponse pour ce lot.',
// native messages
required: 'Veuillez saisir ou sélectionner une valeur pour le champ [label]',
minString: 'Veuillez saisir au moins [min] caractères',
maxString: 'Veuillez saisir moins de [max] caractères',
minNumber: 'Ce champ doit être superieur ou égal à [min]',
maxNumber: 'Ce champ doit être inferieur ou égal à [max]',
minNumberExclusive: 'Ce champ doit être superieur à [min]',
maxNumberExclusive: 'Ce champ doit être inferieur à [max]',
minDate: 'La date doit est postérieure au [min]',
maxDate: 'La date doit est antérieure au [max]',
badDate: 'Cette date est invalide',
minCount: 'Vous devez saisir plus de [minCount] valeurs',
maxCount: 'Vous devez saisir moins de [maxCount] valeurs',
noDecimal: 'Ce champ doit être un entier',
notAllowed: "[value] n'est pas une valeur acceptée",
expectedString: 'Le champ [label] doit être une chaine de caractères',
expectedNumber: 'Le champ [label] doit être un nombre',
expectedBoolean: 'Le champ [label] doit être un booléen',
expectedArray: 'Le champ [label] doit être un tableau',
expectedObject: 'Le champ [label] doit être une objet',
expectedConstructor: 'Le champ [label] doit être du type [type]',
keyNotInSchema: "Le champ [key] n'est pas permis par le schéma",
regEx: [
{ msg: 'Le champ [label] ne vérifie pas la validation par Regex' },
{ exp: SimpleSchema.RegEx.Email, msg: 'Cette adresse e-mail est incorrecte' },
{ exp: SimpleSchema.RegEx.WeakEmail, msg: 'Cette adresse e-mail est incorrecte' },
{ exp: SimpleSchema.RegEx.Domain, msg: 'Le champ [label] doit être un domaine valide' },
{ exp: SimpleSchema.RegEx.WeakDomain, msg: 'Le champ [label] doit être un domaine valide' },
{ exp: SimpleSchema.RegEx.IP, msg: 'Cette adresse IP est invalide' },
{ exp: SimpleSchema.RegEx.IPv4, msg: 'Cette adresse IPv4 est invalide' },
{ exp: SimpleSchema.RegEx.IPv6, msg: 'Cette adresse IPv6 est invalide' },
{ exp: SimpleSchema.RegEx.Url, msg: 'Cette URL is invalide' },
{ exp: SimpleSchema.RegEx.Id, msg: 'Cet identifiant alphanumérique est invalide' },
{ exp: SimpleSchema.RegEx.Phone, msg: 'Ce numéro de téléphone est invalide' },
{ exp: SimpleSchema.RegEx.Telephone, msg: 'Ce numéro de téléphone est invalide' },
],
},
},
});
import { AutoForm } from 'meteor/aldeed:autoform';
import hooksFormApiCrawl from './hooks/hooksFormApiCrawl';
import hooksFormLogin from './hooks/hooksFormLogin';
AutoForm.hooks({
formApiCrawl: hooksFormApiCrawl,
formLogin: hooksFormLogin,
});
import formLoginSchema from './formLoginSchema';
import formApiCrawlSchema from './formApiCrawlSchema';
if (Meteor.isClient) {
import './hooksForm';
}
export { formApiCrawlSchema, formLoginSchema };
import { Meteor } from 'meteor/meteor';
import { FlowRouter } from 'meteor/kadira:flow-router'; import { FlowRouter } from 'meteor/kadira:flow-router';
import { BlazeLayout } from 'meteor/kadira:blaze-layout'; import { BlazeLayout } from 'meteor/kadira:blaze-layout';
const adminSection = FlowRouter.group({ const adminSection = FlowRouter.group({
prefix: '/admin', prefix: '/admin',
triggersEnter: [(context, redirect) => {
if (!Meteor.userId()) {
redirect('login');
}
}],
}); });
adminSection.route('/', { adminSection.route('/', {
...@@ -38,3 +44,14 @@ adminSection.route('/stat', { ...@@ -38,3 +44,14 @@ adminSection.route('/stat', {
}); });
}, },
}); });
adminSection.route('/notif', {
name: 'notif',
action() {
BlazeLayout.render('mainLayoutTpl', {
sidebar: 'sidebarLayoutTpl',
main: 'notifTpl',
navbar: 'navbarLayoutTpl',
});
},
});
...@@ -16,6 +16,7 @@ import '../../ui/pages/not-found/not-found'; ...@@ -16,6 +16,7 @@ import '../../ui/pages/not-found/not-found';
import '../../ui/pages/admin/indexation/indexation'; import '../../ui/pages/admin/indexation/indexation';
import '../../ui/pages/admin/account/account'; import '../../ui/pages/admin/account/account';
import '../../ui/pages/admin/statistique/statistique'; import '../../ui/pages/admin/statistique/statistique';
import '../../ui/pages/admin/notif/notif';
// Set up all routes in the app // Set up all routes in the app
import './adminRoutes'; import './adminRoutes';
......
// Import server startup through a single index entry point // Import server startup through a single index entry point
import './fixtures'; import './fixtures';
import './register-api'; import './register-api';
import('meteor/percolate:synced-cron').then(({ SyncedCron }) => {
const numberCron = Object.keys(SyncedCron._entries);
if (numberCron > 0) {
console.log(`Nombre de cron à exécuter : ${numberCron}`);
SyncedCron.start();
}
});
// Register your apis here
import '../../api/indexation/methods'; // Register your apis here
import '../../api/account/methods'; import '/imports/api/indexation/methods';
import '../../api/config/methods'; import '/imports/api/account/methods';
import '../../api/testSearch/methods'; import '/imports/api/config/methods';
import '../../tabular/tabularUser'; import '/imports/api/testSearch/methods';
import '../../tabular/tabularTestSearch'; import '/imports/tabular/tabularUser';
import '/imports/tabular/tabularTestSearch';
import Tabular from 'meteor/aldeed:tabular'; import Tabular from 'meteor/aldeed:tabular';
import { Meteor } from 'meteor/meteor'; import { Meteor } from 'meteor/meteor';
import testSearchCollection from '../collections/testSearchCollection'; import testSearchCollection from '../api/testSearch/testSearchCollection';
new Tabular.Table({ new Tabular.Table({
name: 'testSearch', name: 'testSearch',
......
import iziToast from 'izitoast'; import iziToast from 'izitoast';
import alertsCollections from '../../../collections/alertsCollection'; import alertsCollections from '../../../api/notif/notifsCollection';
export default function (options) { export default function (options) {
this.options = { this.options = {
......
import { Template } from 'meteor/templating'; import { Template } from 'meteor/templating';
import { Session } from 'meteor/session'; import { Session } from 'meteor/session';
import tabsCollection from '../../../collections/tabsCollection'; import tabsCollection from '../../../api/tabs/tabsCollection';
import './tabs.html'; import './tabs.html';
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
<ul class="nav navbar-nav navbar-right"> <ul class="nav navbar-nav navbar-right">
{{#if currentUser}} {{#if currentUser}}
<li> <li>
<a href="#"> <a href="/admin/notif">
<i class="fa fa-bell"></i> <i class="fa fa-bell"></i>
</a> </a>
</li> </li>
...@@ -27,9 +27,6 @@ ...@@ -27,9 +27,6 @@
<a href="/logout">Déconnexion</a> <a href="/logout">Déconnexion</a>
</li> </li>
{{else}} {{else}}
<li>
<a href="/register">Inscription</a>
</li>
<li> <li>
<a href="/login">Connexion</a> <a href="/login">Connexion</a>
</li> </li>
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
import { Meteor } from 'meteor/meteor'; import { Meteor } from 'meteor/meteor';
import { Template } from 'meteor/templating'; import { Template } from 'meteor/templating';
import { Session } from 'meteor/session'; import { Session } from 'meteor/session';
import TabsCollection from '../../../../collections/tabsCollection'; import TabsCollection from '../../../../api/tabs/tabsCollection';
import '../../../components/tabs/tabs'; import '../../../components/tabs/tabs';
import './list/list'; import './list/list';
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
</div> </div>
{{> afQuickField name='content'}} {{> afQuickField name='content'}}
</fieldset> </fieldset>
<button type="submit" class="btn btn-primary">Insert</button> <button type="submit" class="btn btn-success">Valider</button>
{{/autoForm}} {{/autoForm}}
</div> </div>
</div> </div>
......
import { formApiCrawlSchema } from '/imports/collections/schemaForm'; import formApiCrawlSchema from '/imports/api/crawl/api/formApiCrawlSchema';
import { Template } from 'meteor/templating'; import { Template } from 'meteor/templating';
import $ from 'jquery'; import $ from 'jquery';
import '/imports/api/crawl/api/formApiCrawlHooks';
import './api.html'; import './api.html';
Template.apiIndexationTpl.onRendered(() => { Template.apiIndexationTpl.onRendered(() => {
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
import { Meteor } from 'meteor/meteor'; import { Meteor } from 'meteor/meteor';
import { Template } from 'meteor/templating'; import { Template } from 'meteor/templating';
import { Session } from 'meteor/session'; import { Session } from 'meteor/session';
import TabsCollection from '../../../../collections/tabsCollection'; import TabsCollection from '../../../../api/tabs/tabsCollection';
import '../../../components/tabs/tabs'; import '../../../components/tabs/tabs';
import './main/main'; import './main/main';
......
...@@ -2,7 +2,9 @@ ...@@ -2,7 +2,9 @@
import { Template } from 'meteor/templating'; import { Template } from 'meteor/templating';
import { Meteor } from 'meteor/meteor'; import { Meteor } from 'meteor/meteor';
import $ from 'jquery'; import $ from 'jquery';
import displayNotif from '../../../../components/notifs/notifs.js'; import displayNotif from '/imports/ui/components/notifs/notifs.js';
import formWebsiteCrawlSchema from '/imports/api/crawl/website/formWebsiteCrawlSchema';
import '/imports/api/crawl/website/formWebsiteCrawlHooks';